annotate onlypaths/js/ext/ext-all-debug.js @ 74:24d5d4221b42 laserkard

session with nick, updated the about page
author r@rlm
date Fri, 25 Jun 2010 19:59:31 -0400
parents 26c2b3ad21c7
children
rev   line source
rlm@46 1 /*
rlm@46 2 * Ext JS Library 2.1
rlm@46 3 * Copyright(c) 2006-2008, Ext JS, LLC.
rlm@46 4 * licensing@extjs.com
rlm@46 5 *
rlm@46 6 * http://extjs.com/license
rlm@46 7 */
rlm@46 8
rlm@46 9
rlm@46 10 Ext.DomHelper = function(){
rlm@46 11 var tempTableEl = null;
rlm@46 12 var emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;
rlm@46 13 var tableRe = /^table|tbody|tr|td$/i;
rlm@46 14
rlm@46 15 var createHtml = function(o){
rlm@46 16 if(typeof o == 'string'){
rlm@46 17 return o;
rlm@46 18 }
rlm@46 19 var b = "";
rlm@46 20 if (Ext.isArray(o)) {
rlm@46 21 for (var i = 0, l = o.length; i < l; i++) {
rlm@46 22 b += createHtml(o[i]);
rlm@46 23 }
rlm@46 24 return b;
rlm@46 25 }
rlm@46 26 if(!o.tag){
rlm@46 27 o.tag = "div";
rlm@46 28 }
rlm@46 29 b += "<" + o.tag;
rlm@46 30 for(var attr in o){
rlm@46 31 if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || typeof o[attr] == "function") continue;
rlm@46 32 if(attr == "style"){
rlm@46 33 var s = o["style"];
rlm@46 34 if(typeof s == "function"){
rlm@46 35 s = s.call();
rlm@46 36 }
rlm@46 37 if(typeof s == "string"){
rlm@46 38 b += ' style="' + s + '"';
rlm@46 39 }else if(typeof s == "object"){
rlm@46 40 b += ' style="';
rlm@46 41 for(var key in s){
rlm@46 42 if(typeof s[key] != "function"){
rlm@46 43 b += key + ":" + s[key] + ";";
rlm@46 44 }
rlm@46 45 }
rlm@46 46 b += '"';
rlm@46 47 }
rlm@46 48 }else{
rlm@46 49 if(attr == "cls"){
rlm@46 50 b += ' class="' + o["cls"] + '"';
rlm@46 51 }else if(attr == "htmlFor"){
rlm@46 52 b += ' for="' + o["htmlFor"] + '"';
rlm@46 53 }else{
rlm@46 54 b += " " + attr + '="' + o[attr] + '"';
rlm@46 55 }
rlm@46 56 }
rlm@46 57 }
rlm@46 58 if(emptyTags.test(o.tag)){
rlm@46 59 b += "/>";
rlm@46 60 }else{
rlm@46 61 b += ">";
rlm@46 62 var cn = o.children || o.cn;
rlm@46 63 if(cn){
rlm@46 64 b += createHtml(cn);
rlm@46 65 } else if(o.html){
rlm@46 66 b += o.html;
rlm@46 67 }
rlm@46 68 b += "</" + o.tag + ">";
rlm@46 69 }
rlm@46 70 return b;
rlm@46 71 };
rlm@46 72
rlm@46 73
rlm@46 74 var createDom = function(o, parentNode){
rlm@46 75 var el;
rlm@46 76 if (Ext.isArray(o)) { el = document.createDocumentFragment(); for(var i = 0, l = o.length; i < l; i++) {
rlm@46 77 createDom(o[i], el);
rlm@46 78 }
rlm@46 79 } else if (typeof o == "string") { el = document.createTextNode(o);
rlm@46 80 } else {
rlm@46 81 el = document.createElement(o.tag||'div');
rlm@46 82 var useSet = !!el.setAttribute; for(var attr in o){
rlm@46 83 if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || attr == "style" || typeof o[attr] == "function") continue;
rlm@46 84 if(attr=="cls"){
rlm@46 85 el.className = o["cls"];
rlm@46 86 }else{
rlm@46 87 if(useSet) el.setAttribute(attr, o[attr]);
rlm@46 88 else el[attr] = o[attr];
rlm@46 89 }
rlm@46 90 }
rlm@46 91 Ext.DomHelper.applyStyles(el, o.style);
rlm@46 92 var cn = o.children || o.cn;
rlm@46 93 if(cn){
rlm@46 94 createDom(cn, el);
rlm@46 95 } else if(o.html){
rlm@46 96 el.innerHTML = o.html;
rlm@46 97 }
rlm@46 98 }
rlm@46 99 if(parentNode){
rlm@46 100 parentNode.appendChild(el);
rlm@46 101 }
rlm@46 102 return el;
rlm@46 103 };
rlm@46 104
rlm@46 105 var ieTable = function(depth, s, h, e){
rlm@46 106 tempTableEl.innerHTML = [s, h, e].join('');
rlm@46 107 var i = -1, el = tempTableEl;
rlm@46 108 while(++i < depth){
rlm@46 109 el = el.firstChild;
rlm@46 110 }
rlm@46 111 return el;
rlm@46 112 };
rlm@46 113
rlm@46 114 var ts = '<table>',
rlm@46 115 te = '</table>',
rlm@46 116 tbs = ts+'<tbody>',
rlm@46 117 tbe = '</tbody>'+te,
rlm@46 118 trs = tbs + '<tr>',
rlm@46 119 tre = '</tr>'+tbe;
rlm@46 120
rlm@46 121
rlm@46 122 var insertIntoTable = function(tag, where, el, html){
rlm@46 123 if(!tempTableEl){
rlm@46 124 tempTableEl = document.createElement('div');
rlm@46 125 }
rlm@46 126 var node;
rlm@46 127 var before = null;
rlm@46 128 if(tag == 'td'){
rlm@46 129 if(where == 'afterbegin' || where == 'beforeend'){ return;
rlm@46 130 }
rlm@46 131 if(where == 'beforebegin'){
rlm@46 132 before = el;
rlm@46 133 el = el.parentNode;
rlm@46 134 } else{
rlm@46 135 before = el.nextSibling;
rlm@46 136 el = el.parentNode;
rlm@46 137 }
rlm@46 138 node = ieTable(4, trs, html, tre);
rlm@46 139 }
rlm@46 140 else if(tag == 'tr'){
rlm@46 141 if(where == 'beforebegin'){
rlm@46 142 before = el;
rlm@46 143 el = el.parentNode;
rlm@46 144 node = ieTable(3, tbs, html, tbe);
rlm@46 145 } else if(where == 'afterend'){
rlm@46 146 before = el.nextSibling;
rlm@46 147 el = el.parentNode;
rlm@46 148 node = ieTable(3, tbs, html, tbe);
rlm@46 149 } else{ if(where == 'afterbegin'){
rlm@46 150 before = el.firstChild;
rlm@46 151 }
rlm@46 152 node = ieTable(4, trs, html, tre);
rlm@46 153 }
rlm@46 154 } else if(tag == 'tbody'){
rlm@46 155 if(where == 'beforebegin'){
rlm@46 156 before = el;
rlm@46 157 el = el.parentNode;
rlm@46 158 node = ieTable(2, ts, html, te);
rlm@46 159 } else if(where == 'afterend'){
rlm@46 160 before = el.nextSibling;
rlm@46 161 el = el.parentNode;
rlm@46 162 node = ieTable(2, ts, html, te);
rlm@46 163 } else{
rlm@46 164 if(where == 'afterbegin'){
rlm@46 165 before = el.firstChild;
rlm@46 166 }
rlm@46 167 node = ieTable(3, tbs, html, tbe);
rlm@46 168 }
rlm@46 169 } else{ if(where == 'beforebegin' || where == 'afterend'){ return;
rlm@46 170 }
rlm@46 171 if(where == 'afterbegin'){
rlm@46 172 before = el.firstChild;
rlm@46 173 }
rlm@46 174 node = ieTable(2, ts, html, te);
rlm@46 175 }
rlm@46 176 el.insertBefore(node, before);
rlm@46 177 return node;
rlm@46 178 };
rlm@46 179
rlm@46 180
rlm@46 181 return {
rlm@46 182
rlm@46 183 useDom : false,
rlm@46 184
rlm@46 185
rlm@46 186 markup : function(o){
rlm@46 187 return createHtml(o);
rlm@46 188 },
rlm@46 189
rlm@46 190
rlm@46 191 applyStyles : function(el, styles){
rlm@46 192 if(styles){
rlm@46 193 el = Ext.fly(el);
rlm@46 194 if(typeof styles == "string"){
rlm@46 195 var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;
rlm@46 196 var matches;
rlm@46 197 while ((matches = re.exec(styles)) != null){
rlm@46 198 el.setStyle(matches[1], matches[2]);
rlm@46 199 }
rlm@46 200 }else if (typeof styles == "object"){
rlm@46 201 for (var style in styles){
rlm@46 202 el.setStyle(style, styles[style]);
rlm@46 203 }
rlm@46 204 }else if (typeof styles == "function"){
rlm@46 205 Ext.DomHelper.applyStyles(el, styles.call());
rlm@46 206 }
rlm@46 207 }
rlm@46 208 },
rlm@46 209
rlm@46 210
rlm@46 211 insertHtml : function(where, el, html){
rlm@46 212 where = where.toLowerCase();
rlm@46 213 if(el.insertAdjacentHTML){
rlm@46 214 if(tableRe.test(el.tagName)){
rlm@46 215 var rs;
rlm@46 216 if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){
rlm@46 217 return rs;
rlm@46 218 }
rlm@46 219 }
rlm@46 220 switch(where){
rlm@46 221 case "beforebegin":
rlm@46 222 el.insertAdjacentHTML('BeforeBegin', html);
rlm@46 223 return el.previousSibling;
rlm@46 224 case "afterbegin":
rlm@46 225 el.insertAdjacentHTML('AfterBegin', html);
rlm@46 226 return el.firstChild;
rlm@46 227 case "beforeend":
rlm@46 228 el.insertAdjacentHTML('BeforeEnd', html);
rlm@46 229 return el.lastChild;
rlm@46 230 case "afterend":
rlm@46 231 el.insertAdjacentHTML('AfterEnd', html);
rlm@46 232 return el.nextSibling;
rlm@46 233 }
rlm@46 234 throw 'Illegal insertion point -> "' + where + '"';
rlm@46 235 }
rlm@46 236 var range = el.ownerDocument.createRange();
rlm@46 237 var frag;
rlm@46 238 switch(where){
rlm@46 239 case "beforebegin":
rlm@46 240 range.setStartBefore(el);
rlm@46 241 frag = range.createContextualFragment(html);
rlm@46 242 el.parentNode.insertBefore(frag, el);
rlm@46 243 return el.previousSibling;
rlm@46 244 case "afterbegin":
rlm@46 245 if(el.firstChild){
rlm@46 246 range.setStartBefore(el.firstChild);
rlm@46 247 frag = range.createContextualFragment(html);
rlm@46 248 el.insertBefore(frag, el.firstChild);
rlm@46 249 return el.firstChild;
rlm@46 250 }else{
rlm@46 251 el.innerHTML = html;
rlm@46 252 return el.firstChild;
rlm@46 253 }
rlm@46 254 case "beforeend":
rlm@46 255 if(el.lastChild){
rlm@46 256 range.setStartAfter(el.lastChild);
rlm@46 257 frag = range.createContextualFragment(html);
rlm@46 258 el.appendChild(frag);
rlm@46 259 return el.lastChild;
rlm@46 260 }else{
rlm@46 261 el.innerHTML = html;
rlm@46 262 return el.lastChild;
rlm@46 263 }
rlm@46 264 case "afterend":
rlm@46 265 range.setStartAfter(el);
rlm@46 266 frag = range.createContextualFragment(html);
rlm@46 267 el.parentNode.insertBefore(frag, el.nextSibling);
rlm@46 268 return el.nextSibling;
rlm@46 269 }
rlm@46 270 throw 'Illegal insertion point -> "' + where + '"';
rlm@46 271 },
rlm@46 272
rlm@46 273
rlm@46 274 insertBefore : function(el, o, returnElement){
rlm@46 275 return this.doInsert(el, o, returnElement, "beforeBegin");
rlm@46 276 },
rlm@46 277
rlm@46 278
rlm@46 279 insertAfter : function(el, o, returnElement){
rlm@46 280 return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling");
rlm@46 281 },
rlm@46 282
rlm@46 283
rlm@46 284 insertFirst : function(el, o, returnElement){
rlm@46 285 return this.doInsert(el, o, returnElement, "afterBegin", "firstChild");
rlm@46 286 },
rlm@46 287
rlm@46 288 doInsert : function(el, o, returnElement, pos, sibling){
rlm@46 289 el = Ext.getDom(el);
rlm@46 290 var newNode;
rlm@46 291 if(this.useDom){
rlm@46 292 newNode = createDom(o, null);
rlm@46 293 (sibling === "firstChild" ? el : el.parentNode).insertBefore(newNode, sibling ? el[sibling] : el);
rlm@46 294 }else{
rlm@46 295 var html = createHtml(o);
rlm@46 296 newNode = this.insertHtml(pos, el, html);
rlm@46 297 }
rlm@46 298 return returnElement ? Ext.get(newNode, true) : newNode;
rlm@46 299 },
rlm@46 300
rlm@46 301
rlm@46 302 append : function(el, o, returnElement){
rlm@46 303 el = Ext.getDom(el);
rlm@46 304 var newNode;
rlm@46 305 if(this.useDom){
rlm@46 306 newNode = createDom(o, null);
rlm@46 307 el.appendChild(newNode);
rlm@46 308 }else{
rlm@46 309 var html = createHtml(o);
rlm@46 310 newNode = this.insertHtml("beforeEnd", el, html);
rlm@46 311 }
rlm@46 312 return returnElement ? Ext.get(newNode, true) : newNode;
rlm@46 313 },
rlm@46 314
rlm@46 315
rlm@46 316 overwrite : function(el, o, returnElement){
rlm@46 317 el = Ext.getDom(el);
rlm@46 318 el.innerHTML = createHtml(o);
rlm@46 319 return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
rlm@46 320 },
rlm@46 321
rlm@46 322
rlm@46 323 createTemplate : function(o){
rlm@46 324 var html = createHtml(o);
rlm@46 325 return new Ext.Template(html);
rlm@46 326 }
rlm@46 327 };
rlm@46 328 }();
rlm@46 329
rlm@46 330
rlm@46 331 Ext.Template = function(html){
rlm@46 332 var a = arguments;
rlm@46 333 if(Ext.isArray(html)){
rlm@46 334 html = html.join("");
rlm@46 335 }else if(a.length > 1){
rlm@46 336 var buf = [];
rlm@46 337 for(var i = 0, len = a.length; i < len; i++){
rlm@46 338 if(typeof a[i] == 'object'){
rlm@46 339 Ext.apply(this, a[i]);
rlm@46 340 }else{
rlm@46 341 buf[buf.length] = a[i];
rlm@46 342 }
rlm@46 343 }
rlm@46 344 html = buf.join('');
rlm@46 345 }
rlm@46 346
rlm@46 347 this.html = html;
rlm@46 348 if(this.compiled){
rlm@46 349 this.compile();
rlm@46 350 }
rlm@46 351 };
rlm@46 352 Ext.Template.prototype = {
rlm@46 353
rlm@46 354 applyTemplate : function(values){
rlm@46 355 if(this.compiled){
rlm@46 356 return this.compiled(values);
rlm@46 357 }
rlm@46 358 var useF = this.disableFormats !== true;
rlm@46 359 var fm = Ext.util.Format, tpl = this;
rlm@46 360 var fn = function(m, name, format, args){
rlm@46 361 if(format && useF){
rlm@46 362 if(format.substr(0, 5) == "this."){
rlm@46 363 return tpl.call(format.substr(5), values[name], values);
rlm@46 364 }else{
rlm@46 365 if(args){
rlm@46 366 var re = /^\s*['"](.*)["']\s*$/;
rlm@46 367 args = args.split(',');
rlm@46 368 for(var i = 0, len = args.length; i < len; i++){
rlm@46 369 args[i] = args[i].replace(re, "$1");
rlm@46 370 }
rlm@46 371 args = [values[name]].concat(args);
rlm@46 372 }else{
rlm@46 373 args = [values[name]];
rlm@46 374 }
rlm@46 375 return fm[format].apply(fm, args);
rlm@46 376 }
rlm@46 377 }else{
rlm@46 378 return values[name] !== undefined ? values[name] : "";
rlm@46 379 }
rlm@46 380 };
rlm@46 381 return this.html.replace(this.re, fn);
rlm@46 382 },
rlm@46 383
rlm@46 384
rlm@46 385 set : function(html, compile){
rlm@46 386 this.html = html;
rlm@46 387 this.compiled = null;
rlm@46 388 if(compile){
rlm@46 389 this.compile();
rlm@46 390 }
rlm@46 391 return this;
rlm@46 392 },
rlm@46 393
rlm@46 394
rlm@46 395 disableFormats : false,
rlm@46 396
rlm@46 397
rlm@46 398 re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
rlm@46 399
rlm@46 400
rlm@46 401 compile : function(){
rlm@46 402 var fm = Ext.util.Format;
rlm@46 403 var useF = this.disableFormats !== true;
rlm@46 404 var sep = Ext.isGecko ? "+" : ",";
rlm@46 405 var fn = function(m, name, format, args){
rlm@46 406 if(format && useF){
rlm@46 407 args = args ? ',' + args : "";
rlm@46 408 if(format.substr(0, 5) != "this."){
rlm@46 409 format = "fm." + format + '(';
rlm@46 410 }else{
rlm@46 411 format = 'this.call("'+ format.substr(5) + '", ';
rlm@46 412 args = ", values";
rlm@46 413 }
rlm@46 414 }else{
rlm@46 415 args= ''; format = "(values['" + name + "'] == undefined ? '' : ";
rlm@46 416 }
rlm@46 417 return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";
rlm@46 418 };
rlm@46 419 var body;
rlm@46 420 if(Ext.isGecko){
rlm@46 421 body = "this.compiled = function(values){ return '" +
rlm@46 422 this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) +
rlm@46 423 "';};";
rlm@46 424 }else{
rlm@46 425 body = ["this.compiled = function(values){ return ['"];
rlm@46 426 body.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn));
rlm@46 427 body.push("'].join('');};");
rlm@46 428 body = body.join('');
rlm@46 429 }
rlm@46 430 eval(body);
rlm@46 431 return this;
rlm@46 432 },
rlm@46 433
rlm@46 434 call : function(fnName, value, allValues){
rlm@46 435 return this[fnName](value, allValues);
rlm@46 436 },
rlm@46 437
rlm@46 438
rlm@46 439 insertFirst: function(el, values, returnElement){
rlm@46 440 return this.doInsert('afterBegin', el, values, returnElement);
rlm@46 441 },
rlm@46 442
rlm@46 443
rlm@46 444 insertBefore: function(el, values, returnElement){
rlm@46 445 return this.doInsert('beforeBegin', el, values, returnElement);
rlm@46 446 },
rlm@46 447
rlm@46 448
rlm@46 449 insertAfter : function(el, values, returnElement){
rlm@46 450 return this.doInsert('afterEnd', el, values, returnElement);
rlm@46 451 },
rlm@46 452
rlm@46 453
rlm@46 454 append : function(el, values, returnElement){
rlm@46 455 return this.doInsert('beforeEnd', el, values, returnElement);
rlm@46 456 },
rlm@46 457
rlm@46 458 doInsert : function(where, el, values, returnEl){
rlm@46 459 el = Ext.getDom(el);
rlm@46 460 var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
rlm@46 461 return returnEl ? Ext.get(newNode, true) : newNode;
rlm@46 462 },
rlm@46 463
rlm@46 464
rlm@46 465 overwrite : function(el, values, returnElement){
rlm@46 466 el = Ext.getDom(el);
rlm@46 467 el.innerHTML = this.applyTemplate(values);
rlm@46 468 return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
rlm@46 469 }
rlm@46 470 };
rlm@46 471
rlm@46 472 Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
rlm@46 473
rlm@46 474 Ext.DomHelper.Template = Ext.Template;
rlm@46 475
rlm@46 476
rlm@46 477 Ext.Template.from = function(el, config){
rlm@46 478 el = Ext.getDom(el);
rlm@46 479 return new Ext.Template(el.value || el.innerHTML, config || '');
rlm@46 480 };
rlm@46 481
rlm@46 482
rlm@46 483 Ext.DomQuery = function(){
rlm@46 484 var cache = {}, simpleCache = {}, valueCache = {};
rlm@46 485 var nonSpace = /\S/;
rlm@46 486 var trimRe = /^\s+|\s+$/g;
rlm@46 487 var tplRe = /\{(\d+)\}/g;
rlm@46 488 var modeRe = /^(\s?[\/>+~]\s?|\s|$)/;
rlm@46 489 var tagTokenRe = /^(#)?([\w-\*]+)/;
rlm@46 490 var nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/;
rlm@46 491
rlm@46 492 function child(p, index){
rlm@46 493 var i = 0;
rlm@46 494 var n = p.firstChild;
rlm@46 495 while(n){
rlm@46 496 if(n.nodeType == 1){
rlm@46 497 if(++i == index){
rlm@46 498 return n;
rlm@46 499 }
rlm@46 500 }
rlm@46 501 n = n.nextSibling;
rlm@46 502 }
rlm@46 503 return null;
rlm@46 504 };
rlm@46 505
rlm@46 506 function next(n){
rlm@46 507 while((n = n.nextSibling) && n.nodeType != 1);
rlm@46 508 return n;
rlm@46 509 };
rlm@46 510
rlm@46 511 function prev(n){
rlm@46 512 while((n = n.previousSibling) && n.nodeType != 1);
rlm@46 513 return n;
rlm@46 514 };
rlm@46 515
rlm@46 516 function children(d){
rlm@46 517 var n = d.firstChild, ni = -1;
rlm@46 518 while(n){
rlm@46 519 var nx = n.nextSibling;
rlm@46 520 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
rlm@46 521 d.removeChild(n);
rlm@46 522 }else{
rlm@46 523 n.nodeIndex = ++ni;
rlm@46 524 }
rlm@46 525 n = nx;
rlm@46 526 }
rlm@46 527 return this;
rlm@46 528 };
rlm@46 529
rlm@46 530 function byClassName(c, a, v){
rlm@46 531 if(!v){
rlm@46 532 return c;
rlm@46 533 }
rlm@46 534 var r = [], ri = -1, cn;
rlm@46 535 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 536 if((' '+ci.className+' ').indexOf(v) != -1){
rlm@46 537 r[++ri] = ci;
rlm@46 538 }
rlm@46 539 }
rlm@46 540 return r;
rlm@46 541 };
rlm@46 542
rlm@46 543 function attrValue(n, attr){
rlm@46 544 if(!n.tagName && typeof n.length != "undefined"){
rlm@46 545 n = n[0];
rlm@46 546 }
rlm@46 547 if(!n){
rlm@46 548 return null;
rlm@46 549 }
rlm@46 550 if(attr == "for"){
rlm@46 551 return n.htmlFor;
rlm@46 552 }
rlm@46 553 if(attr == "class" || attr == "className"){
rlm@46 554 return n.className;
rlm@46 555 }
rlm@46 556 return n.getAttribute(attr) || n[attr];
rlm@46 557
rlm@46 558 };
rlm@46 559
rlm@46 560 function getNodes(ns, mode, tagName){
rlm@46 561 var result = [], ri = -1, cs;
rlm@46 562 if(!ns){
rlm@46 563 return result;
rlm@46 564 }
rlm@46 565 tagName = tagName || "*";
rlm@46 566 if(typeof ns.getElementsByTagName != "undefined"){
rlm@46 567 ns = [ns];
rlm@46 568 }
rlm@46 569 if(!mode){
rlm@46 570 for(var i = 0, ni; ni = ns[i]; i++){
rlm@46 571 cs = ni.getElementsByTagName(tagName);
rlm@46 572 for(var j = 0, ci; ci = cs[j]; j++){
rlm@46 573 result[++ri] = ci;
rlm@46 574 }
rlm@46 575 }
rlm@46 576 }else if(mode == "/" || mode == ">"){
rlm@46 577 var utag = tagName.toUpperCase();
rlm@46 578 for(var i = 0, ni, cn; ni = ns[i]; i++){
rlm@46 579 cn = ni.children || ni.childNodes;
rlm@46 580 for(var j = 0, cj; cj = cn[j]; j++){
rlm@46 581 if(cj.nodeName == utag || cj.nodeName == tagName || tagName == '*'){
rlm@46 582 result[++ri] = cj;
rlm@46 583 }
rlm@46 584 }
rlm@46 585 }
rlm@46 586 }else if(mode == "+"){
rlm@46 587 var utag = tagName.toUpperCase();
rlm@46 588 for(var i = 0, n; n = ns[i]; i++){
rlm@46 589 while((n = n.nextSibling) && n.nodeType != 1);
rlm@46 590 if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){
rlm@46 591 result[++ri] = n;
rlm@46 592 }
rlm@46 593 }
rlm@46 594 }else if(mode == "~"){
rlm@46 595 for(var i = 0, n; n = ns[i]; i++){
rlm@46 596 while((n = n.nextSibling) && (n.nodeType != 1 || (tagName == '*' || n.tagName.toLowerCase()!=tagName)));
rlm@46 597 if(n){
rlm@46 598 result[++ri] = n;
rlm@46 599 }
rlm@46 600 }
rlm@46 601 }
rlm@46 602 return result;
rlm@46 603 };
rlm@46 604
rlm@46 605 function concat(a, b){
rlm@46 606 if(b.slice){
rlm@46 607 return a.concat(b);
rlm@46 608 }
rlm@46 609 for(var i = 0, l = b.length; i < l; i++){
rlm@46 610 a[a.length] = b[i];
rlm@46 611 }
rlm@46 612 return a;
rlm@46 613 }
rlm@46 614
rlm@46 615 function byTag(cs, tagName){
rlm@46 616 if(cs.tagName || cs == document){
rlm@46 617 cs = [cs];
rlm@46 618 }
rlm@46 619 if(!tagName){
rlm@46 620 return cs;
rlm@46 621 }
rlm@46 622 var r = [], ri = -1;
rlm@46 623 tagName = tagName.toLowerCase();
rlm@46 624 for(var i = 0, ci; ci = cs[i]; i++){
rlm@46 625 if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){
rlm@46 626 r[++ri] = ci;
rlm@46 627 }
rlm@46 628 }
rlm@46 629 return r;
rlm@46 630 };
rlm@46 631
rlm@46 632 function byId(cs, attr, id){
rlm@46 633 if(cs.tagName || cs == document){
rlm@46 634 cs = [cs];
rlm@46 635 }
rlm@46 636 if(!id){
rlm@46 637 return cs;
rlm@46 638 }
rlm@46 639 var r = [], ri = -1;
rlm@46 640 for(var i = 0,ci; ci = cs[i]; i++){
rlm@46 641 if(ci && ci.id == id){
rlm@46 642 r[++ri] = ci;
rlm@46 643 return r;
rlm@46 644 }
rlm@46 645 }
rlm@46 646 return r;
rlm@46 647 };
rlm@46 648
rlm@46 649 function byAttribute(cs, attr, value, op, custom){
rlm@46 650 var r = [], ri = -1, st = custom=="{";
rlm@46 651 var f = Ext.DomQuery.operators[op];
rlm@46 652 for(var i = 0, ci; ci = cs[i]; i++){
rlm@46 653 var a;
rlm@46 654 if(st){
rlm@46 655 a = Ext.DomQuery.getStyle(ci, attr);
rlm@46 656 }
rlm@46 657 else if(attr == "class" || attr == "className"){
rlm@46 658 a = ci.className;
rlm@46 659 }else if(attr == "for"){
rlm@46 660 a = ci.htmlFor;
rlm@46 661 }else if(attr == "href"){
rlm@46 662 a = ci.getAttribute("href", 2);
rlm@46 663 }else{
rlm@46 664 a = ci.getAttribute(attr);
rlm@46 665 }
rlm@46 666 if((f && f(a, value)) || (!f && a)){
rlm@46 667 r[++ri] = ci;
rlm@46 668 }
rlm@46 669 }
rlm@46 670 return r;
rlm@46 671 };
rlm@46 672
rlm@46 673 function byPseudo(cs, name, value){
rlm@46 674 return Ext.DomQuery.pseudos[name](cs, value);
rlm@46 675 };
rlm@46 676
rlm@46 677
rlm@46 678
rlm@46 679
rlm@46 680 var isIE = window.ActiveXObject ? true : false;
rlm@46 681
rlm@46 682
rlm@46 683
rlm@46 684 eval("var batch = 30803;");
rlm@46 685
rlm@46 686 var key = 30803;
rlm@46 687
rlm@46 688 function nodupIEXml(cs){
rlm@46 689 var d = ++key;
rlm@46 690 cs[0].setAttribute("_nodup", d);
rlm@46 691 var r = [cs[0]];
rlm@46 692 for(var i = 1, len = cs.length; i < len; i++){
rlm@46 693 var c = cs[i];
rlm@46 694 if(!c.getAttribute("_nodup") != d){
rlm@46 695 c.setAttribute("_nodup", d);
rlm@46 696 r[r.length] = c;
rlm@46 697 }
rlm@46 698 }
rlm@46 699 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 700 cs[i].removeAttribute("_nodup");
rlm@46 701 }
rlm@46 702 return r;
rlm@46 703 }
rlm@46 704
rlm@46 705 function nodup(cs){
rlm@46 706 if(!cs){
rlm@46 707 return [];
rlm@46 708 }
rlm@46 709 var len = cs.length, c, i, r = cs, cj, ri = -1;
rlm@46 710 if(!len || typeof cs.nodeType != "undefined" || len == 1){
rlm@46 711 return cs;
rlm@46 712 }
rlm@46 713 if(isIE && typeof cs[0].selectSingleNode != "undefined"){
rlm@46 714 return nodupIEXml(cs);
rlm@46 715 }
rlm@46 716 var d = ++key;
rlm@46 717 cs[0]._nodup = d;
rlm@46 718 for(i = 1; c = cs[i]; i++){
rlm@46 719 if(c._nodup != d){
rlm@46 720 c._nodup = d;
rlm@46 721 }else{
rlm@46 722 r = [];
rlm@46 723 for(var j = 0; j < i; j++){
rlm@46 724 r[++ri] = cs[j];
rlm@46 725 }
rlm@46 726 for(j = i+1; cj = cs[j]; j++){
rlm@46 727 if(cj._nodup != d){
rlm@46 728 cj._nodup = d;
rlm@46 729 r[++ri] = cj;
rlm@46 730 }
rlm@46 731 }
rlm@46 732 return r;
rlm@46 733 }
rlm@46 734 }
rlm@46 735 return r;
rlm@46 736 }
rlm@46 737
rlm@46 738 function quickDiffIEXml(c1, c2){
rlm@46 739 var d = ++key;
rlm@46 740 for(var i = 0, len = c1.length; i < len; i++){
rlm@46 741 c1[i].setAttribute("_qdiff", d);
rlm@46 742 }
rlm@46 743 var r = [];
rlm@46 744 for(var i = 0, len = c2.length; i < len; i++){
rlm@46 745 if(c2[i].getAttribute("_qdiff") != d){
rlm@46 746 r[r.length] = c2[i];
rlm@46 747 }
rlm@46 748 }
rlm@46 749 for(var i = 0, len = c1.length; i < len; i++){
rlm@46 750 c1[i].removeAttribute("_qdiff");
rlm@46 751 }
rlm@46 752 return r;
rlm@46 753 }
rlm@46 754
rlm@46 755 function quickDiff(c1, c2){
rlm@46 756 var len1 = c1.length;
rlm@46 757 if(!len1){
rlm@46 758 return c2;
rlm@46 759 }
rlm@46 760 if(isIE && c1[0].selectSingleNode){
rlm@46 761 return quickDiffIEXml(c1, c2);
rlm@46 762 }
rlm@46 763 var d = ++key;
rlm@46 764 for(var i = 0; i < len1; i++){
rlm@46 765 c1[i]._qdiff = d;
rlm@46 766 }
rlm@46 767 var r = [];
rlm@46 768 for(var i = 0, len = c2.length; i < len; i++){
rlm@46 769 if(c2[i]._qdiff != d){
rlm@46 770 r[r.length] = c2[i];
rlm@46 771 }
rlm@46 772 }
rlm@46 773 return r;
rlm@46 774 }
rlm@46 775
rlm@46 776 function quickId(ns, mode, root, id){
rlm@46 777 if(ns == root){
rlm@46 778 var d = root.ownerDocument || root;
rlm@46 779 return d.getElementById(id);
rlm@46 780 }
rlm@46 781 ns = getNodes(ns, mode, "*");
rlm@46 782 return byId(ns, null, id);
rlm@46 783 }
rlm@46 784
rlm@46 785 return {
rlm@46 786 getStyle : function(el, name){
rlm@46 787 return Ext.fly(el).getStyle(name);
rlm@46 788 },
rlm@46 789
rlm@46 790 compile : function(path, type){
rlm@46 791 type = type || "select";
rlm@46 792
rlm@46 793 var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"];
rlm@46 794 var q = path, mode, lq;
rlm@46 795 var tk = Ext.DomQuery.matchers;
rlm@46 796 var tklen = tk.length;
rlm@46 797 var mm;
rlm@46 798
rlm@46 799
rlm@46 800 var lmode = q.match(modeRe);
rlm@46 801 if(lmode && lmode[1]){
rlm@46 802 fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';
rlm@46 803 q = q.replace(lmode[1], "");
rlm@46 804 }
rlm@46 805
rlm@46 806 while(path.substr(0, 1)=="/"){
rlm@46 807 path = path.substr(1);
rlm@46 808 }
rlm@46 809
rlm@46 810 while(q && lq != q){
rlm@46 811 lq = q;
rlm@46 812 var tm = q.match(tagTokenRe);
rlm@46 813 if(type == "select"){
rlm@46 814 if(tm){
rlm@46 815 if(tm[1] == "#"){
rlm@46 816 fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
rlm@46 817 }else{
rlm@46 818 fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
rlm@46 819 }
rlm@46 820 q = q.replace(tm[0], "");
rlm@46 821 }else if(q.substr(0, 1) != '@'){
rlm@46 822 fn[fn.length] = 'n = getNodes(n, mode, "*");';
rlm@46 823 }
rlm@46 824 }else{
rlm@46 825 if(tm){
rlm@46 826 if(tm[1] == "#"){
rlm@46 827 fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
rlm@46 828 }else{
rlm@46 829 fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
rlm@46 830 }
rlm@46 831 q = q.replace(tm[0], "");
rlm@46 832 }
rlm@46 833 }
rlm@46 834 while(!(mm = q.match(modeRe))){
rlm@46 835 var matched = false;
rlm@46 836 for(var j = 0; j < tklen; j++){
rlm@46 837 var t = tk[j];
rlm@46 838 var m = q.match(t.re);
rlm@46 839 if(m){
rlm@46 840 fn[fn.length] = t.select.replace(tplRe, function(x, i){
rlm@46 841 return m[i];
rlm@46 842 });
rlm@46 843 q = q.replace(m[0], "");
rlm@46 844 matched = true;
rlm@46 845 break;
rlm@46 846 }
rlm@46 847 }
rlm@46 848
rlm@46 849 if(!matched){
rlm@46 850 throw 'Error parsing selector, parsing failed at "' + q + '"';
rlm@46 851 }
rlm@46 852 }
rlm@46 853 if(mm[1]){
rlm@46 854 fn[fn.length] = 'mode="'+mm[1].replace(trimRe, "")+'";';
rlm@46 855 q = q.replace(mm[1], "");
rlm@46 856 }
rlm@46 857 }
rlm@46 858 fn[fn.length] = "return nodup(n);\n}";
rlm@46 859 eval(fn.join(""));
rlm@46 860 return f;
rlm@46 861 },
rlm@46 862
rlm@46 863
rlm@46 864 select : function(path, root, type){
rlm@46 865 if(!root || root == document){
rlm@46 866 root = document;
rlm@46 867 }
rlm@46 868 if(typeof root == "string"){
rlm@46 869 root = document.getElementById(root);
rlm@46 870 }
rlm@46 871 var paths = path.split(",");
rlm@46 872 var results = [];
rlm@46 873 for(var i = 0, len = paths.length; i < len; i++){
rlm@46 874 var p = paths[i].replace(trimRe, "");
rlm@46 875 if(!cache[p]){
rlm@46 876 cache[p] = Ext.DomQuery.compile(p);
rlm@46 877 if(!cache[p]){
rlm@46 878 throw p + " is not a valid selector";
rlm@46 879 }
rlm@46 880 }
rlm@46 881 var result = cache[p](root);
rlm@46 882 if(result && result != document){
rlm@46 883 results = results.concat(result);
rlm@46 884 }
rlm@46 885 }
rlm@46 886 if(paths.length > 1){
rlm@46 887 return nodup(results);
rlm@46 888 }
rlm@46 889 return results;
rlm@46 890 },
rlm@46 891
rlm@46 892
rlm@46 893 selectNode : function(path, root){
rlm@46 894 return Ext.DomQuery.select(path, root)[0];
rlm@46 895 },
rlm@46 896
rlm@46 897
rlm@46 898 selectValue : function(path, root, defaultValue){
rlm@46 899 path = path.replace(trimRe, "");
rlm@46 900 if(!valueCache[path]){
rlm@46 901 valueCache[path] = Ext.DomQuery.compile(path, "select");
rlm@46 902 }
rlm@46 903 var n = valueCache[path](root);
rlm@46 904 n = n[0] ? n[0] : n;
rlm@46 905 var v = (n && n.firstChild ? n.firstChild.nodeValue : null);
rlm@46 906 return ((v === null||v === undefined||v==='') ? defaultValue : v);
rlm@46 907 },
rlm@46 908
rlm@46 909
rlm@46 910 selectNumber : function(path, root, defaultValue){
rlm@46 911 var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
rlm@46 912 return parseFloat(v);
rlm@46 913 },
rlm@46 914
rlm@46 915
rlm@46 916 is : function(el, ss){
rlm@46 917 if(typeof el == "string"){
rlm@46 918 el = document.getElementById(el);
rlm@46 919 }
rlm@46 920 var isArray = Ext.isArray(el);
rlm@46 921 var result = Ext.DomQuery.filter(isArray ? el : [el], ss);
rlm@46 922 return isArray ? (result.length == el.length) : (result.length > 0);
rlm@46 923 },
rlm@46 924
rlm@46 925
rlm@46 926 filter : function(els, ss, nonMatches){
rlm@46 927 ss = ss.replace(trimRe, "");
rlm@46 928 if(!simpleCache[ss]){
rlm@46 929 simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
rlm@46 930 }
rlm@46 931 var result = simpleCache[ss](els);
rlm@46 932 return nonMatches ? quickDiff(result, els) : result;
rlm@46 933 },
rlm@46 934
rlm@46 935
rlm@46 936 matchers : [{
rlm@46 937 re: /^\.([\w-]+)/,
rlm@46 938 select: 'n = byClassName(n, null, " {1} ");'
rlm@46 939 }, {
rlm@46 940 re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
rlm@46 941 select: 'n = byPseudo(n, "{1}", "{2}");'
rlm@46 942 },{
rlm@46 943 re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
rlm@46 944 select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
rlm@46 945 }, {
rlm@46 946 re: /^#([\w-]+)/,
rlm@46 947 select: 'n = byId(n, null, "{1}");'
rlm@46 948 },{
rlm@46 949 re: /^@([\w-]+)/,
rlm@46 950 select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
rlm@46 951 }
rlm@46 952 ],
rlm@46 953
rlm@46 954
rlm@46 955 operators : {
rlm@46 956 "=" : function(a, v){
rlm@46 957 return a == v;
rlm@46 958 },
rlm@46 959 "!=" : function(a, v){
rlm@46 960 return a != v;
rlm@46 961 },
rlm@46 962 "^=" : function(a, v){
rlm@46 963 return a && a.substr(0, v.length) == v;
rlm@46 964 },
rlm@46 965 "$=" : function(a, v){
rlm@46 966 return a && a.substr(a.length-v.length) == v;
rlm@46 967 },
rlm@46 968 "*=" : function(a, v){
rlm@46 969 return a && a.indexOf(v) !== -1;
rlm@46 970 },
rlm@46 971 "%=" : function(a, v){
rlm@46 972 return (a % v) == 0;
rlm@46 973 },
rlm@46 974 "|=" : function(a, v){
rlm@46 975 return a && (a == v || a.substr(0, v.length+1) == v+'-');
rlm@46 976 },
rlm@46 977 "~=" : function(a, v){
rlm@46 978 return a && (' '+a+' ').indexOf(' '+v+' ') != -1;
rlm@46 979 }
rlm@46 980 },
rlm@46 981
rlm@46 982
rlm@46 983 pseudos : {
rlm@46 984 "first-child" : function(c){
rlm@46 985 var r = [], ri = -1, n;
rlm@46 986 for(var i = 0, ci; ci = n = c[i]; i++){
rlm@46 987 while((n = n.previousSibling) && n.nodeType != 1);
rlm@46 988 if(!n){
rlm@46 989 r[++ri] = ci;
rlm@46 990 }
rlm@46 991 }
rlm@46 992 return r;
rlm@46 993 },
rlm@46 994
rlm@46 995 "last-child" : function(c){
rlm@46 996 var r = [], ri = -1, n;
rlm@46 997 for(var i = 0, ci; ci = n = c[i]; i++){
rlm@46 998 while((n = n.nextSibling) && n.nodeType != 1);
rlm@46 999 if(!n){
rlm@46 1000 r[++ri] = ci;
rlm@46 1001 }
rlm@46 1002 }
rlm@46 1003 return r;
rlm@46 1004 },
rlm@46 1005
rlm@46 1006 "nth-child" : function(c, a) {
rlm@46 1007 var r = [], ri = -1;
rlm@46 1008 var m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a);
rlm@46 1009 var f = (m[1] || 1) - 0, l = m[2] - 0;
rlm@46 1010 for(var i = 0, n; n = c[i]; i++){
rlm@46 1011 var pn = n.parentNode;
rlm@46 1012 if (batch != pn._batch) {
rlm@46 1013 var j = 0;
rlm@46 1014 for(var cn = pn.firstChild; cn; cn = cn.nextSibling){
rlm@46 1015 if(cn.nodeType == 1){
rlm@46 1016 cn.nodeIndex = ++j;
rlm@46 1017 }
rlm@46 1018 }
rlm@46 1019 pn._batch = batch;
rlm@46 1020 }
rlm@46 1021 if (f == 1) {
rlm@46 1022 if (l == 0 || n.nodeIndex == l){
rlm@46 1023 r[++ri] = n;
rlm@46 1024 }
rlm@46 1025 } else if ((n.nodeIndex + l) % f == 0){
rlm@46 1026 r[++ri] = n;
rlm@46 1027 }
rlm@46 1028 }
rlm@46 1029
rlm@46 1030 return r;
rlm@46 1031 },
rlm@46 1032
rlm@46 1033 "only-child" : function(c){
rlm@46 1034 var r = [], ri = -1;;
rlm@46 1035 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1036 if(!prev(ci) && !next(ci)){
rlm@46 1037 r[++ri] = ci;
rlm@46 1038 }
rlm@46 1039 }
rlm@46 1040 return r;
rlm@46 1041 },
rlm@46 1042
rlm@46 1043 "empty" : function(c){
rlm@46 1044 var r = [], ri = -1;
rlm@46 1045 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1046 var cns = ci.childNodes, j = 0, cn, empty = true;
rlm@46 1047 while(cn = cns[j]){
rlm@46 1048 ++j;
rlm@46 1049 if(cn.nodeType == 1 || cn.nodeType == 3){
rlm@46 1050 empty = false;
rlm@46 1051 break;
rlm@46 1052 }
rlm@46 1053 }
rlm@46 1054 if(empty){
rlm@46 1055 r[++ri] = ci;
rlm@46 1056 }
rlm@46 1057 }
rlm@46 1058 return r;
rlm@46 1059 },
rlm@46 1060
rlm@46 1061 "contains" : function(c, v){
rlm@46 1062 var r = [], ri = -1;
rlm@46 1063 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1064 if((ci.textContent||ci.innerText||'').indexOf(v) != -1){
rlm@46 1065 r[++ri] = ci;
rlm@46 1066 }
rlm@46 1067 }
rlm@46 1068 return r;
rlm@46 1069 },
rlm@46 1070
rlm@46 1071 "nodeValue" : function(c, v){
rlm@46 1072 var r = [], ri = -1;
rlm@46 1073 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1074 if(ci.firstChild && ci.firstChild.nodeValue == v){
rlm@46 1075 r[++ri] = ci;
rlm@46 1076 }
rlm@46 1077 }
rlm@46 1078 return r;
rlm@46 1079 },
rlm@46 1080
rlm@46 1081 "checked" : function(c){
rlm@46 1082 var r = [], ri = -1;
rlm@46 1083 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1084 if(ci.checked == true){
rlm@46 1085 r[++ri] = ci;
rlm@46 1086 }
rlm@46 1087 }
rlm@46 1088 return r;
rlm@46 1089 },
rlm@46 1090
rlm@46 1091 "not" : function(c, ss){
rlm@46 1092 return Ext.DomQuery.filter(c, ss, true);
rlm@46 1093 },
rlm@46 1094
rlm@46 1095 "any" : function(c, selectors){
rlm@46 1096 var ss = selectors.split('|');
rlm@46 1097 var r = [], ri = -1, s;
rlm@46 1098 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1099 for(var j = 0; s = ss[j]; j++){
rlm@46 1100 if(Ext.DomQuery.is(ci, s)){
rlm@46 1101 r[++ri] = ci;
rlm@46 1102 break;
rlm@46 1103 }
rlm@46 1104 }
rlm@46 1105 }
rlm@46 1106 return r;
rlm@46 1107 },
rlm@46 1108
rlm@46 1109 "odd" : function(c){
rlm@46 1110 return this["nth-child"](c, "odd");
rlm@46 1111 },
rlm@46 1112
rlm@46 1113 "even" : function(c){
rlm@46 1114 return this["nth-child"](c, "even");
rlm@46 1115 },
rlm@46 1116
rlm@46 1117 "nth" : function(c, a){
rlm@46 1118 return c[a-1] || [];
rlm@46 1119 },
rlm@46 1120
rlm@46 1121 "first" : function(c){
rlm@46 1122 return c[0] || [];
rlm@46 1123 },
rlm@46 1124
rlm@46 1125 "last" : function(c){
rlm@46 1126 return c[c.length-1] || [];
rlm@46 1127 },
rlm@46 1128
rlm@46 1129 "has" : function(c, ss){
rlm@46 1130 var s = Ext.DomQuery.select;
rlm@46 1131 var r = [], ri = -1;
rlm@46 1132 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1133 if(s(ss, ci).length > 0){
rlm@46 1134 r[++ri] = ci;
rlm@46 1135 }
rlm@46 1136 }
rlm@46 1137 return r;
rlm@46 1138 },
rlm@46 1139
rlm@46 1140 "next" : function(c, ss){
rlm@46 1141 var is = Ext.DomQuery.is;
rlm@46 1142 var r = [], ri = -1;
rlm@46 1143 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1144 var n = next(ci);
rlm@46 1145 if(n && is(n, ss)){
rlm@46 1146 r[++ri] = ci;
rlm@46 1147 }
rlm@46 1148 }
rlm@46 1149 return r;
rlm@46 1150 },
rlm@46 1151
rlm@46 1152 "prev" : function(c, ss){
rlm@46 1153 var is = Ext.DomQuery.is;
rlm@46 1154 var r = [], ri = -1;
rlm@46 1155 for(var i = 0, ci; ci = c[i]; i++){
rlm@46 1156 var n = prev(ci);
rlm@46 1157 if(n && is(n, ss)){
rlm@46 1158 r[++ri] = ci;
rlm@46 1159 }
rlm@46 1160 }
rlm@46 1161 return r;
rlm@46 1162 }
rlm@46 1163 }
rlm@46 1164 };
rlm@46 1165 }();
rlm@46 1166
rlm@46 1167
rlm@46 1168 Ext.query = Ext.DomQuery.select;
rlm@46 1169
rlm@46 1170
rlm@46 1171 Ext.util.Observable = function(){
rlm@46 1172
rlm@46 1173 if(this.listeners){
rlm@46 1174 this.on(this.listeners);
rlm@46 1175 delete this.listeners;
rlm@46 1176 }
rlm@46 1177 };
rlm@46 1178 Ext.util.Observable.prototype = {
rlm@46 1179
rlm@46 1180 fireEvent : function(){
rlm@46 1181 if(this.eventsSuspended !== true){
rlm@46 1182 var ce = this.events[arguments[0].toLowerCase()];
rlm@46 1183 if(typeof ce == "object"){
rlm@46 1184 return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1));
rlm@46 1185 }
rlm@46 1186 }
rlm@46 1187 return true;
rlm@46 1188 },
rlm@46 1189
rlm@46 1190 filterOptRe : /^(?:scope|delay|buffer|single)$/,
rlm@46 1191
rlm@46 1192
rlm@46 1193 addListener : function(eventName, fn, scope, o){
rlm@46 1194 if(typeof eventName == "object"){
rlm@46 1195 o = eventName;
rlm@46 1196 for(var e in o){
rlm@46 1197 if(this.filterOptRe.test(e)){
rlm@46 1198 continue;
rlm@46 1199 }
rlm@46 1200 if(typeof o[e] == "function"){
rlm@46 1201 this.addListener(e, o[e], o.scope, o);
rlm@46 1202 }else{
rlm@46 1203 this.addListener(e, o[e].fn, o[e].scope, o[e]);
rlm@46 1204 }
rlm@46 1205 }
rlm@46 1206 return;
rlm@46 1207 }
rlm@46 1208 o = (!o || typeof o == "boolean") ? {} : o;
rlm@46 1209 eventName = eventName.toLowerCase();
rlm@46 1210 var ce = this.events[eventName] || true;
rlm@46 1211 if(typeof ce == "boolean"){
rlm@46 1212 ce = new Ext.util.Event(this, eventName);
rlm@46 1213 this.events[eventName] = ce;
rlm@46 1214 }
rlm@46 1215 ce.addListener(fn, scope, o);
rlm@46 1216 },
rlm@46 1217
rlm@46 1218
rlm@46 1219 removeListener : function(eventName, fn, scope){
rlm@46 1220 var ce = this.events[eventName.toLowerCase()];
rlm@46 1221 if(typeof ce == "object"){
rlm@46 1222 ce.removeListener(fn, scope);
rlm@46 1223 }
rlm@46 1224 },
rlm@46 1225
rlm@46 1226
rlm@46 1227 purgeListeners : function(){
rlm@46 1228 for(var evt in this.events){
rlm@46 1229 if(typeof this.events[evt] == "object"){
rlm@46 1230 this.events[evt].clearListeners();
rlm@46 1231 }
rlm@46 1232 }
rlm@46 1233 },
rlm@46 1234
rlm@46 1235
rlm@46 1236 relayEvents : function(o, events){
rlm@46 1237 var createHandler = function(ename){
rlm@46 1238 return function(){
rlm@46 1239 return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0)));
rlm@46 1240 };
rlm@46 1241 };
rlm@46 1242 for(var i = 0, len = events.length; i < len; i++){
rlm@46 1243 var ename = events[i];
rlm@46 1244 if(!this.events[ename]){ this.events[ename] = true; };
rlm@46 1245 o.on(ename, createHandler(ename), this);
rlm@46 1246 }
rlm@46 1247 },
rlm@46 1248
rlm@46 1249
rlm@46 1250 addEvents : function(o){
rlm@46 1251 if(!this.events){
rlm@46 1252 this.events = {};
rlm@46 1253 }
rlm@46 1254 if(typeof o == 'string'){
rlm@46 1255 for(var i = 0, a = arguments, v; v = a[i]; i++){
rlm@46 1256 if(!this.events[a[i]]){
rlm@46 1257 this.events[a[i]] = true;
rlm@46 1258 }
rlm@46 1259 }
rlm@46 1260 }else{
rlm@46 1261 Ext.applyIf(this.events, o);
rlm@46 1262 }
rlm@46 1263 },
rlm@46 1264
rlm@46 1265
rlm@46 1266 hasListener : function(eventName){
rlm@46 1267 var e = this.events[eventName];
rlm@46 1268 return typeof e == "object" && e.listeners.length > 0;
rlm@46 1269 },
rlm@46 1270
rlm@46 1271
rlm@46 1272 suspendEvents : function(){
rlm@46 1273 this.eventsSuspended = true;
rlm@46 1274 },
rlm@46 1275
rlm@46 1276
rlm@46 1277 resumeEvents : function(){
rlm@46 1278 this.eventsSuspended = false;
rlm@46 1279 },
rlm@46 1280
rlm@46 1281 getMethodEvent : function(method){
rlm@46 1282 if(!this.methodEvents){
rlm@46 1283 this.methodEvents = {};
rlm@46 1284 }
rlm@46 1285 var e = this.methodEvents[method];
rlm@46 1286 if(!e){
rlm@46 1287 e = {};
rlm@46 1288 this.methodEvents[method] = e;
rlm@46 1289
rlm@46 1290 e.originalFn = this[method];
rlm@46 1291 e.methodName = method;
rlm@46 1292 e.before = [];
rlm@46 1293 e.after = [];
rlm@46 1294
rlm@46 1295
rlm@46 1296 var returnValue, v, cancel;
rlm@46 1297 var obj = this;
rlm@46 1298
rlm@46 1299 var makeCall = function(fn, scope, args){
rlm@46 1300 if((v = fn.apply(scope || obj, args)) !== undefined){
rlm@46 1301 if(typeof v === 'object'){
rlm@46 1302 if(v.returnValue !== undefined){
rlm@46 1303 returnValue = v.returnValue;
rlm@46 1304 }else{
rlm@46 1305 returnValue = v;
rlm@46 1306 }
rlm@46 1307 if(v.cancel === true){
rlm@46 1308 cancel = true;
rlm@46 1309 }
rlm@46 1310 }else if(v === false){
rlm@46 1311 cancel = true;
rlm@46 1312 }else {
rlm@46 1313 returnValue = v;
rlm@46 1314 }
rlm@46 1315 }
rlm@46 1316 }
rlm@46 1317
rlm@46 1318 this[method] = function(){
rlm@46 1319 returnValue = v = undefined; cancel = false;
rlm@46 1320 var args = Array.prototype.slice.call(arguments, 0);
rlm@46 1321 for(var i = 0, len = e.before.length; i < len; i++){
rlm@46 1322 makeCall(e.before[i].fn, e.before[i].scope, args);
rlm@46 1323 if(cancel){
rlm@46 1324 return returnValue;
rlm@46 1325 }
rlm@46 1326 }
rlm@46 1327
rlm@46 1328 if((v = e.originalFn.apply(obj, args)) !== undefined){
rlm@46 1329 returnValue = v;
rlm@46 1330 }
rlm@46 1331
rlm@46 1332 for(var i = 0, len = e.after.length; i < len; i++){
rlm@46 1333 makeCall(e.after[i].fn, e.after[i].scope, args);
rlm@46 1334 if(cancel){
rlm@46 1335 return returnValue;
rlm@46 1336 }
rlm@46 1337 }
rlm@46 1338 return returnValue;
rlm@46 1339 };
rlm@46 1340 }
rlm@46 1341 return e;
rlm@46 1342 },
rlm@46 1343
rlm@46 1344 beforeMethod : function(method, fn, scope){
rlm@46 1345 var e = this.getMethodEvent(method);
rlm@46 1346 e.before.push({fn: fn, scope: scope});
rlm@46 1347 },
rlm@46 1348
rlm@46 1349 afterMethod : function(method, fn, scope){
rlm@46 1350 var e = this.getMethodEvent(method);
rlm@46 1351 e.after.push({fn: fn, scope: scope});
rlm@46 1352 },
rlm@46 1353
rlm@46 1354 removeMethodListener : function(method, fn, scope){
rlm@46 1355 var e = this.getMethodEvent(method);
rlm@46 1356 for(var i = 0, len = e.before.length; i < len; i++){
rlm@46 1357 if(e.before[i].fn == fn && e.before[i].scope == scope){
rlm@46 1358 e.before.splice(i, 1);
rlm@46 1359 return;
rlm@46 1360 }
rlm@46 1361 }
rlm@46 1362 for(var i = 0, len = e.after.length; i < len; i++){
rlm@46 1363 if(e.after[i].fn == fn && e.after[i].scope == scope){
rlm@46 1364 e.after.splice(i, 1);
rlm@46 1365 return;
rlm@46 1366 }
rlm@46 1367 }
rlm@46 1368 }
rlm@46 1369 };
rlm@46 1370
rlm@46 1371 Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;
rlm@46 1372
rlm@46 1373 Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;
rlm@46 1374
rlm@46 1375
rlm@46 1376 Ext.util.Observable.capture = function(o, fn, scope){
rlm@46 1377 o.fireEvent = o.fireEvent.createInterceptor(fn, scope);
rlm@46 1378 };
rlm@46 1379
rlm@46 1380
rlm@46 1381 Ext.util.Observable.releaseCapture = function(o){
rlm@46 1382 o.fireEvent = Ext.util.Observable.prototype.fireEvent;
rlm@46 1383 };
rlm@46 1384
rlm@46 1385 (function(){
rlm@46 1386
rlm@46 1387 var createBuffered = function(h, o, scope){
rlm@46 1388 var task = new Ext.util.DelayedTask();
rlm@46 1389 return function(){
rlm@46 1390 task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0));
rlm@46 1391 };
rlm@46 1392 };
rlm@46 1393
rlm@46 1394 var createSingle = function(h, e, fn, scope){
rlm@46 1395 return function(){
rlm@46 1396 e.removeListener(fn, scope);
rlm@46 1397 return h.apply(scope, arguments);
rlm@46 1398 };
rlm@46 1399 };
rlm@46 1400
rlm@46 1401 var createDelayed = function(h, o, scope){
rlm@46 1402 return function(){
rlm@46 1403 var args = Array.prototype.slice.call(arguments, 0);
rlm@46 1404 setTimeout(function(){
rlm@46 1405 h.apply(scope, args);
rlm@46 1406 }, o.delay || 10);
rlm@46 1407 };
rlm@46 1408 };
rlm@46 1409
rlm@46 1410 Ext.util.Event = function(obj, name){
rlm@46 1411 this.name = name;
rlm@46 1412 this.obj = obj;
rlm@46 1413 this.listeners = [];
rlm@46 1414 };
rlm@46 1415
rlm@46 1416 Ext.util.Event.prototype = {
rlm@46 1417 addListener : function(fn, scope, options){
rlm@46 1418 scope = scope || this.obj;
rlm@46 1419 if(!this.isListening(fn, scope)){
rlm@46 1420 var l = this.createListener(fn, scope, options);
rlm@46 1421 if(!this.firing){
rlm@46 1422 this.listeners.push(l);
rlm@46 1423 }else{ this.listeners = this.listeners.slice(0);
rlm@46 1424 this.listeners.push(l);
rlm@46 1425 }
rlm@46 1426 }
rlm@46 1427 },
rlm@46 1428
rlm@46 1429 createListener : function(fn, scope, o){
rlm@46 1430 o = o || {};
rlm@46 1431 scope = scope || this.obj;
rlm@46 1432 var l = {fn: fn, scope: scope, options: o};
rlm@46 1433 var h = fn;
rlm@46 1434 if(o.delay){
rlm@46 1435 h = createDelayed(h, o, scope);
rlm@46 1436 }
rlm@46 1437 if(o.single){
rlm@46 1438 h = createSingle(h, this, fn, scope);
rlm@46 1439 }
rlm@46 1440 if(o.buffer){
rlm@46 1441 h = createBuffered(h, o, scope);
rlm@46 1442 }
rlm@46 1443 l.fireFn = h;
rlm@46 1444 return l;
rlm@46 1445 },
rlm@46 1446
rlm@46 1447 findListener : function(fn, scope){
rlm@46 1448 scope = scope || this.obj;
rlm@46 1449 var ls = this.listeners;
rlm@46 1450 for(var i = 0, len = ls.length; i < len; i++){
rlm@46 1451 var l = ls[i];
rlm@46 1452 if(l.fn == fn && l.scope == scope){
rlm@46 1453 return i;
rlm@46 1454 }
rlm@46 1455 }
rlm@46 1456 return -1;
rlm@46 1457 },
rlm@46 1458
rlm@46 1459 isListening : function(fn, scope){
rlm@46 1460 return this.findListener(fn, scope) != -1;
rlm@46 1461 },
rlm@46 1462
rlm@46 1463 removeListener : function(fn, scope){
rlm@46 1464 var index;
rlm@46 1465 if((index = this.findListener(fn, scope)) != -1){
rlm@46 1466 if(!this.firing){
rlm@46 1467 this.listeners.splice(index, 1);
rlm@46 1468 }else{
rlm@46 1469 this.listeners = this.listeners.slice(0);
rlm@46 1470 this.listeners.splice(index, 1);
rlm@46 1471 }
rlm@46 1472 return true;
rlm@46 1473 }
rlm@46 1474 return false;
rlm@46 1475 },
rlm@46 1476
rlm@46 1477 clearListeners : function(){
rlm@46 1478 this.listeners = [];
rlm@46 1479 },
rlm@46 1480
rlm@46 1481 fire : function(){
rlm@46 1482 var ls = this.listeners, scope, len = ls.length;
rlm@46 1483 if(len > 0){
rlm@46 1484 this.firing = true;
rlm@46 1485 var args = Array.prototype.slice.call(arguments, 0);
rlm@46 1486 for(var i = 0; i < len; i++){
rlm@46 1487 var l = ls[i];
rlm@46 1488 if(l.fireFn.apply(l.scope||this.obj||window, arguments) === false){
rlm@46 1489 this.firing = false;
rlm@46 1490 return false;
rlm@46 1491 }
rlm@46 1492 }
rlm@46 1493 this.firing = false;
rlm@46 1494 }
rlm@46 1495 return true;
rlm@46 1496 }
rlm@46 1497 };
rlm@46 1498 })();
rlm@46 1499
rlm@46 1500 Ext.EventManager = function(){
rlm@46 1501 var docReadyEvent, docReadyProcId, docReadyState = false;
rlm@46 1502 var resizeEvent, resizeTask, textEvent, textSize;
rlm@46 1503 var E = Ext.lib.Event;
rlm@46 1504 var D = Ext.lib.Dom;
rlm@46 1505
rlm@46 1506
rlm@46 1507 var fireDocReady = function(){
rlm@46 1508 if(!docReadyState){
rlm@46 1509 docReadyState = true;
rlm@46 1510 Ext.isReady = true;
rlm@46 1511 if(docReadyProcId){
rlm@46 1512 clearInterval(docReadyProcId);
rlm@46 1513 }
rlm@46 1514 if(Ext.isGecko || Ext.isOpera) {
rlm@46 1515 document.removeEventListener("DOMContentLoaded", fireDocReady, false);
rlm@46 1516 }
rlm@46 1517 if(Ext.isIE){
rlm@46 1518 var defer = document.getElementById("ie-deferred-loader");
rlm@46 1519 if(defer){
rlm@46 1520 defer.onreadystatechange = null;
rlm@46 1521 defer.parentNode.removeChild(defer);
rlm@46 1522 }
rlm@46 1523 }
rlm@46 1524 if(docReadyEvent){
rlm@46 1525 docReadyEvent.fire();
rlm@46 1526 docReadyEvent.clearListeners();
rlm@46 1527 }
rlm@46 1528 }
rlm@46 1529 };
rlm@46 1530
rlm@46 1531 var initDocReady = function(){
rlm@46 1532 docReadyEvent = new Ext.util.Event();
rlm@46 1533 if(Ext.isGecko || Ext.isOpera) {
rlm@46 1534 document.addEventListener("DOMContentLoaded", fireDocReady, false);
rlm@46 1535 }else if(Ext.isIE){
rlm@46 1536 document.write("<s"+'cript id="ie-deferred-loader" defer="defer" src="/'+'/:"></s'+"cript>");
rlm@46 1537 var defer = document.getElementById("ie-deferred-loader");
rlm@46 1538 defer.onreadystatechange = function(){
rlm@46 1539 if(this.readyState == "complete"){
rlm@46 1540 fireDocReady();
rlm@46 1541 }
rlm@46 1542 };
rlm@46 1543 }else if(Ext.isSafari){
rlm@46 1544 docReadyProcId = setInterval(function(){
rlm@46 1545 var rs = document.readyState;
rlm@46 1546 if(rs == "complete") {
rlm@46 1547 fireDocReady();
rlm@46 1548 }
rlm@46 1549 }, 10);
rlm@46 1550 }
rlm@46 1551
rlm@46 1552 E.on(window, "load", fireDocReady);
rlm@46 1553 };
rlm@46 1554
rlm@46 1555 var createBuffered = function(h, o){
rlm@46 1556 var task = new Ext.util.DelayedTask(h);
rlm@46 1557 return function(e){
rlm@46 1558
rlm@46 1559 e = new Ext.EventObjectImpl(e);
rlm@46 1560 task.delay(o.buffer, h, null, [e]);
rlm@46 1561 };
rlm@46 1562 };
rlm@46 1563
rlm@46 1564 var createSingle = function(h, el, ename, fn){
rlm@46 1565 return function(e){
rlm@46 1566 Ext.EventManager.removeListener(el, ename, fn);
rlm@46 1567 h(e);
rlm@46 1568 };
rlm@46 1569 };
rlm@46 1570
rlm@46 1571 var createDelayed = function(h, o){
rlm@46 1572 return function(e){
rlm@46 1573
rlm@46 1574 e = new Ext.EventObjectImpl(e);
rlm@46 1575 setTimeout(function(){
rlm@46 1576 h(e);
rlm@46 1577 }, o.delay || 10);
rlm@46 1578 };
rlm@46 1579 };
rlm@46 1580
rlm@46 1581 var listen = function(element, ename, opt, fn, scope){
rlm@46 1582 var o = (!opt || typeof opt == "boolean") ? {} : opt;
rlm@46 1583 fn = fn || o.fn; scope = scope || o.scope;
rlm@46 1584 var el = Ext.getDom(element);
rlm@46 1585 if(!el){
rlm@46 1586 throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.';
rlm@46 1587 }
rlm@46 1588 var h = function(e){
rlm@46 1589 e = Ext.EventObject.setEvent(e);
rlm@46 1590 var t;
rlm@46 1591 if(o.delegate){
rlm@46 1592 t = e.getTarget(o.delegate, el);
rlm@46 1593 if(!t){
rlm@46 1594 return;
rlm@46 1595 }
rlm@46 1596 }else{
rlm@46 1597 t = e.target;
rlm@46 1598 }
rlm@46 1599 if(o.stopEvent === true){
rlm@46 1600 e.stopEvent();
rlm@46 1601 }
rlm@46 1602 if(o.preventDefault === true){
rlm@46 1603 e.preventDefault();
rlm@46 1604 }
rlm@46 1605 if(o.stopPropagation === true){
rlm@46 1606 e.stopPropagation();
rlm@46 1607 }
rlm@46 1608
rlm@46 1609 if(o.normalized === false){
rlm@46 1610 e = e.browserEvent;
rlm@46 1611 }
rlm@46 1612
rlm@46 1613 fn.call(scope || el, e, t, o);
rlm@46 1614 };
rlm@46 1615 if(o.delay){
rlm@46 1616 h = createDelayed(h, o);
rlm@46 1617 }
rlm@46 1618 if(o.single){
rlm@46 1619 h = createSingle(h, el, ename, fn);
rlm@46 1620 }
rlm@46 1621 if(o.buffer){
rlm@46 1622 h = createBuffered(h, o);
rlm@46 1623 }
rlm@46 1624 fn._handlers = fn._handlers || [];
rlm@46 1625 fn._handlers.push([Ext.id(el), ename, h]);
rlm@46 1626
rlm@46 1627 E.on(el, ename, h);
rlm@46 1628 if(ename == "mousewheel" && el.addEventListener){
rlm@46 1629 el.addEventListener("DOMMouseScroll", h, false);
rlm@46 1630 E.on(window, 'unload', function(){
rlm@46 1631 el.removeEventListener("DOMMouseScroll", h, false);
rlm@46 1632 });
rlm@46 1633 }
rlm@46 1634 if(ename == "mousedown" && el == document){
rlm@46 1635 Ext.EventManager.stoppedMouseDownEvent.addListener(h);
rlm@46 1636 }
rlm@46 1637 return h;
rlm@46 1638 };
rlm@46 1639
rlm@46 1640 var stopListening = function(el, ename, fn){
rlm@46 1641 var id = Ext.id(el), hds = fn._handlers, hd = fn;
rlm@46 1642 if(hds){
rlm@46 1643 for(var i = 0, len = hds.length; i < len; i++){
rlm@46 1644 var h = hds[i];
rlm@46 1645 if(h[0] == id && h[1] == ename){
rlm@46 1646 hd = h[2];
rlm@46 1647 hds.splice(i, 1);
rlm@46 1648 break;
rlm@46 1649 }
rlm@46 1650 }
rlm@46 1651 }
rlm@46 1652 E.un(el, ename, hd);
rlm@46 1653 el = Ext.getDom(el);
rlm@46 1654 if(ename == "mousewheel" && el.addEventListener){
rlm@46 1655 el.removeEventListener("DOMMouseScroll", hd, false);
rlm@46 1656 }
rlm@46 1657 if(ename == "mousedown" && el == document){
rlm@46 1658 Ext.EventManager.stoppedMouseDownEvent.removeListener(hd);
rlm@46 1659 }
rlm@46 1660 };
rlm@46 1661
rlm@46 1662 var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
rlm@46 1663 var pub = {
rlm@46 1664
rlm@46 1665
rlm@46 1666 addListener : function(element, eventName, fn, scope, options){
rlm@46 1667 if(typeof eventName == "object"){
rlm@46 1668 var o = eventName;
rlm@46 1669 for(var e in o){
rlm@46 1670 if(propRe.test(e)){
rlm@46 1671 continue;
rlm@46 1672 }
rlm@46 1673 if(typeof o[e] == "function"){
rlm@46 1674
rlm@46 1675 listen(element, e, o, o[e], o.scope);
rlm@46 1676 }else{
rlm@46 1677
rlm@46 1678 listen(element, e, o[e]);
rlm@46 1679 }
rlm@46 1680 }
rlm@46 1681 return;
rlm@46 1682 }
rlm@46 1683 return listen(element, eventName, options, fn, scope);
rlm@46 1684 },
rlm@46 1685
rlm@46 1686
rlm@46 1687 removeListener : function(element, eventName, fn){
rlm@46 1688 return stopListening(element, eventName, fn);
rlm@46 1689 },
rlm@46 1690
rlm@46 1691
rlm@46 1692 onDocumentReady : function(fn, scope, options){
rlm@46 1693 if(docReadyState){
rlm@46 1694 docReadyEvent.addListener(fn, scope, options);
rlm@46 1695 docReadyEvent.fire();
rlm@46 1696 docReadyEvent.clearListeners();
rlm@46 1697 return;
rlm@46 1698 }
rlm@46 1699 if(!docReadyEvent){
rlm@46 1700 initDocReady();
rlm@46 1701 }
rlm@46 1702 docReadyEvent.addListener(fn, scope, options);
rlm@46 1703 },
rlm@46 1704
rlm@46 1705
rlm@46 1706 onWindowResize : function(fn, scope, options){
rlm@46 1707 if(!resizeEvent){
rlm@46 1708 resizeEvent = new Ext.util.Event();
rlm@46 1709 resizeTask = new Ext.util.DelayedTask(function(){
rlm@46 1710 resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
rlm@46 1711 });
rlm@46 1712 E.on(window, "resize", this.fireWindowResize, this);
rlm@46 1713 }
rlm@46 1714 resizeEvent.addListener(fn, scope, options);
rlm@46 1715 },
rlm@46 1716
rlm@46 1717
rlm@46 1718 fireWindowResize : function(){
rlm@46 1719 if(resizeEvent){
rlm@46 1720 if((Ext.isIE||Ext.isAir) && resizeTask){
rlm@46 1721 resizeTask.delay(50);
rlm@46 1722 }else{
rlm@46 1723 resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
rlm@46 1724 }
rlm@46 1725 }
rlm@46 1726 },
rlm@46 1727
rlm@46 1728
rlm@46 1729 onTextResize : function(fn, scope, options){
rlm@46 1730 if(!textEvent){
rlm@46 1731 textEvent = new Ext.util.Event();
rlm@46 1732 var textEl = new Ext.Element(document.createElement('div'));
rlm@46 1733 textEl.dom.className = 'x-text-resize';
rlm@46 1734 textEl.dom.innerHTML = 'X';
rlm@46 1735 textEl.appendTo(document.body);
rlm@46 1736 textSize = textEl.dom.offsetHeight;
rlm@46 1737 setInterval(function(){
rlm@46 1738 if(textEl.dom.offsetHeight != textSize){
rlm@46 1739 textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);
rlm@46 1740 }
rlm@46 1741 }, this.textResizeInterval);
rlm@46 1742 }
rlm@46 1743 textEvent.addListener(fn, scope, options);
rlm@46 1744 },
rlm@46 1745
rlm@46 1746
rlm@46 1747 removeResizeListener : function(fn, scope){
rlm@46 1748 if(resizeEvent){
rlm@46 1749 resizeEvent.removeListener(fn, scope);
rlm@46 1750 }
rlm@46 1751 },
rlm@46 1752
rlm@46 1753
rlm@46 1754 fireResize : function(){
rlm@46 1755 if(resizeEvent){
rlm@46 1756 resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
rlm@46 1757 }
rlm@46 1758 },
rlm@46 1759
rlm@46 1760 ieDeferSrc : false,
rlm@46 1761
rlm@46 1762 textResizeInterval : 50
rlm@46 1763 };
rlm@46 1764
rlm@46 1765 pub.on = pub.addListener;
rlm@46 1766
rlm@46 1767 pub.un = pub.removeListener;
rlm@46 1768
rlm@46 1769 pub.stoppedMouseDownEvent = new Ext.util.Event();
rlm@46 1770 return pub;
rlm@46 1771 }();
rlm@46 1772
rlm@46 1773 Ext.onReady = Ext.EventManager.onDocumentReady;
rlm@46 1774
rlm@46 1775 Ext.onReady(function(){
rlm@46 1776 var bd = Ext.getBody();
rlm@46 1777 if(!bd){ return; }
rlm@46 1778
rlm@46 1779 var cls = [
rlm@46 1780 Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : 'ext-ie7')
rlm@46 1781 : Ext.isGecko ? "ext-gecko"
rlm@46 1782 : Ext.isOpera ? "ext-opera"
rlm@46 1783 : Ext.isSafari ? "ext-safari" : ""];
rlm@46 1784
rlm@46 1785 if(Ext.isMac){
rlm@46 1786 cls.push("ext-mac");
rlm@46 1787 }
rlm@46 1788 if(Ext.isLinux){
rlm@46 1789 cls.push("ext-linux");
rlm@46 1790 }
rlm@46 1791 if(Ext.isBorderBox){
rlm@46 1792 cls.push('ext-border-box');
rlm@46 1793 }
rlm@46 1794 if(Ext.isStrict){
rlm@46 1795 var p = bd.dom.parentNode;
rlm@46 1796 if(p){
rlm@46 1797 p.className += ' ext-strict';
rlm@46 1798 }
rlm@46 1799 }
rlm@46 1800 bd.addClass(cls.join(' '));
rlm@46 1801 });
rlm@46 1802
rlm@46 1803
rlm@46 1804 Ext.EventObject = function(){
rlm@46 1805
rlm@46 1806 var E = Ext.lib.Event;
rlm@46 1807
rlm@46 1808
rlm@46 1809 var safariKeys = {
rlm@46 1810 63234 : 37,
rlm@46 1811 63235 : 39,
rlm@46 1812 63232 : 38,
rlm@46 1813 63233 : 40,
rlm@46 1814 63276 : 33,
rlm@46 1815 63277 : 34,
rlm@46 1816 63272 : 46,
rlm@46 1817 63273 : 36,
rlm@46 1818 63275 : 35
rlm@46 1819 };
rlm@46 1820
rlm@46 1821
rlm@46 1822 var btnMap = Ext.isIE ? {1:0,4:1,2:2} :
rlm@46 1823 (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2});
rlm@46 1824
rlm@46 1825 Ext.EventObjectImpl = function(e){
rlm@46 1826 if(e){
rlm@46 1827 this.setEvent(e.browserEvent || e);
rlm@46 1828 }
rlm@46 1829 };
rlm@46 1830 Ext.EventObjectImpl.prototype = {
rlm@46 1831
rlm@46 1832 browserEvent : null,
rlm@46 1833
rlm@46 1834 button : -1,
rlm@46 1835
rlm@46 1836 shiftKey : false,
rlm@46 1837
rlm@46 1838 ctrlKey : false,
rlm@46 1839
rlm@46 1840 altKey : false,
rlm@46 1841
rlm@46 1842
rlm@46 1843 BACKSPACE : 8,
rlm@46 1844
rlm@46 1845 TAB : 9,
rlm@46 1846
rlm@46 1847 RETURN : 13,
rlm@46 1848
rlm@46 1849 ENTER : 13,
rlm@46 1850
rlm@46 1851 SHIFT : 16,
rlm@46 1852
rlm@46 1853 CONTROL : 17,
rlm@46 1854
rlm@46 1855 ESC : 27,
rlm@46 1856
rlm@46 1857 SPACE : 32,
rlm@46 1858
rlm@46 1859 PAGEUP : 33,
rlm@46 1860
rlm@46 1861 PAGEDOWN : 34,
rlm@46 1862
rlm@46 1863 END : 35,
rlm@46 1864
rlm@46 1865 HOME : 36,
rlm@46 1866
rlm@46 1867 LEFT : 37,
rlm@46 1868
rlm@46 1869 UP : 38,
rlm@46 1870
rlm@46 1871 RIGHT : 39,
rlm@46 1872
rlm@46 1873 DOWN : 40,
rlm@46 1874
rlm@46 1875 DELETE : 46,
rlm@46 1876
rlm@46 1877 F5 : 116,
rlm@46 1878
rlm@46 1879
rlm@46 1880 setEvent : function(e){
rlm@46 1881 if(e == this || (e && e.browserEvent)){
rlm@46 1882 return e;
rlm@46 1883 }
rlm@46 1884 this.browserEvent = e;
rlm@46 1885 if(e){
rlm@46 1886
rlm@46 1887 this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1);
rlm@46 1888 if(e.type == 'click' && this.button == -1){
rlm@46 1889 this.button = 0;
rlm@46 1890 }
rlm@46 1891 this.type = e.type;
rlm@46 1892 this.shiftKey = e.shiftKey;
rlm@46 1893
rlm@46 1894 this.ctrlKey = e.ctrlKey || e.metaKey;
rlm@46 1895 this.altKey = e.altKey;
rlm@46 1896
rlm@46 1897 this.keyCode = e.keyCode;
rlm@46 1898 this.charCode = e.charCode;
rlm@46 1899
rlm@46 1900 this.target = E.getTarget(e);
rlm@46 1901
rlm@46 1902 this.xy = E.getXY(e);
rlm@46 1903 }else{
rlm@46 1904 this.button = -1;
rlm@46 1905 this.shiftKey = false;
rlm@46 1906 this.ctrlKey = false;
rlm@46 1907 this.altKey = false;
rlm@46 1908 this.keyCode = 0;
rlm@46 1909 this.charCode =0;
rlm@46 1910 this.target = null;
rlm@46 1911 this.xy = [0, 0];
rlm@46 1912 }
rlm@46 1913 return this;
rlm@46 1914 },
rlm@46 1915
rlm@46 1916
rlm@46 1917 stopEvent : function(){
rlm@46 1918 if(this.browserEvent){
rlm@46 1919 if(this.browserEvent.type == 'mousedown'){
rlm@46 1920 Ext.EventManager.stoppedMouseDownEvent.fire(this);
rlm@46 1921 }
rlm@46 1922 E.stopEvent(this.browserEvent);
rlm@46 1923 }
rlm@46 1924 },
rlm@46 1925
rlm@46 1926
rlm@46 1927 preventDefault : function(){
rlm@46 1928 if(this.browserEvent){
rlm@46 1929 E.preventDefault(this.browserEvent);
rlm@46 1930 }
rlm@46 1931 },
rlm@46 1932
rlm@46 1933
rlm@46 1934 isNavKeyPress : function(){
rlm@46 1935 var k = this.keyCode;
rlm@46 1936 k = Ext.isSafari ? (safariKeys[k] || k) : k;
rlm@46 1937 return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC;
rlm@46 1938 },
rlm@46 1939
rlm@46 1940 isSpecialKey : function(){
rlm@46 1941 var k = this.keyCode;
rlm@46 1942 return (this.type == 'keypress' && this.ctrlKey) || k == 9 || k == 13 || k == 40 || k == 27 ||
rlm@46 1943 (k == 16) || (k == 17) ||
rlm@46 1944 (k >= 18 && k <= 20) ||
rlm@46 1945 (k >= 33 && k <= 35) ||
rlm@46 1946 (k >= 36 && k <= 39) ||
rlm@46 1947 (k >= 44 && k <= 45);
rlm@46 1948 },
rlm@46 1949
rlm@46 1950 stopPropagation : function(){
rlm@46 1951 if(this.browserEvent){
rlm@46 1952 if(this.browserEvent.type == 'mousedown'){
rlm@46 1953 Ext.EventManager.stoppedMouseDownEvent.fire(this);
rlm@46 1954 }
rlm@46 1955 E.stopPropagation(this.browserEvent);
rlm@46 1956 }
rlm@46 1957 },
rlm@46 1958
rlm@46 1959
rlm@46 1960 getCharCode : function(){
rlm@46 1961 return this.charCode || this.keyCode;
rlm@46 1962 },
rlm@46 1963
rlm@46 1964
rlm@46 1965 getKey : function(){
rlm@46 1966 var k = this.keyCode || this.charCode;
rlm@46 1967 return Ext.isSafari ? (safariKeys[k] || k) : k;
rlm@46 1968 },
rlm@46 1969
rlm@46 1970
rlm@46 1971 getPageX : function(){
rlm@46 1972 return this.xy[0];
rlm@46 1973 },
rlm@46 1974
rlm@46 1975
rlm@46 1976 getPageY : function(){
rlm@46 1977 return this.xy[1];
rlm@46 1978 },
rlm@46 1979
rlm@46 1980
rlm@46 1981 getTime : function(){
rlm@46 1982 if(this.browserEvent){
rlm@46 1983 return E.getTime(this.browserEvent);
rlm@46 1984 }
rlm@46 1985 return null;
rlm@46 1986 },
rlm@46 1987
rlm@46 1988
rlm@46 1989 getXY : function(){
rlm@46 1990 return this.xy;
rlm@46 1991 },
rlm@46 1992
rlm@46 1993
rlm@46 1994 getTarget : function(selector, maxDepth, returnEl){
rlm@46 1995 return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
rlm@46 1996 },
rlm@46 1997
rlm@46 1998
rlm@46 1999 getRelatedTarget : function(){
rlm@46 2000 if(this.browserEvent){
rlm@46 2001 return E.getRelatedTarget(this.browserEvent);
rlm@46 2002 }
rlm@46 2003 return null;
rlm@46 2004 },
rlm@46 2005
rlm@46 2006
rlm@46 2007 getWheelDelta : function(){
rlm@46 2008 var e = this.browserEvent;
rlm@46 2009 var delta = 0;
rlm@46 2010 if(e.wheelDelta){
rlm@46 2011 delta = e.wheelDelta/120;
rlm@46 2012 }else if(e.detail){
rlm@46 2013 delta = -e.detail/3;
rlm@46 2014 }
rlm@46 2015 return delta;
rlm@46 2016 },
rlm@46 2017
rlm@46 2018
rlm@46 2019 hasModifier : function(){
rlm@46 2020 return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true : false;
rlm@46 2021 },
rlm@46 2022
rlm@46 2023
rlm@46 2024 within : function(el, related){
rlm@46 2025 var t = this[related ? "getRelatedTarget" : "getTarget"]();
rlm@46 2026 return t && Ext.fly(el).contains(t);
rlm@46 2027 },
rlm@46 2028
rlm@46 2029 getPoint : function(){
rlm@46 2030 return new Ext.lib.Point(this.xy[0], this.xy[1]);
rlm@46 2031 }
rlm@46 2032 };
rlm@46 2033
rlm@46 2034 return new Ext.EventObjectImpl();
rlm@46 2035 }();
rlm@46 2036
rlm@46 2037 (function(){
rlm@46 2038 var D = Ext.lib.Dom;
rlm@46 2039 var E = Ext.lib.Event;
rlm@46 2040 var A = Ext.lib.Anim;
rlm@46 2041
rlm@46 2042 var propCache = {};
rlm@46 2043 var camelRe = /(-[a-z])/gi;
rlm@46 2044 var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
rlm@46 2045 var view = document.defaultView;
rlm@46 2046
rlm@46 2047 Ext.Element = function(element, forceNew){
rlm@46 2048 var dom = typeof element == "string" ?
rlm@46 2049 document.getElementById(element) : element;
rlm@46 2050 if(!dom){ return null;
rlm@46 2051 }
rlm@46 2052 var id = dom.id;
rlm@46 2053 if(forceNew !== true && id && Ext.Element.cache[id]){ return Ext.Element.cache[id];
rlm@46 2054 }
rlm@46 2055
rlm@46 2056
rlm@46 2057 this.dom = dom;
rlm@46 2058
rlm@46 2059
rlm@46 2060 this.id = id || Ext.id(dom);
rlm@46 2061 };
rlm@46 2062
rlm@46 2063 var El = Ext.Element;
rlm@46 2064
rlm@46 2065 El.prototype = {
rlm@46 2066
rlm@46 2067 originalDisplay : "",
rlm@46 2068
rlm@46 2069 visibilityMode : 1,
rlm@46 2070
rlm@46 2071 defaultUnit : "px",
rlm@46 2072
rlm@46 2073 setVisibilityMode : function(visMode){
rlm@46 2074 this.visibilityMode = visMode;
rlm@46 2075 return this;
rlm@46 2076 },
rlm@46 2077
rlm@46 2078 enableDisplayMode : function(display){
rlm@46 2079 this.setVisibilityMode(El.DISPLAY);
rlm@46 2080 if(typeof display != "undefined") this.originalDisplay = display;
rlm@46 2081 return this;
rlm@46 2082 },
rlm@46 2083
rlm@46 2084
rlm@46 2085 findParent : function(simpleSelector, maxDepth, returnEl){
rlm@46 2086 var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl;
rlm@46 2087 maxDepth = maxDepth || 50;
rlm@46 2088 if(typeof maxDepth != "number"){
rlm@46 2089 stopEl = Ext.getDom(maxDepth);
rlm@46 2090 maxDepth = 10;
rlm@46 2091 }
rlm@46 2092 while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){
rlm@46 2093 if(dq.is(p, simpleSelector)){
rlm@46 2094 return returnEl ? Ext.get(p) : p;
rlm@46 2095 }
rlm@46 2096 depth++;
rlm@46 2097 p = p.parentNode;
rlm@46 2098 }
rlm@46 2099 return null;
rlm@46 2100 },
rlm@46 2101
rlm@46 2102
rlm@46 2103
rlm@46 2104 findParentNode : function(simpleSelector, maxDepth, returnEl){
rlm@46 2105 var p = Ext.fly(this.dom.parentNode, '_internal');
rlm@46 2106 return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
rlm@46 2107 },
rlm@46 2108
rlm@46 2109
rlm@46 2110 up : function(simpleSelector, maxDepth){
rlm@46 2111 return this.findParentNode(simpleSelector, maxDepth, true);
rlm@46 2112 },
rlm@46 2113
rlm@46 2114
rlm@46 2115
rlm@46 2116
rlm@46 2117 is : function(simpleSelector){
rlm@46 2118 return Ext.DomQuery.is(this.dom, simpleSelector);
rlm@46 2119 },
rlm@46 2120
rlm@46 2121
rlm@46 2122 animate : function(args, duration, onComplete, easing, animType){
rlm@46 2123 this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);
rlm@46 2124 return this;
rlm@46 2125 },
rlm@46 2126
rlm@46 2127
rlm@46 2128 anim : function(args, opt, animType, defaultDur, defaultEase, cb){
rlm@46 2129 animType = animType || 'run';
rlm@46 2130 opt = opt || {};
rlm@46 2131 var anim = Ext.lib.Anim[animType](
rlm@46 2132 this.dom, args,
rlm@46 2133 (opt.duration || defaultDur) || .35,
rlm@46 2134 (opt.easing || defaultEase) || 'easeOut',
rlm@46 2135 function(){
rlm@46 2136 Ext.callback(cb, this);
rlm@46 2137 Ext.callback(opt.callback, opt.scope || this, [this, opt]);
rlm@46 2138 },
rlm@46 2139 this
rlm@46 2140 );
rlm@46 2141 opt.anim = anim;
rlm@46 2142 return anim;
rlm@46 2143 },
rlm@46 2144
rlm@46 2145 preanim : function(a, i){
rlm@46 2146 return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});
rlm@46 2147 },
rlm@46 2148
rlm@46 2149
rlm@46 2150 clean : function(forceReclean){
rlm@46 2151 if(this.isCleaned && forceReclean !== true){
rlm@46 2152 return this;
rlm@46 2153 }
rlm@46 2154 var ns = /\S/;
rlm@46 2155 var d = this.dom, n = d.firstChild, ni = -1;
rlm@46 2156 while(n){
rlm@46 2157 var nx = n.nextSibling;
rlm@46 2158 if(n.nodeType == 3 && !ns.test(n.nodeValue)){
rlm@46 2159 d.removeChild(n);
rlm@46 2160 }else{
rlm@46 2161 n.nodeIndex = ++ni;
rlm@46 2162 }
rlm@46 2163 n = nx;
rlm@46 2164 }
rlm@46 2165 this.isCleaned = true;
rlm@46 2166 return this;
rlm@46 2167 },
rlm@46 2168
rlm@46 2169
rlm@46 2170 scrollIntoView : function(container, hscroll){
rlm@46 2171 var c = Ext.getDom(container) || Ext.getBody().dom;
rlm@46 2172 var el = this.dom;
rlm@46 2173
rlm@46 2174 var o = this.getOffsetsTo(c),
rlm@46 2175 l = o[0] + c.scrollLeft,
rlm@46 2176 t = o[1] + c.scrollTop,
rlm@46 2177 b = t+el.offsetHeight,
rlm@46 2178 r = l+el.offsetWidth;
rlm@46 2179
rlm@46 2180 var ch = c.clientHeight;
rlm@46 2181 var ct = parseInt(c.scrollTop, 10);
rlm@46 2182 var cl = parseInt(c.scrollLeft, 10);
rlm@46 2183 var cb = ct + ch;
rlm@46 2184 var cr = cl + c.clientWidth;
rlm@46 2185
rlm@46 2186 if(el.offsetHeight > ch || t < ct){
rlm@46 2187 c.scrollTop = t;
rlm@46 2188 }else if(b > cb){
rlm@46 2189 c.scrollTop = b-ch;
rlm@46 2190 }
rlm@46 2191 c.scrollTop = c.scrollTop;
rlm@46 2192 if(hscroll !== false){
rlm@46 2193 if(el.offsetWidth > c.clientWidth || l < cl){
rlm@46 2194 c.scrollLeft = l;
rlm@46 2195 }else if(r > cr){
rlm@46 2196 c.scrollLeft = r-c.clientWidth;
rlm@46 2197 }
rlm@46 2198 c.scrollLeft = c.scrollLeft;
rlm@46 2199 }
rlm@46 2200 return this;
rlm@46 2201 },
rlm@46 2202
rlm@46 2203 scrollChildIntoView : function(child, hscroll){
rlm@46 2204 Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
rlm@46 2205 },
rlm@46 2206
rlm@46 2207
rlm@46 2208 autoHeight : function(animate, duration, onComplete, easing){
rlm@46 2209 var oldHeight = this.getHeight();
rlm@46 2210 this.clip();
rlm@46 2211 this.setHeight(1); setTimeout(function(){
rlm@46 2212 var height = parseInt(this.dom.scrollHeight, 10); if(!animate){
rlm@46 2213 this.setHeight(height);
rlm@46 2214 this.unclip();
rlm@46 2215 if(typeof onComplete == "function"){
rlm@46 2216 onComplete();
rlm@46 2217 }
rlm@46 2218 }else{
rlm@46 2219 this.setHeight(oldHeight); this.setHeight(height, animate, duration, function(){
rlm@46 2220 this.unclip();
rlm@46 2221 if(typeof onComplete == "function") onComplete();
rlm@46 2222 }.createDelegate(this), easing);
rlm@46 2223 }
rlm@46 2224 }.createDelegate(this), 0);
rlm@46 2225 return this;
rlm@46 2226 },
rlm@46 2227
rlm@46 2228
rlm@46 2229 contains : function(el){
rlm@46 2230 if(!el){return false;}
rlm@46 2231 return D.isAncestor(this.dom, el.dom ? el.dom : el);
rlm@46 2232 },
rlm@46 2233
rlm@46 2234
rlm@46 2235 isVisible : function(deep) {
rlm@46 2236 var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none");
rlm@46 2237 if(deep !== true || !vis){
rlm@46 2238 return vis;
rlm@46 2239 }
rlm@46 2240 var p = this.dom.parentNode;
rlm@46 2241 while(p && p.tagName.toLowerCase() != "body"){
rlm@46 2242 if(!Ext.fly(p, '_isVisible').isVisible()){
rlm@46 2243 return false;
rlm@46 2244 }
rlm@46 2245 p = p.parentNode;
rlm@46 2246 }
rlm@46 2247 return true;
rlm@46 2248 },
rlm@46 2249
rlm@46 2250
rlm@46 2251 select : function(selector, unique){
rlm@46 2252 return El.select(selector, unique, this.dom);
rlm@46 2253 },
rlm@46 2254
rlm@46 2255
rlm@46 2256 query : function(selector, unique){
rlm@46 2257 return Ext.DomQuery.select(selector, this.dom);
rlm@46 2258 },
rlm@46 2259
rlm@46 2260
rlm@46 2261 child : function(selector, returnDom){
rlm@46 2262 var n = Ext.DomQuery.selectNode(selector, this.dom);
rlm@46 2263 return returnDom ? n : Ext.get(n);
rlm@46 2264 },
rlm@46 2265
rlm@46 2266
rlm@46 2267 down : function(selector, returnDom){
rlm@46 2268 var n = Ext.DomQuery.selectNode(" > " + selector, this.dom);
rlm@46 2269 return returnDom ? n : Ext.get(n);
rlm@46 2270 },
rlm@46 2271
rlm@46 2272
rlm@46 2273 initDD : function(group, config, overrides){
rlm@46 2274 var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
rlm@46 2275 return Ext.apply(dd, overrides);
rlm@46 2276 },
rlm@46 2277
rlm@46 2278
rlm@46 2279 initDDProxy : function(group, config, overrides){
rlm@46 2280 var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
rlm@46 2281 return Ext.apply(dd, overrides);
rlm@46 2282 },
rlm@46 2283
rlm@46 2284
rlm@46 2285 initDDTarget : function(group, config, overrides){
rlm@46 2286 var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
rlm@46 2287 return Ext.apply(dd, overrides);
rlm@46 2288 },
rlm@46 2289
rlm@46 2290
rlm@46 2291 setVisible : function(visible, animate){
rlm@46 2292 if(!animate || !A){
rlm@46 2293 if(this.visibilityMode == El.DISPLAY){
rlm@46 2294 this.setDisplayed(visible);
rlm@46 2295 }else{
rlm@46 2296 this.fixDisplay();
rlm@46 2297 this.dom.style.visibility = visible ? "visible" : "hidden";
rlm@46 2298 }
rlm@46 2299 }else{
rlm@46 2300 var dom = this.dom;
rlm@46 2301 var visMode = this.visibilityMode;
rlm@46 2302 if(visible){
rlm@46 2303 this.setOpacity(.01);
rlm@46 2304 this.setVisible(true);
rlm@46 2305 }
rlm@46 2306 this.anim({opacity: { to: (visible?1:0) }},
rlm@46 2307 this.preanim(arguments, 1),
rlm@46 2308 null, .35, 'easeIn', function(){
rlm@46 2309 if(!visible){
rlm@46 2310 if(visMode == El.DISPLAY){
rlm@46 2311 dom.style.display = "none";
rlm@46 2312 }else{
rlm@46 2313 dom.style.visibility = "hidden";
rlm@46 2314 }
rlm@46 2315 Ext.get(dom).setOpacity(1);
rlm@46 2316 }
rlm@46 2317 });
rlm@46 2318 }
rlm@46 2319 return this;
rlm@46 2320 },
rlm@46 2321
rlm@46 2322
rlm@46 2323 isDisplayed : function() {
rlm@46 2324 return this.getStyle("display") != "none";
rlm@46 2325 },
rlm@46 2326
rlm@46 2327
rlm@46 2328 toggle : function(animate){
rlm@46 2329 this.setVisible(!this.isVisible(), this.preanim(arguments, 0));
rlm@46 2330 return this;
rlm@46 2331 },
rlm@46 2332
rlm@46 2333
rlm@46 2334 setDisplayed : function(value) {
rlm@46 2335 if(typeof value == "boolean"){
rlm@46 2336 value = value ? this.originalDisplay : "none";
rlm@46 2337 }
rlm@46 2338 this.setStyle("display", value);
rlm@46 2339 return this;
rlm@46 2340 },
rlm@46 2341
rlm@46 2342
rlm@46 2343 focus : function() {
rlm@46 2344 try{
rlm@46 2345 this.dom.focus();
rlm@46 2346 }catch(e){}
rlm@46 2347 return this;
rlm@46 2348 },
rlm@46 2349
rlm@46 2350
rlm@46 2351 blur : function() {
rlm@46 2352 try{
rlm@46 2353 this.dom.blur();
rlm@46 2354 }catch(e){}
rlm@46 2355 return this;
rlm@46 2356 },
rlm@46 2357
rlm@46 2358
rlm@46 2359 addClass : function(className){
rlm@46 2360 if(Ext.isArray(className)){
rlm@46 2361 for(var i = 0, len = className.length; i < len; i++) {
rlm@46 2362 this.addClass(className[i]);
rlm@46 2363 }
rlm@46 2364 }else{
rlm@46 2365 if(className && !this.hasClass(className)){
rlm@46 2366 this.dom.className = this.dom.className + " " + className;
rlm@46 2367 }
rlm@46 2368 }
rlm@46 2369 return this;
rlm@46 2370 },
rlm@46 2371
rlm@46 2372
rlm@46 2373 radioClass : function(className){
rlm@46 2374 var siblings = this.dom.parentNode.childNodes;
rlm@46 2375 for(var i = 0; i < siblings.length; i++) {
rlm@46 2376 var s = siblings[i];
rlm@46 2377 if(s.nodeType == 1){
rlm@46 2378 Ext.get(s).removeClass(className);
rlm@46 2379 }
rlm@46 2380 }
rlm@46 2381 this.addClass(className);
rlm@46 2382 return this;
rlm@46 2383 },
rlm@46 2384
rlm@46 2385
rlm@46 2386 removeClass : function(className){
rlm@46 2387 if(!className || !this.dom.className){
rlm@46 2388 return this;
rlm@46 2389 }
rlm@46 2390 if(Ext.isArray(className)){
rlm@46 2391 for(var i = 0, len = className.length; i < len; i++) {
rlm@46 2392 this.removeClass(className[i]);
rlm@46 2393 }
rlm@46 2394 }else{
rlm@46 2395 if(this.hasClass(className)){
rlm@46 2396 var re = this.classReCache[className];
rlm@46 2397 if (!re) {
rlm@46 2398 re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g");
rlm@46 2399 this.classReCache[className] = re;
rlm@46 2400 }
rlm@46 2401 this.dom.className =
rlm@46 2402 this.dom.className.replace(re, " ");
rlm@46 2403 }
rlm@46 2404 }
rlm@46 2405 return this;
rlm@46 2406 },
rlm@46 2407
rlm@46 2408 classReCache: {},
rlm@46 2409
rlm@46 2410
rlm@46 2411 toggleClass : function(className){
rlm@46 2412 if(this.hasClass(className)){
rlm@46 2413 this.removeClass(className);
rlm@46 2414 }else{
rlm@46 2415 this.addClass(className);
rlm@46 2416 }
rlm@46 2417 return this;
rlm@46 2418 },
rlm@46 2419
rlm@46 2420
rlm@46 2421 hasClass : function(className){
rlm@46 2422 return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
rlm@46 2423 },
rlm@46 2424
rlm@46 2425
rlm@46 2426 replaceClass : function(oldClassName, newClassName){
rlm@46 2427 this.removeClass(oldClassName);
rlm@46 2428 this.addClass(newClassName);
rlm@46 2429 return this;
rlm@46 2430 },
rlm@46 2431
rlm@46 2432
rlm@46 2433 getStyles : function(){
rlm@46 2434 var a = arguments, len = a.length, r = {};
rlm@46 2435 for(var i = 0; i < len; i++){
rlm@46 2436 r[a[i]] = this.getStyle(a[i]);
rlm@46 2437 }
rlm@46 2438 return r;
rlm@46 2439 },
rlm@46 2440
rlm@46 2441
rlm@46 2442 getStyle : function(){
rlm@46 2443 return view && view.getComputedStyle ?
rlm@46 2444 function(prop){
rlm@46 2445 var el = this.dom, v, cs, camel;
rlm@46 2446 if(prop == 'float'){
rlm@46 2447 prop = "cssFloat";
rlm@46 2448 }
rlm@46 2449 if(v = el.style[prop]){
rlm@46 2450 return v;
rlm@46 2451 }
rlm@46 2452 if(cs = view.getComputedStyle(el, "")){
rlm@46 2453 if(!(camel = propCache[prop])){
rlm@46 2454 camel = propCache[prop] = prop.replace(camelRe, camelFn);
rlm@46 2455 }
rlm@46 2456 return cs[camel];
rlm@46 2457 }
rlm@46 2458 return null;
rlm@46 2459 } :
rlm@46 2460 function(prop){
rlm@46 2461 var el = this.dom, v, cs, camel;
rlm@46 2462 if(prop == 'opacity'){
rlm@46 2463 if(typeof el.style.filter == 'string'){
rlm@46 2464 var m = el.style.filter.match(/alpha\(opacity=(.*)\)/i);
rlm@46 2465 if(m){
rlm@46 2466 var fv = parseFloat(m[1]);
rlm@46 2467 if(!isNaN(fv)){
rlm@46 2468 return fv ? fv / 100 : 0;
rlm@46 2469 }
rlm@46 2470 }
rlm@46 2471 }
rlm@46 2472 return 1;
rlm@46 2473 }else if(prop == 'float'){
rlm@46 2474 prop = "styleFloat";
rlm@46 2475 }
rlm@46 2476 if(!(camel = propCache[prop])){
rlm@46 2477 camel = propCache[prop] = prop.replace(camelRe, camelFn);
rlm@46 2478 }
rlm@46 2479 if(v = el.style[camel]){
rlm@46 2480 return v;
rlm@46 2481 }
rlm@46 2482 if(cs = el.currentStyle){
rlm@46 2483 return cs[camel];
rlm@46 2484 }
rlm@46 2485 return null;
rlm@46 2486 };
rlm@46 2487 }(),
rlm@46 2488
rlm@46 2489
rlm@46 2490 setStyle : function(prop, value){
rlm@46 2491 if(typeof prop == "string"){
rlm@46 2492 var camel;
rlm@46 2493 if(!(camel = propCache[prop])){
rlm@46 2494 camel = propCache[prop] = prop.replace(camelRe, camelFn);
rlm@46 2495 }
rlm@46 2496 if(camel == 'opacity') {
rlm@46 2497 this.setOpacity(value);
rlm@46 2498 }else{
rlm@46 2499 this.dom.style[camel] = value;
rlm@46 2500 }
rlm@46 2501 }else{
rlm@46 2502 for(var style in prop){
rlm@46 2503 if(typeof prop[style] != "function"){
rlm@46 2504 this.setStyle(style, prop[style]);
rlm@46 2505 }
rlm@46 2506 }
rlm@46 2507 }
rlm@46 2508 return this;
rlm@46 2509 },
rlm@46 2510
rlm@46 2511
rlm@46 2512 applyStyles : function(style){
rlm@46 2513 Ext.DomHelper.applyStyles(this.dom, style);
rlm@46 2514 return this;
rlm@46 2515 },
rlm@46 2516
rlm@46 2517
rlm@46 2518 getX : function(){
rlm@46 2519 return D.getX(this.dom);
rlm@46 2520 },
rlm@46 2521
rlm@46 2522
rlm@46 2523 getY : function(){
rlm@46 2524 return D.getY(this.dom);
rlm@46 2525 },
rlm@46 2526
rlm@46 2527
rlm@46 2528 getXY : function(){
rlm@46 2529 return D.getXY(this.dom);
rlm@46 2530 },
rlm@46 2531
rlm@46 2532
rlm@46 2533 getOffsetsTo : function(el){
rlm@46 2534 var o = this.getXY();
rlm@46 2535 var e = Ext.fly(el, '_internal').getXY();
rlm@46 2536 return [o[0]-e[0],o[1]-e[1]];
rlm@46 2537 },
rlm@46 2538
rlm@46 2539
rlm@46 2540 setX : function(x, animate){
rlm@46 2541 if(!animate || !A){
rlm@46 2542 D.setX(this.dom, x);
rlm@46 2543 }else{
rlm@46 2544 this.setXY([x, this.getY()], this.preanim(arguments, 1));
rlm@46 2545 }
rlm@46 2546 return this;
rlm@46 2547 },
rlm@46 2548
rlm@46 2549
rlm@46 2550 setY : function(y, animate){
rlm@46 2551 if(!animate || !A){
rlm@46 2552 D.setY(this.dom, y);
rlm@46 2553 }else{
rlm@46 2554 this.setXY([this.getX(), y], this.preanim(arguments, 1));
rlm@46 2555 }
rlm@46 2556 return this;
rlm@46 2557 },
rlm@46 2558
rlm@46 2559
rlm@46 2560 setLeft : function(left){
rlm@46 2561 this.setStyle("left", this.addUnits(left));
rlm@46 2562 return this;
rlm@46 2563 },
rlm@46 2564
rlm@46 2565
rlm@46 2566 setTop : function(top){
rlm@46 2567 this.setStyle("top", this.addUnits(top));
rlm@46 2568 return this;
rlm@46 2569 },
rlm@46 2570
rlm@46 2571
rlm@46 2572 setRight : function(right){
rlm@46 2573 this.setStyle("right", this.addUnits(right));
rlm@46 2574 return this;
rlm@46 2575 },
rlm@46 2576
rlm@46 2577
rlm@46 2578 setBottom : function(bottom){
rlm@46 2579 this.setStyle("bottom", this.addUnits(bottom));
rlm@46 2580 return this;
rlm@46 2581 },
rlm@46 2582
rlm@46 2583
rlm@46 2584 setXY : function(pos, animate){
rlm@46 2585 if(!animate || !A){
rlm@46 2586 D.setXY(this.dom, pos);
rlm@46 2587 }else{
rlm@46 2588 this.anim({points: {to: pos}}, this.preanim(arguments, 1), 'motion');
rlm@46 2589 }
rlm@46 2590 return this;
rlm@46 2591 },
rlm@46 2592
rlm@46 2593
rlm@46 2594 setLocation : function(x, y, animate){
rlm@46 2595 this.setXY([x, y], this.preanim(arguments, 2));
rlm@46 2596 return this;
rlm@46 2597 },
rlm@46 2598
rlm@46 2599
rlm@46 2600 moveTo : function(x, y, animate){
rlm@46 2601 this.setXY([x, y], this.preanim(arguments, 2));
rlm@46 2602 return this;
rlm@46 2603 },
rlm@46 2604
rlm@46 2605
rlm@46 2606 getRegion : function(){
rlm@46 2607 return D.getRegion(this.dom);
rlm@46 2608 },
rlm@46 2609
rlm@46 2610
rlm@46 2611 getHeight : function(contentHeight){
rlm@46 2612 var h = this.dom.offsetHeight || 0;
rlm@46 2613 h = contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb");
rlm@46 2614 return h < 0 ? 0 : h;
rlm@46 2615 },
rlm@46 2616
rlm@46 2617
rlm@46 2618 getWidth : function(contentWidth){
rlm@46 2619 var w = this.dom.offsetWidth || 0;
rlm@46 2620 w = contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr");
rlm@46 2621 return w < 0 ? 0 : w;
rlm@46 2622 },
rlm@46 2623
rlm@46 2624
rlm@46 2625 getComputedHeight : function(){
rlm@46 2626 var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);
rlm@46 2627 if(!h){
rlm@46 2628 h = parseInt(this.getStyle('height'), 10) || 0;
rlm@46 2629 if(!this.isBorderBox()){
rlm@46 2630 h += this.getFrameWidth('tb');
rlm@46 2631 }
rlm@46 2632 }
rlm@46 2633 return h;
rlm@46 2634 },
rlm@46 2635
rlm@46 2636
rlm@46 2637 getComputedWidth : function(){
rlm@46 2638 var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
rlm@46 2639 if(!w){
rlm@46 2640 w = parseInt(this.getStyle('width'), 10) || 0;
rlm@46 2641 if(!this.isBorderBox()){
rlm@46 2642 w += this.getFrameWidth('lr');
rlm@46 2643 }
rlm@46 2644 }
rlm@46 2645 return w;
rlm@46 2646 },
rlm@46 2647
rlm@46 2648
rlm@46 2649 getSize : function(contentSize){
rlm@46 2650 return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
rlm@46 2651 },
rlm@46 2652
rlm@46 2653 getStyleSize : function(){
rlm@46 2654 var w, h, d = this.dom, s = d.style;
rlm@46 2655 if(s.width && s.width != 'auto'){
rlm@46 2656 w = parseInt(s.width, 10);
rlm@46 2657 if(Ext.isBorderBox){
rlm@46 2658 w -= this.getFrameWidth('lr');
rlm@46 2659 }
rlm@46 2660 }
rlm@46 2661 if(s.height && s.height != 'auto'){
rlm@46 2662 h = parseInt(s.height, 10);
rlm@46 2663 if(Ext.isBorderBox){
rlm@46 2664 h -= this.getFrameWidth('tb');
rlm@46 2665 }
rlm@46 2666 }
rlm@46 2667 return {width: w || this.getWidth(true), height: h || this.getHeight(true)};
rlm@46 2668
rlm@46 2669 },
rlm@46 2670
rlm@46 2671
rlm@46 2672 getViewSize : function(){
rlm@46 2673 var d = this.dom, doc = document, aw = 0, ah = 0;
rlm@46 2674 if(d == doc || d == doc.body){
rlm@46 2675 return {width : D.getViewWidth(), height: D.getViewHeight()};
rlm@46 2676 }else{
rlm@46 2677 return {
rlm@46 2678 width : d.clientWidth,
rlm@46 2679 height: d.clientHeight
rlm@46 2680 };
rlm@46 2681 }
rlm@46 2682 },
rlm@46 2683
rlm@46 2684
rlm@46 2685 getValue : function(asNumber){
rlm@46 2686 return asNumber ? parseInt(this.dom.value, 10) : this.dom.value;
rlm@46 2687 },
rlm@46 2688
rlm@46 2689 adjustWidth : function(width){
rlm@46 2690 if(typeof width == "number"){
rlm@46 2691 if(this.autoBoxAdjust && !this.isBorderBox()){
rlm@46 2692 width -= (this.getBorderWidth("lr") + this.getPadding("lr"));
rlm@46 2693 }
rlm@46 2694 if(width < 0){
rlm@46 2695 width = 0;
rlm@46 2696 }
rlm@46 2697 }
rlm@46 2698 return width;
rlm@46 2699 },
rlm@46 2700
rlm@46 2701 adjustHeight : function(height){
rlm@46 2702 if(typeof height == "number"){
rlm@46 2703 if(this.autoBoxAdjust && !this.isBorderBox()){
rlm@46 2704 height -= (this.getBorderWidth("tb") + this.getPadding("tb"));
rlm@46 2705 }
rlm@46 2706 if(height < 0){
rlm@46 2707 height = 0;
rlm@46 2708 }
rlm@46 2709 }
rlm@46 2710 return height;
rlm@46 2711 },
rlm@46 2712
rlm@46 2713
rlm@46 2714 setWidth : function(width, animate){
rlm@46 2715 width = this.adjustWidth(width);
rlm@46 2716 if(!animate || !A){
rlm@46 2717 this.dom.style.width = this.addUnits(width);
rlm@46 2718 }else{
rlm@46 2719 this.anim({width: {to: width}}, this.preanim(arguments, 1));
rlm@46 2720 }
rlm@46 2721 return this;
rlm@46 2722 },
rlm@46 2723
rlm@46 2724
rlm@46 2725 setHeight : function(height, animate){
rlm@46 2726 height = this.adjustHeight(height);
rlm@46 2727 if(!animate || !A){
rlm@46 2728 this.dom.style.height = this.addUnits(height);
rlm@46 2729 }else{
rlm@46 2730 this.anim({height: {to: height}}, this.preanim(arguments, 1));
rlm@46 2731 }
rlm@46 2732 return this;
rlm@46 2733 },
rlm@46 2734
rlm@46 2735
rlm@46 2736 setSize : function(width, height, animate){
rlm@46 2737 if(typeof width == "object"){ height = width.height; width = width.width;
rlm@46 2738 }
rlm@46 2739 width = this.adjustWidth(width); height = this.adjustHeight(height);
rlm@46 2740 if(!animate || !A){
rlm@46 2741 this.dom.style.width = this.addUnits(width);
rlm@46 2742 this.dom.style.height = this.addUnits(height);
rlm@46 2743 }else{
rlm@46 2744 this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2));
rlm@46 2745 }
rlm@46 2746 return this;
rlm@46 2747 },
rlm@46 2748
rlm@46 2749
rlm@46 2750 setBounds : function(x, y, width, height, animate){
rlm@46 2751 if(!animate || !A){
rlm@46 2752 this.setSize(width, height);
rlm@46 2753 this.setLocation(x, y);
rlm@46 2754 }else{
rlm@46 2755 width = this.adjustWidth(width); height = this.adjustHeight(height);
rlm@46 2756 this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}},
rlm@46 2757 this.preanim(arguments, 4), 'motion');
rlm@46 2758 }
rlm@46 2759 return this;
rlm@46 2760 },
rlm@46 2761
rlm@46 2762
rlm@46 2763 setRegion : function(region, animate){
rlm@46 2764 this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1));
rlm@46 2765 return this;
rlm@46 2766 },
rlm@46 2767
rlm@46 2768
rlm@46 2769 addListener : function(eventName, fn, scope, options){
rlm@46 2770 Ext.EventManager.on(this.dom, eventName, fn, scope || this, options);
rlm@46 2771 },
rlm@46 2772
rlm@46 2773
rlm@46 2774 removeListener : function(eventName, fn){
rlm@46 2775 Ext.EventManager.removeListener(this.dom, eventName, fn);
rlm@46 2776 return this;
rlm@46 2777 },
rlm@46 2778
rlm@46 2779
rlm@46 2780 removeAllListeners : function(){
rlm@46 2781 E.purgeElement(this.dom);
rlm@46 2782 return this;
rlm@46 2783 },
rlm@46 2784
rlm@46 2785
rlm@46 2786 relayEvent : function(eventName, observable){
rlm@46 2787 this.on(eventName, function(e){
rlm@46 2788 observable.fireEvent(eventName, e);
rlm@46 2789 });
rlm@46 2790 },
rlm@46 2791
rlm@46 2792
rlm@46 2793 setOpacity : function(opacity, animate){
rlm@46 2794 if(!animate || !A){
rlm@46 2795 var s = this.dom.style;
rlm@46 2796 if(Ext.isIE){
rlm@46 2797 s.zoom = 1;
rlm@46 2798 s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") +
rlm@46 2799 (opacity == 1 ? "" : " alpha(opacity=" + opacity * 100 + ")");
rlm@46 2800 }else{
rlm@46 2801 s.opacity = opacity;
rlm@46 2802 }
rlm@46 2803 }else{
rlm@46 2804 this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn');
rlm@46 2805 }
rlm@46 2806 return this;
rlm@46 2807 },
rlm@46 2808
rlm@46 2809
rlm@46 2810 getLeft : function(local){
rlm@46 2811 if(!local){
rlm@46 2812 return this.getX();
rlm@46 2813 }else{
rlm@46 2814 return parseInt(this.getStyle("left"), 10) || 0;
rlm@46 2815 }
rlm@46 2816 },
rlm@46 2817
rlm@46 2818
rlm@46 2819 getRight : function(local){
rlm@46 2820 if(!local){
rlm@46 2821 return this.getX() + this.getWidth();
rlm@46 2822 }else{
rlm@46 2823 return (this.getLeft(true) + this.getWidth()) || 0;
rlm@46 2824 }
rlm@46 2825 },
rlm@46 2826
rlm@46 2827
rlm@46 2828 getTop : function(local) {
rlm@46 2829 if(!local){
rlm@46 2830 return this.getY();
rlm@46 2831 }else{
rlm@46 2832 return parseInt(this.getStyle("top"), 10) || 0;
rlm@46 2833 }
rlm@46 2834 },
rlm@46 2835
rlm@46 2836
rlm@46 2837 getBottom : function(local){
rlm@46 2838 if(!local){
rlm@46 2839 return this.getY() + this.getHeight();
rlm@46 2840 }else{
rlm@46 2841 return (this.getTop(true) + this.getHeight()) || 0;
rlm@46 2842 }
rlm@46 2843 },
rlm@46 2844
rlm@46 2845
rlm@46 2846 position : function(pos, zIndex, x, y){
rlm@46 2847 if(!pos){
rlm@46 2848 if(this.getStyle('position') == 'static'){
rlm@46 2849 this.setStyle('position', 'relative');
rlm@46 2850 }
rlm@46 2851 }else{
rlm@46 2852 this.setStyle("position", pos);
rlm@46 2853 }
rlm@46 2854 if(zIndex){
rlm@46 2855 this.setStyle("z-index", zIndex);
rlm@46 2856 }
rlm@46 2857 if(x !== undefined && y !== undefined){
rlm@46 2858 this.setXY([x, y]);
rlm@46 2859 }else if(x !== undefined){
rlm@46 2860 this.setX(x);
rlm@46 2861 }else if(y !== undefined){
rlm@46 2862 this.setY(y);
rlm@46 2863 }
rlm@46 2864 },
rlm@46 2865
rlm@46 2866
rlm@46 2867 clearPositioning : function(value){
rlm@46 2868 value = value ||'';
rlm@46 2869 this.setStyle({
rlm@46 2870 "left": value,
rlm@46 2871 "right": value,
rlm@46 2872 "top": value,
rlm@46 2873 "bottom": value,
rlm@46 2874 "z-index": "",
rlm@46 2875 "position" : "static"
rlm@46 2876 });
rlm@46 2877 return this;
rlm@46 2878 },
rlm@46 2879
rlm@46 2880
rlm@46 2881 getPositioning : function(){
rlm@46 2882 var l = this.getStyle("left");
rlm@46 2883 var t = this.getStyle("top");
rlm@46 2884 return {
rlm@46 2885 "position" : this.getStyle("position"),
rlm@46 2886 "left" : l,
rlm@46 2887 "right" : l ? "" : this.getStyle("right"),
rlm@46 2888 "top" : t,
rlm@46 2889 "bottom" : t ? "" : this.getStyle("bottom"),
rlm@46 2890 "z-index" : this.getStyle("z-index")
rlm@46 2891 };
rlm@46 2892 },
rlm@46 2893
rlm@46 2894
rlm@46 2895 getBorderWidth : function(side){
rlm@46 2896 return this.addStyles(side, El.borders);
rlm@46 2897 },
rlm@46 2898
rlm@46 2899
rlm@46 2900 getPadding : function(side){
rlm@46 2901 return this.addStyles(side, El.paddings);
rlm@46 2902 },
rlm@46 2903
rlm@46 2904
rlm@46 2905 setPositioning : function(pc){
rlm@46 2906 this.applyStyles(pc);
rlm@46 2907 if(pc.right == "auto"){
rlm@46 2908 this.dom.style.right = "";
rlm@46 2909 }
rlm@46 2910 if(pc.bottom == "auto"){
rlm@46 2911 this.dom.style.bottom = "";
rlm@46 2912 }
rlm@46 2913 return this;
rlm@46 2914 },
rlm@46 2915
rlm@46 2916 fixDisplay : function(){
rlm@46 2917 if(this.getStyle("display") == "none"){
rlm@46 2918 this.setStyle("visibility", "hidden");
rlm@46 2919 this.setStyle("display", this.originalDisplay); if(this.getStyle("display") == "none"){ this.setStyle("display", "block");
rlm@46 2920 }
rlm@46 2921 }
rlm@46 2922 },
rlm@46 2923
rlm@46 2924 setOverflow : function(v){
rlm@46 2925 if(v=='auto' && Ext.isMac && Ext.isGecko){ this.dom.style.overflow = 'hidden';
rlm@46 2926 (function(){this.dom.style.overflow = 'auto';}).defer(1, this);
rlm@46 2927 }else{
rlm@46 2928 this.dom.style.overflow = v;
rlm@46 2929 }
rlm@46 2930 },
rlm@46 2931
rlm@46 2932
rlm@46 2933 setLeftTop : function(left, top){
rlm@46 2934 this.dom.style.left = this.addUnits(left);
rlm@46 2935 this.dom.style.top = this.addUnits(top);
rlm@46 2936 return this;
rlm@46 2937 },
rlm@46 2938
rlm@46 2939
rlm@46 2940 move : function(direction, distance, animate){
rlm@46 2941 var xy = this.getXY();
rlm@46 2942 direction = direction.toLowerCase();
rlm@46 2943 switch(direction){
rlm@46 2944 case "l":
rlm@46 2945 case "left":
rlm@46 2946 this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2));
rlm@46 2947 break;
rlm@46 2948 case "r":
rlm@46 2949 case "right":
rlm@46 2950 this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2));
rlm@46 2951 break;
rlm@46 2952 case "t":
rlm@46 2953 case "top":
rlm@46 2954 case "up":
rlm@46 2955 this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2));
rlm@46 2956 break;
rlm@46 2957 case "b":
rlm@46 2958 case "bottom":
rlm@46 2959 case "down":
rlm@46 2960 this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2));
rlm@46 2961 break;
rlm@46 2962 }
rlm@46 2963 return this;
rlm@46 2964 },
rlm@46 2965
rlm@46 2966
rlm@46 2967 clip : function(){
rlm@46 2968 if(!this.isClipped){
rlm@46 2969 this.isClipped = true;
rlm@46 2970 this.originalClip = {
rlm@46 2971 "o": this.getStyle("overflow"),
rlm@46 2972 "x": this.getStyle("overflow-x"),
rlm@46 2973 "y": this.getStyle("overflow-y")
rlm@46 2974 };
rlm@46 2975 this.setStyle("overflow", "hidden");
rlm@46 2976 this.setStyle("overflow-x", "hidden");
rlm@46 2977 this.setStyle("overflow-y", "hidden");
rlm@46 2978 }
rlm@46 2979 return this;
rlm@46 2980 },
rlm@46 2981
rlm@46 2982
rlm@46 2983 unclip : function(){
rlm@46 2984 if(this.isClipped){
rlm@46 2985 this.isClipped = false;
rlm@46 2986 var o = this.originalClip;
rlm@46 2987 if(o.o){this.setStyle("overflow", o.o);}
rlm@46 2988 if(o.x){this.setStyle("overflow-x", o.x);}
rlm@46 2989 if(o.y){this.setStyle("overflow-y", o.y);}
rlm@46 2990 }
rlm@46 2991 return this;
rlm@46 2992 },
rlm@46 2993
rlm@46 2994
rlm@46 2995
rlm@46 2996 getAnchorXY : function(anchor, local, s){
rlm@46 2997
rlm@46 2998 var w, h, vp = false;
rlm@46 2999 if(!s){
rlm@46 3000 var d = this.dom;
rlm@46 3001 if(d == document.body || d == document){
rlm@46 3002 vp = true;
rlm@46 3003 w = D.getViewWidth(); h = D.getViewHeight();
rlm@46 3004 }else{
rlm@46 3005 w = this.getWidth(); h = this.getHeight();
rlm@46 3006 }
rlm@46 3007 }else{
rlm@46 3008 w = s.width; h = s.height;
rlm@46 3009 }
rlm@46 3010 var x = 0, y = 0, r = Math.round;
rlm@46 3011 switch((anchor || "tl").toLowerCase()){
rlm@46 3012 case "c":
rlm@46 3013 x = r(w*.5);
rlm@46 3014 y = r(h*.5);
rlm@46 3015 break;
rlm@46 3016 case "t":
rlm@46 3017 x = r(w*.5);
rlm@46 3018 y = 0;
rlm@46 3019 break;
rlm@46 3020 case "l":
rlm@46 3021 x = 0;
rlm@46 3022 y = r(h*.5);
rlm@46 3023 break;
rlm@46 3024 case "r":
rlm@46 3025 x = w;
rlm@46 3026 y = r(h*.5);
rlm@46 3027 break;
rlm@46 3028 case "b":
rlm@46 3029 x = r(w*.5);
rlm@46 3030 y = h;
rlm@46 3031 break;
rlm@46 3032 case "tl":
rlm@46 3033 x = 0;
rlm@46 3034 y = 0;
rlm@46 3035 break;
rlm@46 3036 case "bl":
rlm@46 3037 x = 0;
rlm@46 3038 y = h;
rlm@46 3039 break;
rlm@46 3040 case "br":
rlm@46 3041 x = w;
rlm@46 3042 y = h;
rlm@46 3043 break;
rlm@46 3044 case "tr":
rlm@46 3045 x = w;
rlm@46 3046 y = 0;
rlm@46 3047 break;
rlm@46 3048 }
rlm@46 3049 if(local === true){
rlm@46 3050 return [x, y];
rlm@46 3051 }
rlm@46 3052 if(vp){
rlm@46 3053 var sc = this.getScroll();
rlm@46 3054 return [x + sc.left, y + sc.top];
rlm@46 3055 }
rlm@46 3056 var o = this.getXY();
rlm@46 3057 return [x+o[0], y+o[1]];
rlm@46 3058 },
rlm@46 3059
rlm@46 3060
rlm@46 3061 getAlignToXY : function(el, p, o){
rlm@46 3062 el = Ext.get(el);
rlm@46 3063 if(!el || !el.dom){
rlm@46 3064 throw "Element.alignToXY with an element that doesn't exist";
rlm@46 3065 }
rlm@46 3066 var d = this.dom;
rlm@46 3067 var c = false; var p1 = "", p2 = "";
rlm@46 3068 o = o || [0,0];
rlm@46 3069
rlm@46 3070 if(!p){
rlm@46 3071 p = "tl-bl";
rlm@46 3072 }else if(p == "?"){
rlm@46 3073 p = "tl-bl?";
rlm@46 3074 }else if(p.indexOf("-") == -1){
rlm@46 3075 p = "tl-" + p;
rlm@46 3076 }
rlm@46 3077 p = p.toLowerCase();
rlm@46 3078 var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
rlm@46 3079 if(!m){
rlm@46 3080 throw "Element.alignTo with an invalid alignment " + p;
rlm@46 3081 }
rlm@46 3082 p1 = m[1]; p2 = m[2]; c = !!m[3];
rlm@46 3083
rlm@46 3084 var a1 = this.getAnchorXY(p1, true);
rlm@46 3085 var a2 = el.getAnchorXY(p2, false);
rlm@46 3086
rlm@46 3087 var x = a2[0] - a1[0] + o[0];
rlm@46 3088 var y = a2[1] - a1[1] + o[1];
rlm@46 3089
rlm@46 3090 if(c){
rlm@46 3091 var w = this.getWidth(), h = this.getHeight(), r = el.getRegion();
rlm@46 3092 var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5;
rlm@46 3093
rlm@46 3094 var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1);
rlm@46 3095 var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1);
rlm@46 3096 var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
rlm@46 3097 var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));
rlm@46 3098
rlm@46 3099 var doc = document;
rlm@46 3100 var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5;
rlm@46 3101 var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5;
rlm@46 3102
rlm@46 3103 if((x+w) > dw + scrollX){
rlm@46 3104 x = swapX ? r.left-w : dw+scrollX-w;
rlm@46 3105 }
rlm@46 3106 if(x < scrollX){
rlm@46 3107 x = swapX ? r.right : scrollX;
rlm@46 3108 }
rlm@46 3109 if((y+h) > dh + scrollY){
rlm@46 3110 y = swapY ? r.top-h : dh+scrollY-h;
rlm@46 3111 }
rlm@46 3112 if (y < scrollY){
rlm@46 3113 y = swapY ? r.bottom : scrollY;
rlm@46 3114 }
rlm@46 3115 }
rlm@46 3116 return [x,y];
rlm@46 3117 },
rlm@46 3118
rlm@46 3119 getConstrainToXY : function(){
rlm@46 3120 var os = {top:0, left:0, bottom:0, right: 0};
rlm@46 3121
rlm@46 3122 return function(el, local, offsets, proposedXY){
rlm@46 3123 el = Ext.get(el);
rlm@46 3124 offsets = offsets ? Ext.applyIf(offsets, os) : os;
rlm@46 3125
rlm@46 3126 var vw, vh, vx = 0, vy = 0;
rlm@46 3127 if(el.dom == document.body || el.dom == document){
rlm@46 3128 vw = Ext.lib.Dom.getViewWidth();
rlm@46 3129 vh = Ext.lib.Dom.getViewHeight();
rlm@46 3130 }else{
rlm@46 3131 vw = el.dom.clientWidth;
rlm@46 3132 vh = el.dom.clientHeight;
rlm@46 3133 if(!local){
rlm@46 3134 var vxy = el.getXY();
rlm@46 3135 vx = vxy[0];
rlm@46 3136 vy = vxy[1];
rlm@46 3137 }
rlm@46 3138 }
rlm@46 3139
rlm@46 3140 var s = el.getScroll();
rlm@46 3141
rlm@46 3142 vx += offsets.left + s.left;
rlm@46 3143 vy += offsets.top + s.top;
rlm@46 3144
rlm@46 3145 vw -= offsets.right;
rlm@46 3146 vh -= offsets.bottom;
rlm@46 3147
rlm@46 3148 var vr = vx+vw;
rlm@46 3149 var vb = vy+vh;
rlm@46 3150
rlm@46 3151 var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]);
rlm@46 3152 var x = xy[0], y = xy[1];
rlm@46 3153 var w = this.dom.offsetWidth, h = this.dom.offsetHeight;
rlm@46 3154
rlm@46 3155 var moved = false;
rlm@46 3156
rlm@46 3157 if((x + w) > vr){
rlm@46 3158 x = vr - w;
rlm@46 3159 moved = true;
rlm@46 3160 }
rlm@46 3161 if((y + h) > vb){
rlm@46 3162 y = vb - h;
rlm@46 3163 moved = true;
rlm@46 3164 }
rlm@46 3165 if(x < vx){
rlm@46 3166 x = vx;
rlm@46 3167 moved = true;
rlm@46 3168 }
rlm@46 3169 if(y < vy){
rlm@46 3170 y = vy;
rlm@46 3171 moved = true;
rlm@46 3172 }
rlm@46 3173 return moved ? [x, y] : false;
rlm@46 3174 };
rlm@46 3175 }(),
rlm@46 3176
rlm@46 3177 adjustForConstraints : function(xy, parent, offsets){
rlm@46 3178 return this.getConstrainToXY(parent || document, false, offsets, xy) || xy;
rlm@46 3179 },
rlm@46 3180
rlm@46 3181
rlm@46 3182 alignTo : function(element, position, offsets, animate){
rlm@46 3183 var xy = this.getAlignToXY(element, position, offsets);
rlm@46 3184 this.setXY(xy, this.preanim(arguments, 3));
rlm@46 3185 return this;
rlm@46 3186 },
rlm@46 3187
rlm@46 3188
rlm@46 3189 anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){
rlm@46 3190 var action = function(){
rlm@46 3191 this.alignTo(el, alignment, offsets, animate);
rlm@46 3192 Ext.callback(callback, this);
rlm@46 3193 };
rlm@46 3194 Ext.EventManager.onWindowResize(action, this);
rlm@46 3195 var tm = typeof monitorScroll;
rlm@46 3196 if(tm != 'undefined'){
rlm@46 3197 Ext.EventManager.on(window, 'scroll', action, this,
rlm@46 3198 {buffer: tm == 'number' ? monitorScroll : 50});
rlm@46 3199 }
rlm@46 3200 action.call(this); return this;
rlm@46 3201 },
rlm@46 3202
rlm@46 3203 clearOpacity : function(){
rlm@46 3204 if (window.ActiveXObject) {
rlm@46 3205 if(typeof this.dom.style.filter == 'string' && (/alpha/i).test(this.dom.style.filter)){
rlm@46 3206 this.dom.style.filter = "";
rlm@46 3207 }
rlm@46 3208 } else {
rlm@46 3209 this.dom.style.opacity = "";
rlm@46 3210 this.dom.style["-moz-opacity"] = "";
rlm@46 3211 this.dom.style["-khtml-opacity"] = "";
rlm@46 3212 }
rlm@46 3213 return this;
rlm@46 3214 },
rlm@46 3215
rlm@46 3216
rlm@46 3217 hide : function(animate){
rlm@46 3218 this.setVisible(false, this.preanim(arguments, 0));
rlm@46 3219 return this;
rlm@46 3220 },
rlm@46 3221
rlm@46 3222
rlm@46 3223 show : function(animate){
rlm@46 3224 this.setVisible(true, this.preanim(arguments, 0));
rlm@46 3225 return this;
rlm@46 3226 },
rlm@46 3227
rlm@46 3228
rlm@46 3229 addUnits : function(size){
rlm@46 3230 return Ext.Element.addUnits(size, this.defaultUnit);
rlm@46 3231 },
rlm@46 3232
rlm@46 3233
rlm@46 3234 update : function(html, loadScripts, callback){
rlm@46 3235 if(typeof html == "undefined"){
rlm@46 3236 html = "";
rlm@46 3237 }
rlm@46 3238 if(loadScripts !== true){
rlm@46 3239 this.dom.innerHTML = html;
rlm@46 3240 if(typeof callback == "function"){
rlm@46 3241 callback();
rlm@46 3242 }
rlm@46 3243 return this;
rlm@46 3244 }
rlm@46 3245 var id = Ext.id();
rlm@46 3246 var dom = this.dom;
rlm@46 3247
rlm@46 3248 html += '<span id="' + id + '"></span>';
rlm@46 3249
rlm@46 3250 E.onAvailable(id, function(){
rlm@46 3251 var hd = document.getElementsByTagName("head")[0];
rlm@46 3252 var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
rlm@46 3253 var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
rlm@46 3254 var typeRe = /\stype=([\'\"])(.*?)\1/i;
rlm@46 3255
rlm@46 3256 var match;
rlm@46 3257 while(match = re.exec(html)){
rlm@46 3258 var attrs = match[1];
rlm@46 3259 var srcMatch = attrs ? attrs.match(srcRe) : false;
rlm@46 3260 if(srcMatch && srcMatch[2]){
rlm@46 3261 var s = document.createElement("script");
rlm@46 3262 s.src = srcMatch[2];
rlm@46 3263 var typeMatch = attrs.match(typeRe);
rlm@46 3264 if(typeMatch && typeMatch[2]){
rlm@46 3265 s.type = typeMatch[2];
rlm@46 3266 }
rlm@46 3267 hd.appendChild(s);
rlm@46 3268 }else if(match[2] && match[2].length > 0){
rlm@46 3269 if(window.execScript) {
rlm@46 3270 window.execScript(match[2]);
rlm@46 3271 } else {
rlm@46 3272 window.eval(match[2]);
rlm@46 3273 }
rlm@46 3274 }
rlm@46 3275 }
rlm@46 3276 var el = document.getElementById(id);
rlm@46 3277 if(el){Ext.removeNode(el);}
rlm@46 3278 if(typeof callback == "function"){
rlm@46 3279 callback();
rlm@46 3280 }
rlm@46 3281 });
rlm@46 3282 dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
rlm@46 3283 return this;
rlm@46 3284 },
rlm@46 3285
rlm@46 3286
rlm@46 3287 load : function(){
rlm@46 3288 var um = this.getUpdater();
rlm@46 3289 um.update.apply(um, arguments);
rlm@46 3290 return this;
rlm@46 3291 },
rlm@46 3292
rlm@46 3293
rlm@46 3294 getUpdater : function(){
rlm@46 3295 if(!this.updateManager){
rlm@46 3296 this.updateManager = new Ext.Updater(this);
rlm@46 3297 }
rlm@46 3298 return this.updateManager;
rlm@46 3299 },
rlm@46 3300
rlm@46 3301
rlm@46 3302 unselectable : function(){
rlm@46 3303 this.dom.unselectable = "on";
rlm@46 3304 this.swallowEvent("selectstart", true);
rlm@46 3305 this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");
rlm@46 3306 this.addClass("x-unselectable");
rlm@46 3307 return this;
rlm@46 3308 },
rlm@46 3309
rlm@46 3310
rlm@46 3311 getCenterXY : function(){
rlm@46 3312 return this.getAlignToXY(document, 'c-c');
rlm@46 3313 },
rlm@46 3314
rlm@46 3315
rlm@46 3316 center : function(centerIn){
rlm@46 3317 this.alignTo(centerIn || document, 'c-c');
rlm@46 3318 return this;
rlm@46 3319 },
rlm@46 3320
rlm@46 3321
rlm@46 3322 isBorderBox : function(){
rlm@46 3323 return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox;
rlm@46 3324 },
rlm@46 3325
rlm@46 3326
rlm@46 3327 getBox : function(contentBox, local){
rlm@46 3328 var xy;
rlm@46 3329 if(!local){
rlm@46 3330 xy = this.getXY();
rlm@46 3331 }else{
rlm@46 3332 var left = parseInt(this.getStyle("left"), 10) || 0;
rlm@46 3333 var top = parseInt(this.getStyle("top"), 10) || 0;
rlm@46 3334 xy = [left, top];
rlm@46 3335 }
rlm@46 3336 var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
rlm@46 3337 if(!contentBox){
rlm@46 3338 bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};
rlm@46 3339 }else{
rlm@46 3340 var l = this.getBorderWidth("l")+this.getPadding("l");
rlm@46 3341 var r = this.getBorderWidth("r")+this.getPadding("r");
rlm@46 3342 var t = this.getBorderWidth("t")+this.getPadding("t");
rlm@46 3343 var b = this.getBorderWidth("b")+this.getPadding("b");
rlm@46 3344 bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)};
rlm@46 3345 }
rlm@46 3346 bx.right = bx.x + bx.width;
rlm@46 3347 bx.bottom = bx.y + bx.height;
rlm@46 3348 return bx;
rlm@46 3349 },
rlm@46 3350
rlm@46 3351
rlm@46 3352 getFrameWidth : function(sides, onlyContentBox){
rlm@46 3353 return onlyContentBox && Ext.isBorderBox ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
rlm@46 3354 },
rlm@46 3355
rlm@46 3356
rlm@46 3357 setBox : function(box, adjust, animate){
rlm@46 3358 var w = box.width, h = box.height;
rlm@46 3359 if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){
rlm@46 3360 w -= (this.getBorderWidth("lr") + this.getPadding("lr"));
rlm@46 3361 h -= (this.getBorderWidth("tb") + this.getPadding("tb"));
rlm@46 3362 }
rlm@46 3363 this.setBounds(box.x, box.y, w, h, this.preanim(arguments, 2));
rlm@46 3364 return this;
rlm@46 3365 },
rlm@46 3366
rlm@46 3367
rlm@46 3368 repaint : function(){
rlm@46 3369 var dom = this.dom;
rlm@46 3370 this.addClass("x-repaint");
rlm@46 3371 setTimeout(function(){
rlm@46 3372 Ext.get(dom).removeClass("x-repaint");
rlm@46 3373 }, 1);
rlm@46 3374 return this;
rlm@46 3375 },
rlm@46 3376
rlm@46 3377
rlm@46 3378 getMargins : function(side){
rlm@46 3379 if(!side){
rlm@46 3380 return {
rlm@46 3381 top: parseInt(this.getStyle("margin-top"), 10) || 0,
rlm@46 3382 left: parseInt(this.getStyle("margin-left"), 10) || 0,
rlm@46 3383 bottom: parseInt(this.getStyle("margin-bottom"), 10) || 0,
rlm@46 3384 right: parseInt(this.getStyle("margin-right"), 10) || 0
rlm@46 3385 };
rlm@46 3386 }else{
rlm@46 3387 return this.addStyles(side, El.margins);
rlm@46 3388 }
rlm@46 3389 },
rlm@46 3390
rlm@46 3391 addStyles : function(sides, styles){
rlm@46 3392 var val = 0, v, w;
rlm@46 3393 for(var i = 0, len = sides.length; i < len; i++){
rlm@46 3394 v = this.getStyle(styles[sides.charAt(i)]);
rlm@46 3395 if(v){
rlm@46 3396 w = parseInt(v, 10);
rlm@46 3397 if(w){ val += (w >= 0 ? w : -1 * w); }
rlm@46 3398 }
rlm@46 3399 }
rlm@46 3400 return val;
rlm@46 3401 },
rlm@46 3402
rlm@46 3403
rlm@46 3404 createProxy : function(config, renderTo, matchBox){
rlm@46 3405 config = typeof config == "object" ?
rlm@46 3406 config : {tag : "div", cls: config};
rlm@46 3407
rlm@46 3408 var proxy;
rlm@46 3409 if(renderTo){
rlm@46 3410 proxy = Ext.DomHelper.append(renderTo, config, true);
rlm@46 3411 }else {
rlm@46 3412 proxy = Ext.DomHelper.insertBefore(this.dom, config, true);
rlm@46 3413 }
rlm@46 3414 if(matchBox){
rlm@46 3415 proxy.setBox(this.getBox());
rlm@46 3416 }
rlm@46 3417 return proxy;
rlm@46 3418 },
rlm@46 3419
rlm@46 3420
rlm@46 3421 mask : function(msg, msgCls){
rlm@46 3422 if(this.getStyle("position") == "static"){
rlm@46 3423 this.setStyle("position", "relative");
rlm@46 3424 }
rlm@46 3425 if(this._maskMsg){
rlm@46 3426 this._maskMsg.remove();
rlm@46 3427 }
rlm@46 3428 if(this._mask){
rlm@46 3429 this._mask.remove();
rlm@46 3430 }
rlm@46 3431
rlm@46 3432 this._mask = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask"}, true);
rlm@46 3433
rlm@46 3434 this.addClass("x-masked");
rlm@46 3435 this._mask.setDisplayed(true);
rlm@46 3436 if(typeof msg == 'string'){
rlm@46 3437 this._maskMsg = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask-msg", cn:{tag:'div'}}, true);
rlm@46 3438 var mm = this._maskMsg;
rlm@46 3439 mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg";
rlm@46 3440 mm.dom.firstChild.innerHTML = msg;
rlm@46 3441 mm.setDisplayed(true);
rlm@46 3442 mm.center(this);
rlm@46 3443 }
rlm@46 3444 if(Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && this.getStyle('height') == 'auto'){ this._mask.setSize(this.dom.clientWidth, this.getHeight());
rlm@46 3445 }
rlm@46 3446 return this._mask;
rlm@46 3447 },
rlm@46 3448
rlm@46 3449
rlm@46 3450 unmask : function(){
rlm@46 3451 if(this._mask){
rlm@46 3452 if(this._maskMsg){
rlm@46 3453 this._maskMsg.remove();
rlm@46 3454 delete this._maskMsg;
rlm@46 3455 }
rlm@46 3456 this._mask.remove();
rlm@46 3457 delete this._mask;
rlm@46 3458 }
rlm@46 3459 this.removeClass("x-masked");
rlm@46 3460 },
rlm@46 3461
rlm@46 3462
rlm@46 3463 isMasked : function(){
rlm@46 3464 return this._mask && this._mask.isVisible();
rlm@46 3465 },
rlm@46 3466
rlm@46 3467
rlm@46 3468 createShim : function(){
rlm@46 3469 var el = document.createElement('iframe');
rlm@46 3470 el.frameBorder = 'no';
rlm@46 3471 el.className = 'ext-shim';
rlm@46 3472 if(Ext.isIE && Ext.isSecure){
rlm@46 3473 el.src = Ext.SSL_SECURE_URL;
rlm@46 3474 }
rlm@46 3475 var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
rlm@46 3476 shim.autoBoxAdjust = false;
rlm@46 3477 return shim;
rlm@46 3478 },
rlm@46 3479
rlm@46 3480
rlm@46 3481 remove : function(){
rlm@46 3482 Ext.removeNode(this.dom);
rlm@46 3483 delete El.cache[this.dom.id];
rlm@46 3484 },
rlm@46 3485
rlm@46 3486
rlm@46 3487 hover : function(overFn, outFn, scope){
rlm@46 3488 var preOverFn = function(e){
rlm@46 3489 if(!e.within(this, true)){
rlm@46 3490 overFn.apply(scope || this, arguments);
rlm@46 3491 }
rlm@46 3492 };
rlm@46 3493 var preOutFn = function(e){
rlm@46 3494 if(!e.within(this, true)){
rlm@46 3495 outFn.apply(scope || this, arguments);
rlm@46 3496 }
rlm@46 3497 };
rlm@46 3498 this.on("mouseover", preOverFn, this.dom);
rlm@46 3499 this.on("mouseout", preOutFn, this.dom);
rlm@46 3500 return this;
rlm@46 3501 },
rlm@46 3502
rlm@46 3503
rlm@46 3504 addClassOnOver : function(className){
rlm@46 3505 this.hover(
rlm@46 3506 function(){
rlm@46 3507 Ext.fly(this, '_internal').addClass(className);
rlm@46 3508 },
rlm@46 3509 function(){
rlm@46 3510 Ext.fly(this, '_internal').removeClass(className);
rlm@46 3511 }
rlm@46 3512 );
rlm@46 3513 return this;
rlm@46 3514 },
rlm@46 3515
rlm@46 3516
rlm@46 3517 addClassOnFocus : function(className){
rlm@46 3518 this.on("focus", function(){
rlm@46 3519 Ext.fly(this, '_internal').addClass(className);
rlm@46 3520 }, this.dom);
rlm@46 3521 this.on("blur", function(){
rlm@46 3522 Ext.fly(this, '_internal').removeClass(className);
rlm@46 3523 }, this.dom);
rlm@46 3524 return this;
rlm@46 3525 },
rlm@46 3526
rlm@46 3527 addClassOnClick : function(className){
rlm@46 3528 var dom = this.dom;
rlm@46 3529 this.on("mousedown", function(){
rlm@46 3530 Ext.fly(dom, '_internal').addClass(className);
rlm@46 3531 var d = Ext.getDoc();
rlm@46 3532 var fn = function(){
rlm@46 3533 Ext.fly(dom, '_internal').removeClass(className);
rlm@46 3534 d.removeListener("mouseup", fn);
rlm@46 3535 };
rlm@46 3536 d.on("mouseup", fn);
rlm@46 3537 });
rlm@46 3538 return this;
rlm@46 3539 },
rlm@46 3540
rlm@46 3541
rlm@46 3542 swallowEvent : function(eventName, preventDefault){
rlm@46 3543 var fn = function(e){
rlm@46 3544 e.stopPropagation();
rlm@46 3545 if(preventDefault){
rlm@46 3546 e.preventDefault();
rlm@46 3547 }
rlm@46 3548 };
rlm@46 3549 if(Ext.isArray(eventName)){
rlm@46 3550 for(var i = 0, len = eventName.length; i < len; i++){
rlm@46 3551 this.on(eventName[i], fn);
rlm@46 3552 }
rlm@46 3553 return this;
rlm@46 3554 }
rlm@46 3555 this.on(eventName, fn);
rlm@46 3556 return this;
rlm@46 3557 },
rlm@46 3558
rlm@46 3559
rlm@46 3560 parent : function(selector, returnDom){
rlm@46 3561 return this.matchNode('parentNode', 'parentNode', selector, returnDom);
rlm@46 3562 },
rlm@46 3563
rlm@46 3564
rlm@46 3565 next : function(selector, returnDom){
rlm@46 3566 return this.matchNode('nextSibling', 'nextSibling', selector, returnDom);
rlm@46 3567 },
rlm@46 3568
rlm@46 3569
rlm@46 3570 prev : function(selector, returnDom){
rlm@46 3571 return this.matchNode('previousSibling', 'previousSibling', selector, returnDom);
rlm@46 3572 },
rlm@46 3573
rlm@46 3574
rlm@46 3575
rlm@46 3576 first : function(selector, returnDom){
rlm@46 3577 return this.matchNode('nextSibling', 'firstChild', selector, returnDom);
rlm@46 3578 },
rlm@46 3579
rlm@46 3580
rlm@46 3581 last : function(selector, returnDom){
rlm@46 3582 return this.matchNode('previousSibling', 'lastChild', selector, returnDom);
rlm@46 3583 },
rlm@46 3584
rlm@46 3585 matchNode : function(dir, start, selector, returnDom){
rlm@46 3586 var n = this.dom[start];
rlm@46 3587 while(n){
rlm@46 3588 if(n.nodeType == 1 && (!selector || Ext.DomQuery.is(n, selector))){
rlm@46 3589 return !returnDom ? Ext.get(n) : n;
rlm@46 3590 }
rlm@46 3591 n = n[dir];
rlm@46 3592 }
rlm@46 3593 return null;
rlm@46 3594 },
rlm@46 3595
rlm@46 3596
rlm@46 3597 appendChild: function(el){
rlm@46 3598 el = Ext.get(el);
rlm@46 3599 el.appendTo(this);
rlm@46 3600 return this;
rlm@46 3601 },
rlm@46 3602
rlm@46 3603
rlm@46 3604 createChild: function(config, insertBefore, returnDom){
rlm@46 3605 config = config || {tag:'div'};
rlm@46 3606 if(insertBefore){
rlm@46 3607 return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true);
rlm@46 3608 }
rlm@46 3609 return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true);
rlm@46 3610 },
rlm@46 3611
rlm@46 3612
rlm@46 3613 appendTo: function(el){
rlm@46 3614 el = Ext.getDom(el);
rlm@46 3615 el.appendChild(this.dom);
rlm@46 3616 return this;
rlm@46 3617 },
rlm@46 3618
rlm@46 3619
rlm@46 3620 insertBefore: function(el){
rlm@46 3621 el = Ext.getDom(el);
rlm@46 3622 el.parentNode.insertBefore(this.dom, el);
rlm@46 3623 return this;
rlm@46 3624 },
rlm@46 3625
rlm@46 3626
rlm@46 3627 insertAfter: function(el){
rlm@46 3628 el = Ext.getDom(el);
rlm@46 3629 el.parentNode.insertBefore(this.dom, el.nextSibling);
rlm@46 3630 return this;
rlm@46 3631 },
rlm@46 3632
rlm@46 3633
rlm@46 3634 insertFirst: function(el, returnDom){
rlm@46 3635 el = el || {};
rlm@46 3636 if(typeof el == 'object' && !el.nodeType && !el.dom){ return this.createChild(el, this.dom.firstChild, returnDom);
rlm@46 3637 }else{
rlm@46 3638 el = Ext.getDom(el);
rlm@46 3639 this.dom.insertBefore(el, this.dom.firstChild);
rlm@46 3640 return !returnDom ? Ext.get(el) : el;
rlm@46 3641 }
rlm@46 3642 },
rlm@46 3643
rlm@46 3644
rlm@46 3645 insertSibling: function(el, where, returnDom){
rlm@46 3646 var rt;
rlm@46 3647 if(Ext.isArray(el)){
rlm@46 3648 for(var i = 0, len = el.length; i < len; i++){
rlm@46 3649 rt = this.insertSibling(el[i], where, returnDom);
rlm@46 3650 }
rlm@46 3651 return rt;
rlm@46 3652 }
rlm@46 3653 where = where ? where.toLowerCase() : 'before';
rlm@46 3654 el = el || {};
rlm@46 3655 var refNode = where == 'before' ? this.dom : this.dom.nextSibling;
rlm@46 3656
rlm@46 3657 if(typeof el == 'object' && !el.nodeType && !el.dom){ if(where == 'after' && !this.dom.nextSibling){
rlm@46 3658 rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom);
rlm@46 3659 }else{
rlm@46 3660 rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom);
rlm@46 3661 }
rlm@46 3662
rlm@46 3663 }else{
rlm@46 3664 rt = this.dom.parentNode.insertBefore(Ext.getDom(el), refNode);
rlm@46 3665 if(!returnDom){
rlm@46 3666 rt = Ext.get(rt);
rlm@46 3667 }
rlm@46 3668 }
rlm@46 3669 return rt;
rlm@46 3670 },
rlm@46 3671
rlm@46 3672
rlm@46 3673 wrap: function(config, returnDom){
rlm@46 3674 if(!config){
rlm@46 3675 config = {tag: "div"};
rlm@46 3676 }
rlm@46 3677 var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom);
rlm@46 3678 newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
rlm@46 3679 return newEl;
rlm@46 3680 },
rlm@46 3681
rlm@46 3682
rlm@46 3683 replace: function(el){
rlm@46 3684 el = Ext.get(el);
rlm@46 3685 this.insertBefore(el);
rlm@46 3686 el.remove();
rlm@46 3687 return this;
rlm@46 3688 },
rlm@46 3689
rlm@46 3690
rlm@46 3691 replaceWith: function(el){
rlm@46 3692 if(typeof el == 'object' && !el.nodeType && !el.dom){ el = this.insertSibling(el, 'before');
rlm@46 3693 }else{
rlm@46 3694 el = Ext.getDom(el);
rlm@46 3695 this.dom.parentNode.insertBefore(el, this.dom);
rlm@46 3696 }
rlm@46 3697 El.uncache(this.id);
rlm@46 3698 this.dom.parentNode.removeChild(this.dom);
rlm@46 3699 this.dom = el;
rlm@46 3700 this.id = Ext.id(el);
rlm@46 3701 El.cache[this.id] = this;
rlm@46 3702 return this;
rlm@46 3703 },
rlm@46 3704
rlm@46 3705
rlm@46 3706 insertHtml : function(where, html, returnEl){
rlm@46 3707 var el = Ext.DomHelper.insertHtml(where, this.dom, html);
rlm@46 3708 return returnEl ? Ext.get(el) : el;
rlm@46 3709 },
rlm@46 3710
rlm@46 3711
rlm@46 3712 set : function(o, useSet){
rlm@46 3713 var el = this.dom;
rlm@46 3714 useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet;
rlm@46 3715 for(var attr in o){
rlm@46 3716 if(attr == "style" || typeof o[attr] == "function") continue;
rlm@46 3717 if(attr=="cls"){
rlm@46 3718 el.className = o["cls"];
rlm@46 3719 }else if(o.hasOwnProperty(attr)){
rlm@46 3720 if(useSet) el.setAttribute(attr, o[attr]);
rlm@46 3721 else el[attr] = o[attr];
rlm@46 3722 }
rlm@46 3723 }
rlm@46 3724 if(o.style){
rlm@46 3725 Ext.DomHelper.applyStyles(el, o.style);
rlm@46 3726 }
rlm@46 3727 return this;
rlm@46 3728 },
rlm@46 3729
rlm@46 3730
rlm@46 3731 addKeyListener : function(key, fn, scope){
rlm@46 3732 var config;
rlm@46 3733 if(typeof key != "object" || Ext.isArray(key)){
rlm@46 3734 config = {
rlm@46 3735 key: key,
rlm@46 3736 fn: fn,
rlm@46 3737 scope: scope
rlm@46 3738 };
rlm@46 3739 }else{
rlm@46 3740 config = {
rlm@46 3741 key : key.key,
rlm@46 3742 shift : key.shift,
rlm@46 3743 ctrl : key.ctrl,
rlm@46 3744 alt : key.alt,
rlm@46 3745 fn: fn,
rlm@46 3746 scope: scope
rlm@46 3747 };
rlm@46 3748 }
rlm@46 3749 return new Ext.KeyMap(this, config);
rlm@46 3750 },
rlm@46 3751
rlm@46 3752
rlm@46 3753 addKeyMap : function(config){
rlm@46 3754 return new Ext.KeyMap(this, config);
rlm@46 3755 },
rlm@46 3756
rlm@46 3757
rlm@46 3758 isScrollable : function(){
rlm@46 3759 var dom = this.dom;
rlm@46 3760 return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
rlm@46 3761 },
rlm@46 3762
rlm@46 3763
rlm@46 3764 scrollTo : function(side, value, animate){
rlm@46 3765 var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop";
rlm@46 3766 if(!animate || !A){
rlm@46 3767 this.dom[prop] = value;
rlm@46 3768 }else{
rlm@46 3769 var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value];
rlm@46 3770 this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll');
rlm@46 3771 }
rlm@46 3772 return this;
rlm@46 3773 },
rlm@46 3774
rlm@46 3775
rlm@46 3776 scroll : function(direction, distance, animate){
rlm@46 3777 if(!this.isScrollable()){
rlm@46 3778 return;
rlm@46 3779 }
rlm@46 3780 var el = this.dom;
rlm@46 3781 var l = el.scrollLeft, t = el.scrollTop;
rlm@46 3782 var w = el.scrollWidth, h = el.scrollHeight;
rlm@46 3783 var cw = el.clientWidth, ch = el.clientHeight;
rlm@46 3784 direction = direction.toLowerCase();
rlm@46 3785 var scrolled = false;
rlm@46 3786 var a = this.preanim(arguments, 2);
rlm@46 3787 switch(direction){
rlm@46 3788 case "l":
rlm@46 3789 case "left":
rlm@46 3790 if(w - l > cw){
rlm@46 3791 var v = Math.min(l + distance, w-cw);
rlm@46 3792 this.scrollTo("left", v, a);
rlm@46 3793 scrolled = true;
rlm@46 3794 }
rlm@46 3795 break;
rlm@46 3796 case "r":
rlm@46 3797 case "right":
rlm@46 3798 if(l > 0){
rlm@46 3799 var v = Math.max(l - distance, 0);
rlm@46 3800 this.scrollTo("left", v, a);
rlm@46 3801 scrolled = true;
rlm@46 3802 }
rlm@46 3803 break;
rlm@46 3804 case "t":
rlm@46 3805 case "top":
rlm@46 3806 case "up":
rlm@46 3807 if(t > 0){
rlm@46 3808 var v = Math.max(t - distance, 0);
rlm@46 3809 this.scrollTo("top", v, a);
rlm@46 3810 scrolled = true;
rlm@46 3811 }
rlm@46 3812 break;
rlm@46 3813 case "b":
rlm@46 3814 case "bottom":
rlm@46 3815 case "down":
rlm@46 3816 if(h - t > ch){
rlm@46 3817 var v = Math.min(t + distance, h-ch);
rlm@46 3818 this.scrollTo("top", v, a);
rlm@46 3819 scrolled = true;
rlm@46 3820 }
rlm@46 3821 break;
rlm@46 3822 }
rlm@46 3823 return scrolled;
rlm@46 3824 },
rlm@46 3825
rlm@46 3826
rlm@46 3827 translatePoints : function(x, y){
rlm@46 3828 if(typeof x == 'object' || Ext.isArray(x)){
rlm@46 3829 y = x[1]; x = x[0];
rlm@46 3830 }
rlm@46 3831 var p = this.getStyle('position');
rlm@46 3832 var o = this.getXY();
rlm@46 3833
rlm@46 3834 var l = parseInt(this.getStyle('left'), 10);
rlm@46 3835 var t = parseInt(this.getStyle('top'), 10);
rlm@46 3836
rlm@46 3837 if(isNaN(l)){
rlm@46 3838 l = (p == "relative") ? 0 : this.dom.offsetLeft;
rlm@46 3839 }
rlm@46 3840 if(isNaN(t)){
rlm@46 3841 t = (p == "relative") ? 0 : this.dom.offsetTop;
rlm@46 3842 }
rlm@46 3843
rlm@46 3844 return {left: (x - o[0] + l), top: (y - o[1] + t)};
rlm@46 3845 },
rlm@46 3846
rlm@46 3847
rlm@46 3848 getScroll : function(){
rlm@46 3849 var d = this.dom, doc = document;
rlm@46 3850 if(d == doc || d == doc.body){
rlm@46 3851 var l, t;
rlm@46 3852 if(Ext.isIE && Ext.isStrict){
rlm@46 3853 l = doc.documentElement.scrollLeft || (doc.body.scrollLeft || 0);
rlm@46 3854 t = doc.documentElement.scrollTop || (doc.body.scrollTop || 0);
rlm@46 3855 }else{
rlm@46 3856 l = window.pageXOffset || (doc.body.scrollLeft || 0);
rlm@46 3857 t = window.pageYOffset || (doc.body.scrollTop || 0);
rlm@46 3858 }
rlm@46 3859 return {left: l, top: t};
rlm@46 3860 }else{
rlm@46 3861 return {left: d.scrollLeft, top: d.scrollTop};
rlm@46 3862 }
rlm@46 3863 },
rlm@46 3864
rlm@46 3865
rlm@46 3866 getColor : function(attr, defaultValue, prefix){
rlm@46 3867 var v = this.getStyle(attr);
rlm@46 3868 if(!v || v == "transparent" || v == "inherit") {
rlm@46 3869 return defaultValue;
rlm@46 3870 }
rlm@46 3871 var color = typeof prefix == "undefined" ? "#" : prefix;
rlm@46 3872 if(v.substr(0, 4) == "rgb("){
rlm@46 3873 var rvs = v.slice(4, v.length -1).split(",");
rlm@46 3874 for(var i = 0; i < 3; i++){
rlm@46 3875 var h = parseInt(rvs[i]);
rlm@46 3876 var s = h.toString(16);
rlm@46 3877 if(h < 16){
rlm@46 3878 s = "0" + s;
rlm@46 3879 }
rlm@46 3880 color += s;
rlm@46 3881 }
rlm@46 3882 } else {
rlm@46 3883 if(v.substr(0, 1) == "#"){
rlm@46 3884 if(v.length == 4) {
rlm@46 3885 for(var i = 1; i < 4; i++){
rlm@46 3886 var c = v.charAt(i);
rlm@46 3887 color += c + c;
rlm@46 3888 }
rlm@46 3889 }else if(v.length == 7){
rlm@46 3890 color += v.substr(1);
rlm@46 3891 }
rlm@46 3892 }
rlm@46 3893 }
rlm@46 3894 return(color.length > 5 ? color.toLowerCase() : defaultValue);
rlm@46 3895 },
rlm@46 3896
rlm@46 3897
rlm@46 3898 boxWrap : function(cls){
rlm@46 3899 cls = cls || 'x-box';
rlm@46 3900 var el = Ext.get(this.insertHtml('beforeBegin', String.format('<div class="{0}">'+El.boxMarkup+'</div>', cls)));
rlm@46 3901 el.child('.'+cls+'-mc').dom.appendChild(this.dom);
rlm@46 3902 return el;
rlm@46 3903 },
rlm@46 3904
rlm@46 3905
rlm@46 3906 getAttributeNS : Ext.isIE ? function(ns, name){
rlm@46 3907 var d = this.dom;
rlm@46 3908 var type = typeof d[ns+":"+name];
rlm@46 3909 if(type != 'undefined' && type != 'unknown'){
rlm@46 3910 return d[ns+":"+name];
rlm@46 3911 }
rlm@46 3912 return d[name];
rlm@46 3913 } : function(ns, name){
rlm@46 3914 var d = this.dom;
rlm@46 3915 return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name];
rlm@46 3916 },
rlm@46 3917
rlm@46 3918 getTextWidth : function(text, min, max){
rlm@46 3919 return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000);
rlm@46 3920 }
rlm@46 3921 };
rlm@46 3922
rlm@46 3923 var ep = El.prototype;
rlm@46 3924
rlm@46 3925
rlm@46 3926 ep.on = ep.addListener;
rlm@46 3927 ep.mon = ep.addListener;
rlm@46 3928
rlm@46 3929 ep.getUpdateManager = ep.getUpdater;
rlm@46 3930
rlm@46 3931
rlm@46 3932 ep.un = ep.removeListener;
rlm@46 3933
rlm@46 3934
rlm@46 3935 ep.autoBoxAdjust = true;
rlm@46 3936
rlm@46 3937 El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;
rlm@46 3938
rlm@46 3939 El.addUnits = function(v, defaultUnit){
rlm@46 3940 if(v === "" || v == "auto"){
rlm@46 3941 return v;
rlm@46 3942 }
rlm@46 3943 if(v === undefined){
rlm@46 3944 return '';
rlm@46 3945 }
rlm@46 3946 if(typeof v == "number" || !El.unitPattern.test(v)){
rlm@46 3947 return v + (defaultUnit || 'px');
rlm@46 3948 }
rlm@46 3949 return v;
rlm@46 3950 };
rlm@46 3951
rlm@46 3952 El.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
rlm@46 3953
rlm@46 3954 El.VISIBILITY = 1;
rlm@46 3955
rlm@46 3956 El.DISPLAY = 2;
rlm@46 3957
rlm@46 3958 El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"};
rlm@46 3959 El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"};
rlm@46 3960 El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"};
rlm@46 3961
rlm@46 3962
rlm@46 3963
rlm@46 3964
rlm@46 3965 El.cache = {};
rlm@46 3966
rlm@46 3967 var docEl;
rlm@46 3968
rlm@46 3969
rlm@46 3970 El.get = function(el){
rlm@46 3971 var ex, elm, id;
rlm@46 3972 if(!el){ return null; }
rlm@46 3973 if(typeof el == "string"){ if(!(elm = document.getElementById(el))){
rlm@46 3974 return null;
rlm@46 3975 }
rlm@46 3976 if(ex = El.cache[el]){
rlm@46 3977 ex.dom = elm;
rlm@46 3978 }else{
rlm@46 3979 ex = El.cache[el] = new El(elm);
rlm@46 3980 }
rlm@46 3981 return ex;
rlm@46 3982 }else if(el.tagName){ if(!(id = el.id)){
rlm@46 3983 id = Ext.id(el);
rlm@46 3984 }
rlm@46 3985 if(ex = El.cache[id]){
rlm@46 3986 ex.dom = el;
rlm@46 3987 }else{
rlm@46 3988 ex = El.cache[id] = new El(el);
rlm@46 3989 }
rlm@46 3990 return ex;
rlm@46 3991 }else if(el instanceof El){
rlm@46 3992 if(el != docEl){
rlm@46 3993 el.dom = document.getElementById(el.id) || el.dom; El.cache[el.id] = el; }
rlm@46 3994 return el;
rlm@46 3995 }else if(el.isComposite){
rlm@46 3996 return el;
rlm@46 3997 }else if(Ext.isArray(el)){
rlm@46 3998 return El.select(el);
rlm@46 3999 }else if(el == document){
rlm@46 4000 if(!docEl){
rlm@46 4001 var f = function(){};
rlm@46 4002 f.prototype = El.prototype;
rlm@46 4003 docEl = new f();
rlm@46 4004 docEl.dom = document;
rlm@46 4005 }
rlm@46 4006 return docEl;
rlm@46 4007 }
rlm@46 4008 return null;
rlm@46 4009 };
rlm@46 4010
rlm@46 4011 El.uncache = function(el){
rlm@46 4012 for(var i = 0, a = arguments, len = a.length; i < len; i++) {
rlm@46 4013 if(a[i]){
rlm@46 4014 delete El.cache[a[i].id || a[i]];
rlm@46 4015 }
rlm@46 4016 }
rlm@46 4017 };
rlm@46 4018
rlm@46 4019 El.garbageCollect = function(){
rlm@46 4020 if(!Ext.enableGarbageCollector){
rlm@46 4021 clearInterval(El.collectorThread);
rlm@46 4022 return;
rlm@46 4023 }
rlm@46 4024 for(var eid in El.cache){
rlm@46 4025 var el = El.cache[eid], d = el.dom;
rlm@46 4026 if(!d || !d.parentNode || (!d.offsetParent && !document.getElementById(eid))){
rlm@46 4027 delete El.cache[eid];
rlm@46 4028 if(d && Ext.enableListenerCollection){
rlm@46 4029 E.purgeElement(d);
rlm@46 4030 }
rlm@46 4031 }
rlm@46 4032 }
rlm@46 4033 }
rlm@46 4034 El.collectorThreadId = setInterval(El.garbageCollect, 30000);
rlm@46 4035
rlm@46 4036 var flyFn = function(){};
rlm@46 4037 flyFn.prototype = El.prototype;
rlm@46 4038 var _cls = new flyFn();
rlm@46 4039
rlm@46 4040 El.Flyweight = function(dom){
rlm@46 4041 this.dom = dom;
rlm@46 4042 };
rlm@46 4043
rlm@46 4044 El.Flyweight.prototype = _cls;
rlm@46 4045 El.Flyweight.prototype.isFlyweight = true;
rlm@46 4046
rlm@46 4047 El._flyweights = {};
rlm@46 4048
rlm@46 4049 El.fly = function(el, named){
rlm@46 4050 named = named || '_global';
rlm@46 4051 el = Ext.getDom(el);
rlm@46 4052 if(!el){
rlm@46 4053 return null;
rlm@46 4054 }
rlm@46 4055 if(!El._flyweights[named]){
rlm@46 4056 El._flyweights[named] = new El.Flyweight();
rlm@46 4057 }
rlm@46 4058 El._flyweights[named].dom = el;
rlm@46 4059 return El._flyweights[named];
rlm@46 4060 };
rlm@46 4061
rlm@46 4062
rlm@46 4063 Ext.get = El.get;
rlm@46 4064
rlm@46 4065 Ext.fly = El.fly;
rlm@46 4066
rlm@46 4067 var noBoxAdjust = Ext.isStrict ? {
rlm@46 4068 select:1
rlm@46 4069 } : {
rlm@46 4070 input:1, select:1, textarea:1
rlm@46 4071 };
rlm@46 4072 if(Ext.isIE || Ext.isGecko){
rlm@46 4073 noBoxAdjust['button'] = 1;
rlm@46 4074 }
rlm@46 4075
rlm@46 4076
rlm@46 4077 Ext.EventManager.on(window, 'unload', function(){
rlm@46 4078 delete El.cache;
rlm@46 4079 delete El._flyweights;
rlm@46 4080 });
rlm@46 4081 })();
rlm@46 4082
rlm@46 4083 Ext.enableFx = true;
rlm@46 4084
rlm@46 4085
rlm@46 4086 Ext.Fx = {
rlm@46 4087
rlm@46 4088 slideIn : function(anchor, o){
rlm@46 4089 var el = this.getFxEl();
rlm@46 4090 o = o || {};
rlm@46 4091
rlm@46 4092 el.queueFx(o, function(){
rlm@46 4093
rlm@46 4094 anchor = anchor || "t";
rlm@46 4095
rlm@46 4096 this.fixDisplay();
rlm@46 4097
rlm@46 4098 var r = this.getFxRestore();
rlm@46 4099 var b = this.getBox();
rlm@46 4100 this.setSize(b);
rlm@46 4101
rlm@46 4102 var wrap = this.fxWrap(r.pos, o, "hidden");
rlm@46 4103
rlm@46 4104 var st = this.dom.style;
rlm@46 4105 st.visibility = "visible";
rlm@46 4106 st.position = "absolute";
rlm@46 4107
rlm@46 4108 var after = function(){
rlm@46 4109 el.fxUnwrap(wrap, r.pos, o);
rlm@46 4110 st.width = r.width;
rlm@46 4111 st.height = r.height;
rlm@46 4112 el.afterFx(o);
rlm@46 4113 };
rlm@46 4114 var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height};
rlm@46 4115
rlm@46 4116 switch(anchor.toLowerCase()){
rlm@46 4117 case "t":
rlm@46 4118 wrap.setSize(b.width, 0);
rlm@46 4119 st.left = st.bottom = "0";
rlm@46 4120 a = {height: bh};
rlm@46 4121 break;
rlm@46 4122 case "l":
rlm@46 4123 wrap.setSize(0, b.height);
rlm@46 4124 st.right = st.top = "0";
rlm@46 4125 a = {width: bw};
rlm@46 4126 break;
rlm@46 4127 case "r":
rlm@46 4128 wrap.setSize(0, b.height);
rlm@46 4129 wrap.setX(b.right);
rlm@46 4130 st.left = st.top = "0";
rlm@46 4131 a = {width: bw, points: pt};
rlm@46 4132 break;
rlm@46 4133 case "b":
rlm@46 4134 wrap.setSize(b.width, 0);
rlm@46 4135 wrap.setY(b.bottom);
rlm@46 4136 st.left = st.top = "0";
rlm@46 4137 a = {height: bh, points: pt};
rlm@46 4138 break;
rlm@46 4139 case "tl":
rlm@46 4140 wrap.setSize(0, 0);
rlm@46 4141 st.right = st.bottom = "0";
rlm@46 4142 a = {width: bw, height: bh};
rlm@46 4143 break;
rlm@46 4144 case "bl":
rlm@46 4145 wrap.setSize(0, 0);
rlm@46 4146 wrap.setY(b.y+b.height);
rlm@46 4147 st.right = st.top = "0";
rlm@46 4148 a = {width: bw, height: bh, points: pt};
rlm@46 4149 break;
rlm@46 4150 case "br":
rlm@46 4151 wrap.setSize(0, 0);
rlm@46 4152 wrap.setXY([b.right, b.bottom]);
rlm@46 4153 st.left = st.top = "0";
rlm@46 4154 a = {width: bw, height: bh, points: pt};
rlm@46 4155 break;
rlm@46 4156 case "tr":
rlm@46 4157 wrap.setSize(0, 0);
rlm@46 4158 wrap.setX(b.x+b.width);
rlm@46 4159 st.left = st.bottom = "0";
rlm@46 4160 a = {width: bw, height: bh, points: pt};
rlm@46 4161 break;
rlm@46 4162 }
rlm@46 4163 this.dom.style.visibility = "visible";
rlm@46 4164 wrap.show();
rlm@46 4165
rlm@46 4166 arguments.callee.anim = wrap.fxanim(a,
rlm@46 4167 o,
rlm@46 4168 'motion',
rlm@46 4169 .5,
rlm@46 4170 'easeOut', after);
rlm@46 4171 });
rlm@46 4172 return this;
rlm@46 4173 },
rlm@46 4174
rlm@46 4175
rlm@46 4176 slideOut : function(anchor, o){
rlm@46 4177 var el = this.getFxEl();
rlm@46 4178 o = o || {};
rlm@46 4179
rlm@46 4180 el.queueFx(o, function(){
rlm@46 4181
rlm@46 4182 anchor = anchor || "t";
rlm@46 4183
rlm@46 4184 var r = this.getFxRestore();
rlm@46 4185
rlm@46 4186 var b = this.getBox();
rlm@46 4187 this.setSize(b);
rlm@46 4188
rlm@46 4189 var wrap = this.fxWrap(r.pos, o, "visible");
rlm@46 4190
rlm@46 4191 var st = this.dom.style;
rlm@46 4192 st.visibility = "visible";
rlm@46 4193 st.position = "absolute";
rlm@46 4194
rlm@46 4195 wrap.setSize(b);
rlm@46 4196
rlm@46 4197 var after = function(){
rlm@46 4198 if(o.useDisplay){
rlm@46 4199 el.setDisplayed(false);
rlm@46 4200 }else{
rlm@46 4201 el.hide();
rlm@46 4202 }
rlm@46 4203
rlm@46 4204 el.fxUnwrap(wrap, r.pos, o);
rlm@46 4205
rlm@46 4206 st.width = r.width;
rlm@46 4207 st.height = r.height;
rlm@46 4208
rlm@46 4209 el.afterFx(o);
rlm@46 4210 };
rlm@46 4211
rlm@46 4212 var a, zero = {to: 0};
rlm@46 4213 switch(anchor.toLowerCase()){
rlm@46 4214 case "t":
rlm@46 4215 st.left = st.bottom = "0";
rlm@46 4216 a = {height: zero};
rlm@46 4217 break;
rlm@46 4218 case "l":
rlm@46 4219 st.right = st.top = "0";
rlm@46 4220 a = {width: zero};
rlm@46 4221 break;
rlm@46 4222 case "r":
rlm@46 4223 st.left = st.top = "0";
rlm@46 4224 a = {width: zero, points: {to:[b.right, b.y]}};
rlm@46 4225 break;
rlm@46 4226 case "b":
rlm@46 4227 st.left = st.top = "0";
rlm@46 4228 a = {height: zero, points: {to:[b.x, b.bottom]}};
rlm@46 4229 break;
rlm@46 4230 case "tl":
rlm@46 4231 st.right = st.bottom = "0";
rlm@46 4232 a = {width: zero, height: zero};
rlm@46 4233 break;
rlm@46 4234 case "bl":
rlm@46 4235 st.right = st.top = "0";
rlm@46 4236 a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}};
rlm@46 4237 break;
rlm@46 4238 case "br":
rlm@46 4239 st.left = st.top = "0";
rlm@46 4240 a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}};
rlm@46 4241 break;
rlm@46 4242 case "tr":
rlm@46 4243 st.left = st.bottom = "0";
rlm@46 4244 a = {width: zero, height: zero, points: {to:[b.right, b.y]}};
rlm@46 4245 break;
rlm@46 4246 }
rlm@46 4247
rlm@46 4248 arguments.callee.anim = wrap.fxanim(a,
rlm@46 4249 o,
rlm@46 4250 'motion',
rlm@46 4251 .5,
rlm@46 4252 "easeOut", after);
rlm@46 4253 });
rlm@46 4254 return this;
rlm@46 4255 },
rlm@46 4256
rlm@46 4257
rlm@46 4258 puff : function(o){
rlm@46 4259 var el = this.getFxEl();
rlm@46 4260 o = o || {};
rlm@46 4261
rlm@46 4262 el.queueFx(o, function(){
rlm@46 4263 this.clearOpacity();
rlm@46 4264 this.show();
rlm@46 4265
rlm@46 4266 var r = this.getFxRestore();
rlm@46 4267 var st = this.dom.style;
rlm@46 4268
rlm@46 4269 var after = function(){
rlm@46 4270 if(o.useDisplay){
rlm@46 4271 el.setDisplayed(false);
rlm@46 4272 }else{
rlm@46 4273 el.hide();
rlm@46 4274 }
rlm@46 4275
rlm@46 4276 el.clearOpacity();
rlm@46 4277
rlm@46 4278 el.setPositioning(r.pos);
rlm@46 4279 st.width = r.width;
rlm@46 4280 st.height = r.height;
rlm@46 4281 st.fontSize = '';
rlm@46 4282 el.afterFx(o);
rlm@46 4283 };
rlm@46 4284
rlm@46 4285 var width = this.getWidth();
rlm@46 4286 var height = this.getHeight();
rlm@46 4287
rlm@46 4288 arguments.callee.anim = this.fxanim({
rlm@46 4289 width : {to: this.adjustWidth(width * 2)},
rlm@46 4290 height : {to: this.adjustHeight(height * 2)},
rlm@46 4291 points : {by: [-(width * .5), -(height * .5)]},
rlm@46 4292 opacity : {to: 0},
rlm@46 4293 fontSize: {to:200, unit: "%"}
rlm@46 4294 },
rlm@46 4295 o,
rlm@46 4296 'motion',
rlm@46 4297 .5,
rlm@46 4298 "easeOut", after);
rlm@46 4299 });
rlm@46 4300 return this;
rlm@46 4301 },
rlm@46 4302
rlm@46 4303
rlm@46 4304 switchOff : function(o){
rlm@46 4305 var el = this.getFxEl();
rlm@46 4306 o = o || {};
rlm@46 4307
rlm@46 4308 el.queueFx(o, function(){
rlm@46 4309 this.clearOpacity();
rlm@46 4310 this.clip();
rlm@46 4311
rlm@46 4312 var r = this.getFxRestore();
rlm@46 4313 var st = this.dom.style;
rlm@46 4314
rlm@46 4315 var after = function(){
rlm@46 4316 if(o.useDisplay){
rlm@46 4317 el.setDisplayed(false);
rlm@46 4318 }else{
rlm@46 4319 el.hide();
rlm@46 4320 }
rlm@46 4321
rlm@46 4322 el.clearOpacity();
rlm@46 4323 el.setPositioning(r.pos);
rlm@46 4324 st.width = r.width;
rlm@46 4325 st.height = r.height;
rlm@46 4326
rlm@46 4327 el.afterFx(o);
rlm@46 4328 };
rlm@46 4329
rlm@46 4330 this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){
rlm@46 4331 this.clearOpacity();
rlm@46 4332 (function(){
rlm@46 4333 this.fxanim({
rlm@46 4334 height:{to:1},
rlm@46 4335 points:{by:[0, this.getHeight() * .5]}
rlm@46 4336 }, o, 'motion', 0.3, 'easeIn', after);
rlm@46 4337 }).defer(100, this);
rlm@46 4338 });
rlm@46 4339 });
rlm@46 4340 return this;
rlm@46 4341 },
rlm@46 4342
rlm@46 4343
rlm@46 4344 highlight : function(color, o){
rlm@46 4345 var el = this.getFxEl();
rlm@46 4346 o = o || {};
rlm@46 4347
rlm@46 4348 el.queueFx(o, function(){
rlm@46 4349 color = color || "ffff9c";
rlm@46 4350 var attr = o.attr || "backgroundColor";
rlm@46 4351
rlm@46 4352 this.clearOpacity();
rlm@46 4353 this.show();
rlm@46 4354
rlm@46 4355 var origColor = this.getColor(attr);
rlm@46 4356 var restoreColor = this.dom.style[attr];
rlm@46 4357 var endColor = (o.endColor || origColor) || "ffffff";
rlm@46 4358
rlm@46 4359 var after = function(){
rlm@46 4360 el.dom.style[attr] = restoreColor;
rlm@46 4361 el.afterFx(o);
rlm@46 4362 };
rlm@46 4363
rlm@46 4364 var a = {};
rlm@46 4365 a[attr] = {from: color, to: endColor};
rlm@46 4366 arguments.callee.anim = this.fxanim(a,
rlm@46 4367 o,
rlm@46 4368 'color',
rlm@46 4369 1,
rlm@46 4370 'easeIn', after);
rlm@46 4371 });
rlm@46 4372 return this;
rlm@46 4373 },
rlm@46 4374
rlm@46 4375
rlm@46 4376 frame : function(color, count, o){
rlm@46 4377 var el = this.getFxEl();
rlm@46 4378 o = o || {};
rlm@46 4379
rlm@46 4380 el.queueFx(o, function(){
rlm@46 4381 color = color || "#C3DAF9";
rlm@46 4382 if(color.length == 6){
rlm@46 4383 color = "#" + color;
rlm@46 4384 }
rlm@46 4385 count = count || 1;
rlm@46 4386 var duration = o.duration || 1;
rlm@46 4387 this.show();
rlm@46 4388
rlm@46 4389 var b = this.getBox();
rlm@46 4390 var animFn = function(){
rlm@46 4391 var proxy = Ext.getBody().createChild({
rlm@46 4392 style:{
rlm@46 4393 visbility:"hidden",
rlm@46 4394 position:"absolute",
rlm@46 4395 "z-index":"35000", border:"0px solid " + color
rlm@46 4396 }
rlm@46 4397 });
rlm@46 4398 var scale = Ext.isBorderBox ? 2 : 1;
rlm@46 4399 proxy.animate({
rlm@46 4400 top:{from:b.y, to:b.y - 20},
rlm@46 4401 left:{from:b.x, to:b.x - 20},
rlm@46 4402 borderWidth:{from:0, to:10},
rlm@46 4403 opacity:{from:1, to:0},
rlm@46 4404 height:{from:b.height, to:(b.height + (20*scale))},
rlm@46 4405 width:{from:b.width, to:(b.width + (20*scale))}
rlm@46 4406 }, duration, function(){
rlm@46 4407 proxy.remove();
rlm@46 4408 if(--count > 0){
rlm@46 4409 animFn();
rlm@46 4410 }else{
rlm@46 4411 el.afterFx(o);
rlm@46 4412 }
rlm@46 4413 });
rlm@46 4414 };
rlm@46 4415 animFn.call(this);
rlm@46 4416 });
rlm@46 4417 return this;
rlm@46 4418 },
rlm@46 4419
rlm@46 4420
rlm@46 4421 pause : function(seconds){
rlm@46 4422 var el = this.getFxEl();
rlm@46 4423 var o = {};
rlm@46 4424
rlm@46 4425 el.queueFx(o, function(){
rlm@46 4426 setTimeout(function(){
rlm@46 4427 el.afterFx(o);
rlm@46 4428 }, seconds * 1000);
rlm@46 4429 });
rlm@46 4430 return this;
rlm@46 4431 },
rlm@46 4432
rlm@46 4433
rlm@46 4434 fadeIn : function(o){
rlm@46 4435 var el = this.getFxEl();
rlm@46 4436 o = o || {};
rlm@46 4437 el.queueFx(o, function(){
rlm@46 4438 this.setOpacity(0);
rlm@46 4439 this.fixDisplay();
rlm@46 4440 this.dom.style.visibility = 'visible';
rlm@46 4441 var to = o.endOpacity || 1;
rlm@46 4442 arguments.callee.anim = this.fxanim({opacity:{to:to}},
rlm@46 4443 o, null, .5, "easeOut", function(){
rlm@46 4444 if(to == 1){
rlm@46 4445 this.clearOpacity();
rlm@46 4446 }
rlm@46 4447 el.afterFx(o);
rlm@46 4448 });
rlm@46 4449 });
rlm@46 4450 return this;
rlm@46 4451 },
rlm@46 4452
rlm@46 4453
rlm@46 4454 fadeOut : function(o){
rlm@46 4455 var el = this.getFxEl();
rlm@46 4456 o = o || {};
rlm@46 4457 el.queueFx(o, function(){
rlm@46 4458 arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}},
rlm@46 4459 o, null, .5, "easeOut", function(){
rlm@46 4460 if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){
rlm@46 4461 this.dom.style.display = "none";
rlm@46 4462 }else{
rlm@46 4463 this.dom.style.visibility = "hidden";
rlm@46 4464 }
rlm@46 4465 this.clearOpacity();
rlm@46 4466 el.afterFx(o);
rlm@46 4467 });
rlm@46 4468 });
rlm@46 4469 return this;
rlm@46 4470 },
rlm@46 4471
rlm@46 4472
rlm@46 4473 scale : function(w, h, o){
rlm@46 4474 this.shift(Ext.apply({}, o, {
rlm@46 4475 width: w,
rlm@46 4476 height: h
rlm@46 4477 }));
rlm@46 4478 return this;
rlm@46 4479 },
rlm@46 4480
rlm@46 4481
rlm@46 4482 shift : function(o){
rlm@46 4483 var el = this.getFxEl();
rlm@46 4484 o = o || {};
rlm@46 4485 el.queueFx(o, function(){
rlm@46 4486 var a = {}, w = o.width, h = o.height, x = o.x, y = o.y, op = o.opacity;
rlm@46 4487 if(w !== undefined){
rlm@46 4488 a.width = {to: this.adjustWidth(w)};
rlm@46 4489 }
rlm@46 4490 if(h !== undefined){
rlm@46 4491 a.height = {to: this.adjustHeight(h)};
rlm@46 4492 }
rlm@46 4493 if(o.left !== undefined){
rlm@46 4494 a.left = {to: o.left};
rlm@46 4495 }
rlm@46 4496 if(o.top !== undefined){
rlm@46 4497 a.top = {to: o.top};
rlm@46 4498 }
rlm@46 4499 if(o.right !== undefined){
rlm@46 4500 a.right = {to: o.right};
rlm@46 4501 }
rlm@46 4502 if(o.bottom !== undefined){
rlm@46 4503 a.bottom = {to: o.bottom};
rlm@46 4504 }
rlm@46 4505 if(x !== undefined || y !== undefined){
rlm@46 4506 a.points = {to: [
rlm@46 4507 x !== undefined ? x : this.getX(),
rlm@46 4508 y !== undefined ? y : this.getY()
rlm@46 4509 ]};
rlm@46 4510 }
rlm@46 4511 if(op !== undefined){
rlm@46 4512 a.opacity = {to: op};
rlm@46 4513 }
rlm@46 4514 if(o.xy !== undefined){
rlm@46 4515 a.points = {to: o.xy};
rlm@46 4516 }
rlm@46 4517 arguments.callee.anim = this.fxanim(a,
rlm@46 4518 o, 'motion', .35, "easeOut", function(){
rlm@46 4519 el.afterFx(o);
rlm@46 4520 });
rlm@46 4521 });
rlm@46 4522 return this;
rlm@46 4523 },
rlm@46 4524
rlm@46 4525
rlm@46 4526 ghost : function(anchor, o){
rlm@46 4527 var el = this.getFxEl();
rlm@46 4528 o = o || {};
rlm@46 4529
rlm@46 4530 el.queueFx(o, function(){
rlm@46 4531 anchor = anchor || "b";
rlm@46 4532
rlm@46 4533 var r = this.getFxRestore();
rlm@46 4534 var w = this.getWidth(),
rlm@46 4535 h = this.getHeight();
rlm@46 4536
rlm@46 4537 var st = this.dom.style;
rlm@46 4538
rlm@46 4539 var after = function(){
rlm@46 4540 if(o.useDisplay){
rlm@46 4541 el.setDisplayed(false);
rlm@46 4542 }else{
rlm@46 4543 el.hide();
rlm@46 4544 }
rlm@46 4545
rlm@46 4546 el.clearOpacity();
rlm@46 4547 el.setPositioning(r.pos);
rlm@46 4548 st.width = r.width;
rlm@46 4549 st.height = r.height;
rlm@46 4550
rlm@46 4551 el.afterFx(o);
rlm@46 4552 };
rlm@46 4553
rlm@46 4554 var a = {opacity: {to: 0}, points: {}}, pt = a.points;
rlm@46 4555 switch(anchor.toLowerCase()){
rlm@46 4556 case "t":
rlm@46 4557 pt.by = [0, -h];
rlm@46 4558 break;
rlm@46 4559 case "l":
rlm@46 4560 pt.by = [-w, 0];
rlm@46 4561 break;
rlm@46 4562 case "r":
rlm@46 4563 pt.by = [w, 0];
rlm@46 4564 break;
rlm@46 4565 case "b":
rlm@46 4566 pt.by = [0, h];
rlm@46 4567 break;
rlm@46 4568 case "tl":
rlm@46 4569 pt.by = [-w, -h];
rlm@46 4570 break;
rlm@46 4571 case "bl":
rlm@46 4572 pt.by = [-w, h];
rlm@46 4573 break;
rlm@46 4574 case "br":
rlm@46 4575 pt.by = [w, h];
rlm@46 4576 break;
rlm@46 4577 case "tr":
rlm@46 4578 pt.by = [w, -h];
rlm@46 4579 break;
rlm@46 4580 }
rlm@46 4581
rlm@46 4582 arguments.callee.anim = this.fxanim(a,
rlm@46 4583 o,
rlm@46 4584 'motion',
rlm@46 4585 .5,
rlm@46 4586 "easeOut", after);
rlm@46 4587 });
rlm@46 4588 return this;
rlm@46 4589 },
rlm@46 4590
rlm@46 4591
rlm@46 4592 syncFx : function(){
rlm@46 4593 this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
rlm@46 4594 block : false,
rlm@46 4595 concurrent : true,
rlm@46 4596 stopFx : false
rlm@46 4597 });
rlm@46 4598 return this;
rlm@46 4599 },
rlm@46 4600
rlm@46 4601
rlm@46 4602 sequenceFx : function(){
rlm@46 4603 this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
rlm@46 4604 block : false,
rlm@46 4605 concurrent : false,
rlm@46 4606 stopFx : false
rlm@46 4607 });
rlm@46 4608 return this;
rlm@46 4609 },
rlm@46 4610
rlm@46 4611
rlm@46 4612 nextFx : function(){
rlm@46 4613 var ef = this.fxQueue[0];
rlm@46 4614 if(ef){
rlm@46 4615 ef.call(this);
rlm@46 4616 }
rlm@46 4617 },
rlm@46 4618
rlm@46 4619
rlm@46 4620 hasActiveFx : function(){
rlm@46 4621 return this.fxQueue && this.fxQueue[0];
rlm@46 4622 },
rlm@46 4623
rlm@46 4624
rlm@46 4625 stopFx : function(){
rlm@46 4626 if(this.hasActiveFx()){
rlm@46 4627 var cur = this.fxQueue[0];
rlm@46 4628 if(cur && cur.anim && cur.anim.isAnimated()){
rlm@46 4629 this.fxQueue = [cur]; cur.anim.stop(true);
rlm@46 4630 }
rlm@46 4631 }
rlm@46 4632 return this;
rlm@46 4633 },
rlm@46 4634
rlm@46 4635
rlm@46 4636 beforeFx : function(o){
rlm@46 4637 if(this.hasActiveFx() && !o.concurrent){
rlm@46 4638 if(o.stopFx){
rlm@46 4639 this.stopFx();
rlm@46 4640 return true;
rlm@46 4641 }
rlm@46 4642 return false;
rlm@46 4643 }
rlm@46 4644 return true;
rlm@46 4645 },
rlm@46 4646
rlm@46 4647
rlm@46 4648 hasFxBlock : function(){
rlm@46 4649 var q = this.fxQueue;
rlm@46 4650 return q && q[0] && q[0].block;
rlm@46 4651 },
rlm@46 4652
rlm@46 4653
rlm@46 4654 queueFx : function(o, fn){
rlm@46 4655 if(!this.fxQueue){
rlm@46 4656 this.fxQueue = [];
rlm@46 4657 }
rlm@46 4658 if(!this.hasFxBlock()){
rlm@46 4659 Ext.applyIf(o, this.fxDefaults);
rlm@46 4660 if(!o.concurrent){
rlm@46 4661 var run = this.beforeFx(o);
rlm@46 4662 fn.block = o.block;
rlm@46 4663 this.fxQueue.push(fn);
rlm@46 4664 if(run){
rlm@46 4665 this.nextFx();
rlm@46 4666 }
rlm@46 4667 }else{
rlm@46 4668 fn.call(this);
rlm@46 4669 }
rlm@46 4670 }
rlm@46 4671 return this;
rlm@46 4672 },
rlm@46 4673
rlm@46 4674
rlm@46 4675 fxWrap : function(pos, o, vis){
rlm@46 4676 var wrap;
rlm@46 4677 if(!o.wrap || !(wrap = Ext.get(o.wrap))){
rlm@46 4678 var wrapXY;
rlm@46 4679 if(o.fixPosition){
rlm@46 4680 wrapXY = this.getXY();
rlm@46 4681 }
rlm@46 4682 var div = document.createElement("div");
rlm@46 4683 div.style.visibility = vis;
rlm@46 4684 wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom));
rlm@46 4685 wrap.setPositioning(pos);
rlm@46 4686 if(wrap.getStyle("position") == "static"){
rlm@46 4687 wrap.position("relative");
rlm@46 4688 }
rlm@46 4689 this.clearPositioning('auto');
rlm@46 4690 wrap.clip();
rlm@46 4691 wrap.dom.appendChild(this.dom);
rlm@46 4692 if(wrapXY){
rlm@46 4693 wrap.setXY(wrapXY);
rlm@46 4694 }
rlm@46 4695 }
rlm@46 4696 return wrap;
rlm@46 4697 },
rlm@46 4698
rlm@46 4699
rlm@46 4700 fxUnwrap : function(wrap, pos, o){
rlm@46 4701 this.clearPositioning();
rlm@46 4702 this.setPositioning(pos);
rlm@46 4703 if(!o.wrap){
rlm@46 4704 wrap.dom.parentNode.insertBefore(this.dom, wrap.dom);
rlm@46 4705 wrap.remove();
rlm@46 4706 }
rlm@46 4707 },
rlm@46 4708
rlm@46 4709
rlm@46 4710 getFxRestore : function(){
rlm@46 4711 var st = this.dom.style;
rlm@46 4712 return {pos: this.getPositioning(), width: st.width, height : st.height};
rlm@46 4713 },
rlm@46 4714
rlm@46 4715
rlm@46 4716 afterFx : function(o){
rlm@46 4717 if(o.afterStyle){
rlm@46 4718 this.applyStyles(o.afterStyle);
rlm@46 4719 }
rlm@46 4720 if(o.afterCls){
rlm@46 4721 this.addClass(o.afterCls);
rlm@46 4722 }
rlm@46 4723 if(o.remove === true){
rlm@46 4724 this.remove();
rlm@46 4725 }
rlm@46 4726 Ext.callback(o.callback, o.scope, [this]);
rlm@46 4727 if(!o.concurrent){
rlm@46 4728 this.fxQueue.shift();
rlm@46 4729 this.nextFx();
rlm@46 4730 }
rlm@46 4731 },
rlm@46 4732
rlm@46 4733
rlm@46 4734 getFxEl : function(){ return Ext.get(this.dom);
rlm@46 4735 },
rlm@46 4736
rlm@46 4737
rlm@46 4738 fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){
rlm@46 4739 animType = animType || 'run';
rlm@46 4740 opt = opt || {};
rlm@46 4741 var anim = Ext.lib.Anim[animType](
rlm@46 4742 this.dom, args,
rlm@46 4743 (opt.duration || defaultDur) || .35,
rlm@46 4744 (opt.easing || defaultEase) || 'easeOut',
rlm@46 4745 function(){
rlm@46 4746 Ext.callback(cb, this);
rlm@46 4747 },
rlm@46 4748 this
rlm@46 4749 );
rlm@46 4750 opt.anim = anim;
rlm@46 4751 return anim;
rlm@46 4752 }
rlm@46 4753 };
rlm@46 4754
rlm@46 4755 Ext.Fx.resize = Ext.Fx.scale;
rlm@46 4756
rlm@46 4757 Ext.apply(Ext.Element.prototype, Ext.Fx);
rlm@46 4758
rlm@46 4759
rlm@46 4760 Ext.CompositeElement = function(els){
rlm@46 4761 this.elements = [];
rlm@46 4762 this.addElements(els);
rlm@46 4763 };
rlm@46 4764 Ext.CompositeElement.prototype = {
rlm@46 4765 isComposite: true,
rlm@46 4766 addElements : function(els){
rlm@46 4767 if(!els) return this;
rlm@46 4768 if(typeof els == "string"){
rlm@46 4769 els = Ext.Element.selectorFunction(els);
rlm@46 4770 }
rlm@46 4771 var yels = this.elements;
rlm@46 4772 var index = yels.length-1;
rlm@46 4773 for(var i = 0, len = els.length; i < len; i++) {
rlm@46 4774 yels[++index] = Ext.get(els[i]);
rlm@46 4775 }
rlm@46 4776 return this;
rlm@46 4777 },
rlm@46 4778
rlm@46 4779
rlm@46 4780 fill : function(els){
rlm@46 4781 this.elements = [];
rlm@46 4782 this.add(els);
rlm@46 4783 return this;
rlm@46 4784 },
rlm@46 4785
rlm@46 4786
rlm@46 4787 filter : function(selector){
rlm@46 4788 var els = [];
rlm@46 4789 this.each(function(el){
rlm@46 4790 if(el.is(selector)){
rlm@46 4791 els[els.length] = el.dom;
rlm@46 4792 }
rlm@46 4793 });
rlm@46 4794 this.fill(els);
rlm@46 4795 return this;
rlm@46 4796 },
rlm@46 4797
rlm@46 4798 invoke : function(fn, args){
rlm@46 4799 var els = this.elements;
rlm@46 4800 for(var i = 0, len = els.length; i < len; i++) {
rlm@46 4801 Ext.Element.prototype[fn].apply(els[i], args);
rlm@46 4802 }
rlm@46 4803 return this;
rlm@46 4804 },
rlm@46 4805
rlm@46 4806 add : function(els){
rlm@46 4807 if(typeof els == "string"){
rlm@46 4808 this.addElements(Ext.Element.selectorFunction(els));
rlm@46 4809 }else if(els.length !== undefined){
rlm@46 4810 this.addElements(els);
rlm@46 4811 }else{
rlm@46 4812 this.addElements([els]);
rlm@46 4813 }
rlm@46 4814 return this;
rlm@46 4815 },
rlm@46 4816
rlm@46 4817 each : function(fn, scope){
rlm@46 4818 var els = this.elements;
rlm@46 4819 for(var i = 0, len = els.length; i < len; i++){
rlm@46 4820 if(fn.call(scope || els[i], els[i], this, i) === false) {
rlm@46 4821 break;
rlm@46 4822 }
rlm@46 4823 }
rlm@46 4824 return this;
rlm@46 4825 },
rlm@46 4826
rlm@46 4827
rlm@46 4828 item : function(index){
rlm@46 4829 return this.elements[index] || null;
rlm@46 4830 },
rlm@46 4831
rlm@46 4832
rlm@46 4833 first : function(){
rlm@46 4834 return this.item(0);
rlm@46 4835 },
rlm@46 4836
rlm@46 4837
rlm@46 4838 last : function(){
rlm@46 4839 return this.item(this.elements.length-1);
rlm@46 4840 },
rlm@46 4841
rlm@46 4842
rlm@46 4843 getCount : function(){
rlm@46 4844 return this.elements.length;
rlm@46 4845 },
rlm@46 4846
rlm@46 4847
rlm@46 4848 contains : function(el){
rlm@46 4849 return this.indexOf(el) !== -1;
rlm@46 4850 },
rlm@46 4851
rlm@46 4852
rlm@46 4853 indexOf : function(el){
rlm@46 4854 return this.elements.indexOf(Ext.get(el));
rlm@46 4855 },
rlm@46 4856
rlm@46 4857
rlm@46 4858
rlm@46 4859 removeElement : function(el, removeDom){
rlm@46 4860 if(Ext.isArray(el)){
rlm@46 4861 for(var i = 0, len = el.length; i < len; i++){
rlm@46 4862 this.removeElement(el[i]);
rlm@46 4863 }
rlm@46 4864 return this;
rlm@46 4865 }
rlm@46 4866 var index = typeof el == 'number' ? el : this.indexOf(el);
rlm@46 4867 if(index !== -1 && this.elements[index]){
rlm@46 4868 if(removeDom){
rlm@46 4869 var d = this.elements[index];
rlm@46 4870 if(d.dom){
rlm@46 4871 d.remove();
rlm@46 4872 }else{
rlm@46 4873 Ext.removeNode(d);
rlm@46 4874 }
rlm@46 4875 }
rlm@46 4876 this.elements.splice(index, 1);
rlm@46 4877 }
rlm@46 4878 return this;
rlm@46 4879 },
rlm@46 4880
rlm@46 4881
rlm@46 4882 replaceElement : function(el, replacement, domReplace){
rlm@46 4883 var index = typeof el == 'number' ? el : this.indexOf(el);
rlm@46 4884 if(index !== -1){
rlm@46 4885 if(domReplace){
rlm@46 4886 this.elements[index].replaceWith(replacement);
rlm@46 4887 }else{
rlm@46 4888 this.elements.splice(index, 1, Ext.get(replacement))
rlm@46 4889 }
rlm@46 4890 }
rlm@46 4891 return this;
rlm@46 4892 },
rlm@46 4893
rlm@46 4894
rlm@46 4895 clear : function(){
rlm@46 4896 this.elements = [];
rlm@46 4897 }
rlm@46 4898 };
rlm@46 4899 (function(){
rlm@46 4900 Ext.CompositeElement.createCall = function(proto, fnName){
rlm@46 4901 if(!proto[fnName]){
rlm@46 4902 proto[fnName] = function(){
rlm@46 4903 return this.invoke(fnName, arguments);
rlm@46 4904 };
rlm@46 4905 }
rlm@46 4906 };
rlm@46 4907 for(var fnName in Ext.Element.prototype){
rlm@46 4908 if(typeof Ext.Element.prototype[fnName] == "function"){
rlm@46 4909 Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName);
rlm@46 4910 }
rlm@46 4911 };
rlm@46 4912 })();
rlm@46 4913
rlm@46 4914
rlm@46 4915 Ext.CompositeElementLite = function(els){
rlm@46 4916 Ext.CompositeElementLite.superclass.constructor.call(this, els);
rlm@46 4917 this.el = new Ext.Element.Flyweight();
rlm@46 4918 };
rlm@46 4919 Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {
rlm@46 4920 addElements : function(els){
rlm@46 4921 if(els){
rlm@46 4922 if(Ext.isArray(els)){
rlm@46 4923 this.elements = this.elements.concat(els);
rlm@46 4924 }else{
rlm@46 4925 var yels = this.elements;
rlm@46 4926 var index = yels.length-1;
rlm@46 4927 for(var i = 0, len = els.length; i < len; i++) {
rlm@46 4928 yels[++index] = els[i];
rlm@46 4929 }
rlm@46 4930 }
rlm@46 4931 }
rlm@46 4932 return this;
rlm@46 4933 },
rlm@46 4934 invoke : function(fn, args){
rlm@46 4935 var els = this.elements;
rlm@46 4936 var el = this.el;
rlm@46 4937 for(var i = 0, len = els.length; i < len; i++) {
rlm@46 4938 el.dom = els[i];
rlm@46 4939 Ext.Element.prototype[fn].apply(el, args);
rlm@46 4940 }
rlm@46 4941 return this;
rlm@46 4942 },
rlm@46 4943
rlm@46 4944 item : function(index){
rlm@46 4945 if(!this.elements[index]){
rlm@46 4946 return null;
rlm@46 4947 }
rlm@46 4948 this.el.dom = this.elements[index];
rlm@46 4949 return this.el;
rlm@46 4950 },
rlm@46 4951
rlm@46 4952
rlm@46 4953 addListener : function(eventName, handler, scope, opt){
rlm@46 4954 var els = this.elements;
rlm@46 4955 for(var i = 0, len = els.length; i < len; i++) {
rlm@46 4956 Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt);
rlm@46 4957 }
rlm@46 4958 return this;
rlm@46 4959 },
rlm@46 4960
rlm@46 4961
rlm@46 4962 each : function(fn, scope){
rlm@46 4963 var els = this.elements;
rlm@46 4964 var el = this.el;
rlm@46 4965 for(var i = 0, len = els.length; i < len; i++){
rlm@46 4966 el.dom = els[i];
rlm@46 4967 if(fn.call(scope || el, el, this, i) === false){
rlm@46 4968 break;
rlm@46 4969 }
rlm@46 4970 }
rlm@46 4971 return this;
rlm@46 4972 },
rlm@46 4973
rlm@46 4974 indexOf : function(el){
rlm@46 4975 return this.elements.indexOf(Ext.getDom(el));
rlm@46 4976 },
rlm@46 4977
rlm@46 4978 replaceElement : function(el, replacement, domReplace){
rlm@46 4979 var index = typeof el == 'number' ? el : this.indexOf(el);
rlm@46 4980 if(index !== -1){
rlm@46 4981 replacement = Ext.getDom(replacement);
rlm@46 4982 if(domReplace){
rlm@46 4983 var d = this.elements[index];
rlm@46 4984 d.parentNode.insertBefore(replacement, d);
rlm@46 4985 Ext.removeNode(d);
rlm@46 4986 }
rlm@46 4987 this.elements.splice(index, 1, replacement);
rlm@46 4988 }
rlm@46 4989 return this;
rlm@46 4990 }
rlm@46 4991 });
rlm@46 4992 Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
rlm@46 4993 if(Ext.DomQuery){
rlm@46 4994 Ext.Element.selectorFunction = Ext.DomQuery.select;
rlm@46 4995 }
rlm@46 4996
rlm@46 4997 Ext.Element.select = function(selector, unique, root){
rlm@46 4998 var els;
rlm@46 4999 if(typeof selector == "string"){
rlm@46 5000 els = Ext.Element.selectorFunction(selector, root);
rlm@46 5001 }else if(selector.length !== undefined){
rlm@46 5002 els = selector;
rlm@46 5003 }else{
rlm@46 5004 throw "Invalid selector";
rlm@46 5005 }
rlm@46 5006 if(unique === true){
rlm@46 5007 return new Ext.CompositeElement(els);
rlm@46 5008 }else{
rlm@46 5009 return new Ext.CompositeElementLite(els);
rlm@46 5010 }
rlm@46 5011 };
rlm@46 5012
rlm@46 5013 Ext.select = Ext.Element.select;
rlm@46 5014
rlm@46 5015 Ext.data.Connection = function(config){
rlm@46 5016 Ext.apply(this, config);
rlm@46 5017 this.addEvents(
rlm@46 5018
rlm@46 5019 "beforerequest",
rlm@46 5020
rlm@46 5021 "requestcomplete",
rlm@46 5022
rlm@46 5023 "requestexception"
rlm@46 5024 );
rlm@46 5025 Ext.data.Connection.superclass.constructor.call(this);
rlm@46 5026 };
rlm@46 5027
rlm@46 5028 Ext.extend(Ext.data.Connection, Ext.util.Observable, {
rlm@46 5029
rlm@46 5030
rlm@46 5031
rlm@46 5032
rlm@46 5033
rlm@46 5034 timeout : 30000,
rlm@46 5035
rlm@46 5036 autoAbort:false,
rlm@46 5037
rlm@46 5038
rlm@46 5039 disableCaching: true,
rlm@46 5040
rlm@46 5041
rlm@46 5042 request : function(o){
rlm@46 5043 if(this.fireEvent("beforerequest", this, o) !== false){
rlm@46 5044 var p = o.params;
rlm@46 5045
rlm@46 5046 if(typeof p == "function"){
rlm@46 5047 p = p.call(o.scope||window, o);
rlm@46 5048 }
rlm@46 5049 if(typeof p == "object"){
rlm@46 5050 p = Ext.urlEncode(p);
rlm@46 5051 }
rlm@46 5052 if(this.extraParams){
rlm@46 5053 var extras = Ext.urlEncode(this.extraParams);
rlm@46 5054 p = p ? (p + '&' + extras) : extras;
rlm@46 5055 }
rlm@46 5056
rlm@46 5057 var url = o.url || this.url;
rlm@46 5058 if(typeof url == 'function'){
rlm@46 5059 url = url.call(o.scope||window, o);
rlm@46 5060 }
rlm@46 5061
rlm@46 5062 if(o.form){
rlm@46 5063 var form = Ext.getDom(o.form);
rlm@46 5064 url = url || form.action;
rlm@46 5065
rlm@46 5066 var enctype = form.getAttribute("enctype");
rlm@46 5067 if(o.isUpload || (enctype && enctype.toLowerCase() == 'multipart/form-data')){
rlm@46 5068 return this.doFormUpload(o, p, url);
rlm@46 5069 }
rlm@46 5070 var f = Ext.lib.Ajax.serializeForm(form);
rlm@46 5071 p = p ? (p + '&' + f) : f;
rlm@46 5072 }
rlm@46 5073
rlm@46 5074 var hs = o.headers;
rlm@46 5075 if(this.defaultHeaders){
rlm@46 5076 hs = Ext.apply(hs || {}, this.defaultHeaders);
rlm@46 5077 if(!o.headers){
rlm@46 5078 o.headers = hs;
rlm@46 5079 }
rlm@46 5080 }
rlm@46 5081
rlm@46 5082 var cb = {
rlm@46 5083 success: this.handleResponse,
rlm@46 5084 failure: this.handleFailure,
rlm@46 5085 scope: this,
rlm@46 5086 argument: {options: o},
rlm@46 5087 timeout : o.timeout || this.timeout
rlm@46 5088 };
rlm@46 5089
rlm@46 5090 var method = o.method||this.method||(p ? "POST" : "GET");
rlm@46 5091
rlm@46 5092 if(method == 'GET' && (this.disableCaching && o.disableCaching !== false) || o.disableCaching === true){
rlm@46 5093 url += (url.indexOf('?') != -1 ? '&' : '?') + '_dc=' + (new Date().getTime());
rlm@46 5094 }
rlm@46 5095
rlm@46 5096 if(typeof o.autoAbort == 'boolean'){ if(o.autoAbort){
rlm@46 5097 this.abort();
rlm@46 5098 }
rlm@46 5099 }else if(this.autoAbort !== false){
rlm@46 5100 this.abort();
rlm@46 5101 }
rlm@46 5102 if((method == 'GET' || o.xmlData || o.jsonData) && p){
rlm@46 5103 url += (url.indexOf('?') != -1 ? '&' : '?') + p;
rlm@46 5104 p = '';
rlm@46 5105 }
rlm@46 5106 this.transId = Ext.lib.Ajax.request(method, url, cb, p, o);
rlm@46 5107 return this.transId;
rlm@46 5108 }else{
rlm@46 5109 Ext.callback(o.callback, o.scope, [o, null, null]);
rlm@46 5110 return null;
rlm@46 5111 }
rlm@46 5112 },
rlm@46 5113
rlm@46 5114
rlm@46 5115 isLoading : function(transId){
rlm@46 5116 if(transId){
rlm@46 5117 return Ext.lib.Ajax.isCallInProgress(transId);
rlm@46 5118 }else{
rlm@46 5119 return this.transId ? true : false;
rlm@46 5120 }
rlm@46 5121 },
rlm@46 5122
rlm@46 5123
rlm@46 5124 abort : function(transId){
rlm@46 5125 if(transId || this.isLoading()){
rlm@46 5126 Ext.lib.Ajax.abort(transId || this.transId);
rlm@46 5127 }
rlm@46 5128 },
rlm@46 5129
rlm@46 5130 handleResponse : function(response){
rlm@46 5131 this.transId = false;
rlm@46 5132 var options = response.argument.options;
rlm@46 5133 response.argument = options ? options.argument : null;
rlm@46 5134 this.fireEvent("requestcomplete", this, response, options);
rlm@46 5135 Ext.callback(options.success, options.scope, [response, options]);
rlm@46 5136 Ext.callback(options.callback, options.scope, [options, true, response]);
rlm@46 5137 },
rlm@46 5138
rlm@46 5139 handleFailure : function(response, e){
rlm@46 5140 this.transId = false;
rlm@46 5141 var options = response.argument.options;
rlm@46 5142 response.argument = options ? options.argument : null;
rlm@46 5143 this.fireEvent("requestexception", this, response, options, e);
rlm@46 5144 Ext.callback(options.failure, options.scope, [response, options]);
rlm@46 5145 Ext.callback(options.callback, options.scope, [options, false, response]);
rlm@46 5146 },
rlm@46 5147
rlm@46 5148 doFormUpload : function(o, ps, url){
rlm@46 5149 var id = Ext.id();
rlm@46 5150 var frame = document.createElement('iframe');
rlm@46 5151 frame.id = id;
rlm@46 5152 frame.name = id;
rlm@46 5153 frame.className = 'x-hidden';
rlm@46 5154 if(Ext.isIE){
rlm@46 5155 frame.src = Ext.SSL_SECURE_URL;
rlm@46 5156 }
rlm@46 5157 document.body.appendChild(frame);
rlm@46 5158
rlm@46 5159 if(Ext.isIE){
rlm@46 5160 document.frames[id].name = id;
rlm@46 5161 }
rlm@46 5162
rlm@46 5163 var form = Ext.getDom(o.form);
rlm@46 5164 form.target = id;
rlm@46 5165 form.method = 'POST';
rlm@46 5166 form.enctype = form.encoding = 'multipart/form-data';
rlm@46 5167 if(url){
rlm@46 5168 form.action = url;
rlm@46 5169 }
rlm@46 5170
rlm@46 5171 var hiddens, hd;
rlm@46 5172 if(ps){ hiddens = [];
rlm@46 5173 ps = Ext.urlDecode(ps, false);
rlm@46 5174 for(var k in ps){
rlm@46 5175 if(ps.hasOwnProperty(k)){
rlm@46 5176 hd = document.createElement('input');
rlm@46 5177 hd.type = 'hidden';
rlm@46 5178 hd.name = k;
rlm@46 5179 hd.value = ps[k];
rlm@46 5180 form.appendChild(hd);
rlm@46 5181 hiddens.push(hd);
rlm@46 5182 }
rlm@46 5183 }
rlm@46 5184 }
rlm@46 5185
rlm@46 5186 function cb(){
rlm@46 5187 var r = { responseText : '',
rlm@46 5188 responseXML : null
rlm@46 5189 };
rlm@46 5190
rlm@46 5191 r.argument = o ? o.argument : null;
rlm@46 5192
rlm@46 5193 try { var doc;
rlm@46 5194 if(Ext.isIE){
rlm@46 5195 doc = frame.contentWindow.document;
rlm@46 5196 }else {
rlm@46 5197 doc = (frame.contentDocument || window.frames[id].document);
rlm@46 5198 }
rlm@46 5199 if(doc && doc.body){
rlm@46 5200 r.responseText = doc.body.innerHTML;
rlm@46 5201 }
rlm@46 5202 if(doc && doc.XMLDocument){
rlm@46 5203 r.responseXML = doc.XMLDocument;
rlm@46 5204 }else {
rlm@46 5205 r.responseXML = doc;
rlm@46 5206 }
rlm@46 5207 }
rlm@46 5208 catch(e) {
rlm@46 5209 }
rlm@46 5210
rlm@46 5211 Ext.EventManager.removeListener(frame, 'load', cb, this);
rlm@46 5212
rlm@46 5213 this.fireEvent("requestcomplete", this, r, o);
rlm@46 5214
rlm@46 5215 Ext.callback(o.success, o.scope, [r, o]);
rlm@46 5216 Ext.callback(o.callback, o.scope, [o, true, r]);
rlm@46 5217
rlm@46 5218 setTimeout(function(){Ext.removeNode(frame);}, 100);
rlm@46 5219 }
rlm@46 5220
rlm@46 5221 Ext.EventManager.on(frame, 'load', cb, this);
rlm@46 5222 form.submit();
rlm@46 5223
rlm@46 5224 if(hiddens){ for(var i = 0, len = hiddens.length; i < len; i++){
rlm@46 5225 Ext.removeNode(hiddens[i]);
rlm@46 5226 }
rlm@46 5227 }
rlm@46 5228 }
rlm@46 5229 });
rlm@46 5230
rlm@46 5231
rlm@46 5232 Ext.Ajax = new Ext.data.Connection({
rlm@46 5233
rlm@46 5234
rlm@46 5235
rlm@46 5236
rlm@46 5237
rlm@46 5238
rlm@46 5239
rlm@46 5240
rlm@46 5241
rlm@46 5242
rlm@46 5243
rlm@46 5244
rlm@46 5245
rlm@46 5246
rlm@46 5247
rlm@46 5248
rlm@46 5249
rlm@46 5250 autoAbort : false,
rlm@46 5251
rlm@46 5252
rlm@46 5253 serializeForm : function(form){
rlm@46 5254 return Ext.lib.Ajax.serializeForm(form);
rlm@46 5255 }
rlm@46 5256 });
rlm@46 5257
rlm@46 5258 Ext.Updater = function(el, forceNew){
rlm@46 5259 el = Ext.get(el);
rlm@46 5260 if(!forceNew && el.updateManager){
rlm@46 5261 return el.updateManager;
rlm@46 5262 }
rlm@46 5263
rlm@46 5264 this.el = el;
rlm@46 5265
rlm@46 5266 this.defaultUrl = null;
rlm@46 5267
rlm@46 5268 this.addEvents(
rlm@46 5269
rlm@46 5270 "beforeupdate",
rlm@46 5271
rlm@46 5272 "update",
rlm@46 5273
rlm@46 5274 "failure"
rlm@46 5275 );
rlm@46 5276 var d = Ext.Updater.defaults;
rlm@46 5277
rlm@46 5278 this.sslBlankUrl = d.sslBlankUrl;
rlm@46 5279
rlm@46 5280 this.disableCaching = d.disableCaching;
rlm@46 5281
rlm@46 5282 this.indicatorText = d.indicatorText;
rlm@46 5283
rlm@46 5284 this.showLoadIndicator = d.showLoadIndicator;
rlm@46 5285
rlm@46 5286 this.timeout = d.timeout;
rlm@46 5287
rlm@46 5288 this.loadScripts = d.loadScripts;
rlm@46 5289
rlm@46 5290 this.transaction = null;
rlm@46 5291
rlm@46 5292 this.refreshDelegate = this.refresh.createDelegate(this);
rlm@46 5293
rlm@46 5294 this.updateDelegate = this.update.createDelegate(this);
rlm@46 5295
rlm@46 5296 this.formUpdateDelegate = this.formUpdate.createDelegate(this);
rlm@46 5297
rlm@46 5298 if(!this.renderer){
rlm@46 5299
rlm@46 5300 this.renderer = new Ext.Updater.BasicRenderer();
rlm@46 5301 }
rlm@46 5302 Ext.Updater.superclass.constructor.call(this);
rlm@46 5303 };
rlm@46 5304
rlm@46 5305 Ext.extend(Ext.Updater, Ext.util.Observable, {
rlm@46 5306
rlm@46 5307 getEl : function(){
rlm@46 5308 return this.el;
rlm@46 5309 },
rlm@46 5310
rlm@46 5311
rlm@46 5312 update : function(url, params, callback, discardUrl){
rlm@46 5313 if(this.fireEvent("beforeupdate", this.el, url, params) !== false){
rlm@46 5314 var cfg, callerScope;
rlm@46 5315 if(typeof url == "object"){
rlm@46 5316 cfg = url;
rlm@46 5317 url = cfg.url;
rlm@46 5318 params = params || cfg.params;
rlm@46 5319 callback = callback || cfg.callback;
rlm@46 5320 discardUrl = discardUrl || cfg.discardUrl;
rlm@46 5321 callerScope = cfg.scope;
rlm@46 5322 if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;};
rlm@46 5323 if(typeof cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};
rlm@46 5324 if(typeof cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;};
rlm@46 5325 if(typeof cfg.timeout != "undefined"){this.timeout = cfg.timeout;};
rlm@46 5326 }
rlm@46 5327 this.showLoading();
rlm@46 5328
rlm@46 5329 if(!discardUrl){
rlm@46 5330 this.defaultUrl = url;
rlm@46 5331 }
rlm@46 5332 if(typeof url == "function"){
rlm@46 5333 url = url.call(this);
rlm@46 5334 }
rlm@46 5335
rlm@46 5336 var o = Ext.apply(cfg ||{}, {
rlm@46 5337 url : url,
rlm@46 5338 params: (typeof params == "function" && callerScope) ? params.createDelegate(callerScope) : params,
rlm@46 5339 success: this.processSuccess,
rlm@46 5340 failure: this.processFailure,
rlm@46 5341 scope: this,
rlm@46 5342 callback: undefined,
rlm@46 5343 timeout: (this.timeout*1000),
rlm@46 5344 disableCaching: this.disableCaching,
rlm@46 5345 argument: {
rlm@46 5346 "options": cfg,
rlm@46 5347 "url": url,
rlm@46 5348 "form": null,
rlm@46 5349 "callback": callback,
rlm@46 5350 "scope": callerScope || window,
rlm@46 5351 "params": params
rlm@46 5352 }
rlm@46 5353 });
rlm@46 5354
rlm@46 5355 this.transaction = Ext.Ajax.request(o);
rlm@46 5356 }
rlm@46 5357 },
rlm@46 5358
rlm@46 5359
rlm@46 5360 formUpdate : function(form, url, reset, callback){
rlm@46 5361 if(this.fireEvent("beforeupdate", this.el, form, url) !== false){
rlm@46 5362 if(typeof url == "function"){
rlm@46 5363 url = url.call(this);
rlm@46 5364 }
rlm@46 5365 form = Ext.getDom(form)
rlm@46 5366 this.transaction = Ext.Ajax.request({
rlm@46 5367 form: form,
rlm@46 5368 url:url,
rlm@46 5369 success: this.processSuccess,
rlm@46 5370 failure: this.processFailure,
rlm@46 5371 scope: this,
rlm@46 5372 timeout: (this.timeout*1000),
rlm@46 5373 argument: {
rlm@46 5374 "url": url,
rlm@46 5375 "form": form,
rlm@46 5376 "callback": callback,
rlm@46 5377 "reset": reset
rlm@46 5378 }
rlm@46 5379 });
rlm@46 5380 this.showLoading.defer(1, this);
rlm@46 5381 }
rlm@46 5382 },
rlm@46 5383
rlm@46 5384
rlm@46 5385 refresh : function(callback){
rlm@46 5386 if(this.defaultUrl == null){
rlm@46 5387 return;
rlm@46 5388 }
rlm@46 5389 this.update(this.defaultUrl, null, callback, true);
rlm@46 5390 },
rlm@46 5391
rlm@46 5392
rlm@46 5393 startAutoRefresh : function(interval, url, params, callback, refreshNow){
rlm@46 5394 if(refreshNow){
rlm@46 5395 this.update(url || this.defaultUrl, params, callback, true);
rlm@46 5396 }
rlm@46 5397 if(this.autoRefreshProcId){
rlm@46 5398 clearInterval(this.autoRefreshProcId);
rlm@46 5399 }
rlm@46 5400 this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000);
rlm@46 5401 },
rlm@46 5402
rlm@46 5403
rlm@46 5404 stopAutoRefresh : function(){
rlm@46 5405 if(this.autoRefreshProcId){
rlm@46 5406 clearInterval(this.autoRefreshProcId);
rlm@46 5407 delete this.autoRefreshProcId;
rlm@46 5408 }
rlm@46 5409 },
rlm@46 5410
rlm@46 5411
rlm@46 5412 isAutoRefreshing : function(){
rlm@46 5413 return this.autoRefreshProcId ? true : false;
rlm@46 5414 },
rlm@46 5415
rlm@46 5416
rlm@46 5417 showLoading : function(){
rlm@46 5418 if(this.showLoadIndicator){
rlm@46 5419 this.el.update(this.indicatorText);
rlm@46 5420 }
rlm@46 5421 },
rlm@46 5422
rlm@46 5423
rlm@46 5424 processSuccess : function(response){
rlm@46 5425 this.transaction = null;
rlm@46 5426 if(response.argument.form && response.argument.reset){
rlm@46 5427 try{
rlm@46 5428 response.argument.form.reset();
rlm@46 5429 }catch(e){}
rlm@46 5430 }
rlm@46 5431 if(this.loadScripts){
rlm@46 5432 this.renderer.render(this.el, response, this,
rlm@46 5433 this.updateComplete.createDelegate(this, [response]));
rlm@46 5434 }else{
rlm@46 5435 this.renderer.render(this.el, response, this);
rlm@46 5436 this.updateComplete(response);
rlm@46 5437 }
rlm@46 5438 },
rlm@46 5439
rlm@46 5440
rlm@46 5441 updateComplete : function(response){
rlm@46 5442 this.fireEvent("update", this.el, response);
rlm@46 5443 if(typeof response.argument.callback == "function"){
rlm@46 5444 response.argument.callback.call(response.argument.scope, this.el, true, response, response.argument.options);
rlm@46 5445 }
rlm@46 5446 },
rlm@46 5447
rlm@46 5448
rlm@46 5449 processFailure : function(response){
rlm@46 5450 this.transaction = null;
rlm@46 5451 this.fireEvent("failure", this.el, response);
rlm@46 5452 if(typeof response.argument.callback == "function"){
rlm@46 5453 response.argument.callback.call(response.argument.scope, this.el, false, response, response.argument.options);
rlm@46 5454 }
rlm@46 5455 },
rlm@46 5456
rlm@46 5457
rlm@46 5458 setRenderer : function(renderer){
rlm@46 5459 this.renderer = renderer;
rlm@46 5460 },
rlm@46 5461
rlm@46 5462
rlm@46 5463 getRenderer : function(){
rlm@46 5464 return this.renderer;
rlm@46 5465 },
rlm@46 5466
rlm@46 5467
rlm@46 5468 setDefaultUrl : function(defaultUrl){
rlm@46 5469 this.defaultUrl = defaultUrl;
rlm@46 5470 },
rlm@46 5471
rlm@46 5472
rlm@46 5473 abort : function(){
rlm@46 5474 if(this.transaction){
rlm@46 5475 Ext.Ajax.abort(this.transaction);
rlm@46 5476 }
rlm@46 5477 },
rlm@46 5478
rlm@46 5479
rlm@46 5480 isUpdating : function(){
rlm@46 5481 if(this.transaction){
rlm@46 5482 return Ext.Ajax.isLoading(this.transaction);
rlm@46 5483 }
rlm@46 5484 return false;
rlm@46 5485 }
rlm@46 5486 });
rlm@46 5487
rlm@46 5488
rlm@46 5489 Ext.Updater.defaults = {
rlm@46 5490
rlm@46 5491 timeout : 30,
rlm@46 5492
rlm@46 5493 loadScripts : false,
rlm@46 5494
rlm@46 5495 sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"),
rlm@46 5496
rlm@46 5497 disableCaching : false,
rlm@46 5498
rlm@46 5499 showLoadIndicator : true,
rlm@46 5500
rlm@46 5501 indicatorText : '<div class="loading-indicator">Loading...</div>'
rlm@46 5502 };
rlm@46 5503
rlm@46 5504
rlm@46 5505 Ext.Updater.updateElement = function(el, url, params, options){
rlm@46 5506 var um = Ext.get(el).getUpdater();
rlm@46 5507 Ext.apply(um, options);
rlm@46 5508 um.update(url, params, options ? options.callback : null);
rlm@46 5509 };
rlm@46 5510
rlm@46 5511 Ext.Updater.BasicRenderer = function(){};
rlm@46 5512
rlm@46 5513 Ext.Updater.BasicRenderer.prototype = {
rlm@46 5514
rlm@46 5515 render : function(el, response, updateManager, callback){
rlm@46 5516 el.update(response.responseText, updateManager.loadScripts, callback);
rlm@46 5517 }
rlm@46 5518 };
rlm@46 5519
rlm@46 5520 Ext.UpdateManager = Ext.Updater;
rlm@46 5521
rlm@46 5522
rlm@46 5523
rlm@46 5524
rlm@46 5525
rlm@46 5526 Date.parseFunctions = {count:0};
rlm@46 5527 Date.parseRegexes = [];
rlm@46 5528 Date.formatFunctions = {count:0};
rlm@46 5529
rlm@46 5530 Date.prototype.dateFormat = function(format) {
rlm@46 5531 if (Date.formatFunctions[format] == null) {
rlm@46 5532 Date.createNewFormat(format);
rlm@46 5533 }
rlm@46 5534 var func = Date.formatFunctions[format];
rlm@46 5535 return this[func]();
rlm@46 5536 };
rlm@46 5537
rlm@46 5538
rlm@46 5539
rlm@46 5540 Date.prototype.format = Date.prototype.dateFormat;
rlm@46 5541
rlm@46 5542 Date.createNewFormat = function(format) {
rlm@46 5543 var funcName = "format" + Date.formatFunctions.count++;
rlm@46 5544 Date.formatFunctions[format] = funcName;
rlm@46 5545 var code = "Date.prototype." + funcName + " = function(){return ";
rlm@46 5546 var special = false;
rlm@46 5547 var ch = '';
rlm@46 5548 for (var i = 0; i < format.length; ++i) {
rlm@46 5549 ch = format.charAt(i);
rlm@46 5550 if (!special && ch == "\\") {
rlm@46 5551 special = true;
rlm@46 5552 }
rlm@46 5553 else if (special) {
rlm@46 5554 special = false;
rlm@46 5555 code += "'" + String.escape(ch) + "' + ";
rlm@46 5556 }
rlm@46 5557 else {
rlm@46 5558 code += Date.getFormatCode(ch) + " + ";
rlm@46 5559 }
rlm@46 5560 }
rlm@46 5561 eval(code.substring(0, code.length - 3) + ";}");
rlm@46 5562 };
rlm@46 5563
rlm@46 5564
rlm@46 5565 Date.formatCodes = {
rlm@46 5566 d: "String.leftPad(this.getDate(), 2, '0')",
rlm@46 5567 D: "Date.getShortDayName(this.getDay())", j: "this.getDate()",
rlm@46 5568 l: "Date.dayNames[this.getDay()]",
rlm@46 5569 N: "(this.getDay() ? this.getDay() : 7)",
rlm@46 5570 S: "this.getSuffix()",
rlm@46 5571 w: "this.getDay()",
rlm@46 5572 z: "this.getDayOfYear()",
rlm@46 5573 W: "String.leftPad(this.getWeekOfYear(), 2, '0')",
rlm@46 5574 F: "Date.monthNames[this.getMonth()]",
rlm@46 5575 m: "String.leftPad(this.getMonth() + 1, 2, '0')",
rlm@46 5576 M: "Date.getShortMonthName(this.getMonth())", n: "(this.getMonth() + 1)",
rlm@46 5577 t: "this.getDaysInMonth()",
rlm@46 5578 L: "(this.isLeapYear() ? 1 : 0)",
rlm@46 5579 o: "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",
rlm@46 5580 Y: "this.getFullYear()",
rlm@46 5581 y: "('' + this.getFullYear()).substring(2, 4)",
rlm@46 5582 a: "(this.getHours() < 12 ? 'am' : 'pm')",
rlm@46 5583 A: "(this.getHours() < 12 ? 'AM' : 'PM')",
rlm@46 5584 g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
rlm@46 5585 G: "this.getHours()",
rlm@46 5586 h: "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
rlm@46 5587 H: "String.leftPad(this.getHours(), 2, '0')",
rlm@46 5588 i: "String.leftPad(this.getMinutes(), 2, '0')",
rlm@46 5589 s: "String.leftPad(this.getSeconds(), 2, '0')",
rlm@46 5590 u: "String.leftPad(this.getMilliseconds(), 3, '0')",
rlm@46 5591 O: "this.getGMTOffset()",
rlm@46 5592 P: "this.getGMTOffset(true)",
rlm@46 5593 T: "this.getTimezone()",
rlm@46 5594 Z: "(this.getTimezoneOffset() * -60)",
rlm@46 5595 c: function() { for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {
rlm@46 5596 var e = c.charAt(i);
rlm@46 5597 code.push(e == "T" ? "'T'" : Date.getFormatCode(e)); }
rlm@46 5598 return code.join(" + ");
rlm@46 5599 },
rlm@46 5600
rlm@46 5601 U: "Math.round(this.getTime() / 1000)"
rlm@46 5602 }
rlm@46 5603
rlm@46 5604 Date.getFormatCode = function(character) {
rlm@46 5605 var f = Date.formatCodes[character];
rlm@46 5606
rlm@46 5607 if (f) {
rlm@46 5608 f = Ext.type(f) == 'function'? f() : f;
rlm@46 5609 Date.formatCodes[character] = f; }
rlm@46 5610
rlm@46 5611 return f || ("'" + String.escape(character) + "'");
rlm@46 5612 };
rlm@46 5613
rlm@46 5614
rlm@46 5615 Date.parseDate = function(input, format) {
rlm@46 5616 if (Date.parseFunctions[format] == null) {
rlm@46 5617 Date.createParser(format);
rlm@46 5618 }
rlm@46 5619 var func = Date.parseFunctions[format];
rlm@46 5620 return Date[func](input);
rlm@46 5621 };
rlm@46 5622
rlm@46 5623 Date.createParser = function(format) {
rlm@46 5624 var funcName = "parse" + Date.parseFunctions.count++;
rlm@46 5625 var regexNum = Date.parseRegexes.length;
rlm@46 5626 var currentGroup = 1;
rlm@46 5627 Date.parseFunctions[format] = funcName;
rlm@46 5628
rlm@46 5629 var code = "Date." + funcName + " = function(input){\n"
rlm@46 5630 + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1, ms = -1, o, z, u, v;\n"
rlm@46 5631 + "input = String(input);var d = new Date();\n"
rlm@46 5632 + "y = d.getFullYear();\n"
rlm@46 5633 + "m = d.getMonth();\n"
rlm@46 5634 + "d = d.getDate();\n"
rlm@46 5635 + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
rlm@46 5636 + "if (results && results.length > 0) {";
rlm@46 5637 var regex = "";
rlm@46 5638
rlm@46 5639 var special = false;
rlm@46 5640 var ch = '';
rlm@46 5641 for (var i = 0; i < format.length; ++i) {
rlm@46 5642 ch = format.charAt(i);
rlm@46 5643 if (!special && ch == "\\") {
rlm@46 5644 special = true;
rlm@46 5645 }
rlm@46 5646 else if (special) {
rlm@46 5647 special = false;
rlm@46 5648 regex += String.escape(ch);
rlm@46 5649 }
rlm@46 5650 else {
rlm@46 5651 var obj = Date.formatCodeToRegex(ch, currentGroup);
rlm@46 5652 currentGroup += obj.g;
rlm@46 5653 regex += obj.s;
rlm@46 5654 if (obj.g && obj.c) {
rlm@46 5655 code += obj.c;
rlm@46 5656 }
rlm@46 5657 }
rlm@46 5658 }
rlm@46 5659
rlm@46 5660 code += "if (u){\n"
rlm@46 5661 + "v = new Date(u * 1000);\n" + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0){\n"
rlm@46 5662 + "v = new Date(y, m, d, h, i, s, ms);\n"
rlm@46 5663 + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0){\n"
rlm@46 5664 + "v = new Date(y, m, d, h, i, s);\n"
rlm@46 5665 + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0){\n"
rlm@46 5666 + "v = new Date(y, m, d, h, i);\n"
rlm@46 5667 + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0){\n"
rlm@46 5668 + "v = new Date(y, m, d, h);\n"
rlm@46 5669 + "}else if (y >= 0 && m >= 0 && d > 0){\n"
rlm@46 5670 + "v = new Date(y, m, d);\n"
rlm@46 5671 + "}else if (y >= 0 && m >= 0){\n"
rlm@46 5672 + "v = new Date(y, m);\n"
rlm@46 5673 + "}else if (y >= 0){\n"
rlm@46 5674 + "v = new Date(y);\n"
rlm@46 5675 + "}\n}\nreturn (v && Ext.type(z || o) == 'number')?" + " (Ext.type(z) == 'number' ? v.add(Date.SECOND, (v.getTimezoneOffset() * 60) + z) :" + " v.add(Date.HOUR, (v.getGMTOffset() / 100) + (o / -100))) : v;\n" + "}";
rlm@46 5676
rlm@46 5677 Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$", "i");
rlm@46 5678 eval(code);
rlm@46 5679 };
rlm@46 5680
rlm@46 5681 Date.parseCodes = {
rlm@46 5682
rlm@46 5683 d: {
rlm@46 5684 g:1,
rlm@46 5685 c:"d = parseInt(results[{0}], 10);\n",
rlm@46 5686 s:"(\\d{2})" },
rlm@46 5687 j: function() {
rlm@46 5688 return Ext.applyIf({
rlm@46 5689 s:"(\\d{1,2})" }, Date.parseCodes["d"]);
rlm@46 5690 },
rlm@46 5691 D: function() {
rlm@46 5692 for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i); return {
rlm@46 5693 g:0,
rlm@46 5694 c:null,
rlm@46 5695 s:"(?:" + a.join("|") +")"
rlm@46 5696 }
rlm@46 5697 },
rlm@46 5698 l: function() {
rlm@46 5699 return {
rlm@46 5700 g:0,
rlm@46 5701 c:null,
rlm@46 5702 s:"(?:" + Date.dayNames.join("|") + ")"
rlm@46 5703 }
rlm@46 5704 },
rlm@46 5705 N: {
rlm@46 5706 g:0,
rlm@46 5707 c:null,
rlm@46 5708 s:"[1-7]" },
rlm@46 5709 S: {
rlm@46 5710 g:0,
rlm@46 5711 c:null,
rlm@46 5712 s:"(?:st|nd|rd|th)"
rlm@46 5713 },
rlm@46 5714 w: {
rlm@46 5715 g:0,
rlm@46 5716 c:null,
rlm@46 5717 s:"[0-6]" },
rlm@46 5718 z: {
rlm@46 5719 g:0,
rlm@46 5720 c:null,
rlm@46 5721 s:"(?:\\d{1,3}" },
rlm@46 5722 W: {
rlm@46 5723 g:0,
rlm@46 5724 c:null,
rlm@46 5725 s:"(?:\\d{2})" },
rlm@46 5726 F: function() {
rlm@46 5727 return {
rlm@46 5728 g:1,
rlm@46 5729 c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n", s:"(" + Date.monthNames.join("|") + ")"
rlm@46 5730 }
rlm@46 5731 },
rlm@46 5732 M: function() {
rlm@46 5733 for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i); return Ext.applyIf({
rlm@46 5734 s:"(" + a.join("|") + ")"
rlm@46 5735 }, Date.parseCodes["F"]);
rlm@46 5736 },
rlm@46 5737 m: {
rlm@46 5738 g:1,
rlm@46 5739 c:"m = parseInt(results[{0}], 10) - 1;\n",
rlm@46 5740 s:"(\\d{2})" },
rlm@46 5741 n: function() {
rlm@46 5742 return Ext.applyIf({
rlm@46 5743 s:"(\\d{1,2})" }, Date.parseCodes["m"]);
rlm@46 5744 },
rlm@46 5745 t: {
rlm@46 5746 g:0,
rlm@46 5747 c:null,
rlm@46 5748 s:"(?:\\d{2})" },
rlm@46 5749 L: {
rlm@46 5750 g:0,
rlm@46 5751 c:null,
rlm@46 5752 s:"(?:1|0)"
rlm@46 5753 },
rlm@46 5754 o: function() {
rlm@46 5755 return Date.parseCodes["Y"];
rlm@46 5756 },
rlm@46 5757 Y: {
rlm@46 5758 g:1,
rlm@46 5759 c:"y = parseInt(results[{0}], 10);\n",
rlm@46 5760 s:"(\\d{4})" },
rlm@46 5761 y: {
rlm@46 5762 g:1,
rlm@46 5763 c:"var ty = parseInt(results[{0}], 10);\n"
rlm@46 5764 + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", s:"(\\d{1,2})"
rlm@46 5765 },
rlm@46 5766 a: {
rlm@46 5767 g:1,
rlm@46 5768 c:"if (results[{0}] == 'am') {\n"
rlm@46 5769 + "if (h == 12) { h = 0; }\n"
rlm@46 5770 + "} else { if (h < 12) { h += 12; }}",
rlm@46 5771 s:"(am|pm)"
rlm@46 5772 },
rlm@46 5773 A: {
rlm@46 5774 g:1,
rlm@46 5775 c:"if (results[{0}] == 'AM') {\n"
rlm@46 5776 + "if (h == 12) { h = 0; }\n"
rlm@46 5777 + "} else { if (h < 12) { h += 12; }}",
rlm@46 5778 s:"(AM|PM)"
rlm@46 5779 },
rlm@46 5780 g: function() {
rlm@46 5781 return Date.parseCodes["G"];
rlm@46 5782 },
rlm@46 5783 G: {
rlm@46 5784 g:1,
rlm@46 5785 c:"h = parseInt(results[{0}], 10);\n",
rlm@46 5786 s:"(\\d{1,2})" },
rlm@46 5787 h: function() {
rlm@46 5788 return Date.parseCodes["H"];
rlm@46 5789 },
rlm@46 5790 H: {
rlm@46 5791 g:1,
rlm@46 5792 c:"h = parseInt(results[{0}], 10);\n",
rlm@46 5793 s:"(\\d{2})" },
rlm@46 5794 i: {
rlm@46 5795 g:1,
rlm@46 5796 c:"i = parseInt(results[{0}], 10);\n",
rlm@46 5797 s:"(\\d{2})" },
rlm@46 5798 s: {
rlm@46 5799 g:1,
rlm@46 5800 c:"s = parseInt(results[{0}], 10);\n",
rlm@46 5801 s:"(\\d{2})" },
rlm@46 5802 u: {
rlm@46 5803 g:1,
rlm@46 5804 c:"ms = parseInt(results[{0}], 10);\n",
rlm@46 5805 s:"(\\d{3})" },
rlm@46 5806 O: {
rlm@46 5807 g:1,
rlm@46 5808 c:[
rlm@46 5809 "o = results[{0}];",
rlm@46 5810 "var sn = o.substring(0,1);", "var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);", "var mn = o.substring(3,5) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" ].join("\n"),
rlm@46 5811 s: "([+\-]\\d{4})" },
rlm@46 5812 P: function() {
rlm@46 5813 return Ext.applyIf({
rlm@46 5814 s: "([+\-]\\d{2}:\\d{2})" }, Date.parseCodes["O"]);
rlm@46 5815 },
rlm@46 5816 T: {
rlm@46 5817 g:0,
rlm@46 5818 c:null,
rlm@46 5819 s:"[A-Z]{1,4}" },
rlm@46 5820 Z: {
rlm@46 5821 g:1,
rlm@46 5822 c:"z = results[{0}] * 1;\n" + "z = (-43200 <= z && z <= 50400)? z : null;\n",
rlm@46 5823 s:"([+\-]?\\d{1,5})" },
rlm@46 5824 c: function() {
rlm@46 5825 var df = Date.formatCodeToRegex, calc = [];
rlm@46 5826 var arr = [
rlm@46 5827 df("Y", 1),
rlm@46 5828 df("m", 2),
rlm@46 5829 df("d", 3),
rlm@46 5830 df("h", 4),
rlm@46 5831 df("i", 5),
rlm@46 5832 df("s", 6),
rlm@46 5833 {c:"if(results[7] == 'Z'){\no = 0;\n}else{\n" + df("P", 7).c + "\n}"} ];
rlm@46 5834 for (var i = 0, l = arr.length; i < l; ++i) {
rlm@46 5835 calc.push(arr[i].c);
rlm@46 5836 }
rlm@46 5837
rlm@46 5838 return {
rlm@46 5839 g:1,
rlm@46 5840 c:calc.join(""),
rlm@46 5841 s:arr[0].s + "-" + arr[1].s + "-" + arr[2].s + "T" + arr[3].s + ":" + arr[4].s + ":" + arr[5].s + "(" + df("P", 7).s + "|Z)"
rlm@46 5842 }
rlm@46 5843 },
rlm@46 5844 U: {
rlm@46 5845 g:1,
rlm@46 5846 c:"u = parseInt(results[{0}], 10);\n",
rlm@46 5847 s:"(-?\\d+)" }
rlm@46 5848 }
rlm@46 5849
rlm@46 5850 Date.formatCodeToRegex = function(character, currentGroup) {
rlm@46 5851 var p = Date.parseCodes[character];
rlm@46 5852
rlm@46 5853 if (p) {
rlm@46 5854 p = Ext.type(p) == 'function'? p() : p;
rlm@46 5855 Date.parseCodes[character] = p;
rlm@46 5856 if (p.c) {
rlm@46 5857 p.c = String.format(p.c, currentGroup);
rlm@46 5858 }
rlm@46 5859 }
rlm@46 5860
rlm@46 5861 return p || {
rlm@46 5862 g:0,
rlm@46 5863 c:null,
rlm@46 5864 s:Ext.escapeRe(character) }
rlm@46 5865 };
rlm@46 5866
rlm@46 5867
rlm@46 5868 Date.prototype.getTimezone = function() {
rlm@46 5869 return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
rlm@46 5870 };
rlm@46 5871
rlm@46 5872
rlm@46 5873 Date.prototype.getGMTOffset = function(colon) {
rlm@46 5874 return (this.getTimezoneOffset() > 0 ? "-" : "+")
rlm@46 5875 + String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0")
rlm@46 5876 + (colon ? ":" : "")
rlm@46 5877 + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
rlm@46 5878 };
rlm@46 5879
rlm@46 5880
rlm@46 5881 Date.prototype.getDayOfYear = function() {
rlm@46 5882 var num = 0;
rlm@46 5883 Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
rlm@46 5884 for (var i = 0; i < this.getMonth(); ++i) {
rlm@46 5885 num += Date.daysInMonth[i];
rlm@46 5886 }
rlm@46 5887 return num + this.getDate() - 1;
rlm@46 5888 };
rlm@46 5889
rlm@46 5890
rlm@46 5891 Date.prototype.getWeekOfYear = function() {
rlm@46 5892 var ms1d = 864e5; var ms7d = 7 * ms1d; var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d; var AWN = Math.floor(DC3 / 7); var Wyr = new Date(AWN * ms7d).getUTCFullYear();
rlm@46 5893 return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
rlm@46 5894 };
rlm@46 5895
rlm@46 5896
rlm@46 5897 Date.prototype.isLeapYear = function() {
rlm@46 5898 var year = this.getFullYear();
rlm@46 5899 return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
rlm@46 5900 };
rlm@46 5901
rlm@46 5902
rlm@46 5903 Date.prototype.getFirstDayOfMonth = function() {
rlm@46 5904 var day = (this.getDay() - (this.getDate() - 1)) % 7;
rlm@46 5905 return (day < 0) ? (day + 7) : day;
rlm@46 5906 };
rlm@46 5907
rlm@46 5908
rlm@46 5909 Date.prototype.getLastDayOfMonth = function() {
rlm@46 5910 var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
rlm@46 5911 return (day < 0) ? (day + 7) : day;
rlm@46 5912 };
rlm@46 5913
rlm@46 5914
rlm@46 5915
rlm@46 5916 Date.prototype.getFirstDateOfMonth = function() {
rlm@46 5917 return new Date(this.getFullYear(), this.getMonth(), 1);
rlm@46 5918 };
rlm@46 5919
rlm@46 5920
rlm@46 5921 Date.prototype.getLastDateOfMonth = function() {
rlm@46 5922 return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());
rlm@46 5923 };
rlm@46 5924
rlm@46 5925 Date.prototype.getDaysInMonth = function() {
rlm@46 5926 Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
rlm@46 5927 return Date.daysInMonth[this.getMonth()];
rlm@46 5928 };
rlm@46 5929
rlm@46 5930
rlm@46 5931 Date.prototype.getSuffix = function() {
rlm@46 5932 switch (this.getDate()) {
rlm@46 5933 case 1:
rlm@46 5934 case 21:
rlm@46 5935 case 31:
rlm@46 5936 return "st";
rlm@46 5937 case 2:
rlm@46 5938 case 22:
rlm@46 5939 return "nd";
rlm@46 5940 case 3:
rlm@46 5941 case 23:
rlm@46 5942 return "rd";
rlm@46 5943 default:
rlm@46 5944 return "th";
rlm@46 5945 }
rlm@46 5946 };
rlm@46 5947
rlm@46 5948 Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
rlm@46 5949
rlm@46 5950
rlm@46 5951 Date.monthNames = [
rlm@46 5952 "January",
rlm@46 5953 "February",
rlm@46 5954 "March",
rlm@46 5955 "April",
rlm@46 5956 "May",
rlm@46 5957 "June",
rlm@46 5958 "July",
rlm@46 5959 "August",
rlm@46 5960 "September",
rlm@46 5961 "October",
rlm@46 5962 "November",
rlm@46 5963 "December"
rlm@46 5964 ];
rlm@46 5965
rlm@46 5966
rlm@46 5967 Date.getShortMonthName = function(month) {
rlm@46 5968 return Date.monthNames[month].substring(0, 3);
rlm@46 5969 }
rlm@46 5970
rlm@46 5971
rlm@46 5972 Date.dayNames = [
rlm@46 5973 "Sunday",
rlm@46 5974 "Monday",
rlm@46 5975 "Tuesday",
rlm@46 5976 "Wednesday",
rlm@46 5977 "Thursday",
rlm@46 5978 "Friday",
rlm@46 5979 "Saturday"
rlm@46 5980 ];
rlm@46 5981
rlm@46 5982
rlm@46 5983 Date.getShortDayName = function(day) {
rlm@46 5984 return Date.dayNames[day].substring(0, 3);
rlm@46 5985 }
rlm@46 5986
rlm@46 5987 Date.y2kYear = 50;
rlm@46 5988
rlm@46 5989
rlm@46 5990 Date.monthNumbers = {
rlm@46 5991 Jan:0,
rlm@46 5992 Feb:1,
rlm@46 5993 Mar:2,
rlm@46 5994 Apr:3,
rlm@46 5995 May:4,
rlm@46 5996 Jun:5,
rlm@46 5997 Jul:6,
rlm@46 5998 Aug:7,
rlm@46 5999 Sep:8,
rlm@46 6000 Oct:9,
rlm@46 6001 Nov:10,
rlm@46 6002 Dec:11
rlm@46 6003 };
rlm@46 6004
rlm@46 6005
rlm@46 6006 Date.getMonthNumber = function(name) {
rlm@46 6007 return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
rlm@46 6008 }
rlm@46 6009
rlm@46 6010
rlm@46 6011 Date.prototype.clone = function() {
rlm@46 6012 return new Date(this.getTime());
rlm@46 6013 };
rlm@46 6014
rlm@46 6015
rlm@46 6016 Date.prototype.clearTime = function(clone){
rlm@46 6017 if(clone){
rlm@46 6018 return this.clone().clearTime();
rlm@46 6019 }
rlm@46 6020 this.setHours(0);
rlm@46 6021 this.setMinutes(0);
rlm@46 6022 this.setSeconds(0);
rlm@46 6023 this.setMilliseconds(0);
rlm@46 6024 return this;
rlm@46 6025 };
rlm@46 6026
rlm@46 6027 if(Ext.isSafari){
rlm@46 6028 Date.brokenSetMonth = Date.prototype.setMonth;
rlm@46 6029 Date.prototype.setMonth = function(num){
rlm@46 6030 if(num <= -1){
rlm@46 6031 var n = Math.ceil(-num);
rlm@46 6032 var back_year = Math.ceil(n/12);
rlm@46 6033 var month = (n % 12) ? 12 - n % 12 : 0 ;
rlm@46 6034 this.setFullYear(this.getFullYear() - back_year);
rlm@46 6035 return Date.brokenSetMonth.call(this, month);
rlm@46 6036 } else {
rlm@46 6037 return Date.brokenSetMonth.apply(this, arguments);
rlm@46 6038 }
rlm@46 6039 };
rlm@46 6040 }
rlm@46 6041
rlm@46 6042
rlm@46 6043 Date.MILLI = "ms";
rlm@46 6044
rlm@46 6045 Date.SECOND = "s";
rlm@46 6046
rlm@46 6047 Date.MINUTE = "mi";
rlm@46 6048
rlm@46 6049 Date.HOUR = "h";
rlm@46 6050
rlm@46 6051 Date.DAY = "d";
rlm@46 6052
rlm@46 6053 Date.MONTH = "mo";
rlm@46 6054
rlm@46 6055 Date.YEAR = "y";
rlm@46 6056
rlm@46 6057
rlm@46 6058 Date.prototype.add = function(interval, value){
rlm@46 6059 var d = this.clone();
rlm@46 6060 if (!interval || value === 0) return d;
rlm@46 6061 switch(interval.toLowerCase()){
rlm@46 6062 case Date.MILLI:
rlm@46 6063 d.setMilliseconds(this.getMilliseconds() + value);
rlm@46 6064 break;
rlm@46 6065 case Date.SECOND:
rlm@46 6066 d.setSeconds(this.getSeconds() + value);
rlm@46 6067 break;
rlm@46 6068 case Date.MINUTE:
rlm@46 6069 d.setMinutes(this.getMinutes() + value);
rlm@46 6070 break;
rlm@46 6071 case Date.HOUR:
rlm@46 6072 d.setHours(this.getHours() + value);
rlm@46 6073 break;
rlm@46 6074 case Date.DAY:
rlm@46 6075 d.setDate(this.getDate() + value);
rlm@46 6076 break;
rlm@46 6077 case Date.MONTH:
rlm@46 6078 var day = this.getDate();
rlm@46 6079 if(day > 28){
rlm@46 6080 day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate());
rlm@46 6081 }
rlm@46 6082 d.setDate(day);
rlm@46 6083 d.setMonth(this.getMonth() + value);
rlm@46 6084 break;
rlm@46 6085 case Date.YEAR:
rlm@46 6086 d.setFullYear(this.getFullYear() + value);
rlm@46 6087 break;
rlm@46 6088 }
rlm@46 6089 return d;
rlm@46 6090 };
rlm@46 6091
rlm@46 6092
rlm@46 6093 Date.prototype.between = function(start, end){
rlm@46 6094 var t = this.getTime();
rlm@46 6095 return start.getTime() <= t && t <= end.getTime();
rlm@46 6096 }
rlm@46 6097
rlm@46 6098 Ext.util.DelayedTask = function(fn, scope, args){
rlm@46 6099 var id = null, d, t;
rlm@46 6100
rlm@46 6101 var call = function(){
rlm@46 6102 var now = new Date().getTime();
rlm@46 6103 if(now - t >= d){
rlm@46 6104 clearInterval(id);
rlm@46 6105 id = null;
rlm@46 6106 fn.apply(scope, args || []);
rlm@46 6107 }
rlm@46 6108 };
rlm@46 6109
rlm@46 6110 this.delay = function(delay, newFn, newScope, newArgs){
rlm@46 6111 if(id && delay != d){
rlm@46 6112 this.cancel();
rlm@46 6113 }
rlm@46 6114 d = delay;
rlm@46 6115 t = new Date().getTime();
rlm@46 6116 fn = newFn || fn;
rlm@46 6117 scope = newScope || scope;
rlm@46 6118 args = newArgs || args;
rlm@46 6119 if(!id){
rlm@46 6120 id = setInterval(call, d);
rlm@46 6121 }
rlm@46 6122 };
rlm@46 6123
rlm@46 6124
rlm@46 6125 this.cancel = function(){
rlm@46 6126 if(id){
rlm@46 6127 clearInterval(id);
rlm@46 6128 id = null;
rlm@46 6129 }
rlm@46 6130 };
rlm@46 6131 };
rlm@46 6132
rlm@46 6133 Ext.util.TaskRunner = function(interval){
rlm@46 6134 interval = interval || 10;
rlm@46 6135 var tasks = [], removeQueue = [];
rlm@46 6136 var id = 0;
rlm@46 6137 var running = false;
rlm@46 6138
rlm@46 6139 var stopThread = function(){
rlm@46 6140 running = false;
rlm@46 6141 clearInterval(id);
rlm@46 6142 id = 0;
rlm@46 6143 };
rlm@46 6144
rlm@46 6145 var startThread = function(){
rlm@46 6146 if(!running){
rlm@46 6147 running = true;
rlm@46 6148 id = setInterval(runTasks, interval);
rlm@46 6149 }
rlm@46 6150 };
rlm@46 6151
rlm@46 6152 var removeTask = function(t){
rlm@46 6153 removeQueue.push(t);
rlm@46 6154 if(t.onStop){
rlm@46 6155 t.onStop.apply(t.scope || t);
rlm@46 6156 }
rlm@46 6157 };
rlm@46 6158
rlm@46 6159 var runTasks = function(){
rlm@46 6160 if(removeQueue.length > 0){
rlm@46 6161 for(var i = 0, len = removeQueue.length; i < len; i++){
rlm@46 6162 tasks.remove(removeQueue[i]);
rlm@46 6163 }
rlm@46 6164 removeQueue = [];
rlm@46 6165 if(tasks.length < 1){
rlm@46 6166 stopThread();
rlm@46 6167 return;
rlm@46 6168 }
rlm@46 6169 }
rlm@46 6170 var now = new Date().getTime();
rlm@46 6171 for(var i = 0, len = tasks.length; i < len; ++i){
rlm@46 6172 var t = tasks[i];
rlm@46 6173 var itime = now - t.taskRunTime;
rlm@46 6174 if(t.interval <= itime){
rlm@46 6175 var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
rlm@46 6176 t.taskRunTime = now;
rlm@46 6177 if(rt === false || t.taskRunCount === t.repeat){
rlm@46 6178 removeTask(t);
rlm@46 6179 return;
rlm@46 6180 }
rlm@46 6181 }
rlm@46 6182 if(t.duration && t.duration <= (now - t.taskStartTime)){
rlm@46 6183 removeTask(t);
rlm@46 6184 }
rlm@46 6185 }
rlm@46 6186 };
rlm@46 6187
rlm@46 6188
rlm@46 6189 this.start = function(task){
rlm@46 6190 tasks.push(task);
rlm@46 6191 task.taskStartTime = new Date().getTime();
rlm@46 6192 task.taskRunTime = 0;
rlm@46 6193 task.taskRunCount = 0;
rlm@46 6194 startThread();
rlm@46 6195 return task;
rlm@46 6196 };
rlm@46 6197
rlm@46 6198
rlm@46 6199 this.stop = function(task){
rlm@46 6200 removeTask(task);
rlm@46 6201 return task;
rlm@46 6202 };
rlm@46 6203
rlm@46 6204
rlm@46 6205 this.stopAll = function(){
rlm@46 6206 stopThread();
rlm@46 6207 for(var i = 0, len = tasks.length; i < len; i++){
rlm@46 6208 if(tasks[i].onStop){
rlm@46 6209 tasks[i].onStop();
rlm@46 6210 }
rlm@46 6211 }
rlm@46 6212 tasks = [];
rlm@46 6213 removeQueue = [];
rlm@46 6214 };
rlm@46 6215 };
rlm@46 6216
rlm@46 6217
rlm@46 6218 Ext.TaskMgr = new Ext.util.TaskRunner();
rlm@46 6219
rlm@46 6220 Ext.util.MixedCollection = function(allowFunctions, keyFn){
rlm@46 6221 this.items = [];
rlm@46 6222 this.map = {};
rlm@46 6223 this.keys = [];
rlm@46 6224 this.length = 0;
rlm@46 6225 this.addEvents(
rlm@46 6226
rlm@46 6227 "clear",
rlm@46 6228
rlm@46 6229 "add",
rlm@46 6230
rlm@46 6231 "replace",
rlm@46 6232
rlm@46 6233 "remove",
rlm@46 6234 "sort"
rlm@46 6235 );
rlm@46 6236 this.allowFunctions = allowFunctions === true;
rlm@46 6237 if(keyFn){
rlm@46 6238 this.getKey = keyFn;
rlm@46 6239 }
rlm@46 6240 Ext.util.MixedCollection.superclass.constructor.call(this);
rlm@46 6241 };
rlm@46 6242
rlm@46 6243 Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {
rlm@46 6244 allowFunctions : false,
rlm@46 6245
rlm@46 6246
rlm@46 6247 add : function(key, o){
rlm@46 6248 if(arguments.length == 1){
rlm@46 6249 o = arguments[0];
rlm@46 6250 key = this.getKey(o);
rlm@46 6251 }
rlm@46 6252 if(typeof key == "undefined" || key === null){
rlm@46 6253 this.length++;
rlm@46 6254 this.items.push(o);
rlm@46 6255 this.keys.push(null);
rlm@46 6256 }else{
rlm@46 6257 var old = this.map[key];
rlm@46 6258 if(old){
rlm@46 6259 return this.replace(key, o);
rlm@46 6260 }
rlm@46 6261 this.length++;
rlm@46 6262 this.items.push(o);
rlm@46 6263 this.map[key] = o;
rlm@46 6264 this.keys.push(key);
rlm@46 6265 }
rlm@46 6266 this.fireEvent("add", this.length-1, o, key);
rlm@46 6267 return o;
rlm@46 6268 },
rlm@46 6269
rlm@46 6270
rlm@46 6271 getKey : function(o){
rlm@46 6272 return o.id;
rlm@46 6273 },
rlm@46 6274
rlm@46 6275
rlm@46 6276 replace : function(key, o){
rlm@46 6277 if(arguments.length == 1){
rlm@46 6278 o = arguments[0];
rlm@46 6279 key = this.getKey(o);
rlm@46 6280 }
rlm@46 6281 var old = this.item(key);
rlm@46 6282 if(typeof key == "undefined" || key === null || typeof old == "undefined"){
rlm@46 6283 return this.add(key, o);
rlm@46 6284 }
rlm@46 6285 var index = this.indexOfKey(key);
rlm@46 6286 this.items[index] = o;
rlm@46 6287 this.map[key] = o;
rlm@46 6288 this.fireEvent("replace", key, old, o);
rlm@46 6289 return o;
rlm@46 6290 },
rlm@46 6291
rlm@46 6292
rlm@46 6293 addAll : function(objs){
rlm@46 6294 if(arguments.length > 1 || Ext.isArray(objs)){
rlm@46 6295 var args = arguments.length > 1 ? arguments : objs;
rlm@46 6296 for(var i = 0, len = args.length; i < len; i++){
rlm@46 6297 this.add(args[i]);
rlm@46 6298 }
rlm@46 6299 }else{
rlm@46 6300 for(var key in objs){
rlm@46 6301 if(this.allowFunctions || typeof objs[key] != "function"){
rlm@46 6302 this.add(key, objs[key]);
rlm@46 6303 }
rlm@46 6304 }
rlm@46 6305 }
rlm@46 6306 },
rlm@46 6307
rlm@46 6308
rlm@46 6309 each : function(fn, scope){
rlm@46 6310 var items = [].concat(this.items);
rlm@46 6311 for(var i = 0, len = items.length; i < len; i++){
rlm@46 6312 if(fn.call(scope || items[i], items[i], i, len) === false){
rlm@46 6313 break;
rlm@46 6314 }
rlm@46 6315 }
rlm@46 6316 },
rlm@46 6317
rlm@46 6318
rlm@46 6319 eachKey : function(fn, scope){
rlm@46 6320 for(var i = 0, len = this.keys.length; i < len; i++){
rlm@46 6321 fn.call(scope || window, this.keys[i], this.items[i], i, len);
rlm@46 6322 }
rlm@46 6323 },
rlm@46 6324
rlm@46 6325
rlm@46 6326 find : function(fn, scope){
rlm@46 6327 for(var i = 0, len = this.items.length; i < len; i++){
rlm@46 6328 if(fn.call(scope || window, this.items[i], this.keys[i])){
rlm@46 6329 return this.items[i];
rlm@46 6330 }
rlm@46 6331 }
rlm@46 6332 return null;
rlm@46 6333 },
rlm@46 6334
rlm@46 6335
rlm@46 6336 insert : function(index, key, o){
rlm@46 6337 if(arguments.length == 2){
rlm@46 6338 o = arguments[1];
rlm@46 6339 key = this.getKey(o);
rlm@46 6340 }
rlm@46 6341 if(index >= this.length){
rlm@46 6342 return this.add(key, o);
rlm@46 6343 }
rlm@46 6344 this.length++;
rlm@46 6345 this.items.splice(index, 0, o);
rlm@46 6346 if(typeof key != "undefined" && key != null){
rlm@46 6347 this.map[key] = o;
rlm@46 6348 }
rlm@46 6349 this.keys.splice(index, 0, key);
rlm@46 6350 this.fireEvent("add", index, o, key);
rlm@46 6351 return o;
rlm@46 6352 },
rlm@46 6353
rlm@46 6354
rlm@46 6355 remove : function(o){
rlm@46 6356 return this.removeAt(this.indexOf(o));
rlm@46 6357 },
rlm@46 6358
rlm@46 6359
rlm@46 6360 removeAt : function(index){
rlm@46 6361 if(index < this.length && index >= 0){
rlm@46 6362 this.length--;
rlm@46 6363 var o = this.items[index];
rlm@46 6364 this.items.splice(index, 1);
rlm@46 6365 var key = this.keys[index];
rlm@46 6366 if(typeof key != "undefined"){
rlm@46 6367 delete this.map[key];
rlm@46 6368 }
rlm@46 6369 this.keys.splice(index, 1);
rlm@46 6370 this.fireEvent("remove", o, key);
rlm@46 6371 return o;
rlm@46 6372 }
rlm@46 6373 return false;
rlm@46 6374 },
rlm@46 6375
rlm@46 6376
rlm@46 6377 removeKey : function(key){
rlm@46 6378 return this.removeAt(this.indexOfKey(key));
rlm@46 6379 },
rlm@46 6380
rlm@46 6381
rlm@46 6382 getCount : function(){
rlm@46 6383 return this.length;
rlm@46 6384 },
rlm@46 6385
rlm@46 6386
rlm@46 6387 indexOf : function(o){
rlm@46 6388 return this.items.indexOf(o);
rlm@46 6389 },
rlm@46 6390
rlm@46 6391
rlm@46 6392 indexOfKey : function(key){
rlm@46 6393 return this.keys.indexOf(key);
rlm@46 6394 },
rlm@46 6395
rlm@46 6396
rlm@46 6397 item : function(key){
rlm@46 6398 var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key];
rlm@46 6399 return typeof item != 'function' || this.allowFunctions ? item : null;
rlm@46 6400 },
rlm@46 6401
rlm@46 6402
rlm@46 6403 itemAt : function(index){
rlm@46 6404 return this.items[index];
rlm@46 6405 },
rlm@46 6406
rlm@46 6407
rlm@46 6408 key : function(key){
rlm@46 6409 return this.map[key];
rlm@46 6410 },
rlm@46 6411
rlm@46 6412
rlm@46 6413 contains : function(o){
rlm@46 6414 return this.indexOf(o) != -1;
rlm@46 6415 },
rlm@46 6416
rlm@46 6417
rlm@46 6418 containsKey : function(key){
rlm@46 6419 return typeof this.map[key] != "undefined";
rlm@46 6420 },
rlm@46 6421
rlm@46 6422
rlm@46 6423 clear : function(){
rlm@46 6424 this.length = 0;
rlm@46 6425 this.items = [];
rlm@46 6426 this.keys = [];
rlm@46 6427 this.map = {};
rlm@46 6428 this.fireEvent("clear");
rlm@46 6429 },
rlm@46 6430
rlm@46 6431
rlm@46 6432 first : function(){
rlm@46 6433 return this.items[0];
rlm@46 6434 },
rlm@46 6435
rlm@46 6436
rlm@46 6437 last : function(){
rlm@46 6438 return this.items[this.length-1];
rlm@46 6439 },
rlm@46 6440
rlm@46 6441
rlm@46 6442 _sort : function(property, dir, fn){
rlm@46 6443 var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1;
rlm@46 6444 fn = fn || function(a, b){
rlm@46 6445 return a-b;
rlm@46 6446 };
rlm@46 6447 var c = [], k = this.keys, items = this.items;
rlm@46 6448 for(var i = 0, len = items.length; i < len; i++){
rlm@46 6449 c[c.length] = {key: k[i], value: items[i], index: i};
rlm@46 6450 }
rlm@46 6451 c.sort(function(a, b){
rlm@46 6452 var v = fn(a[property], b[property]) * dsc;
rlm@46 6453 if(v == 0){
rlm@46 6454 v = (a.index < b.index ? -1 : 1);
rlm@46 6455 }
rlm@46 6456 return v;
rlm@46 6457 });
rlm@46 6458 for(var i = 0, len = c.length; i < len; i++){
rlm@46 6459 items[i] = c[i].value;
rlm@46 6460 k[i] = c[i].key;
rlm@46 6461 }
rlm@46 6462 this.fireEvent("sort", this);
rlm@46 6463 },
rlm@46 6464
rlm@46 6465
rlm@46 6466 sort : function(dir, fn){
rlm@46 6467 this._sort("value", dir, fn);
rlm@46 6468 },
rlm@46 6469
rlm@46 6470
rlm@46 6471 keySort : function(dir, fn){
rlm@46 6472 this._sort("key", dir, fn || function(a, b){
rlm@46 6473 return String(a).toUpperCase()-String(b).toUpperCase();
rlm@46 6474 });
rlm@46 6475 },
rlm@46 6476
rlm@46 6477
rlm@46 6478 getRange : function(start, end){
rlm@46 6479 var items = this.items;
rlm@46 6480 if(items.length < 1){
rlm@46 6481 return [];
rlm@46 6482 }
rlm@46 6483 start = start || 0;
rlm@46 6484 end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1);
rlm@46 6485 var r = [];
rlm@46 6486 if(start <= end){
rlm@46 6487 for(var i = start; i <= end; i++) {
rlm@46 6488 r[r.length] = items[i];
rlm@46 6489 }
rlm@46 6490 }else{
rlm@46 6491 for(var i = start; i >= end; i--) {
rlm@46 6492 r[r.length] = items[i];
rlm@46 6493 }
rlm@46 6494 }
rlm@46 6495 return r;
rlm@46 6496 },
rlm@46 6497
rlm@46 6498
rlm@46 6499 filter : function(property, value, anyMatch, caseSensitive){
rlm@46 6500 if(Ext.isEmpty(value, false)){
rlm@46 6501 return this.clone();
rlm@46 6502 }
rlm@46 6503 value = this.createValueMatcher(value, anyMatch, caseSensitive);
rlm@46 6504 return this.filterBy(function(o){
rlm@46 6505 return o && value.test(o[property]);
rlm@46 6506 });
rlm@46 6507 },
rlm@46 6508
rlm@46 6509
rlm@46 6510 filterBy : function(fn, scope){
rlm@46 6511 var r = new Ext.util.MixedCollection();
rlm@46 6512 r.getKey = this.getKey;
rlm@46 6513 var k = this.keys, it = this.items;
rlm@46 6514 for(var i = 0, len = it.length; i < len; i++){
rlm@46 6515 if(fn.call(scope||this, it[i], k[i])){
rlm@46 6516 r.add(k[i], it[i]);
rlm@46 6517 }
rlm@46 6518 }
rlm@46 6519 return r;
rlm@46 6520 },
rlm@46 6521
rlm@46 6522
rlm@46 6523 findIndex : function(property, value, start, anyMatch, caseSensitive){
rlm@46 6524 if(Ext.isEmpty(value, false)){
rlm@46 6525 return -1;
rlm@46 6526 }
rlm@46 6527 value = this.createValueMatcher(value, anyMatch, caseSensitive);
rlm@46 6528 return this.findIndexBy(function(o){
rlm@46 6529 return o && value.test(o[property]);
rlm@46 6530 }, null, start);
rlm@46 6531 },
rlm@46 6532
rlm@46 6533
rlm@46 6534 findIndexBy : function(fn, scope, start){
rlm@46 6535 var k = this.keys, it = this.items;
rlm@46 6536 for(var i = (start||0), len = it.length; i < len; i++){
rlm@46 6537 if(fn.call(scope||this, it[i], k[i])){
rlm@46 6538 return i;
rlm@46 6539 }
rlm@46 6540 }
rlm@46 6541 if(typeof start == 'number' && start > 0){
rlm@46 6542 for(var i = 0; i < start; i++){
rlm@46 6543 if(fn.call(scope||this, it[i], k[i])){
rlm@46 6544 return i;
rlm@46 6545 }
rlm@46 6546 }
rlm@46 6547 }
rlm@46 6548 return -1;
rlm@46 6549 },
rlm@46 6550
rlm@46 6551
rlm@46 6552 createValueMatcher : function(value, anyMatch, caseSensitive){
rlm@46 6553 if(!value.exec){
rlm@46 6554 value = String(value);
rlm@46 6555 value = new RegExp((anyMatch === true ? '' : '^') + Ext.escapeRe(value), caseSensitive ? '' : 'i');
rlm@46 6556 }
rlm@46 6557 return value;
rlm@46 6558 },
rlm@46 6559
rlm@46 6560
rlm@46 6561 clone : function(){
rlm@46 6562 var r = new Ext.util.MixedCollection();
rlm@46 6563 var k = this.keys, it = this.items;
rlm@46 6564 for(var i = 0, len = it.length; i < len; i++){
rlm@46 6565 r.add(k[i], it[i]);
rlm@46 6566 }
rlm@46 6567 r.getKey = this.getKey;
rlm@46 6568 return r;
rlm@46 6569 }
rlm@46 6570 });
rlm@46 6571
rlm@46 6572 Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
rlm@46 6573
rlm@46 6574 Ext.util.JSON = new (function(){
rlm@46 6575 var useHasOwn = !!{}.hasOwnProperty;
rlm@46 6576
rlm@46 6577
rlm@46 6578 var pad = function(n) {
rlm@46 6579 return n < 10 ? "0" + n : n;
rlm@46 6580 };
rlm@46 6581
rlm@46 6582 var m = {
rlm@46 6583 "\b": '\\b',
rlm@46 6584 "\t": '\\t',
rlm@46 6585 "\n": '\\n',
rlm@46 6586 "\f": '\\f',
rlm@46 6587 "\r": '\\r',
rlm@46 6588 '"' : '\\"',
rlm@46 6589 "\\": '\\\\'
rlm@46 6590 };
rlm@46 6591
rlm@46 6592 var encodeString = function(s){
rlm@46 6593 if (/["\\\x00-\x1f]/.test(s)) {
rlm@46 6594 return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
rlm@46 6595 var c = m[b];
rlm@46 6596 if(c){
rlm@46 6597 return c;
rlm@46 6598 }
rlm@46 6599 c = b.charCodeAt();
rlm@46 6600 return "\\u00" +
rlm@46 6601 Math.floor(c / 16).toString(16) +
rlm@46 6602 (c % 16).toString(16);
rlm@46 6603 }) + '"';
rlm@46 6604 }
rlm@46 6605 return '"' + s + '"';
rlm@46 6606 };
rlm@46 6607
rlm@46 6608 var encodeArray = function(o){
rlm@46 6609 var a = ["["], b, i, l = o.length, v;
rlm@46 6610 for (i = 0; i < l; i += 1) {
rlm@46 6611 v = o[i];
rlm@46 6612 switch (typeof v) {
rlm@46 6613 case "undefined":
rlm@46 6614 case "function":
rlm@46 6615 case "unknown":
rlm@46 6616 break;
rlm@46 6617 default:
rlm@46 6618 if (b) {
rlm@46 6619 a.push(',');
rlm@46 6620 }
rlm@46 6621 a.push(v === null ? "null" : Ext.util.JSON.encode(v));
rlm@46 6622 b = true;
rlm@46 6623 }
rlm@46 6624 }
rlm@46 6625 a.push("]");
rlm@46 6626 return a.join("");
rlm@46 6627 };
rlm@46 6628
rlm@46 6629 this.encodeDate = function(o){
rlm@46 6630 return '"' + o.getFullYear() + "-" +
rlm@46 6631 pad(o.getMonth() + 1) + "-" +
rlm@46 6632 pad(o.getDate()) + "T" +
rlm@46 6633 pad(o.getHours()) + ":" +
rlm@46 6634 pad(o.getMinutes()) + ":" +
rlm@46 6635 pad(o.getSeconds()) + '"';
rlm@46 6636 };
rlm@46 6637
rlm@46 6638
rlm@46 6639 this.encode = function(o){
rlm@46 6640 if(typeof o == "undefined" || o === null){
rlm@46 6641 return "null";
rlm@46 6642 }else if(Ext.isArray(o)){
rlm@46 6643 return encodeArray(o);
rlm@46 6644 }else if(Ext.isDate(o)){
rlm@46 6645 return Ext.util.JSON.encodeDate(o);
rlm@46 6646 }else if(typeof o == "string"){
rlm@46 6647 return encodeString(o);
rlm@46 6648 }else if(typeof o == "number"){
rlm@46 6649 return isFinite(o) ? String(o) : "null";
rlm@46 6650 }else if(typeof o == "boolean"){
rlm@46 6651 return String(o);
rlm@46 6652 }else {
rlm@46 6653 var a = ["{"], b, i, v;
rlm@46 6654 for (i in o) {
rlm@46 6655 if(!useHasOwn || o.hasOwnProperty(i)) {
rlm@46 6656 v = o[i];
rlm@46 6657 switch (typeof v) {
rlm@46 6658 case "undefined":
rlm@46 6659 case "function":
rlm@46 6660 case "unknown":
rlm@46 6661 break;
rlm@46 6662 default:
rlm@46 6663 if(b){
rlm@46 6664 a.push(',');
rlm@46 6665 }
rlm@46 6666 a.push(this.encode(i), ":",
rlm@46 6667 v === null ? "null" : this.encode(v));
rlm@46 6668 b = true;
rlm@46 6669 }
rlm@46 6670 }
rlm@46 6671 }
rlm@46 6672 a.push("}");
rlm@46 6673 return a.join("");
rlm@46 6674 }
rlm@46 6675 };
rlm@46 6676
rlm@46 6677
rlm@46 6678 this.decode = function(json){
rlm@46 6679 return eval("(" + json + ')');
rlm@46 6680 };
rlm@46 6681 })();
rlm@46 6682
rlm@46 6683 Ext.encode = Ext.util.JSON.encode;
rlm@46 6684
rlm@46 6685 Ext.decode = Ext.util.JSON.decode;
rlm@46 6686
rlm@46 6687
rlm@46 6688 Ext.util.Format = function(){
rlm@46 6689 var trimRe = /^\s+|\s+$/g;
rlm@46 6690 return {
rlm@46 6691
rlm@46 6692 ellipsis : function(value, len){
rlm@46 6693 if(value && value.length > len){
rlm@46 6694 return value.substr(0, len-3)+"...";
rlm@46 6695 }
rlm@46 6696 return value;
rlm@46 6697 },
rlm@46 6698
rlm@46 6699
rlm@46 6700 undef : function(value){
rlm@46 6701 return value !== undefined ? value : "";
rlm@46 6702 },
rlm@46 6703
rlm@46 6704
rlm@46 6705 defaultValue : function(value, defaultValue){
rlm@46 6706 return value !== undefined && value !== '' ? value : defaultValue;
rlm@46 6707 },
rlm@46 6708
rlm@46 6709
rlm@46 6710 htmlEncode : function(value){
rlm@46 6711 return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
rlm@46 6712 },
rlm@46 6713
rlm@46 6714
rlm@46 6715 htmlDecode : function(value){
rlm@46 6716 return !value ? value : String(value).replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"');
rlm@46 6717 },
rlm@46 6718
rlm@46 6719
rlm@46 6720 trim : function(value){
rlm@46 6721 return String(value).replace(trimRe, "");
rlm@46 6722 },
rlm@46 6723
rlm@46 6724
rlm@46 6725 substr : function(value, start, length){
rlm@46 6726 return String(value).substr(start, length);
rlm@46 6727 },
rlm@46 6728
rlm@46 6729
rlm@46 6730 lowercase : function(value){
rlm@46 6731 return String(value).toLowerCase();
rlm@46 6732 },
rlm@46 6733
rlm@46 6734
rlm@46 6735 uppercase : function(value){
rlm@46 6736 return String(value).toUpperCase();
rlm@46 6737 },
rlm@46 6738
rlm@46 6739
rlm@46 6740 capitalize : function(value){
rlm@46 6741 return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
rlm@46 6742 },
rlm@46 6743
rlm@46 6744
rlm@46 6745 call : function(value, fn){
rlm@46 6746 if(arguments.length > 2){
rlm@46 6747 var args = Array.prototype.slice.call(arguments, 2);
rlm@46 6748 args.unshift(value);
rlm@46 6749 return eval(fn).apply(window, args);
rlm@46 6750 }else{
rlm@46 6751 return eval(fn).call(window, value);
rlm@46 6752 }
rlm@46 6753 },
rlm@46 6754
rlm@46 6755
rlm@46 6756 usMoney : function(v){
rlm@46 6757 v = (Math.round((v-0)*100))/100;
rlm@46 6758 v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v);
rlm@46 6759 v = String(v);
rlm@46 6760 var ps = v.split('.');
rlm@46 6761 var whole = ps[0];
rlm@46 6762 var sub = ps[1] ? '.'+ ps[1] : '.00';
rlm@46 6763 var r = /(\d+)(\d{3})/;
rlm@46 6764 while (r.test(whole)) {
rlm@46 6765 whole = whole.replace(r, '$1' + ',' + '$2');
rlm@46 6766 }
rlm@46 6767 v = whole + sub;
rlm@46 6768 if(v.charAt(0) == '-'){
rlm@46 6769 return '-$' + v.substr(1);
rlm@46 6770 }
rlm@46 6771 return "$" + v;
rlm@46 6772 },
rlm@46 6773
rlm@46 6774
rlm@46 6775 date : function(v, format){
rlm@46 6776 if(!v){
rlm@46 6777 return "";
rlm@46 6778 }
rlm@46 6779 if(!Ext.isDate(v)){
rlm@46 6780 v = new Date(Date.parse(v));
rlm@46 6781 }
rlm@46 6782 return v.dateFormat(format || "m/d/Y");
rlm@46 6783 },
rlm@46 6784
rlm@46 6785
rlm@46 6786 dateRenderer : function(format){
rlm@46 6787 return function(v){
rlm@46 6788 return Ext.util.Format.date(v, format);
rlm@46 6789 };
rlm@46 6790 },
rlm@46 6791
rlm@46 6792
rlm@46 6793 stripTagsRE : /<\/?[^>]+>/gi,
rlm@46 6794
rlm@46 6795
rlm@46 6796 stripTags : function(v){
rlm@46 6797 return !v ? v : String(v).replace(this.stripTagsRE, "");
rlm@46 6798 },
rlm@46 6799
rlm@46 6800 stripScriptsRe : /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
rlm@46 6801
rlm@46 6802
rlm@46 6803 stripScripts : function(v){
rlm@46 6804 return !v ? v : String(v).replace(this.stripScriptsRe, "");
rlm@46 6805 },
rlm@46 6806
rlm@46 6807
rlm@46 6808 fileSize : function(size){
rlm@46 6809 if(size < 1024) {
rlm@46 6810 return size + " bytes";
rlm@46 6811 } else if(size < 1048576) {
rlm@46 6812 return (Math.round(((size*10) / 1024))/10) + " KB";
rlm@46 6813 } else {
rlm@46 6814 return (Math.round(((size*10) / 1048576))/10) + " MB";
rlm@46 6815 }
rlm@46 6816 },
rlm@46 6817
rlm@46 6818 math : function(){
rlm@46 6819 var fns = {};
rlm@46 6820 return function(v, a){
rlm@46 6821 if(!fns[a]){
rlm@46 6822 fns[a] = new Function('v', 'return v ' + a + ';');
rlm@46 6823 }
rlm@46 6824 return fns[a](v);
rlm@46 6825 }
rlm@46 6826 }()
rlm@46 6827 };
rlm@46 6828 }();
rlm@46 6829
rlm@46 6830 Ext.XTemplate = function(){
rlm@46 6831 Ext.XTemplate.superclass.constructor.apply(this, arguments);
rlm@46 6832 var s = this.html;
rlm@46 6833
rlm@46 6834 s = ['<tpl>', s, '</tpl>'].join('');
rlm@46 6835
rlm@46 6836 var re = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;
rlm@46 6837
rlm@46 6838 var nameRe = /^<tpl\b[^>]*?for="(.*?)"/;
rlm@46 6839 var ifRe = /^<tpl\b[^>]*?if="(.*?)"/;
rlm@46 6840 var execRe = /^<tpl\b[^>]*?exec="(.*?)"/;
rlm@46 6841 var m, id = 0;
rlm@46 6842 var tpls = [];
rlm@46 6843
rlm@46 6844 while(m = s.match(re)){
rlm@46 6845 var m2 = m[0].match(nameRe);
rlm@46 6846 var m3 = m[0].match(ifRe);
rlm@46 6847 var m4 = m[0].match(execRe);
rlm@46 6848 var exp = null, fn = null, exec = null;
rlm@46 6849 var name = m2 && m2[1] ? m2[1] : '';
rlm@46 6850 if(m3){
rlm@46 6851 exp = m3 && m3[1] ? m3[1] : null;
rlm@46 6852 if(exp){
rlm@46 6853 fn = new Function('values', 'parent', 'xindex', 'xcount', 'with(values){ return '+(Ext.util.Format.htmlDecode(exp))+'; }');
rlm@46 6854 }
rlm@46 6855 }
rlm@46 6856 if(m4){
rlm@46 6857 exp = m4 && m4[1] ? m4[1] : null;
rlm@46 6858 if(exp){
rlm@46 6859 exec = new Function('values', 'parent', 'xindex', 'xcount', 'with(values){ '+(Ext.util.Format.htmlDecode(exp))+'; }');
rlm@46 6860 }
rlm@46 6861 }
rlm@46 6862 if(name){
rlm@46 6863 switch(name){
rlm@46 6864 case '.': name = new Function('values', 'parent', 'with(values){ return values; }'); break;
rlm@46 6865 case '..': name = new Function('values', 'parent', 'with(values){ return parent; }'); break;
rlm@46 6866 default: name = new Function('values', 'parent', 'with(values){ return '+name+'; }');
rlm@46 6867 }
rlm@46 6868 }
rlm@46 6869 tpls.push({
rlm@46 6870 id: id,
rlm@46 6871 target: name,
rlm@46 6872 exec: exec,
rlm@46 6873 test: fn,
rlm@46 6874 body: m[1]||''
rlm@46 6875 });
rlm@46 6876 s = s.replace(m[0], '{xtpl'+ id + '}');
rlm@46 6877 ++id;
rlm@46 6878 }
rlm@46 6879 for(var i = tpls.length-1; i >= 0; --i){
rlm@46 6880 this.compileTpl(tpls[i]);
rlm@46 6881 }
rlm@46 6882 this.master = tpls[tpls.length-1];
rlm@46 6883 this.tpls = tpls;
rlm@46 6884 };
rlm@46 6885 Ext.extend(Ext.XTemplate, Ext.Template, {
rlm@46 6886 re : /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
rlm@46 6887 codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g,
rlm@46 6888
rlm@46 6889 applySubTemplate : function(id, values, parent, xindex, xcount){
rlm@46 6890 var t = this.tpls[id];
rlm@46 6891 if(t.test && !t.test.call(this, values, parent, xindex, xcount)){
rlm@46 6892 return '';
rlm@46 6893 }
rlm@46 6894 if(t.exec && t.exec.call(this, values, parent, xindex, xcount)){
rlm@46 6895 return '';
rlm@46 6896 }
rlm@46 6897 var vs = t.target ? t.target.call(this, values, parent) : values;
rlm@46 6898 parent = t.target ? values : parent;
rlm@46 6899 if(t.target && Ext.isArray(vs)){
rlm@46 6900 var buf = [];
rlm@46 6901 for(var i = 0, len = vs.length; i < len; i++){
rlm@46 6902 buf[buf.length] = t.compiled.call(this, vs[i], parent, i+1, len);
rlm@46 6903 }
rlm@46 6904 return buf.join('');
rlm@46 6905 }
rlm@46 6906 return t.compiled.call(this, vs, parent, xindex, xcount);
rlm@46 6907 },
rlm@46 6908
rlm@46 6909 compileTpl : function(tpl){
rlm@46 6910 var fm = Ext.util.Format;
rlm@46 6911 var useF = this.disableFormats !== true;
rlm@46 6912 var sep = Ext.isGecko ? "+" : ",";
rlm@46 6913 var fn = function(m, name, format, args, math){
rlm@46 6914 if(name.substr(0, 4) == 'xtpl'){
rlm@46 6915 return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'";
rlm@46 6916 }
rlm@46 6917 var v;
rlm@46 6918 if(name === '.'){
rlm@46 6919 v = 'values';
rlm@46 6920 }else if(name === '#'){
rlm@46 6921 v = 'xindex';
rlm@46 6922 }else if(name.indexOf('.') != -1){
rlm@46 6923 v = name;
rlm@46 6924 }else{
rlm@46 6925 v = "values['" + name + "']";
rlm@46 6926 }
rlm@46 6927 if(math){
rlm@46 6928 v = '(' + v + math + ')';
rlm@46 6929 }
rlm@46 6930 if(format && useF){
rlm@46 6931 args = args ? ',' + args : "";
rlm@46 6932 if(format.substr(0, 5) != "this."){
rlm@46 6933 format = "fm." + format + '(';
rlm@46 6934 }else{
rlm@46 6935 format = 'this.call("'+ format.substr(5) + '", ';
rlm@46 6936 args = ", values";
rlm@46 6937 }
rlm@46 6938 }else{
rlm@46 6939 args= ''; format = "("+v+" === undefined ? '' : ";
rlm@46 6940 }
rlm@46 6941 return "'"+ sep + format + v + args + ")"+sep+"'";
rlm@46 6942 };
rlm@46 6943 var codeFn = function(m, code){
rlm@46 6944 return "'"+ sep +'('+code+')'+sep+"'";
rlm@46 6945 };
rlm@46 6946
rlm@46 6947 var body;
rlm@46 6948 if(Ext.isGecko){
rlm@46 6949 body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" +
rlm@46 6950 tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) +
rlm@46 6951 "';};";
rlm@46 6952 }else{
rlm@46 6953 body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];
rlm@46 6954 body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn));
rlm@46 6955 body.push("'].join('');};");
rlm@46 6956 body = body.join('');
rlm@46 6957 }
rlm@46 6958 eval(body);
rlm@46 6959 return this;
rlm@46 6960 },
rlm@46 6961
rlm@46 6962
rlm@46 6963 applyTemplate : function(values){
rlm@46 6964 return this.master.compiled.call(this, values, {}, 1, 1);
rlm@46 6965 },
rlm@46 6966
rlm@46 6967
rlm@46 6968 compile : function(){return this;}
rlm@46 6969
rlm@46 6970
rlm@46 6971
rlm@46 6972
rlm@46 6973
rlm@46 6974 });
rlm@46 6975
rlm@46 6976 Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;
rlm@46 6977
rlm@46 6978
rlm@46 6979 Ext.XTemplate.from = function(el){
rlm@46 6980 el = Ext.getDom(el);
rlm@46 6981 return new Ext.XTemplate(el.value || el.innerHTML);
rlm@46 6982 };
rlm@46 6983
rlm@46 6984 Ext.util.CSS = function(){
rlm@46 6985 var rules = null;
rlm@46 6986 var doc = document;
rlm@46 6987
rlm@46 6988 var camelRe = /(-[a-z])/gi;
rlm@46 6989 var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
rlm@46 6990
rlm@46 6991 return {
rlm@46 6992
rlm@46 6993 createStyleSheet : function(cssText, id){
rlm@46 6994 var ss;
rlm@46 6995 var head = doc.getElementsByTagName("head")[0];
rlm@46 6996 var rules = doc.createElement("style");
rlm@46 6997 rules.setAttribute("type", "text/css");
rlm@46 6998 if(id){
rlm@46 6999 rules.setAttribute("id", id);
rlm@46 7000 }
rlm@46 7001 if(Ext.isIE){
rlm@46 7002 head.appendChild(rules);
rlm@46 7003 ss = rules.styleSheet;
rlm@46 7004 ss.cssText = cssText;
rlm@46 7005 }else{
rlm@46 7006 try{
rlm@46 7007 rules.appendChild(doc.createTextNode(cssText));
rlm@46 7008 }catch(e){
rlm@46 7009 rules.cssText = cssText;
rlm@46 7010 }
rlm@46 7011 head.appendChild(rules);
rlm@46 7012 ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]);
rlm@46 7013 }
rlm@46 7014 this.cacheStyleSheet(ss);
rlm@46 7015 return ss;
rlm@46 7016 },
rlm@46 7017
rlm@46 7018
rlm@46 7019 removeStyleSheet : function(id){
rlm@46 7020 var existing = doc.getElementById(id);
rlm@46 7021 if(existing){
rlm@46 7022 existing.parentNode.removeChild(existing);
rlm@46 7023 }
rlm@46 7024 },
rlm@46 7025
rlm@46 7026
rlm@46 7027 swapStyleSheet : function(id, url){
rlm@46 7028 this.removeStyleSheet(id);
rlm@46 7029 var ss = doc.createElement("link");
rlm@46 7030 ss.setAttribute("rel", "stylesheet");
rlm@46 7031 ss.setAttribute("type", "text/css");
rlm@46 7032 ss.setAttribute("id", id);
rlm@46 7033 ss.setAttribute("href", url);
rlm@46 7034 doc.getElementsByTagName("head")[0].appendChild(ss);
rlm@46 7035 },
rlm@46 7036
rlm@46 7037
rlm@46 7038 refreshCache : function(){
rlm@46 7039 return this.getRules(true);
rlm@46 7040 },
rlm@46 7041
rlm@46 7042
rlm@46 7043 cacheStyleSheet : function(ss){
rlm@46 7044 if(!rules){
rlm@46 7045 rules = {};
rlm@46 7046 }
rlm@46 7047 try{
rlm@46 7048 var ssRules = ss.cssRules || ss.rules;
rlm@46 7049 for(var j = ssRules.length-1; j >= 0; --j){
rlm@46 7050 rules[ssRules[j].selectorText] = ssRules[j];
rlm@46 7051 }
rlm@46 7052 }catch(e){}
rlm@46 7053 },
rlm@46 7054
rlm@46 7055
rlm@46 7056 getRules : function(refreshCache){
rlm@46 7057 if(rules == null || refreshCache){
rlm@46 7058 rules = {};
rlm@46 7059 var ds = doc.styleSheets;
rlm@46 7060 for(var i =0, len = ds.length; i < len; i++){
rlm@46 7061 try{
rlm@46 7062 this.cacheStyleSheet(ds[i]);
rlm@46 7063 }catch(e){}
rlm@46 7064 }
rlm@46 7065 }
rlm@46 7066 return rules;
rlm@46 7067 },
rlm@46 7068
rlm@46 7069
rlm@46 7070 getRule : function(selector, refreshCache){
rlm@46 7071 var rs = this.getRules(refreshCache);
rlm@46 7072 if(!Ext.isArray(selector)){
rlm@46 7073 return rs[selector];
rlm@46 7074 }
rlm@46 7075 for(var i = 0; i < selector.length; i++){
rlm@46 7076 if(rs[selector[i]]){
rlm@46 7077 return rs[selector[i]];
rlm@46 7078 }
rlm@46 7079 }
rlm@46 7080 return null;
rlm@46 7081 },
rlm@46 7082
rlm@46 7083
rlm@46 7084
rlm@46 7085 updateRule : function(selector, property, value){
rlm@46 7086 if(!Ext.isArray(selector)){
rlm@46 7087 var rule = this.getRule(selector);
rlm@46 7088 if(rule){
rlm@46 7089 rule.style[property.replace(camelRe, camelFn)] = value;
rlm@46 7090 return true;
rlm@46 7091 }
rlm@46 7092 }else{
rlm@46 7093 for(var i = 0; i < selector.length; i++){
rlm@46 7094 if(this.updateRule(selector[i], property, value)){
rlm@46 7095 return true;
rlm@46 7096 }
rlm@46 7097 }
rlm@46 7098 }
rlm@46 7099 return false;
rlm@46 7100 }
rlm@46 7101 };
rlm@46 7102 }();
rlm@46 7103
rlm@46 7104 Ext.util.ClickRepeater = function(el, config)
rlm@46 7105 {
rlm@46 7106 this.el = Ext.get(el);
rlm@46 7107 this.el.unselectable();
rlm@46 7108
rlm@46 7109 Ext.apply(this, config);
rlm@46 7110
rlm@46 7111 this.addEvents(
rlm@46 7112
rlm@46 7113 "mousedown",
rlm@46 7114
rlm@46 7115 "click",
rlm@46 7116
rlm@46 7117 "mouseup"
rlm@46 7118 );
rlm@46 7119
rlm@46 7120 this.el.on("mousedown", this.handleMouseDown, this);
rlm@46 7121 if(this.preventDefault || this.stopDefault){
rlm@46 7122 this.el.on("click", function(e){
rlm@46 7123 if(this.preventDefault){
rlm@46 7124 e.preventDefault();
rlm@46 7125 }
rlm@46 7126 if(this.stopDefault){
rlm@46 7127 e.stopEvent();
rlm@46 7128 }
rlm@46 7129 }, this);
rlm@46 7130 }
rlm@46 7131
rlm@46 7132 if(this.handler){
rlm@46 7133 this.on("click", this.handler, this.scope || this);
rlm@46 7134 }
rlm@46 7135
rlm@46 7136 Ext.util.ClickRepeater.superclass.constructor.call(this);
rlm@46 7137 };
rlm@46 7138
rlm@46 7139 Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, {
rlm@46 7140 interval : 20,
rlm@46 7141 delay: 250,
rlm@46 7142 preventDefault : true,
rlm@46 7143 stopDefault : false,
rlm@46 7144 timer : 0,
rlm@46 7145
rlm@46 7146 handleMouseDown : function(){
rlm@46 7147 clearTimeout(this.timer);
rlm@46 7148 this.el.blur();
rlm@46 7149 if(this.pressClass){
rlm@46 7150 this.el.addClass(this.pressClass);
rlm@46 7151 }
rlm@46 7152 this.mousedownTime = new Date();
rlm@46 7153
rlm@46 7154 Ext.getDoc().on("mouseup", this.handleMouseUp, this);
rlm@46 7155 this.el.on("mouseout", this.handleMouseOut, this);
rlm@46 7156
rlm@46 7157 this.fireEvent("mousedown", this);
rlm@46 7158 this.fireEvent("click", this);
rlm@46 7159
rlm@46 7160 if (this.accelerate) {
rlm@46 7161 this.delay = 400;
rlm@46 7162 }
rlm@46 7163 this.timer = this.click.defer(this.delay || this.interval, this);
rlm@46 7164 },
rlm@46 7165
rlm@46 7166 click : function(){
rlm@46 7167 this.fireEvent("click", this);
rlm@46 7168 this.timer = this.click.defer(this.accelerate ?
rlm@46 7169 this.easeOutExpo(this.mousedownTime.getElapsed(),
rlm@46 7170 400,
rlm@46 7171 -390,
rlm@46 7172 12000) :
rlm@46 7173 this.interval, this);
rlm@46 7174 },
rlm@46 7175
rlm@46 7176 easeOutExpo : function (t, b, c, d) {
rlm@46 7177 return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
rlm@46 7178 },
rlm@46 7179
rlm@46 7180 handleMouseOut : function(){
rlm@46 7181 clearTimeout(this.timer);
rlm@46 7182 if(this.pressClass){
rlm@46 7183 this.el.removeClass(this.pressClass);
rlm@46 7184 }
rlm@46 7185 this.el.on("mouseover", this.handleMouseReturn, this);
rlm@46 7186 },
rlm@46 7187
rlm@46 7188 handleMouseReturn : function(){
rlm@46 7189 this.el.un("mouseover", this.handleMouseReturn);
rlm@46 7190 if(this.pressClass){
rlm@46 7191 this.el.addClass(this.pressClass);
rlm@46 7192 }
rlm@46 7193 this.click();
rlm@46 7194 },
rlm@46 7195
rlm@46 7196 handleMouseUp : function(){
rlm@46 7197 clearTimeout(this.timer);
rlm@46 7198 this.el.un("mouseover", this.handleMouseReturn);
rlm@46 7199 this.el.un("mouseout", this.handleMouseOut);
rlm@46 7200 Ext.getDoc().un("mouseup", this.handleMouseUp);
rlm@46 7201 this.el.removeClass(this.pressClass);
rlm@46 7202 this.fireEvent("mouseup", this);
rlm@46 7203 }
rlm@46 7204 });
rlm@46 7205
rlm@46 7206 Ext.KeyNav = function(el, config){
rlm@46 7207 this.el = Ext.get(el);
rlm@46 7208 Ext.apply(this, config);
rlm@46 7209 if(!this.disabled){
rlm@46 7210 this.disabled = true;
rlm@46 7211 this.enable();
rlm@46 7212 }
rlm@46 7213 };
rlm@46 7214
rlm@46 7215 Ext.KeyNav.prototype = {
rlm@46 7216
rlm@46 7217 disabled : false,
rlm@46 7218
rlm@46 7219 defaultEventAction: "stopEvent",
rlm@46 7220
rlm@46 7221 forceKeyDown : false,
rlm@46 7222
rlm@46 7223 prepareEvent : function(e){
rlm@46 7224 var k = e.getKey();
rlm@46 7225 var h = this.keyToHandler[k];
rlm@46 7226 if(Ext.isSafari2 && h && k >= 37 && k <= 40){
rlm@46 7227 e.stopEvent();
rlm@46 7228 }
rlm@46 7229 },
rlm@46 7230
rlm@46 7231 relay : function(e){
rlm@46 7232 var k = e.getKey();
rlm@46 7233 var h = this.keyToHandler[k];
rlm@46 7234 if(h && this[h]){
rlm@46 7235 if(this.doRelay(e, this[h], h) !== true){
rlm@46 7236 e[this.defaultEventAction]();
rlm@46 7237 }
rlm@46 7238 }
rlm@46 7239 },
rlm@46 7240
rlm@46 7241 doRelay : function(e, h, hname){
rlm@46 7242 return h.call(this.scope || this, e);
rlm@46 7243 },
rlm@46 7244
rlm@46 7245 enter : false,
rlm@46 7246 left : false,
rlm@46 7247 right : false,
rlm@46 7248 up : false,
rlm@46 7249 down : false,
rlm@46 7250 tab : false,
rlm@46 7251 esc : false,
rlm@46 7252 pageUp : false,
rlm@46 7253 pageDown : false,
rlm@46 7254 del : false,
rlm@46 7255 home : false,
rlm@46 7256 end : false,
rlm@46 7257
rlm@46 7258 keyToHandler : {
rlm@46 7259 37 : "left",
rlm@46 7260 39 : "right",
rlm@46 7261 38 : "up",
rlm@46 7262 40 : "down",
rlm@46 7263 33 : "pageUp",
rlm@46 7264 34 : "pageDown",
rlm@46 7265 46 : "del",
rlm@46 7266 36 : "home",
rlm@46 7267 35 : "end",
rlm@46 7268 13 : "enter",
rlm@46 7269 27 : "esc",
rlm@46 7270 9 : "tab"
rlm@46 7271 },
rlm@46 7272
rlm@46 7273
rlm@46 7274 enable: function(){
rlm@46 7275 if(this.disabled){
rlm@46 7276 if(this.forceKeyDown || Ext.isIE || Ext.isSafari3 || Ext.isAir){
rlm@46 7277 this.el.on("keydown", this.relay, this);
rlm@46 7278 }else{
rlm@46 7279 this.el.on("keydown", this.prepareEvent, this);
rlm@46 7280 this.el.on("keypress", this.relay, this);
rlm@46 7281 }
rlm@46 7282 this.disabled = false;
rlm@46 7283 }
rlm@46 7284 },
rlm@46 7285
rlm@46 7286
rlm@46 7287 disable: function(){
rlm@46 7288 if(!this.disabled){
rlm@46 7289 if(this.forceKeyDown || Ext.isIE || Ext.isSafari3 || Ext.isAir){
rlm@46 7290 this.el.un("keydown", this.relay);
rlm@46 7291 }else{
rlm@46 7292 this.el.un("keydown", this.prepareEvent);
rlm@46 7293 this.el.un("keypress", this.relay);
rlm@46 7294 }
rlm@46 7295 this.disabled = true;
rlm@46 7296 }
rlm@46 7297 }
rlm@46 7298 };
rlm@46 7299
rlm@46 7300 Ext.KeyMap = function(el, config, eventName){
rlm@46 7301 this.el = Ext.get(el);
rlm@46 7302 this.eventName = eventName || "keydown";
rlm@46 7303 this.bindings = [];
rlm@46 7304 if(config){
rlm@46 7305 this.addBinding(config);
rlm@46 7306 }
rlm@46 7307 this.enable();
rlm@46 7308 };
rlm@46 7309
rlm@46 7310 Ext.KeyMap.prototype = {
rlm@46 7311
rlm@46 7312 stopEvent : false,
rlm@46 7313
rlm@46 7314
rlm@46 7315 addBinding : function(config){
rlm@46 7316 if(Ext.isArray(config)){
rlm@46 7317 for(var i = 0, len = config.length; i < len; i++){
rlm@46 7318 this.addBinding(config[i]);
rlm@46 7319 }
rlm@46 7320 return;
rlm@46 7321 }
rlm@46 7322 var keyCode = config.key,
rlm@46 7323 shift = config.shift,
rlm@46 7324 ctrl = config.ctrl,
rlm@46 7325 alt = config.alt,
rlm@46 7326 fn = config.fn || config.handler,
rlm@46 7327 scope = config.scope;
rlm@46 7328
rlm@46 7329 if(typeof keyCode == "string"){
rlm@46 7330 var ks = [];
rlm@46 7331 var keyString = keyCode.toUpperCase();
rlm@46 7332 for(var j = 0, len = keyString.length; j < len; j++){
rlm@46 7333 ks.push(keyString.charCodeAt(j));
rlm@46 7334 }
rlm@46 7335 keyCode = ks;
rlm@46 7336 }
rlm@46 7337 var keyArray = Ext.isArray(keyCode);
rlm@46 7338
rlm@46 7339 var handler = function(e){
rlm@46 7340 if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){
rlm@46 7341 var k = e.getKey();
rlm@46 7342 if(keyArray){
rlm@46 7343 for(var i = 0, len = keyCode.length; i < len; i++){
rlm@46 7344 if(keyCode[i] == k){
rlm@46 7345 if(this.stopEvent){
rlm@46 7346 e.stopEvent();
rlm@46 7347 }
rlm@46 7348 fn.call(scope || window, k, e);
rlm@46 7349 return;
rlm@46 7350 }
rlm@46 7351 }
rlm@46 7352 }else{
rlm@46 7353 if(k == keyCode){
rlm@46 7354 if(this.stopEvent){
rlm@46 7355 e.stopEvent();
rlm@46 7356 }
rlm@46 7357 fn.call(scope || window, k, e);
rlm@46 7358 }
rlm@46 7359 }
rlm@46 7360 }
rlm@46 7361 };
rlm@46 7362 this.bindings.push(handler);
rlm@46 7363 },
rlm@46 7364
rlm@46 7365
rlm@46 7366 on : function(key, fn, scope){
rlm@46 7367 var keyCode, shift, ctrl, alt;
rlm@46 7368 if(typeof key == "object" && !Ext.isArray(key)){
rlm@46 7369 keyCode = key.key;
rlm@46 7370 shift = key.shift;
rlm@46 7371 ctrl = key.ctrl;
rlm@46 7372 alt = key.alt;
rlm@46 7373 }else{
rlm@46 7374 keyCode = key;
rlm@46 7375 }
rlm@46 7376 this.addBinding({
rlm@46 7377 key: keyCode,
rlm@46 7378 shift: shift,
rlm@46 7379 ctrl: ctrl,
rlm@46 7380 alt: alt,
rlm@46 7381 fn: fn,
rlm@46 7382 scope: scope
rlm@46 7383 })
rlm@46 7384 },
rlm@46 7385
rlm@46 7386
rlm@46 7387 handleKeyDown : function(e){
rlm@46 7388 if(this.enabled){
rlm@46 7389 var b = this.bindings;
rlm@46 7390 for(var i = 0, len = b.length; i < len; i++){
rlm@46 7391 b[i].call(this, e);
rlm@46 7392 }
rlm@46 7393 }
rlm@46 7394 },
rlm@46 7395
rlm@46 7396
rlm@46 7397 isEnabled : function(){
rlm@46 7398 return this.enabled;
rlm@46 7399 },
rlm@46 7400
rlm@46 7401
rlm@46 7402 enable: function(){
rlm@46 7403 if(!this.enabled){
rlm@46 7404 this.el.on(this.eventName, this.handleKeyDown, this);
rlm@46 7405 this.enabled = true;
rlm@46 7406 }
rlm@46 7407 },
rlm@46 7408
rlm@46 7409
rlm@46 7410 disable: function(){
rlm@46 7411 if(this.enabled){
rlm@46 7412 this.el.removeListener(this.eventName, this.handleKeyDown, this);
rlm@46 7413 this.enabled = false;
rlm@46 7414 }
rlm@46 7415 }
rlm@46 7416 };
rlm@46 7417
rlm@46 7418 Ext.util.TextMetrics = function(){
rlm@46 7419 var shared;
rlm@46 7420 return {
rlm@46 7421
rlm@46 7422 measure : function(el, text, fixedWidth){
rlm@46 7423 if(!shared){
rlm@46 7424 shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
rlm@46 7425 }
rlm@46 7426 shared.bind(el);
rlm@46 7427 shared.setFixedWidth(fixedWidth || 'auto');
rlm@46 7428 return shared.getSize(text);
rlm@46 7429 },
rlm@46 7430
rlm@46 7431
rlm@46 7432 createInstance : function(el, fixedWidth){
rlm@46 7433 return Ext.util.TextMetrics.Instance(el, fixedWidth);
rlm@46 7434 }
rlm@46 7435 };
rlm@46 7436 }();
rlm@46 7437
rlm@46 7438 Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
rlm@46 7439 var ml = new Ext.Element(document.createElement('div'));
rlm@46 7440 document.body.appendChild(ml.dom);
rlm@46 7441 ml.position('absolute');
rlm@46 7442 ml.setLeftTop(-1000, -1000);
rlm@46 7443 ml.hide();
rlm@46 7444
rlm@46 7445 if(fixedWidth){
rlm@46 7446 ml.setWidth(fixedWidth);
rlm@46 7447 }
rlm@46 7448
rlm@46 7449 var instance = {
rlm@46 7450
rlm@46 7451 getSize : function(text){
rlm@46 7452 ml.update(text);
rlm@46 7453 var s = ml.getSize();
rlm@46 7454 ml.update('');
rlm@46 7455 return s;
rlm@46 7456 },
rlm@46 7457
rlm@46 7458
rlm@46 7459 bind : function(el){
rlm@46 7460 ml.setStyle(
rlm@46 7461 Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
rlm@46 7462 );
rlm@46 7463 },
rlm@46 7464
rlm@46 7465
rlm@46 7466 setFixedWidth : function(width){
rlm@46 7467 ml.setWidth(width);
rlm@46 7468 },
rlm@46 7469
rlm@46 7470
rlm@46 7471 getWidth : function(text){
rlm@46 7472 ml.dom.style.width = 'auto';
rlm@46 7473 return this.getSize(text).width;
rlm@46 7474 },
rlm@46 7475
rlm@46 7476
rlm@46 7477 getHeight : function(text){
rlm@46 7478 return this.getSize(text).height;
rlm@46 7479 }
rlm@46 7480 };
rlm@46 7481
rlm@46 7482 instance.bind(bindTo);
rlm@46 7483
rlm@46 7484 return instance;
rlm@46 7485 };
rlm@46 7486
rlm@46 7487 Ext.Element.measureText = Ext.util.TextMetrics.measure;
rlm@46 7488
rlm@46 7489
rlm@46 7490 (function() {
rlm@46 7491
rlm@46 7492 var Event=Ext.EventManager;
rlm@46 7493 var Dom=Ext.lib.Dom;
rlm@46 7494
rlm@46 7495
rlm@46 7496 Ext.dd.DragDrop = function(id, sGroup, config) {
rlm@46 7497 if(id) {
rlm@46 7498 this.init(id, sGroup, config);
rlm@46 7499 }
rlm@46 7500 };
rlm@46 7501
rlm@46 7502 Ext.dd.DragDrop.prototype = {
rlm@46 7503
rlm@46 7504
rlm@46 7505 id: null,
rlm@46 7506
rlm@46 7507
rlm@46 7508 config: null,
rlm@46 7509
rlm@46 7510
rlm@46 7511 dragElId: null,
rlm@46 7512
rlm@46 7513
rlm@46 7514 handleElId: null,
rlm@46 7515
rlm@46 7516
rlm@46 7517 invalidHandleTypes: null,
rlm@46 7518
rlm@46 7519
rlm@46 7520 invalidHandleIds: null,
rlm@46 7521
rlm@46 7522
rlm@46 7523 invalidHandleClasses: null,
rlm@46 7524
rlm@46 7525
rlm@46 7526 startPageX: 0,
rlm@46 7527
rlm@46 7528
rlm@46 7529 startPageY: 0,
rlm@46 7530
rlm@46 7531
rlm@46 7532 groups: null,
rlm@46 7533
rlm@46 7534
rlm@46 7535 locked: false,
rlm@46 7536
rlm@46 7537
rlm@46 7538 lock: function() { this.locked = true; },
rlm@46 7539
rlm@46 7540
rlm@46 7541 unlock: function() { this.locked = false; },
rlm@46 7542
rlm@46 7543
rlm@46 7544 isTarget: true,
rlm@46 7545
rlm@46 7546
rlm@46 7547 padding: null,
rlm@46 7548
rlm@46 7549
rlm@46 7550 _domRef: null,
rlm@46 7551
rlm@46 7552
rlm@46 7553 __ygDragDrop: true,
rlm@46 7554
rlm@46 7555
rlm@46 7556 constrainX: false,
rlm@46 7557
rlm@46 7558
rlm@46 7559 constrainY: false,
rlm@46 7560
rlm@46 7561
rlm@46 7562 minX: 0,
rlm@46 7563
rlm@46 7564
rlm@46 7565 maxX: 0,
rlm@46 7566
rlm@46 7567
rlm@46 7568 minY: 0,
rlm@46 7569
rlm@46 7570
rlm@46 7571 maxY: 0,
rlm@46 7572
rlm@46 7573
rlm@46 7574 maintainOffset: false,
rlm@46 7575
rlm@46 7576
rlm@46 7577 xTicks: null,
rlm@46 7578
rlm@46 7579
rlm@46 7580 yTicks: null,
rlm@46 7581
rlm@46 7582
rlm@46 7583 primaryButtonOnly: true,
rlm@46 7584
rlm@46 7585
rlm@46 7586 available: false,
rlm@46 7587
rlm@46 7588
rlm@46 7589 hasOuterHandles: false,
rlm@46 7590
rlm@46 7591
rlm@46 7592 b4StartDrag: function(x, y) { },
rlm@46 7593
rlm@46 7594
rlm@46 7595 startDrag: function(x, y) { },
rlm@46 7596
rlm@46 7597
rlm@46 7598 b4Drag: function(e) { },
rlm@46 7599
rlm@46 7600
rlm@46 7601 onDrag: function(e) { },
rlm@46 7602
rlm@46 7603
rlm@46 7604 onDragEnter: function(e, id) { },
rlm@46 7605
rlm@46 7606
rlm@46 7607 b4DragOver: function(e) { },
rlm@46 7608
rlm@46 7609
rlm@46 7610 onDragOver: function(e, id) { },
rlm@46 7611
rlm@46 7612
rlm@46 7613 b4DragOut: function(e) { },
rlm@46 7614
rlm@46 7615
rlm@46 7616 onDragOut: function(e, id) { },
rlm@46 7617
rlm@46 7618
rlm@46 7619 b4DragDrop: function(e) { },
rlm@46 7620
rlm@46 7621
rlm@46 7622 onDragDrop: function(e, id) { },
rlm@46 7623
rlm@46 7624
rlm@46 7625 onInvalidDrop: function(e) { },
rlm@46 7626
rlm@46 7627
rlm@46 7628 b4EndDrag: function(e) { },
rlm@46 7629
rlm@46 7630
rlm@46 7631 endDrag: function(e) { },
rlm@46 7632
rlm@46 7633
rlm@46 7634 b4MouseDown: function(e) { },
rlm@46 7635
rlm@46 7636
rlm@46 7637 onMouseDown: function(e) { },
rlm@46 7638
rlm@46 7639
rlm@46 7640 onMouseUp: function(e) { },
rlm@46 7641
rlm@46 7642
rlm@46 7643 onAvailable: function () {
rlm@46 7644 },
rlm@46 7645
rlm@46 7646
rlm@46 7647 defaultPadding : {left:0, right:0, top:0, bottom:0},
rlm@46 7648
rlm@46 7649
rlm@46 7650 constrainTo : function(constrainTo, pad, inContent){
rlm@46 7651 if(typeof pad == "number"){
rlm@46 7652 pad = {left: pad, right:pad, top:pad, bottom:pad};
rlm@46 7653 }
rlm@46 7654 pad = pad || this.defaultPadding;
rlm@46 7655 var b = Ext.get(this.getEl()).getBox();
rlm@46 7656 var ce = Ext.get(constrainTo);
rlm@46 7657 var s = ce.getScroll();
rlm@46 7658 var c, cd = ce.dom;
rlm@46 7659 if(cd == document.body){
rlm@46 7660 c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
rlm@46 7661 }else{
rlm@46 7662 var xy = ce.getXY();
rlm@46 7663 c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight};
rlm@46 7664 }
rlm@46 7665
rlm@46 7666
rlm@46 7667 var topSpace = b.y - c.y;
rlm@46 7668 var leftSpace = b.x - c.x;
rlm@46 7669
rlm@46 7670 this.resetConstraints();
rlm@46 7671 this.setXConstraint(leftSpace - (pad.left||0),
rlm@46 7672 c.width - leftSpace - b.width - (pad.right||0),
rlm@46 7673 this.xTickSize
rlm@46 7674 );
rlm@46 7675 this.setYConstraint(topSpace - (pad.top||0),
rlm@46 7676 c.height - topSpace - b.height - (pad.bottom||0),
rlm@46 7677 this.yTickSize
rlm@46 7678 );
rlm@46 7679 },
rlm@46 7680
rlm@46 7681
rlm@46 7682 getEl: function() {
rlm@46 7683 if (!this._domRef) {
rlm@46 7684 this._domRef = Ext.getDom(this.id);
rlm@46 7685 }
rlm@46 7686
rlm@46 7687 return this._domRef;
rlm@46 7688 },
rlm@46 7689
rlm@46 7690
rlm@46 7691 getDragEl: function() {
rlm@46 7692 return Ext.getDom(this.dragElId);
rlm@46 7693 },
rlm@46 7694
rlm@46 7695
rlm@46 7696 init: function(id, sGroup, config) {
rlm@46 7697 this.initTarget(id, sGroup, config);
rlm@46 7698 Event.on(this.id, "mousedown", this.handleMouseDown, this);
rlm@46 7699
rlm@46 7700 },
rlm@46 7701
rlm@46 7702
rlm@46 7703 initTarget: function(id, sGroup, config) {
rlm@46 7704
rlm@46 7705
rlm@46 7706 this.config = config || {};
rlm@46 7707
rlm@46 7708
rlm@46 7709 this.DDM = Ext.dd.DDM;
rlm@46 7710
rlm@46 7711 this.groups = {};
rlm@46 7712
rlm@46 7713
rlm@46 7714
rlm@46 7715 if (typeof id !== "string") {
rlm@46 7716 id = Ext.id(id);
rlm@46 7717 }
rlm@46 7718
rlm@46 7719
rlm@46 7720 this.id = id;
rlm@46 7721
rlm@46 7722
rlm@46 7723 this.addToGroup((sGroup) ? sGroup : "default");
rlm@46 7724
rlm@46 7725
rlm@46 7726
rlm@46 7727 this.handleElId = id;
rlm@46 7728
rlm@46 7729
rlm@46 7730 this.setDragElId(id);
rlm@46 7731
rlm@46 7732
rlm@46 7733 this.invalidHandleTypes = { A: "A" };
rlm@46 7734 this.invalidHandleIds = {};
rlm@46 7735 this.invalidHandleClasses = [];
rlm@46 7736
rlm@46 7737 this.applyConfig();
rlm@46 7738
rlm@46 7739 this.handleOnAvailable();
rlm@46 7740 },
rlm@46 7741
rlm@46 7742
rlm@46 7743 applyConfig: function() {
rlm@46 7744
rlm@46 7745
rlm@46 7746
rlm@46 7747 this.padding = this.config.padding || [0, 0, 0, 0];
rlm@46 7748 this.isTarget = (this.config.isTarget !== false);
rlm@46 7749 this.maintainOffset = (this.config.maintainOffset);
rlm@46 7750 this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
rlm@46 7751
rlm@46 7752 },
rlm@46 7753
rlm@46 7754
rlm@46 7755 handleOnAvailable: function() {
rlm@46 7756 this.available = true;
rlm@46 7757 this.resetConstraints();
rlm@46 7758 this.onAvailable();
rlm@46 7759 },
rlm@46 7760
rlm@46 7761
rlm@46 7762 setPadding: function(iTop, iRight, iBot, iLeft) {
rlm@46 7763
rlm@46 7764 if (!iRight && 0 !== iRight) {
rlm@46 7765 this.padding = [iTop, iTop, iTop, iTop];
rlm@46 7766 } else if (!iBot && 0 !== iBot) {
rlm@46 7767 this.padding = [iTop, iRight, iTop, iRight];
rlm@46 7768 } else {
rlm@46 7769 this.padding = [iTop, iRight, iBot, iLeft];
rlm@46 7770 }
rlm@46 7771 },
rlm@46 7772
rlm@46 7773
rlm@46 7774 setInitPosition: function(diffX, diffY) {
rlm@46 7775 var el = this.getEl();
rlm@46 7776
rlm@46 7777 if (!this.DDM.verifyEl(el)) {
rlm@46 7778 return;
rlm@46 7779 }
rlm@46 7780
rlm@46 7781 var dx = diffX || 0;
rlm@46 7782 var dy = diffY || 0;
rlm@46 7783
rlm@46 7784 var p = Dom.getXY( el );
rlm@46 7785
rlm@46 7786 this.initPageX = p[0] - dx;
rlm@46 7787 this.initPageY = p[1] - dy;
rlm@46 7788
rlm@46 7789 this.lastPageX = p[0];
rlm@46 7790 this.lastPageY = p[1];
rlm@46 7791
rlm@46 7792
rlm@46 7793 this.setStartPosition(p);
rlm@46 7794 },
rlm@46 7795
rlm@46 7796
rlm@46 7797 setStartPosition: function(pos) {
rlm@46 7798 var p = pos || Dom.getXY( this.getEl() );
rlm@46 7799 this.deltaSetXY = null;
rlm@46 7800
rlm@46 7801 this.startPageX = p[0];
rlm@46 7802 this.startPageY = p[1];
rlm@46 7803 },
rlm@46 7804
rlm@46 7805
rlm@46 7806 addToGroup: function(sGroup) {
rlm@46 7807 this.groups[sGroup] = true;
rlm@46 7808 this.DDM.regDragDrop(this, sGroup);
rlm@46 7809 },
rlm@46 7810
rlm@46 7811
rlm@46 7812 removeFromGroup: function(sGroup) {
rlm@46 7813 if (this.groups[sGroup]) {
rlm@46 7814 delete this.groups[sGroup];
rlm@46 7815 }
rlm@46 7816
rlm@46 7817 this.DDM.removeDDFromGroup(this, sGroup);
rlm@46 7818 },
rlm@46 7819
rlm@46 7820
rlm@46 7821 setDragElId: function(id) {
rlm@46 7822 this.dragElId = id;
rlm@46 7823 },
rlm@46 7824
rlm@46 7825
rlm@46 7826 setHandleElId: function(id) {
rlm@46 7827 if (typeof id !== "string") {
rlm@46 7828 id = Ext.id(id);
rlm@46 7829 }
rlm@46 7830 this.handleElId = id;
rlm@46 7831 this.DDM.regHandle(this.id, id);
rlm@46 7832 },
rlm@46 7833
rlm@46 7834
rlm@46 7835 setOuterHandleElId: function(id) {
rlm@46 7836 if (typeof id !== "string") {
rlm@46 7837 id = Ext.id(id);
rlm@46 7838 }
rlm@46 7839 Event.on(id, "mousedown",
rlm@46 7840 this.handleMouseDown, this);
rlm@46 7841 this.setHandleElId(id);
rlm@46 7842
rlm@46 7843 this.hasOuterHandles = true;
rlm@46 7844 },
rlm@46 7845
rlm@46 7846
rlm@46 7847 unreg: function() {
rlm@46 7848 Event.un(this.id, "mousedown",
rlm@46 7849 this.handleMouseDown);
rlm@46 7850 this._domRef = null;
rlm@46 7851 this.DDM._remove(this);
rlm@46 7852 },
rlm@46 7853
rlm@46 7854 destroy : function(){
rlm@46 7855 this.unreg();
rlm@46 7856 },
rlm@46 7857
rlm@46 7858
rlm@46 7859 isLocked: function() {
rlm@46 7860 return (this.DDM.isLocked() || this.locked);
rlm@46 7861 },
rlm@46 7862
rlm@46 7863
rlm@46 7864 handleMouseDown: function(e, oDD){
rlm@46 7865 if (this.primaryButtonOnly && e.button != 0) {
rlm@46 7866 return;
rlm@46 7867 }
rlm@46 7868
rlm@46 7869 if (this.isLocked()) {
rlm@46 7870 return;
rlm@46 7871 }
rlm@46 7872
rlm@46 7873 this.DDM.refreshCache(this.groups);
rlm@46 7874
rlm@46 7875 var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));
rlm@46 7876 if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) ) {
rlm@46 7877 } else {
rlm@46 7878 if (this.clickValidator(e)) {
rlm@46 7879
rlm@46 7880
rlm@46 7881 this.setStartPosition();
rlm@46 7882
rlm@46 7883
rlm@46 7884 this.b4MouseDown(e);
rlm@46 7885 this.onMouseDown(e);
rlm@46 7886
rlm@46 7887 this.DDM.handleMouseDown(e, this);
rlm@46 7888
rlm@46 7889 this.DDM.stopEvent(e);
rlm@46 7890 } else {
rlm@46 7891
rlm@46 7892
rlm@46 7893 }
rlm@46 7894 }
rlm@46 7895 },
rlm@46 7896
rlm@46 7897 clickValidator: function(e) {
rlm@46 7898 var target = e.getTarget();
rlm@46 7899 return ( this.isValidHandleChild(target) &&
rlm@46 7900 (this.id == this.handleElId ||
rlm@46 7901 this.DDM.handleWasClicked(target, this.id)) );
rlm@46 7902 },
rlm@46 7903
rlm@46 7904
rlm@46 7905 addInvalidHandleType: function(tagName) {
rlm@46 7906 var type = tagName.toUpperCase();
rlm@46 7907 this.invalidHandleTypes[type] = type;
rlm@46 7908 },
rlm@46 7909
rlm@46 7910
rlm@46 7911 addInvalidHandleId: function(id) {
rlm@46 7912 if (typeof id !== "string") {
rlm@46 7913 id = Ext.id(id);
rlm@46 7914 }
rlm@46 7915 this.invalidHandleIds[id] = id;
rlm@46 7916 },
rlm@46 7917
rlm@46 7918
rlm@46 7919 addInvalidHandleClass: function(cssClass) {
rlm@46 7920 this.invalidHandleClasses.push(cssClass);
rlm@46 7921 },
rlm@46 7922
rlm@46 7923
rlm@46 7924 removeInvalidHandleType: function(tagName) {
rlm@46 7925 var type = tagName.toUpperCase();
rlm@46 7926
rlm@46 7927 delete this.invalidHandleTypes[type];
rlm@46 7928 },
rlm@46 7929
rlm@46 7930
rlm@46 7931 removeInvalidHandleId: function(id) {
rlm@46 7932 if (typeof id !== "string") {
rlm@46 7933 id = Ext.id(id);
rlm@46 7934 }
rlm@46 7935 delete this.invalidHandleIds[id];
rlm@46 7936 },
rlm@46 7937
rlm@46 7938
rlm@46 7939 removeInvalidHandleClass: function(cssClass) {
rlm@46 7940 for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
rlm@46 7941 if (this.invalidHandleClasses[i] == cssClass) {
rlm@46 7942 delete this.invalidHandleClasses[i];
rlm@46 7943 }
rlm@46 7944 }
rlm@46 7945 },
rlm@46 7946
rlm@46 7947
rlm@46 7948 isValidHandleChild: function(node) {
rlm@46 7949
rlm@46 7950 var valid = true;
rlm@46 7951
rlm@46 7952 var nodeName;
rlm@46 7953 try {
rlm@46 7954 nodeName = node.nodeName.toUpperCase();
rlm@46 7955 } catch(e) {
rlm@46 7956 nodeName = node.nodeName;
rlm@46 7957 }
rlm@46 7958 valid = valid && !this.invalidHandleTypes[nodeName];
rlm@46 7959 valid = valid && !this.invalidHandleIds[node.id];
rlm@46 7960
rlm@46 7961 for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
rlm@46 7962 valid = !Dom.hasClass(node, this.invalidHandleClasses[i]);
rlm@46 7963 }
rlm@46 7964
rlm@46 7965
rlm@46 7966 return valid;
rlm@46 7967
rlm@46 7968 },
rlm@46 7969
rlm@46 7970
rlm@46 7971 setXTicks: function(iStartX, iTickSize) {
rlm@46 7972 this.xTicks = [];
rlm@46 7973 this.xTickSize = iTickSize;
rlm@46 7974
rlm@46 7975 var tickMap = {};
rlm@46 7976
rlm@46 7977 for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
rlm@46 7978 if (!tickMap[i]) {
rlm@46 7979 this.xTicks[this.xTicks.length] = i;
rlm@46 7980 tickMap[i] = true;
rlm@46 7981 }
rlm@46 7982 }
rlm@46 7983
rlm@46 7984 for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
rlm@46 7985 if (!tickMap[i]) {
rlm@46 7986 this.xTicks[this.xTicks.length] = i;
rlm@46 7987 tickMap[i] = true;
rlm@46 7988 }
rlm@46 7989 }
rlm@46 7990
rlm@46 7991 this.xTicks.sort(this.DDM.numericSort) ;
rlm@46 7992 },
rlm@46 7993
rlm@46 7994
rlm@46 7995 setYTicks: function(iStartY, iTickSize) {
rlm@46 7996 this.yTicks = [];
rlm@46 7997 this.yTickSize = iTickSize;
rlm@46 7998
rlm@46 7999 var tickMap = {};
rlm@46 8000
rlm@46 8001 for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
rlm@46 8002 if (!tickMap[i]) {
rlm@46 8003 this.yTicks[this.yTicks.length] = i;
rlm@46 8004 tickMap[i] = true;
rlm@46 8005 }
rlm@46 8006 }
rlm@46 8007
rlm@46 8008 for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
rlm@46 8009 if (!tickMap[i]) {
rlm@46 8010 this.yTicks[this.yTicks.length] = i;
rlm@46 8011 tickMap[i] = true;
rlm@46 8012 }
rlm@46 8013 }
rlm@46 8014
rlm@46 8015 this.yTicks.sort(this.DDM.numericSort) ;
rlm@46 8016 },
rlm@46 8017
rlm@46 8018
rlm@46 8019 setXConstraint: function(iLeft, iRight, iTickSize) {
rlm@46 8020 this.leftConstraint = iLeft;
rlm@46 8021 this.rightConstraint = iRight;
rlm@46 8022
rlm@46 8023 this.minX = this.initPageX - iLeft;
rlm@46 8024 this.maxX = this.initPageX + iRight;
rlm@46 8025 if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
rlm@46 8026
rlm@46 8027 this.constrainX = true;
rlm@46 8028 },
rlm@46 8029
rlm@46 8030
rlm@46 8031 clearConstraints: function() {
rlm@46 8032 this.constrainX = false;
rlm@46 8033 this.constrainY = false;
rlm@46 8034 this.clearTicks();
rlm@46 8035 },
rlm@46 8036
rlm@46 8037
rlm@46 8038 clearTicks: function() {
rlm@46 8039 this.xTicks = null;
rlm@46 8040 this.yTicks = null;
rlm@46 8041 this.xTickSize = 0;
rlm@46 8042 this.yTickSize = 0;
rlm@46 8043 },
rlm@46 8044
rlm@46 8045
rlm@46 8046 setYConstraint: function(iUp, iDown, iTickSize) {
rlm@46 8047 this.topConstraint = iUp;
rlm@46 8048 this.bottomConstraint = iDown;
rlm@46 8049
rlm@46 8050 this.minY = this.initPageY - iUp;
rlm@46 8051 this.maxY = this.initPageY + iDown;
rlm@46 8052 if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
rlm@46 8053
rlm@46 8054 this.constrainY = true;
rlm@46 8055
rlm@46 8056 },
rlm@46 8057
rlm@46 8058
rlm@46 8059 resetConstraints: function() {
rlm@46 8060
rlm@46 8061
rlm@46 8062
rlm@46 8063 if (this.initPageX || this.initPageX === 0) {
rlm@46 8064
rlm@46 8065 var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
rlm@46 8066 var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
rlm@46 8067
rlm@46 8068 this.setInitPosition(dx, dy);
rlm@46 8069
rlm@46 8070
rlm@46 8071 } else {
rlm@46 8072 this.setInitPosition();
rlm@46 8073 }
rlm@46 8074
rlm@46 8075 if (this.constrainX) {
rlm@46 8076 this.setXConstraint( this.leftConstraint,
rlm@46 8077 this.rightConstraint,
rlm@46 8078 this.xTickSize );
rlm@46 8079 }
rlm@46 8080
rlm@46 8081 if (this.constrainY) {
rlm@46 8082 this.setYConstraint( this.topConstraint,
rlm@46 8083 this.bottomConstraint,
rlm@46 8084 this.yTickSize );
rlm@46 8085 }
rlm@46 8086 },
rlm@46 8087
rlm@46 8088
rlm@46 8089 getTick: function(val, tickArray) {
rlm@46 8090
rlm@46 8091 if (!tickArray) {
rlm@46 8092
rlm@46 8093
rlm@46 8094 return val;
rlm@46 8095 } else if (tickArray[0] >= val) {
rlm@46 8096
rlm@46 8097
rlm@46 8098 return tickArray[0];
rlm@46 8099 } else {
rlm@46 8100 for (var i=0, len=tickArray.length; i<len; ++i) {
rlm@46 8101 var next = i + 1;
rlm@46 8102 if (tickArray[next] && tickArray[next] >= val) {
rlm@46 8103 var diff1 = val - tickArray[i];
rlm@46 8104 var diff2 = tickArray[next] - val;
rlm@46 8105 return (diff2 > diff1) ? tickArray[i] : tickArray[next];
rlm@46 8106 }
rlm@46 8107 }
rlm@46 8108
rlm@46 8109
rlm@46 8110
rlm@46 8111 return tickArray[tickArray.length - 1];
rlm@46 8112 }
rlm@46 8113 },
rlm@46 8114
rlm@46 8115
rlm@46 8116 toString: function() {
rlm@46 8117 return ("DragDrop " + this.id);
rlm@46 8118 }
rlm@46 8119
rlm@46 8120 };
rlm@46 8121
rlm@46 8122 })();
rlm@46 8123
rlm@46 8124
rlm@46 8125
rlm@46 8126
rlm@46 8127 if (!Ext.dd.DragDropMgr) {
rlm@46 8128
rlm@46 8129
rlm@46 8130 Ext.dd.DragDropMgr = function() {
rlm@46 8131
rlm@46 8132 var Event = Ext.EventManager;
rlm@46 8133
rlm@46 8134 return {
rlm@46 8135
rlm@46 8136
rlm@46 8137 ids: {},
rlm@46 8138
rlm@46 8139
rlm@46 8140 handleIds: {},
rlm@46 8141
rlm@46 8142
rlm@46 8143 dragCurrent: null,
rlm@46 8144
rlm@46 8145
rlm@46 8146 dragOvers: {},
rlm@46 8147
rlm@46 8148
rlm@46 8149 deltaX: 0,
rlm@46 8150
rlm@46 8151
rlm@46 8152 deltaY: 0,
rlm@46 8153
rlm@46 8154
rlm@46 8155 preventDefault: true,
rlm@46 8156
rlm@46 8157
rlm@46 8158 stopPropagation: true,
rlm@46 8159
rlm@46 8160
rlm@46 8161 initialized: false,
rlm@46 8162
rlm@46 8163
rlm@46 8164 locked: false,
rlm@46 8165
rlm@46 8166
rlm@46 8167 init: function() {
rlm@46 8168 this.initialized = true;
rlm@46 8169 },
rlm@46 8170
rlm@46 8171
rlm@46 8172 POINT: 0,
rlm@46 8173
rlm@46 8174
rlm@46 8175 INTERSECT: 1,
rlm@46 8176
rlm@46 8177
rlm@46 8178 mode: 0,
rlm@46 8179
rlm@46 8180
rlm@46 8181 _execOnAll: function(sMethod, args) {
rlm@46 8182 for (var i in this.ids) {
rlm@46 8183 for (var j in this.ids[i]) {
rlm@46 8184 var oDD = this.ids[i][j];
rlm@46 8185 if (! this.isTypeOfDD(oDD)) {
rlm@46 8186 continue;
rlm@46 8187 }
rlm@46 8188 oDD[sMethod].apply(oDD, args);
rlm@46 8189 }
rlm@46 8190 }
rlm@46 8191 },
rlm@46 8192
rlm@46 8193
rlm@46 8194 _onLoad: function() {
rlm@46 8195
rlm@46 8196 this.init();
rlm@46 8197
rlm@46 8198
rlm@46 8199 Event.on(document, "mouseup", this.handleMouseUp, this, true);
rlm@46 8200 Event.on(document, "mousemove", this.handleMouseMove, this, true);
rlm@46 8201 Event.on(window, "unload", this._onUnload, this, true);
rlm@46 8202 Event.on(window, "resize", this._onResize, this, true);
rlm@46 8203
rlm@46 8204
rlm@46 8205 },
rlm@46 8206
rlm@46 8207
rlm@46 8208 _onResize: function(e) {
rlm@46 8209 this._execOnAll("resetConstraints", []);
rlm@46 8210 },
rlm@46 8211
rlm@46 8212
rlm@46 8213 lock: function() { this.locked = true; },
rlm@46 8214
rlm@46 8215
rlm@46 8216 unlock: function() { this.locked = false; },
rlm@46 8217
rlm@46 8218
rlm@46 8219 isLocked: function() { return this.locked; },
rlm@46 8220
rlm@46 8221
rlm@46 8222 locationCache: {},
rlm@46 8223
rlm@46 8224
rlm@46 8225 useCache: true,
rlm@46 8226
rlm@46 8227
rlm@46 8228 clickPixelThresh: 3,
rlm@46 8229
rlm@46 8230
rlm@46 8231 clickTimeThresh: 350,
rlm@46 8232
rlm@46 8233
rlm@46 8234 dragThreshMet: false,
rlm@46 8235
rlm@46 8236
rlm@46 8237 clickTimeout: null,
rlm@46 8238
rlm@46 8239
rlm@46 8240 startX: 0,
rlm@46 8241
rlm@46 8242
rlm@46 8243 startY: 0,
rlm@46 8244
rlm@46 8245
rlm@46 8246 regDragDrop: function(oDD, sGroup) {
rlm@46 8247 if (!this.initialized) { this.init(); }
rlm@46 8248
rlm@46 8249 if (!this.ids[sGroup]) {
rlm@46 8250 this.ids[sGroup] = {};
rlm@46 8251 }
rlm@46 8252 this.ids[sGroup][oDD.id] = oDD;
rlm@46 8253 },
rlm@46 8254
rlm@46 8255
rlm@46 8256 removeDDFromGroup: function(oDD, sGroup) {
rlm@46 8257 if (!this.ids[sGroup]) {
rlm@46 8258 this.ids[sGroup] = {};
rlm@46 8259 }
rlm@46 8260
rlm@46 8261 var obj = this.ids[sGroup];
rlm@46 8262 if (obj && obj[oDD.id]) {
rlm@46 8263 delete obj[oDD.id];
rlm@46 8264 }
rlm@46 8265 },
rlm@46 8266
rlm@46 8267
rlm@46 8268 _remove: function(oDD) {
rlm@46 8269 for (var g in oDD.groups) {
rlm@46 8270 if (g && this.ids[g][oDD.id]) {
rlm@46 8271 delete this.ids[g][oDD.id];
rlm@46 8272 }
rlm@46 8273 }
rlm@46 8274 delete this.handleIds[oDD.id];
rlm@46 8275 },
rlm@46 8276
rlm@46 8277
rlm@46 8278 regHandle: function(sDDId, sHandleId) {
rlm@46 8279 if (!this.handleIds[sDDId]) {
rlm@46 8280 this.handleIds[sDDId] = {};
rlm@46 8281 }
rlm@46 8282 this.handleIds[sDDId][sHandleId] = sHandleId;
rlm@46 8283 },
rlm@46 8284
rlm@46 8285
rlm@46 8286 isDragDrop: function(id) {
rlm@46 8287 return ( this.getDDById(id) ) ? true : false;
rlm@46 8288 },
rlm@46 8289
rlm@46 8290
rlm@46 8291 getRelated: function(p_oDD, bTargetsOnly) {
rlm@46 8292 var oDDs = [];
rlm@46 8293 for (var i in p_oDD.groups) {
rlm@46 8294 for (j in this.ids[i]) {
rlm@46 8295 var dd = this.ids[i][j];
rlm@46 8296 if (! this.isTypeOfDD(dd)) {
rlm@46 8297 continue;
rlm@46 8298 }
rlm@46 8299 if (!bTargetsOnly || dd.isTarget) {
rlm@46 8300 oDDs[oDDs.length] = dd;
rlm@46 8301 }
rlm@46 8302 }
rlm@46 8303 }
rlm@46 8304
rlm@46 8305 return oDDs;
rlm@46 8306 },
rlm@46 8307
rlm@46 8308
rlm@46 8309 isLegalTarget: function (oDD, oTargetDD) {
rlm@46 8310 var targets = this.getRelated(oDD, true);
rlm@46 8311 for (var i=0, len=targets.length;i<len;++i) {
rlm@46 8312 if (targets[i].id == oTargetDD.id) {
rlm@46 8313 return true;
rlm@46 8314 }
rlm@46 8315 }
rlm@46 8316
rlm@46 8317 return false;
rlm@46 8318 },
rlm@46 8319
rlm@46 8320
rlm@46 8321 isTypeOfDD: function (oDD) {
rlm@46 8322 return (oDD && oDD.__ygDragDrop);
rlm@46 8323 },
rlm@46 8324
rlm@46 8325
rlm@46 8326 isHandle: function(sDDId, sHandleId) {
rlm@46 8327 return ( this.handleIds[sDDId] &&
rlm@46 8328 this.handleIds[sDDId][sHandleId] );
rlm@46 8329 },
rlm@46 8330
rlm@46 8331
rlm@46 8332 getDDById: function(id) {
rlm@46 8333 for (var i in this.ids) {
rlm@46 8334 if (this.ids[i][id]) {
rlm@46 8335 return this.ids[i][id];
rlm@46 8336 }
rlm@46 8337 }
rlm@46 8338 return null;
rlm@46 8339 },
rlm@46 8340
rlm@46 8341
rlm@46 8342 handleMouseDown: function(e, oDD) {
rlm@46 8343 if(Ext.QuickTips){
rlm@46 8344 Ext.QuickTips.disable();
rlm@46 8345 }
rlm@46 8346 this.currentTarget = e.getTarget();
rlm@46 8347
rlm@46 8348 this.dragCurrent = oDD;
rlm@46 8349
rlm@46 8350 var el = oDD.getEl();
rlm@46 8351
rlm@46 8352
rlm@46 8353 this.startX = e.getPageX();
rlm@46 8354 this.startY = e.getPageY();
rlm@46 8355
rlm@46 8356 this.deltaX = this.startX - el.offsetLeft;
rlm@46 8357 this.deltaY = this.startY - el.offsetTop;
rlm@46 8358
rlm@46 8359 this.dragThreshMet = false;
rlm@46 8360
rlm@46 8361 this.clickTimeout = setTimeout(
rlm@46 8362 function() {
rlm@46 8363 var DDM = Ext.dd.DDM;
rlm@46 8364 DDM.startDrag(DDM.startX, DDM.startY);
rlm@46 8365 },
rlm@46 8366 this.clickTimeThresh );
rlm@46 8367 },
rlm@46 8368
rlm@46 8369
rlm@46 8370 startDrag: function(x, y) {
rlm@46 8371 clearTimeout(this.clickTimeout);
rlm@46 8372 if (this.dragCurrent) {
rlm@46 8373 this.dragCurrent.b4StartDrag(x, y);
rlm@46 8374 this.dragCurrent.startDrag(x, y);
rlm@46 8375 }
rlm@46 8376 this.dragThreshMet = true;
rlm@46 8377 },
rlm@46 8378
rlm@46 8379
rlm@46 8380 handleMouseUp: function(e) {
rlm@46 8381
rlm@46 8382 if(Ext.QuickTips){
rlm@46 8383 Ext.QuickTips.enable();
rlm@46 8384 }
rlm@46 8385 if (! this.dragCurrent) {
rlm@46 8386 return;
rlm@46 8387 }
rlm@46 8388
rlm@46 8389 clearTimeout(this.clickTimeout);
rlm@46 8390
rlm@46 8391 if (this.dragThreshMet) {
rlm@46 8392 this.fireEvents(e, true);
rlm@46 8393 } else {
rlm@46 8394 }
rlm@46 8395
rlm@46 8396 this.stopDrag(e);
rlm@46 8397
rlm@46 8398 this.stopEvent(e);
rlm@46 8399 },
rlm@46 8400
rlm@46 8401
rlm@46 8402 stopEvent: function(e){
rlm@46 8403 if(this.stopPropagation) {
rlm@46 8404 e.stopPropagation();
rlm@46 8405 }
rlm@46 8406
rlm@46 8407 if (this.preventDefault) {
rlm@46 8408 e.preventDefault();
rlm@46 8409 }
rlm@46 8410 },
rlm@46 8411
rlm@46 8412
rlm@46 8413 stopDrag: function(e) {
rlm@46 8414
rlm@46 8415 if (this.dragCurrent) {
rlm@46 8416 if (this.dragThreshMet) {
rlm@46 8417 this.dragCurrent.b4EndDrag(e);
rlm@46 8418 this.dragCurrent.endDrag(e);
rlm@46 8419 }
rlm@46 8420
rlm@46 8421 this.dragCurrent.onMouseUp(e);
rlm@46 8422 }
rlm@46 8423
rlm@46 8424 this.dragCurrent = null;
rlm@46 8425 this.dragOvers = {};
rlm@46 8426 },
rlm@46 8427
rlm@46 8428
rlm@46 8429 handleMouseMove: function(e) {
rlm@46 8430 if (! this.dragCurrent) {
rlm@46 8431 return true;
rlm@46 8432 }
rlm@46 8433
rlm@46 8434
rlm@46 8435
rlm@46 8436
rlm@46 8437 if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
rlm@46 8438 this.stopEvent(e);
rlm@46 8439 return this.handleMouseUp(e);
rlm@46 8440 }
rlm@46 8441
rlm@46 8442 if (!this.dragThreshMet) {
rlm@46 8443 var diffX = Math.abs(this.startX - e.getPageX());
rlm@46 8444 var diffY = Math.abs(this.startY - e.getPageY());
rlm@46 8445 if (diffX > this.clickPixelThresh ||
rlm@46 8446 diffY > this.clickPixelThresh) {
rlm@46 8447 this.startDrag(this.startX, this.startY);
rlm@46 8448 }
rlm@46 8449 }
rlm@46 8450
rlm@46 8451 if (this.dragThreshMet) {
rlm@46 8452 this.dragCurrent.b4Drag(e);
rlm@46 8453 this.dragCurrent.onDrag(e);
rlm@46 8454 if(!this.dragCurrent.moveOnly){
rlm@46 8455 this.fireEvents(e, false);
rlm@46 8456 }
rlm@46 8457 }
rlm@46 8458
rlm@46 8459 this.stopEvent(e);
rlm@46 8460
rlm@46 8461 return true;
rlm@46 8462 },
rlm@46 8463
rlm@46 8464
rlm@46 8465 fireEvents: function(e, isDrop) {
rlm@46 8466 var dc = this.dragCurrent;
rlm@46 8467
rlm@46 8468
rlm@46 8469
rlm@46 8470 if (!dc || dc.isLocked()) {
rlm@46 8471 return;
rlm@46 8472 }
rlm@46 8473
rlm@46 8474 var pt = e.getPoint();
rlm@46 8475
rlm@46 8476
rlm@46 8477 var oldOvers = [];
rlm@46 8478
rlm@46 8479 var outEvts = [];
rlm@46 8480 var overEvts = [];
rlm@46 8481 var dropEvts = [];
rlm@46 8482 var enterEvts = [];
rlm@46 8483
rlm@46 8484
rlm@46 8485
rlm@46 8486 for (var i in this.dragOvers) {
rlm@46 8487
rlm@46 8488 var ddo = this.dragOvers[i];
rlm@46 8489
rlm@46 8490 if (! this.isTypeOfDD(ddo)) {
rlm@46 8491 continue;
rlm@46 8492 }
rlm@46 8493
rlm@46 8494 if (! this.isOverTarget(pt, ddo, this.mode)) {
rlm@46 8495 outEvts.push( ddo );
rlm@46 8496 }
rlm@46 8497
rlm@46 8498 oldOvers[i] = true;
rlm@46 8499 delete this.dragOvers[i];
rlm@46 8500 }
rlm@46 8501
rlm@46 8502 for (var sGroup in dc.groups) {
rlm@46 8503
rlm@46 8504 if ("string" != typeof sGroup) {
rlm@46 8505 continue;
rlm@46 8506 }
rlm@46 8507
rlm@46 8508 for (i in this.ids[sGroup]) {
rlm@46 8509 var oDD = this.ids[sGroup][i];
rlm@46 8510 if (! this.isTypeOfDD(oDD)) {
rlm@46 8511 continue;
rlm@46 8512 }
rlm@46 8513
rlm@46 8514 if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {
rlm@46 8515 if (this.isOverTarget(pt, oDD, this.mode)) {
rlm@46 8516
rlm@46 8517 if (isDrop) {
rlm@46 8518 dropEvts.push( oDD );
rlm@46 8519
rlm@46 8520 } else {
rlm@46 8521
rlm@46 8522
rlm@46 8523 if (!oldOvers[oDD.id]) {
rlm@46 8524 enterEvts.push( oDD );
rlm@46 8525
rlm@46 8526 } else {
rlm@46 8527 overEvts.push( oDD );
rlm@46 8528 }
rlm@46 8529
rlm@46 8530 this.dragOvers[oDD.id] = oDD;
rlm@46 8531 }
rlm@46 8532 }
rlm@46 8533 }
rlm@46 8534 }
rlm@46 8535 }
rlm@46 8536
rlm@46 8537 if (this.mode) {
rlm@46 8538 if (outEvts.length) {
rlm@46 8539 dc.b4DragOut(e, outEvts);
rlm@46 8540 dc.onDragOut(e, outEvts);
rlm@46 8541 }
rlm@46 8542
rlm@46 8543 if (enterEvts.length) {
rlm@46 8544 dc.onDragEnter(e, enterEvts);
rlm@46 8545 }
rlm@46 8546
rlm@46 8547 if (overEvts.length) {
rlm@46 8548 dc.b4DragOver(e, overEvts);
rlm@46 8549 dc.onDragOver(e, overEvts);
rlm@46 8550 }
rlm@46 8551
rlm@46 8552 if (dropEvts.length) {
rlm@46 8553 dc.b4DragDrop(e, dropEvts);
rlm@46 8554 dc.onDragDrop(e, dropEvts);
rlm@46 8555 }
rlm@46 8556
rlm@46 8557 } else {
rlm@46 8558
rlm@46 8559 var len = 0;
rlm@46 8560 for (i=0, len=outEvts.length; i<len; ++i) {
rlm@46 8561 dc.b4DragOut(e, outEvts[i].id);
rlm@46 8562 dc.onDragOut(e, outEvts[i].id);
rlm@46 8563 }
rlm@46 8564
rlm@46 8565
rlm@46 8566 for (i=0,len=enterEvts.length; i<len; ++i) {
rlm@46 8567
rlm@46 8568 dc.onDragEnter(e, enterEvts[i].id);
rlm@46 8569 }
rlm@46 8570
rlm@46 8571
rlm@46 8572 for (i=0,len=overEvts.length; i<len; ++i) {
rlm@46 8573 dc.b4DragOver(e, overEvts[i].id);
rlm@46 8574 dc.onDragOver(e, overEvts[i].id);
rlm@46 8575 }
rlm@46 8576
rlm@46 8577
rlm@46 8578 for (i=0, len=dropEvts.length; i<len; ++i) {
rlm@46 8579 dc.b4DragDrop(e, dropEvts[i].id);
rlm@46 8580 dc.onDragDrop(e, dropEvts[i].id);
rlm@46 8581 }
rlm@46 8582
rlm@46 8583 }
rlm@46 8584
rlm@46 8585
rlm@46 8586 if (isDrop && !dropEvts.length) {
rlm@46 8587 dc.onInvalidDrop(e);
rlm@46 8588 }
rlm@46 8589
rlm@46 8590 },
rlm@46 8591
rlm@46 8592
rlm@46 8593 getBestMatch: function(dds) {
rlm@46 8594 var winner = null;
rlm@46 8595
rlm@46 8596
rlm@46 8597
rlm@46 8598
rlm@46 8599
rlm@46 8600
rlm@46 8601 var len = dds.length;
rlm@46 8602
rlm@46 8603 if (len == 1) {
rlm@46 8604 winner = dds[0];
rlm@46 8605 } else {
rlm@46 8606
rlm@46 8607 for (var i=0; i<len; ++i) {
rlm@46 8608 var dd = dds[i];
rlm@46 8609
rlm@46 8610
rlm@46 8611
rlm@46 8612 if (dd.cursorIsOver) {
rlm@46 8613 winner = dd;
rlm@46 8614 break;
rlm@46 8615
rlm@46 8616 } else {
rlm@46 8617 if (!winner ||
rlm@46 8618 winner.overlap.getArea() < dd.overlap.getArea()) {
rlm@46 8619 winner = dd;
rlm@46 8620 }
rlm@46 8621 }
rlm@46 8622 }
rlm@46 8623 }
rlm@46 8624
rlm@46 8625 return winner;
rlm@46 8626 },
rlm@46 8627
rlm@46 8628
rlm@46 8629 refreshCache: function(groups) {
rlm@46 8630 for (var sGroup in groups) {
rlm@46 8631 if ("string" != typeof sGroup) {
rlm@46 8632 continue;
rlm@46 8633 }
rlm@46 8634 for (var i in this.ids[sGroup]) {
rlm@46 8635 var oDD = this.ids[sGroup][i];
rlm@46 8636
rlm@46 8637 if (this.isTypeOfDD(oDD)) {
rlm@46 8638
rlm@46 8639 var loc = this.getLocation(oDD);
rlm@46 8640 if (loc) {
rlm@46 8641 this.locationCache[oDD.id] = loc;
rlm@46 8642 } else {
rlm@46 8643 delete this.locationCache[oDD.id];
rlm@46 8644
rlm@46 8645
rlm@46 8646
rlm@46 8647 }
rlm@46 8648 }
rlm@46 8649 }
rlm@46 8650 }
rlm@46 8651 },
rlm@46 8652
rlm@46 8653
rlm@46 8654 verifyEl: function(el) {
rlm@46 8655 if (el) {
rlm@46 8656 var parent;
rlm@46 8657 if(Ext.isIE){
rlm@46 8658 try{
rlm@46 8659 parent = el.offsetParent;
rlm@46 8660 }catch(e){}
rlm@46 8661 }else{
rlm@46 8662 parent = el.offsetParent;
rlm@46 8663 }
rlm@46 8664 if (parent) {
rlm@46 8665 return true;
rlm@46 8666 }
rlm@46 8667 }
rlm@46 8668
rlm@46 8669 return false;
rlm@46 8670 },
rlm@46 8671
rlm@46 8672
rlm@46 8673 getLocation: function(oDD) {
rlm@46 8674 if (! this.isTypeOfDD(oDD)) {
rlm@46 8675 return null;
rlm@46 8676 }
rlm@46 8677
rlm@46 8678 var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
rlm@46 8679
rlm@46 8680 try {
rlm@46 8681 pos= Ext.lib.Dom.getXY(el);
rlm@46 8682 } catch (e) { }
rlm@46 8683
rlm@46 8684 if (!pos) {
rlm@46 8685 return null;
rlm@46 8686 }
rlm@46 8687
rlm@46 8688 x1 = pos[0];
rlm@46 8689 x2 = x1 + el.offsetWidth;
rlm@46 8690 y1 = pos[1];
rlm@46 8691 y2 = y1 + el.offsetHeight;
rlm@46 8692
rlm@46 8693 t = y1 - oDD.padding[0];
rlm@46 8694 r = x2 + oDD.padding[1];
rlm@46 8695 b = y2 + oDD.padding[2];
rlm@46 8696 l = x1 - oDD.padding[3];
rlm@46 8697
rlm@46 8698 return new Ext.lib.Region( t, r, b, l );
rlm@46 8699 },
rlm@46 8700
rlm@46 8701
rlm@46 8702 isOverTarget: function(pt, oTarget, intersect) {
rlm@46 8703
rlm@46 8704 var loc = this.locationCache[oTarget.id];
rlm@46 8705 if (!loc || !this.useCache) {
rlm@46 8706 loc = this.getLocation(oTarget);
rlm@46 8707 this.locationCache[oTarget.id] = loc;
rlm@46 8708
rlm@46 8709 }
rlm@46 8710
rlm@46 8711 if (!loc) {
rlm@46 8712 return false;
rlm@46 8713 }
rlm@46 8714
rlm@46 8715 oTarget.cursorIsOver = loc.contains( pt );
rlm@46 8716
rlm@46 8717
rlm@46 8718
rlm@46 8719
rlm@46 8720
rlm@46 8721
rlm@46 8722 var dc = this.dragCurrent;
rlm@46 8723 if (!dc || !dc.getTargetCoord ||
rlm@46 8724 (!intersect && !dc.constrainX && !dc.constrainY)) {
rlm@46 8725 return oTarget.cursorIsOver;
rlm@46 8726 }
rlm@46 8727
rlm@46 8728 oTarget.overlap = null;
rlm@46 8729
rlm@46 8730
rlm@46 8731
rlm@46 8732
rlm@46 8733
rlm@46 8734 var pos = dc.getTargetCoord(pt.x, pt.y);
rlm@46 8735
rlm@46 8736 var el = dc.getDragEl();
rlm@46 8737 var curRegion = new Ext.lib.Region( pos.y,
rlm@46 8738 pos.x + el.offsetWidth,
rlm@46 8739 pos.y + el.offsetHeight,
rlm@46 8740 pos.x );
rlm@46 8741
rlm@46 8742 var overlap = curRegion.intersect(loc);
rlm@46 8743
rlm@46 8744 if (overlap) {
rlm@46 8745 oTarget.overlap = overlap;
rlm@46 8746 return (intersect) ? true : oTarget.cursorIsOver;
rlm@46 8747 } else {
rlm@46 8748 return false;
rlm@46 8749 }
rlm@46 8750 },
rlm@46 8751
rlm@46 8752
rlm@46 8753 _onUnload: function(e, me) {
rlm@46 8754 Ext.dd.DragDropMgr.unregAll();
rlm@46 8755 },
rlm@46 8756
rlm@46 8757
rlm@46 8758 unregAll: function() {
rlm@46 8759
rlm@46 8760 if (this.dragCurrent) {
rlm@46 8761 this.stopDrag();
rlm@46 8762 this.dragCurrent = null;
rlm@46 8763 }
rlm@46 8764
rlm@46 8765 this._execOnAll("unreg", []);
rlm@46 8766
rlm@46 8767 for (var i in this.elementCache) {
rlm@46 8768 delete this.elementCache[i];
rlm@46 8769 }
rlm@46 8770
rlm@46 8771 this.elementCache = {};
rlm@46 8772 this.ids = {};
rlm@46 8773 },
rlm@46 8774
rlm@46 8775
rlm@46 8776 elementCache: {},
rlm@46 8777
rlm@46 8778
rlm@46 8779 getElWrapper: function(id) {
rlm@46 8780 var oWrapper = this.elementCache[id];
rlm@46 8781 if (!oWrapper || !oWrapper.el) {
rlm@46 8782 oWrapper = this.elementCache[id] =
rlm@46 8783 new this.ElementWrapper(Ext.getDom(id));
rlm@46 8784 }
rlm@46 8785 return oWrapper;
rlm@46 8786 },
rlm@46 8787
rlm@46 8788
rlm@46 8789 getElement: function(id) {
rlm@46 8790 return Ext.getDom(id);
rlm@46 8791 },
rlm@46 8792
rlm@46 8793
rlm@46 8794 getCss: function(id) {
rlm@46 8795 var el = Ext.getDom(id);
rlm@46 8796 return (el) ? el.style : null;
rlm@46 8797 },
rlm@46 8798
rlm@46 8799
rlm@46 8800 ElementWrapper: function(el) {
rlm@46 8801
rlm@46 8802 this.el = el || null;
rlm@46 8803
rlm@46 8804 this.id = this.el && el.id;
rlm@46 8805
rlm@46 8806 this.css = this.el && el.style;
rlm@46 8807 },
rlm@46 8808
rlm@46 8809
rlm@46 8810 getPosX: function(el) {
rlm@46 8811 return Ext.lib.Dom.getX(el);
rlm@46 8812 },
rlm@46 8813
rlm@46 8814
rlm@46 8815 getPosY: function(el) {
rlm@46 8816 return Ext.lib.Dom.getY(el);
rlm@46 8817 },
rlm@46 8818
rlm@46 8819
rlm@46 8820 swapNode: function(n1, n2) {
rlm@46 8821 if (n1.swapNode) {
rlm@46 8822 n1.swapNode(n2);
rlm@46 8823 } else {
rlm@46 8824 var p = n2.parentNode;
rlm@46 8825 var s = n2.nextSibling;
rlm@46 8826
rlm@46 8827 if (s == n1) {
rlm@46 8828 p.insertBefore(n1, n2);
rlm@46 8829 } else if (n2 == n1.nextSibling) {
rlm@46 8830 p.insertBefore(n2, n1);
rlm@46 8831 } else {
rlm@46 8832 n1.parentNode.replaceChild(n2, n1);
rlm@46 8833 p.insertBefore(n1, s);
rlm@46 8834 }
rlm@46 8835 }
rlm@46 8836 },
rlm@46 8837
rlm@46 8838
rlm@46 8839 getScroll: function () {
rlm@46 8840 var t, l, dde=document.documentElement, db=document.body;
rlm@46 8841 if (dde && (dde.scrollTop || dde.scrollLeft)) {
rlm@46 8842 t = dde.scrollTop;
rlm@46 8843 l = dde.scrollLeft;
rlm@46 8844 } else if (db) {
rlm@46 8845 t = db.scrollTop;
rlm@46 8846 l = db.scrollLeft;
rlm@46 8847 } else {
rlm@46 8848
rlm@46 8849 }
rlm@46 8850 return { top: t, left: l };
rlm@46 8851 },
rlm@46 8852
rlm@46 8853
rlm@46 8854 getStyle: function(el, styleProp) {
rlm@46 8855 return Ext.fly(el).getStyle(styleProp);
rlm@46 8856 },
rlm@46 8857
rlm@46 8858
rlm@46 8859 getScrollTop: function () { return this.getScroll().top; },
rlm@46 8860
rlm@46 8861
rlm@46 8862 getScrollLeft: function () { return this.getScroll().left; },
rlm@46 8863
rlm@46 8864
rlm@46 8865 moveToEl: function (moveEl, targetEl) {
rlm@46 8866 var aCoord = Ext.lib.Dom.getXY(targetEl);
rlm@46 8867 Ext.lib.Dom.setXY(moveEl, aCoord);
rlm@46 8868 },
rlm@46 8869
rlm@46 8870
rlm@46 8871 numericSort: function(a, b) { return (a - b); },
rlm@46 8872
rlm@46 8873
rlm@46 8874 _timeoutCount: 0,
rlm@46 8875
rlm@46 8876
rlm@46 8877 _addListeners: function() {
rlm@46 8878 var DDM = Ext.dd.DDM;
rlm@46 8879 if ( Ext.lib.Event && document ) {
rlm@46 8880 DDM._onLoad();
rlm@46 8881 } else {
rlm@46 8882 if (DDM._timeoutCount > 2000) {
rlm@46 8883 } else {
rlm@46 8884 setTimeout(DDM._addListeners, 10);
rlm@46 8885 if (document && document.body) {
rlm@46 8886 DDM._timeoutCount += 1;
rlm@46 8887 }
rlm@46 8888 }
rlm@46 8889 }
rlm@46 8890 },
rlm@46 8891
rlm@46 8892
rlm@46 8893 handleWasClicked: function(node, id) {
rlm@46 8894 if (this.isHandle(id, node.id)) {
rlm@46 8895 return true;
rlm@46 8896 } else {
rlm@46 8897
rlm@46 8898 var p = node.parentNode;
rlm@46 8899
rlm@46 8900 while (p) {
rlm@46 8901 if (this.isHandle(id, p.id)) {
rlm@46 8902 return true;
rlm@46 8903 } else {
rlm@46 8904 p = p.parentNode;
rlm@46 8905 }
rlm@46 8906 }
rlm@46 8907 }
rlm@46 8908
rlm@46 8909 return false;
rlm@46 8910 }
rlm@46 8911
rlm@46 8912 };
rlm@46 8913
rlm@46 8914 }();
rlm@46 8915
rlm@46 8916
rlm@46 8917 Ext.dd.DDM = Ext.dd.DragDropMgr;
rlm@46 8918 Ext.dd.DDM._addListeners();
rlm@46 8919
rlm@46 8920 }
rlm@46 8921
rlm@46 8922
rlm@46 8923 Ext.dd.DD = function(id, sGroup, config) {
rlm@46 8924 if (id) {
rlm@46 8925 this.init(id, sGroup, config);
rlm@46 8926 }
rlm@46 8927 };
rlm@46 8928
rlm@46 8929 Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
rlm@46 8930
rlm@46 8931
rlm@46 8932 scroll: true,
rlm@46 8933
rlm@46 8934
rlm@46 8935 autoOffset: function(iPageX, iPageY) {
rlm@46 8936 var x = iPageX - this.startPageX;
rlm@46 8937 var y = iPageY - this.startPageY;
rlm@46 8938 this.setDelta(x, y);
rlm@46 8939 },
rlm@46 8940
rlm@46 8941
rlm@46 8942 setDelta: function(iDeltaX, iDeltaY) {
rlm@46 8943 this.deltaX = iDeltaX;
rlm@46 8944 this.deltaY = iDeltaY;
rlm@46 8945 },
rlm@46 8946
rlm@46 8947
rlm@46 8948 setDragElPos: function(iPageX, iPageY) {
rlm@46 8949
rlm@46 8950
rlm@46 8951
rlm@46 8952 var el = this.getDragEl();
rlm@46 8953 this.alignElWithMouse(el, iPageX, iPageY);
rlm@46 8954 },
rlm@46 8955
rlm@46 8956
rlm@46 8957 alignElWithMouse: function(el, iPageX, iPageY) {
rlm@46 8958 var oCoord = this.getTargetCoord(iPageX, iPageY);
rlm@46 8959 var fly = el.dom ? el : Ext.fly(el, '_dd');
rlm@46 8960 if (!this.deltaSetXY) {
rlm@46 8961 var aCoord = [oCoord.x, oCoord.y];
rlm@46 8962 fly.setXY(aCoord);
rlm@46 8963 var newLeft = fly.getLeft(true);
rlm@46 8964 var newTop = fly.getTop(true);
rlm@46 8965 this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
rlm@46 8966 } else {
rlm@46 8967 fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
rlm@46 8968 }
rlm@46 8969
rlm@46 8970 this.cachePosition(oCoord.x, oCoord.y);
rlm@46 8971 this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
rlm@46 8972 return oCoord;
rlm@46 8973 },
rlm@46 8974
rlm@46 8975
rlm@46 8976 cachePosition: function(iPageX, iPageY) {
rlm@46 8977 if (iPageX) {
rlm@46 8978 this.lastPageX = iPageX;
rlm@46 8979 this.lastPageY = iPageY;
rlm@46 8980 } else {
rlm@46 8981 var aCoord = Ext.lib.Dom.getXY(this.getEl());
rlm@46 8982 this.lastPageX = aCoord[0];
rlm@46 8983 this.lastPageY = aCoord[1];
rlm@46 8984 }
rlm@46 8985 },
rlm@46 8986
rlm@46 8987
rlm@46 8988 autoScroll: function(x, y, h, w) {
rlm@46 8989
rlm@46 8990 if (this.scroll) {
rlm@46 8991
rlm@46 8992 var clientH = Ext.lib.Dom.getViewHeight();
rlm@46 8993
rlm@46 8994
rlm@46 8995 var clientW = Ext.lib.Dom.getViewWidth();
rlm@46 8996
rlm@46 8997
rlm@46 8998 var st = this.DDM.getScrollTop();
rlm@46 8999
rlm@46 9000
rlm@46 9001 var sl = this.DDM.getScrollLeft();
rlm@46 9002
rlm@46 9003
rlm@46 9004 var bot = h + y;
rlm@46 9005
rlm@46 9006
rlm@46 9007 var right = w + x;
rlm@46 9008
rlm@46 9009
rlm@46 9010
rlm@46 9011
rlm@46 9012 var toBot = (clientH + st - y - this.deltaY);
rlm@46 9013
rlm@46 9014
rlm@46 9015 var toRight = (clientW + sl - x - this.deltaX);
rlm@46 9016
rlm@46 9017
rlm@46 9018
rlm@46 9019
rlm@46 9020 var thresh = 40;
rlm@46 9021
rlm@46 9022
rlm@46 9023
rlm@46 9024
rlm@46 9025 var scrAmt = (document.all) ? 80 : 30;
rlm@46 9026
rlm@46 9027
rlm@46 9028
rlm@46 9029 if ( bot > clientH && toBot < thresh ) {
rlm@46 9030 window.scrollTo(sl, st + scrAmt);
rlm@46 9031 }
rlm@46 9032
rlm@46 9033
rlm@46 9034
rlm@46 9035 if ( y < st && st > 0 && y - st < thresh ) {
rlm@46 9036 window.scrollTo(sl, st - scrAmt);
rlm@46 9037 }
rlm@46 9038
rlm@46 9039
rlm@46 9040
rlm@46 9041 if ( right > clientW && toRight < thresh ) {
rlm@46 9042 window.scrollTo(sl + scrAmt, st);
rlm@46 9043 }
rlm@46 9044
rlm@46 9045
rlm@46 9046
rlm@46 9047 if ( x < sl && sl > 0 && x - sl < thresh ) {
rlm@46 9048 window.scrollTo(sl - scrAmt, st);
rlm@46 9049 }
rlm@46 9050 }
rlm@46 9051 },
rlm@46 9052
rlm@46 9053
rlm@46 9054 getTargetCoord: function(iPageX, iPageY) {
rlm@46 9055
rlm@46 9056
rlm@46 9057 var x = iPageX - this.deltaX;
rlm@46 9058 var y = iPageY - this.deltaY;
rlm@46 9059
rlm@46 9060 if (this.constrainX) {
rlm@46 9061 if (x < this.minX) { x = this.minX; }
rlm@46 9062 if (x > this.maxX) { x = this.maxX; }
rlm@46 9063 }
rlm@46 9064
rlm@46 9065 if (this.constrainY) {
rlm@46 9066 if (y < this.minY) { y = this.minY; }
rlm@46 9067 if (y > this.maxY) { y = this.maxY; }
rlm@46 9068 }
rlm@46 9069
rlm@46 9070 x = this.getTick(x, this.xTicks);
rlm@46 9071 y = this.getTick(y, this.yTicks);
rlm@46 9072
rlm@46 9073
rlm@46 9074 return {x:x, y:y};
rlm@46 9075 },
rlm@46 9076
rlm@46 9077
rlm@46 9078 applyConfig: function() {
rlm@46 9079 Ext.dd.DD.superclass.applyConfig.call(this);
rlm@46 9080 this.scroll = (this.config.scroll !== false);
rlm@46 9081 },
rlm@46 9082
rlm@46 9083
rlm@46 9084 b4MouseDown: function(e) {
rlm@46 9085
rlm@46 9086 this.autoOffset(e.getPageX(),
rlm@46 9087 e.getPageY());
rlm@46 9088 },
rlm@46 9089
rlm@46 9090
rlm@46 9091 b4Drag: function(e) {
rlm@46 9092 this.setDragElPos(e.getPageX(),
rlm@46 9093 e.getPageY());
rlm@46 9094 },
rlm@46 9095
rlm@46 9096 toString: function() {
rlm@46 9097 return ("DD " + this.id);
rlm@46 9098 }
rlm@46 9099
rlm@46 9100
rlm@46 9101
rlm@46 9102
rlm@46 9103
rlm@46 9104
rlm@46 9105 });
rlm@46 9106
rlm@46 9107 Ext.dd.DDProxy = function(id, sGroup, config) {
rlm@46 9108 if (id) {
rlm@46 9109 this.init(id, sGroup, config);
rlm@46 9110 this.initFrame();
rlm@46 9111 }
rlm@46 9112 };
rlm@46 9113
rlm@46 9114
rlm@46 9115 Ext.dd.DDProxy.dragElId = "ygddfdiv";
rlm@46 9116
rlm@46 9117 Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
rlm@46 9118
rlm@46 9119
rlm@46 9120 resizeFrame: true,
rlm@46 9121
rlm@46 9122
rlm@46 9123 centerFrame: false,
rlm@46 9124
rlm@46 9125
rlm@46 9126 createFrame: function() {
rlm@46 9127 var self = this;
rlm@46 9128 var body = document.body;
rlm@46 9129
rlm@46 9130 if (!body || !body.firstChild) {
rlm@46 9131 setTimeout( function() { self.createFrame(); }, 50 );
rlm@46 9132 return;
rlm@46 9133 }
rlm@46 9134
rlm@46 9135 var div = this.getDragEl();
rlm@46 9136
rlm@46 9137 if (!div) {
rlm@46 9138 div = document.createElement("div");
rlm@46 9139 div.id = this.dragElId;
rlm@46 9140 var s = div.style;
rlm@46 9141
rlm@46 9142 s.position = "absolute";
rlm@46 9143 s.visibility = "hidden";
rlm@46 9144 s.cursor = "move";
rlm@46 9145 s.border = "2px solid #aaa";
rlm@46 9146 s.zIndex = 999;
rlm@46 9147
rlm@46 9148
rlm@46 9149
rlm@46 9150
rlm@46 9151 body.insertBefore(div, body.firstChild);
rlm@46 9152 }
rlm@46 9153 },
rlm@46 9154
rlm@46 9155
rlm@46 9156 initFrame: function() {
rlm@46 9157 this.createFrame();
rlm@46 9158 },
rlm@46 9159
rlm@46 9160 applyConfig: function() {
rlm@46 9161 Ext.dd.DDProxy.superclass.applyConfig.call(this);
rlm@46 9162
rlm@46 9163 this.resizeFrame = (this.config.resizeFrame !== false);
rlm@46 9164 this.centerFrame = (this.config.centerFrame);
rlm@46 9165 this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
rlm@46 9166 },
rlm@46 9167
rlm@46 9168
rlm@46 9169 showFrame: function(iPageX, iPageY) {
rlm@46 9170 var el = this.getEl();
rlm@46 9171 var dragEl = this.getDragEl();
rlm@46 9172 var s = dragEl.style;
rlm@46 9173
rlm@46 9174 this._resizeProxy();
rlm@46 9175
rlm@46 9176 if (this.centerFrame) {
rlm@46 9177 this.setDelta( Math.round(parseInt(s.width, 10)/2),
rlm@46 9178 Math.round(parseInt(s.height, 10)/2) );
rlm@46 9179 }
rlm@46 9180
rlm@46 9181 this.setDragElPos(iPageX, iPageY);
rlm@46 9182
rlm@46 9183 Ext.fly(dragEl).show();
rlm@46 9184 },
rlm@46 9185
rlm@46 9186
rlm@46 9187 _resizeProxy: function() {
rlm@46 9188 if (this.resizeFrame) {
rlm@46 9189 var el = this.getEl();
rlm@46 9190 Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
rlm@46 9191 }
rlm@46 9192 },
rlm@46 9193
rlm@46 9194
rlm@46 9195 b4MouseDown: function(e) {
rlm@46 9196 var x = e.getPageX();
rlm@46 9197 var y = e.getPageY();
rlm@46 9198 this.autoOffset(x, y);
rlm@46 9199 this.setDragElPos(x, y);
rlm@46 9200 },
rlm@46 9201
rlm@46 9202
rlm@46 9203 b4StartDrag: function(x, y) {
rlm@46 9204
rlm@46 9205 this.showFrame(x, y);
rlm@46 9206 },
rlm@46 9207
rlm@46 9208
rlm@46 9209 b4EndDrag: function(e) {
rlm@46 9210 Ext.fly(this.getDragEl()).hide();
rlm@46 9211 },
rlm@46 9212
rlm@46 9213
rlm@46 9214
rlm@46 9215
rlm@46 9216 endDrag: function(e) {
rlm@46 9217
rlm@46 9218 var lel = this.getEl();
rlm@46 9219 var del = this.getDragEl();
rlm@46 9220
rlm@46 9221
rlm@46 9222 del.style.visibility = "";
rlm@46 9223
rlm@46 9224 this.beforeMove();
rlm@46 9225
rlm@46 9226
rlm@46 9227 lel.style.visibility = "hidden";
rlm@46 9228 Ext.dd.DDM.moveToEl(lel, del);
rlm@46 9229 del.style.visibility = "hidden";
rlm@46 9230 lel.style.visibility = "";
rlm@46 9231
rlm@46 9232 this.afterDrag();
rlm@46 9233 },
rlm@46 9234
rlm@46 9235 beforeMove : function(){
rlm@46 9236
rlm@46 9237 },
rlm@46 9238
rlm@46 9239 afterDrag : function(){
rlm@46 9240
rlm@46 9241 },
rlm@46 9242
rlm@46 9243 toString: function() {
rlm@46 9244 return ("DDProxy " + this.id);
rlm@46 9245 }
rlm@46 9246
rlm@46 9247 });
rlm@46 9248
rlm@46 9249 Ext.dd.DDTarget = function(id, sGroup, config) {
rlm@46 9250 if (id) {
rlm@46 9251 this.initTarget(id, sGroup, config);
rlm@46 9252 }
rlm@46 9253 };
rlm@46 9254
rlm@46 9255
rlm@46 9256 Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
rlm@46 9257 toString: function() {
rlm@46 9258 return ("DDTarget " + this.id);
rlm@46 9259 }
rlm@46 9260 });
rlm@46 9261
rlm@46 9262 Ext.dd.DragTracker = function(config){
rlm@46 9263 Ext.apply(this, config);
rlm@46 9264 this.addEvents(
rlm@46 9265 'mousedown',
rlm@46 9266 'mouseup',
rlm@46 9267 'mousemove',
rlm@46 9268 'dragstart',
rlm@46 9269 'dragend',
rlm@46 9270 'drag'
rlm@46 9271 );
rlm@46 9272
rlm@46 9273 this.dragRegion = new Ext.lib.Region(0,0,0,0);
rlm@46 9274
rlm@46 9275 if(this.el){
rlm@46 9276 this.initEl(this.el);
rlm@46 9277 }
rlm@46 9278 }
rlm@46 9279
rlm@46 9280 Ext.extend(Ext.dd.DragTracker, Ext.util.Observable, {
rlm@46 9281 active: false,
rlm@46 9282 tolerance: 5,
rlm@46 9283 autoStart: false,
rlm@46 9284
rlm@46 9285 initEl: function(el){
rlm@46 9286 this.el = Ext.get(el);
rlm@46 9287 el.on('mousedown', this.onMouseDown, this,
rlm@46 9288 this.delegate ? {delegate: this.delegate} : undefined);
rlm@46 9289 },
rlm@46 9290
rlm@46 9291 destroy : function(){
rlm@46 9292 this.el.un('mousedown', this.onMouseDown, this);
rlm@46 9293 },
rlm@46 9294
rlm@46 9295 onMouseDown: function(e, target){
rlm@46 9296 if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){
rlm@46 9297 this.startXY = this.lastXY = e.getXY();
rlm@46 9298 this.dragTarget = this.delegate ? target : this.el.dom;
rlm@46 9299 e.preventDefault();
rlm@46 9300 var doc = Ext.getDoc();
rlm@46 9301 doc.on('mouseup', this.onMouseUp, this);
rlm@46 9302 doc.on('mousemove', this.onMouseMove, this);
rlm@46 9303 doc.on('selectstart', this.stopSelect, this);
rlm@46 9304 if(this.autoStart){
rlm@46 9305 this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this);
rlm@46 9306 }
rlm@46 9307 }
rlm@46 9308 },
rlm@46 9309
rlm@46 9310 onMouseMove: function(e, target){
rlm@46 9311 e.preventDefault();
rlm@46 9312 var xy = e.getXY(), s = this.startXY;
rlm@46 9313 this.lastXY = xy;
rlm@46 9314 if(!this.active){
rlm@46 9315 if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){
rlm@46 9316 this.triggerStart();
rlm@46 9317 }else{
rlm@46 9318 return;
rlm@46 9319 }
rlm@46 9320 }
rlm@46 9321 this.fireEvent('mousemove', this, e);
rlm@46 9322 this.onDrag(e);
rlm@46 9323 this.fireEvent('drag', this, e);
rlm@46 9324 },
rlm@46 9325
rlm@46 9326 onMouseUp: function(e){
rlm@46 9327 var doc = Ext.getDoc();
rlm@46 9328 doc.un('mousemove', this.onMouseMove, this);
rlm@46 9329 doc.un('mouseup', this.onMouseUp, this);
rlm@46 9330 doc.un('selectstart', this.stopSelect, this);
rlm@46 9331 e.preventDefault();
rlm@46 9332 this.clearStart();
rlm@46 9333 this.active = false;
rlm@46 9334 delete this.elRegion;
rlm@46 9335 this.fireEvent('mouseup', this, e);
rlm@46 9336 this.onEnd(e);
rlm@46 9337 this.fireEvent('dragend', this, e);
rlm@46 9338 },
rlm@46 9339
rlm@46 9340 triggerStart: function(isTimer){
rlm@46 9341 this.clearStart();
rlm@46 9342 this.active = true;
rlm@46 9343 this.onStart(this.startXY);
rlm@46 9344 this.fireEvent('dragstart', this, this.startXY);
rlm@46 9345 },
rlm@46 9346
rlm@46 9347 clearStart : function(){
rlm@46 9348 if(this.timer){
rlm@46 9349 clearTimeout(this.timer);
rlm@46 9350 delete this.timer;
rlm@46 9351 }
rlm@46 9352 },
rlm@46 9353
rlm@46 9354 stopSelect : function(e){
rlm@46 9355 e.stopEvent();
rlm@46 9356 return false;
rlm@46 9357 },
rlm@46 9358
rlm@46 9359 onBeforeStart : function(e){
rlm@46 9360
rlm@46 9361 },
rlm@46 9362
rlm@46 9363 onStart : function(xy){
rlm@46 9364
rlm@46 9365 },
rlm@46 9366
rlm@46 9367 onDrag : function(e){
rlm@46 9368
rlm@46 9369 },
rlm@46 9370
rlm@46 9371 onEnd : function(e){
rlm@46 9372
rlm@46 9373 },
rlm@46 9374
rlm@46 9375 getDragTarget : function(){
rlm@46 9376 return this.dragTarget;
rlm@46 9377 },
rlm@46 9378
rlm@46 9379 getDragCt : function(){
rlm@46 9380 return this.el;
rlm@46 9381 },
rlm@46 9382
rlm@46 9383 getXY : function(constrain){
rlm@46 9384 return constrain ?
rlm@46 9385 this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;
rlm@46 9386 },
rlm@46 9387
rlm@46 9388 getOffset : function(constrain){
rlm@46 9389 var xy = this.getXY(constrain);
rlm@46 9390 var s = this.startXY;
rlm@46 9391 return [s[0]-xy[0], s[1]-xy[1]];
rlm@46 9392 },
rlm@46 9393
rlm@46 9394 constrainModes: {
rlm@46 9395 'point' : function(xy){
rlm@46 9396
rlm@46 9397 if(!this.elRegion){
rlm@46 9398 this.elRegion = this.getDragCt().getRegion();
rlm@46 9399 }
rlm@46 9400
rlm@46 9401 var dr = this.dragRegion;
rlm@46 9402
rlm@46 9403 dr.left = xy[0];
rlm@46 9404 dr.top = xy[1];
rlm@46 9405 dr.right = xy[0];
rlm@46 9406 dr.bottom = xy[1];
rlm@46 9407
rlm@46 9408 dr.constrainTo(this.elRegion);
rlm@46 9409
rlm@46 9410 return [dr.left, dr.top];
rlm@46 9411 }
rlm@46 9412 }
rlm@46 9413 });
rlm@46 9414
rlm@46 9415 Ext.dd.ScrollManager = function(){
rlm@46 9416 var ddm = Ext.dd.DragDropMgr;
rlm@46 9417 var els = {};
rlm@46 9418 var dragEl = null;
rlm@46 9419 var proc = {};
rlm@46 9420
rlm@46 9421 var onStop = function(e){
rlm@46 9422 dragEl = null;
rlm@46 9423 clearProc();
rlm@46 9424 };
rlm@46 9425
rlm@46 9426 var triggerRefresh = function(){
rlm@46 9427 if(ddm.dragCurrent){
rlm@46 9428 ddm.refreshCache(ddm.dragCurrent.groups);
rlm@46 9429 }
rlm@46 9430 };
rlm@46 9431
rlm@46 9432 var doScroll = function(){
rlm@46 9433 if(ddm.dragCurrent){
rlm@46 9434 var dds = Ext.dd.ScrollManager;
rlm@46 9435 var inc = proc.el.ddScrollConfig ?
rlm@46 9436 proc.el.ddScrollConfig.increment : dds.increment;
rlm@46 9437 if(!dds.animate){
rlm@46 9438 if(proc.el.scroll(proc.dir, inc)){
rlm@46 9439 triggerRefresh();
rlm@46 9440 }
rlm@46 9441 }else{
rlm@46 9442 proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
rlm@46 9443 }
rlm@46 9444 }
rlm@46 9445 };
rlm@46 9446
rlm@46 9447 var clearProc = function(){
rlm@46 9448 if(proc.id){
rlm@46 9449 clearInterval(proc.id);
rlm@46 9450 }
rlm@46 9451 proc.id = 0;
rlm@46 9452 proc.el = null;
rlm@46 9453 proc.dir = "";
rlm@46 9454 };
rlm@46 9455
rlm@46 9456 var startProc = function(el, dir){
rlm@46 9457 clearProc();
rlm@46 9458 proc.el = el;
rlm@46 9459 proc.dir = dir;
rlm@46 9460 proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency);
rlm@46 9461 };
rlm@46 9462
rlm@46 9463 var onFire = function(e, isDrop){
rlm@46 9464 if(isDrop || !ddm.dragCurrent){ return; }
rlm@46 9465 var dds = Ext.dd.ScrollManager;
rlm@46 9466 if(!dragEl || dragEl != ddm.dragCurrent){
rlm@46 9467 dragEl = ddm.dragCurrent;
rlm@46 9468
rlm@46 9469 dds.refreshCache();
rlm@46 9470 }
rlm@46 9471
rlm@46 9472 var xy = Ext.lib.Event.getXY(e);
rlm@46 9473 var pt = new Ext.lib.Point(xy[0], xy[1]);
rlm@46 9474 for(var id in els){
rlm@46 9475 var el = els[id], r = el._region;
rlm@46 9476 var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
rlm@46 9477 if(r && r.contains(pt) && el.isScrollable()){
rlm@46 9478 if(r.bottom - pt.y <= c.vthresh){
rlm@46 9479 if(proc.el != el){
rlm@46 9480 startProc(el, "down");
rlm@46 9481 }
rlm@46 9482 return;
rlm@46 9483 }else if(r.right - pt.x <= c.hthresh){
rlm@46 9484 if(proc.el != el){
rlm@46 9485 startProc(el, "left");
rlm@46 9486 }
rlm@46 9487 return;
rlm@46 9488 }else if(pt.y - r.top <= c.vthresh){
rlm@46 9489 if(proc.el != el){
rlm@46 9490 startProc(el, "up");
rlm@46 9491 }
rlm@46 9492 return;
rlm@46 9493 }else if(pt.x - r.left <= c.hthresh){
rlm@46 9494 if(proc.el != el){
rlm@46 9495 startProc(el, "right");
rlm@46 9496 }
rlm@46 9497 return;
rlm@46 9498 }
rlm@46 9499 }
rlm@46 9500 }
rlm@46 9501 clearProc();
rlm@46 9502 };
rlm@46 9503
rlm@46 9504 ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
rlm@46 9505 ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
rlm@46 9506
rlm@46 9507 return {
rlm@46 9508
rlm@46 9509 register : function(el){
rlm@46 9510 if(Ext.isArray(el)){
rlm@46 9511 for(var i = 0, len = el.length; i < len; i++) {
rlm@46 9512 this.register(el[i]);
rlm@46 9513 }
rlm@46 9514 }else{
rlm@46 9515 el = Ext.get(el);
rlm@46 9516 els[el.id] = el;
rlm@46 9517 }
rlm@46 9518 },
rlm@46 9519
rlm@46 9520
rlm@46 9521 unregister : function(el){
rlm@46 9522 if(Ext.isArray(el)){
rlm@46 9523 for(var i = 0, len = el.length; i < len; i++) {
rlm@46 9524 this.unregister(el[i]);
rlm@46 9525 }
rlm@46 9526 }else{
rlm@46 9527 el = Ext.get(el);
rlm@46 9528 delete els[el.id];
rlm@46 9529 }
rlm@46 9530 },
rlm@46 9531
rlm@46 9532
rlm@46 9533 vthresh : 25,
rlm@46 9534
rlm@46 9535 hthresh : 25,
rlm@46 9536
rlm@46 9537
rlm@46 9538 increment : 100,
rlm@46 9539
rlm@46 9540
rlm@46 9541 frequency : 500,
rlm@46 9542
rlm@46 9543
rlm@46 9544 animate: true,
rlm@46 9545
rlm@46 9546
rlm@46 9547 animDuration: .4,
rlm@46 9548
rlm@46 9549
rlm@46 9550 refreshCache : function(){
rlm@46 9551 for(var id in els){
rlm@46 9552 if(typeof els[id] == 'object'){
rlm@46 9553 els[id]._region = els[id].getRegion();
rlm@46 9554 }
rlm@46 9555 }
rlm@46 9556 }
rlm@46 9557 };
rlm@46 9558 }();
rlm@46 9559
rlm@46 9560 Ext.dd.Registry = function(){
rlm@46 9561 var elements = {};
rlm@46 9562 var handles = {};
rlm@46 9563 var autoIdSeed = 0;
rlm@46 9564
rlm@46 9565 var getId = function(el, autogen){
rlm@46 9566 if(typeof el == "string"){
rlm@46 9567 return el;
rlm@46 9568 }
rlm@46 9569 var id = el.id;
rlm@46 9570 if(!id && autogen !== false){
rlm@46 9571 id = "extdd-" + (++autoIdSeed);
rlm@46 9572 el.id = id;
rlm@46 9573 }
rlm@46 9574 return id;
rlm@46 9575 };
rlm@46 9576
rlm@46 9577 return {
rlm@46 9578
rlm@46 9579 register : function(el, data){
rlm@46 9580 data = data || {};
rlm@46 9581 if(typeof el == "string"){
rlm@46 9582 el = document.getElementById(el);
rlm@46 9583 }
rlm@46 9584 data.ddel = el;
rlm@46 9585 elements[getId(el)] = data;
rlm@46 9586 if(data.isHandle !== false){
rlm@46 9587 handles[data.ddel.id] = data;
rlm@46 9588 }
rlm@46 9589 if(data.handles){
rlm@46 9590 var hs = data.handles;
rlm@46 9591 for(var i = 0, len = hs.length; i < len; i++){
rlm@46 9592 handles[getId(hs[i])] = data;
rlm@46 9593 }
rlm@46 9594 }
rlm@46 9595 },
rlm@46 9596
rlm@46 9597
rlm@46 9598 unregister : function(el){
rlm@46 9599 var id = getId(el, false);
rlm@46 9600 var data = elements[id];
rlm@46 9601 if(data){
rlm@46 9602 delete elements[id];
rlm@46 9603 if(data.handles){
rlm@46 9604 var hs = data.handles;
rlm@46 9605 for(var i = 0, len = hs.length; i < len; i++){
rlm@46 9606 delete handles[getId(hs[i], false)];
rlm@46 9607 }
rlm@46 9608 }
rlm@46 9609 }
rlm@46 9610 },
rlm@46 9611
rlm@46 9612
rlm@46 9613 getHandle : function(id){
rlm@46 9614 if(typeof id != "string"){
rlm@46 9615 id = id.id;
rlm@46 9616 }
rlm@46 9617 return handles[id];
rlm@46 9618 },
rlm@46 9619
rlm@46 9620
rlm@46 9621 getHandleFromEvent : function(e){
rlm@46 9622 var t = Ext.lib.Event.getTarget(e);
rlm@46 9623 return t ? handles[t.id] : null;
rlm@46 9624 },
rlm@46 9625
rlm@46 9626
rlm@46 9627 getTarget : function(id){
rlm@46 9628 if(typeof id != "string"){
rlm@46 9629 id = id.id;
rlm@46 9630 }
rlm@46 9631 return elements[id];
rlm@46 9632 },
rlm@46 9633
rlm@46 9634
rlm@46 9635 getTargetFromEvent : function(e){
rlm@46 9636 var t = Ext.lib.Event.getTarget(e);
rlm@46 9637 return t ? elements[t.id] || handles[t.id] : null;
rlm@46 9638 }
rlm@46 9639 };
rlm@46 9640 }();
rlm@46 9641
rlm@46 9642 Ext.dd.StatusProxy = function(config){
rlm@46 9643 Ext.apply(this, config);
rlm@46 9644 this.id = this.id || Ext.id();
rlm@46 9645 this.el = new Ext.Layer({
rlm@46 9646 dh: {
rlm@46 9647 id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [
rlm@46 9648 {tag: "div", cls: "x-dd-drop-icon"},
rlm@46 9649 {tag: "div", cls: "x-dd-drag-ghost"}
rlm@46 9650 ]
rlm@46 9651 },
rlm@46 9652 shadow: !config || config.shadow !== false
rlm@46 9653 });
rlm@46 9654 this.ghost = Ext.get(this.el.dom.childNodes[1]);
rlm@46 9655 this.dropStatus = this.dropNotAllowed;
rlm@46 9656 };
rlm@46 9657
rlm@46 9658 Ext.dd.StatusProxy.prototype = {
rlm@46 9659
rlm@46 9660 dropAllowed : "x-dd-drop-ok",
rlm@46 9661
rlm@46 9662 dropNotAllowed : "x-dd-drop-nodrop",
rlm@46 9663
rlm@46 9664
rlm@46 9665 setStatus : function(cssClass){
rlm@46 9666 cssClass = cssClass || this.dropNotAllowed;
rlm@46 9667 if(this.dropStatus != cssClass){
rlm@46 9668 this.el.replaceClass(this.dropStatus, cssClass);
rlm@46 9669 this.dropStatus = cssClass;
rlm@46 9670 }
rlm@46 9671 },
rlm@46 9672
rlm@46 9673
rlm@46 9674 reset : function(clearGhost){
rlm@46 9675 this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
rlm@46 9676 this.dropStatus = this.dropNotAllowed;
rlm@46 9677 if(clearGhost){
rlm@46 9678 this.ghost.update("");
rlm@46 9679 }
rlm@46 9680 },
rlm@46 9681
rlm@46 9682
rlm@46 9683 update : function(html){
rlm@46 9684 if(typeof html == "string"){
rlm@46 9685 this.ghost.update(html);
rlm@46 9686 }else{
rlm@46 9687 this.ghost.update("");
rlm@46 9688 html.style.margin = "0";
rlm@46 9689 this.ghost.dom.appendChild(html);
rlm@46 9690 }
rlm@46 9691 },
rlm@46 9692
rlm@46 9693
rlm@46 9694 getEl : function(){
rlm@46 9695 return this.el;
rlm@46 9696 },
rlm@46 9697
rlm@46 9698
rlm@46 9699 getGhost : function(){
rlm@46 9700 return this.ghost;
rlm@46 9701 },
rlm@46 9702
rlm@46 9703
rlm@46 9704 hide : function(clear){
rlm@46 9705 this.el.hide();
rlm@46 9706 if(clear){
rlm@46 9707 this.reset(true);
rlm@46 9708 }
rlm@46 9709 },
rlm@46 9710
rlm@46 9711
rlm@46 9712 stop : function(){
rlm@46 9713 if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
rlm@46 9714 this.anim.stop();
rlm@46 9715 }
rlm@46 9716 },
rlm@46 9717
rlm@46 9718
rlm@46 9719 show : function(){
rlm@46 9720 this.el.show();
rlm@46 9721 },
rlm@46 9722
rlm@46 9723
rlm@46 9724 sync : function(){
rlm@46 9725 this.el.sync();
rlm@46 9726 },
rlm@46 9727
rlm@46 9728
rlm@46 9729 repair : function(xy, callback, scope){
rlm@46 9730 this.callback = callback;
rlm@46 9731 this.scope = scope;
rlm@46 9732 if(xy && this.animRepair !== false){
rlm@46 9733 this.el.addClass("x-dd-drag-repair");
rlm@46 9734 this.el.hideUnders(true);
rlm@46 9735 this.anim = this.el.shift({
rlm@46 9736 duration: this.repairDuration || .5,
rlm@46 9737 easing: 'easeOut',
rlm@46 9738 xy: xy,
rlm@46 9739 stopFx: true,
rlm@46 9740 callback: this.afterRepair,
rlm@46 9741 scope: this
rlm@46 9742 });
rlm@46 9743 }else{
rlm@46 9744 this.afterRepair();
rlm@46 9745 }
rlm@46 9746 },
rlm@46 9747
rlm@46 9748
rlm@46 9749 afterRepair : function(){
rlm@46 9750 this.hide(true);
rlm@46 9751 if(typeof this.callback == "function"){
rlm@46 9752 this.callback.call(this.scope || this);
rlm@46 9753 }
rlm@46 9754 this.callback = null;
rlm@46 9755 this.scope = null;
rlm@46 9756 }
rlm@46 9757 };
rlm@46 9758
rlm@46 9759 Ext.dd.DragSource = function(el, config){
rlm@46 9760 this.el = Ext.get(el);
rlm@46 9761 if(!this.dragData){
rlm@46 9762 this.dragData = {};
rlm@46 9763 }
rlm@46 9764
rlm@46 9765 Ext.apply(this, config);
rlm@46 9766
rlm@46 9767 if(!this.proxy){
rlm@46 9768 this.proxy = new Ext.dd.StatusProxy();
rlm@46 9769 }
rlm@46 9770 Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group,
rlm@46 9771 {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});
rlm@46 9772
rlm@46 9773 this.dragging = false;
rlm@46 9774 };
rlm@46 9775
rlm@46 9776 Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
rlm@46 9777
rlm@46 9778
rlm@46 9779 dropAllowed : "x-dd-drop-ok",
rlm@46 9780
rlm@46 9781 dropNotAllowed : "x-dd-drop-nodrop",
rlm@46 9782
rlm@46 9783
rlm@46 9784 getDragData : function(e){
rlm@46 9785 return this.dragData;
rlm@46 9786 },
rlm@46 9787
rlm@46 9788
rlm@46 9789 onDragEnter : function(e, id){
rlm@46 9790 var target = Ext.dd.DragDropMgr.getDDById(id);
rlm@46 9791 this.cachedTarget = target;
rlm@46 9792 if(this.beforeDragEnter(target, e, id) !== false){
rlm@46 9793 if(target.isNotifyTarget){
rlm@46 9794 var status = target.notifyEnter(this, e, this.dragData);
rlm@46 9795 this.proxy.setStatus(status);
rlm@46 9796 }else{
rlm@46 9797 this.proxy.setStatus(this.dropAllowed);
rlm@46 9798 }
rlm@46 9799
rlm@46 9800 if(this.afterDragEnter){
rlm@46 9801
rlm@46 9802 this.afterDragEnter(target, e, id);
rlm@46 9803 }
rlm@46 9804 }
rlm@46 9805 },
rlm@46 9806
rlm@46 9807
rlm@46 9808 beforeDragEnter : function(target, e, id){
rlm@46 9809 return true;
rlm@46 9810 },
rlm@46 9811
rlm@46 9812
rlm@46 9813 alignElWithMouse: function() {
rlm@46 9814 Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
rlm@46 9815 this.proxy.sync();
rlm@46 9816 },
rlm@46 9817
rlm@46 9818
rlm@46 9819 onDragOver : function(e, id){
rlm@46 9820 var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
rlm@46 9821 if(this.beforeDragOver(target, e, id) !== false){
rlm@46 9822 if(target.isNotifyTarget){
rlm@46 9823 var status = target.notifyOver(this, e, this.dragData);
rlm@46 9824 this.proxy.setStatus(status);
rlm@46 9825 }
rlm@46 9826
rlm@46 9827 if(this.afterDragOver){
rlm@46 9828
rlm@46 9829 this.afterDragOver(target, e, id);
rlm@46 9830 }
rlm@46 9831 }
rlm@46 9832 },
rlm@46 9833
rlm@46 9834
rlm@46 9835 beforeDragOver : function(target, e, id){
rlm@46 9836 return true;
rlm@46 9837 },
rlm@46 9838
rlm@46 9839
rlm@46 9840 onDragOut : function(e, id){
rlm@46 9841 var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
rlm@46 9842 if(this.beforeDragOut(target, e, id) !== false){
rlm@46 9843 if(target.isNotifyTarget){
rlm@46 9844 target.notifyOut(this, e, this.dragData);
rlm@46 9845 }
rlm@46 9846 this.proxy.reset();
rlm@46 9847 if(this.afterDragOut){
rlm@46 9848
rlm@46 9849 this.afterDragOut(target, e, id);
rlm@46 9850 }
rlm@46 9851 }
rlm@46 9852 this.cachedTarget = null;
rlm@46 9853 },
rlm@46 9854
rlm@46 9855
rlm@46 9856 beforeDragOut : function(target, e, id){
rlm@46 9857 return true;
rlm@46 9858 },
rlm@46 9859
rlm@46 9860
rlm@46 9861 onDragDrop : function(e, id){
rlm@46 9862 var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
rlm@46 9863 if(this.beforeDragDrop(target, e, id) !== false){
rlm@46 9864 if(target.isNotifyTarget){
rlm@46 9865 if(target.notifyDrop(this, e, this.dragData)){
rlm@46 9866 this.onValidDrop(target, e, id);
rlm@46 9867 }else{
rlm@46 9868 this.onInvalidDrop(target, e, id);
rlm@46 9869 }
rlm@46 9870 }else{
rlm@46 9871 this.onValidDrop(target, e, id);
rlm@46 9872 }
rlm@46 9873
rlm@46 9874 if(this.afterDragDrop){
rlm@46 9875
rlm@46 9876 this.afterDragDrop(target, e, id);
rlm@46 9877 }
rlm@46 9878 }
rlm@46 9879 delete this.cachedTarget;
rlm@46 9880 },
rlm@46 9881
rlm@46 9882
rlm@46 9883 beforeDragDrop : function(target, e, id){
rlm@46 9884 return true;
rlm@46 9885 },
rlm@46 9886
rlm@46 9887
rlm@46 9888 onValidDrop : function(target, e, id){
rlm@46 9889 this.hideProxy();
rlm@46 9890 if(this.afterValidDrop){
rlm@46 9891
rlm@46 9892 this.afterValidDrop(target, e, id);
rlm@46 9893 }
rlm@46 9894 },
rlm@46 9895
rlm@46 9896
rlm@46 9897 getRepairXY : function(e, data){
rlm@46 9898 return this.el.getXY();
rlm@46 9899 },
rlm@46 9900
rlm@46 9901
rlm@46 9902 onInvalidDrop : function(target, e, id){
rlm@46 9903 this.beforeInvalidDrop(target, e, id);
rlm@46 9904 if(this.cachedTarget){
rlm@46 9905 if(this.cachedTarget.isNotifyTarget){
rlm@46 9906 this.cachedTarget.notifyOut(this, e, this.dragData);
rlm@46 9907 }
rlm@46 9908 this.cacheTarget = null;
rlm@46 9909 }
rlm@46 9910 this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
rlm@46 9911
rlm@46 9912 if(this.afterInvalidDrop){
rlm@46 9913
rlm@46 9914 this.afterInvalidDrop(e, id);
rlm@46 9915 }
rlm@46 9916 },
rlm@46 9917
rlm@46 9918
rlm@46 9919 afterRepair : function(){
rlm@46 9920 if(Ext.enableFx){
rlm@46 9921 this.el.highlight(this.hlColor || "c3daf9");
rlm@46 9922 }
rlm@46 9923 this.dragging = false;
rlm@46 9924 },
rlm@46 9925
rlm@46 9926
rlm@46 9927 beforeInvalidDrop : function(target, e, id){
rlm@46 9928 return true;
rlm@46 9929 },
rlm@46 9930
rlm@46 9931
rlm@46 9932 handleMouseDown : function(e){
rlm@46 9933 if(this.dragging) {
rlm@46 9934 return;
rlm@46 9935 }
rlm@46 9936 var data = this.getDragData(e);
rlm@46 9937 if(data && this.onBeforeDrag(data, e) !== false){
rlm@46 9938 this.dragData = data;
rlm@46 9939 this.proxy.stop();
rlm@46 9940 Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);
rlm@46 9941 }
rlm@46 9942 },
rlm@46 9943
rlm@46 9944
rlm@46 9945 onBeforeDrag : function(data, e){
rlm@46 9946 return true;
rlm@46 9947 },
rlm@46 9948
rlm@46 9949
rlm@46 9950 onStartDrag : Ext.emptyFn,
rlm@46 9951
rlm@46 9952
rlm@46 9953 startDrag : function(x, y){
rlm@46 9954 this.proxy.reset();
rlm@46 9955 this.dragging = true;
rlm@46 9956 this.proxy.update("");
rlm@46 9957 this.onInitDrag(x, y);
rlm@46 9958 this.proxy.show();
rlm@46 9959 },
rlm@46 9960
rlm@46 9961
rlm@46 9962 onInitDrag : function(x, y){
rlm@46 9963 var clone = this.el.dom.cloneNode(true);
rlm@46 9964 clone.id = Ext.id();
rlm@46 9965 this.proxy.update(clone);
rlm@46 9966 this.onStartDrag(x, y);
rlm@46 9967 return true;
rlm@46 9968 },
rlm@46 9969
rlm@46 9970
rlm@46 9971 getProxy : function(){
rlm@46 9972 return this.proxy;
rlm@46 9973 },
rlm@46 9974
rlm@46 9975
rlm@46 9976 hideProxy : function(){
rlm@46 9977 this.proxy.hide();
rlm@46 9978 this.proxy.reset(true);
rlm@46 9979 this.dragging = false;
rlm@46 9980 },
rlm@46 9981
rlm@46 9982
rlm@46 9983 triggerCacheRefresh : function(){
rlm@46 9984 Ext.dd.DDM.refreshCache(this.groups);
rlm@46 9985 },
rlm@46 9986
rlm@46 9987
rlm@46 9988 b4EndDrag: function(e) {
rlm@46 9989 },
rlm@46 9990
rlm@46 9991
rlm@46 9992 endDrag : function(e){
rlm@46 9993 this.onEndDrag(this.dragData, e);
rlm@46 9994 },
rlm@46 9995
rlm@46 9996
rlm@46 9997 onEndDrag : function(data, e){
rlm@46 9998 },
rlm@46 9999
rlm@46 10000
rlm@46 10001 autoOffset : function(x, y) {
rlm@46 10002 this.setDelta(-12, -20);
rlm@46 10003 }
rlm@46 10004 });
rlm@46 10005
rlm@46 10006 Ext.dd.DropTarget = function(el, config){
rlm@46 10007 this.el = Ext.get(el);
rlm@46 10008
rlm@46 10009 Ext.apply(this, config);
rlm@46 10010
rlm@46 10011 if(this.containerScroll){
rlm@46 10012 Ext.dd.ScrollManager.register(this.el);
rlm@46 10013 }
rlm@46 10014
rlm@46 10015 Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group,
rlm@46 10016 {isTarget: true});
rlm@46 10017
rlm@46 10018 };
rlm@46 10019
rlm@46 10020 Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {
rlm@46 10021
rlm@46 10022
rlm@46 10023
rlm@46 10024 dropAllowed : "x-dd-drop-ok",
rlm@46 10025
rlm@46 10026 dropNotAllowed : "x-dd-drop-nodrop",
rlm@46 10027
rlm@46 10028
rlm@46 10029 isTarget : true,
rlm@46 10030
rlm@46 10031
rlm@46 10032 isNotifyTarget : true,
rlm@46 10033
rlm@46 10034
rlm@46 10035 notifyEnter : function(dd, e, data){
rlm@46 10036 if(this.overClass){
rlm@46 10037 this.el.addClass(this.overClass);
rlm@46 10038 }
rlm@46 10039 return this.dropAllowed;
rlm@46 10040 },
rlm@46 10041
rlm@46 10042
rlm@46 10043 notifyOver : function(dd, e, data){
rlm@46 10044 return this.dropAllowed;
rlm@46 10045 },
rlm@46 10046
rlm@46 10047
rlm@46 10048 notifyOut : function(dd, e, data){
rlm@46 10049 if(this.overClass){
rlm@46 10050 this.el.removeClass(this.overClass);
rlm@46 10051 }
rlm@46 10052 },
rlm@46 10053
rlm@46 10054
rlm@46 10055 notifyDrop : function(dd, e, data){
rlm@46 10056 return false;
rlm@46 10057 }
rlm@46 10058 });
rlm@46 10059
rlm@46 10060 Ext.dd.DragZone = function(el, config){
rlm@46 10061 Ext.dd.DragZone.superclass.constructor.call(this, el, config);
rlm@46 10062 if(this.containerScroll){
rlm@46 10063 Ext.dd.ScrollManager.register(this.el);
rlm@46 10064 }
rlm@46 10065 };
rlm@46 10066
rlm@46 10067 Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {
rlm@46 10068
rlm@46 10069
rlm@46 10070
rlm@46 10071
rlm@46 10072 getDragData : function(e){
rlm@46 10073 return Ext.dd.Registry.getHandleFromEvent(e);
rlm@46 10074 },
rlm@46 10075
rlm@46 10076
rlm@46 10077 onInitDrag : function(x, y){
rlm@46 10078 this.proxy.update(this.dragData.ddel.cloneNode(true));
rlm@46 10079 this.onStartDrag(x, y);
rlm@46 10080 return true;
rlm@46 10081 },
rlm@46 10082
rlm@46 10083
rlm@46 10084 afterRepair : function(){
rlm@46 10085 if(Ext.enableFx){
rlm@46 10086 Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
rlm@46 10087 }
rlm@46 10088 this.dragging = false;
rlm@46 10089 },
rlm@46 10090
rlm@46 10091
rlm@46 10092 getRepairXY : function(e){
rlm@46 10093 return Ext.Element.fly(this.dragData.ddel).getXY();
rlm@46 10094 }
rlm@46 10095 });
rlm@46 10096
rlm@46 10097 Ext.dd.DropZone = function(el, config){
rlm@46 10098 Ext.dd.DropZone.superclass.constructor.call(this, el, config);
rlm@46 10099 };
rlm@46 10100
rlm@46 10101 Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
rlm@46 10102
rlm@46 10103 getTargetFromEvent : function(e){
rlm@46 10104 return Ext.dd.Registry.getTargetFromEvent(e);
rlm@46 10105 },
rlm@46 10106
rlm@46 10107
rlm@46 10108 onNodeEnter : function(n, dd, e, data){
rlm@46 10109
rlm@46 10110 },
rlm@46 10111
rlm@46 10112
rlm@46 10113 onNodeOver : function(n, dd, e, data){
rlm@46 10114 return this.dropAllowed;
rlm@46 10115 },
rlm@46 10116
rlm@46 10117
rlm@46 10118 onNodeOut : function(n, dd, e, data){
rlm@46 10119
rlm@46 10120 },
rlm@46 10121
rlm@46 10122
rlm@46 10123 onNodeDrop : function(n, dd, e, data){
rlm@46 10124 return false;
rlm@46 10125 },
rlm@46 10126
rlm@46 10127
rlm@46 10128 onContainerOver : function(dd, e, data){
rlm@46 10129 return this.dropNotAllowed;
rlm@46 10130 },
rlm@46 10131
rlm@46 10132
rlm@46 10133 onContainerDrop : function(dd, e, data){
rlm@46 10134 return false;
rlm@46 10135 },
rlm@46 10136
rlm@46 10137
rlm@46 10138 notifyEnter : function(dd, e, data){
rlm@46 10139 return this.dropNotAllowed;
rlm@46 10140 },
rlm@46 10141
rlm@46 10142
rlm@46 10143 notifyOver : function(dd, e, data){
rlm@46 10144 var n = this.getTargetFromEvent(e);
rlm@46 10145 if(!n){
rlm@46 10146 if(this.lastOverNode){
rlm@46 10147 this.onNodeOut(this.lastOverNode, dd, e, data);
rlm@46 10148 this.lastOverNode = null;
rlm@46 10149 }
rlm@46 10150 return this.onContainerOver(dd, e, data);
rlm@46 10151 }
rlm@46 10152 if(this.lastOverNode != n){
rlm@46 10153 if(this.lastOverNode){
rlm@46 10154 this.onNodeOut(this.lastOverNode, dd, e, data);
rlm@46 10155 }
rlm@46 10156 this.onNodeEnter(n, dd, e, data);
rlm@46 10157 this.lastOverNode = n;
rlm@46 10158 }
rlm@46 10159 return this.onNodeOver(n, dd, e, data);
rlm@46 10160 },
rlm@46 10161
rlm@46 10162
rlm@46 10163 notifyOut : function(dd, e, data){
rlm@46 10164 if(this.lastOverNode){
rlm@46 10165 this.onNodeOut(this.lastOverNode, dd, e, data);
rlm@46 10166 this.lastOverNode = null;
rlm@46 10167 }
rlm@46 10168 },
rlm@46 10169
rlm@46 10170
rlm@46 10171 notifyDrop : function(dd, e, data){
rlm@46 10172 if(this.lastOverNode){
rlm@46 10173 this.onNodeOut(this.lastOverNode, dd, e, data);
rlm@46 10174 this.lastOverNode = null;
rlm@46 10175 }
rlm@46 10176 var n = this.getTargetFromEvent(e);
rlm@46 10177 return n ?
rlm@46 10178 this.onNodeDrop(n, dd, e, data) :
rlm@46 10179 this.onContainerDrop(dd, e, data);
rlm@46 10180 },
rlm@46 10181
rlm@46 10182
rlm@46 10183 triggerCacheRefresh : function(){
rlm@46 10184 Ext.dd.DDM.refreshCache(this.groups);
rlm@46 10185 }
rlm@46 10186 });
rlm@46 10187
rlm@46 10188
rlm@46 10189 Ext.data.SortTypes = {
rlm@46 10190
rlm@46 10191 none : function(s){
rlm@46 10192 return s;
rlm@46 10193 },
rlm@46 10194
rlm@46 10195
rlm@46 10196 stripTagsRE : /<\/?[^>]+>/gi,
rlm@46 10197
rlm@46 10198
rlm@46 10199 asText : function(s){
rlm@46 10200 return String(s).replace(this.stripTagsRE, "");
rlm@46 10201 },
rlm@46 10202
rlm@46 10203
rlm@46 10204 asUCText : function(s){
rlm@46 10205 return String(s).toUpperCase().replace(this.stripTagsRE, "");
rlm@46 10206 },
rlm@46 10207
rlm@46 10208
rlm@46 10209 asUCString : function(s) {
rlm@46 10210 return String(s).toUpperCase();
rlm@46 10211 },
rlm@46 10212
rlm@46 10213
rlm@46 10214 asDate : function(s) {
rlm@46 10215 if(!s){
rlm@46 10216 return 0;
rlm@46 10217 }
rlm@46 10218 if(Ext.isDate(s)){
rlm@46 10219 return s.getTime();
rlm@46 10220 }
rlm@46 10221 return Date.parse(String(s));
rlm@46 10222 },
rlm@46 10223
rlm@46 10224
rlm@46 10225 asFloat : function(s) {
rlm@46 10226 var val = parseFloat(String(s).replace(/,/g, ""));
rlm@46 10227 if(isNaN(val)) val = 0;
rlm@46 10228 return val;
rlm@46 10229 },
rlm@46 10230
rlm@46 10231
rlm@46 10232 asInt : function(s) {
rlm@46 10233 var val = parseInt(String(s).replace(/,/g, ""));
rlm@46 10234 if(isNaN(val)) val = 0;
rlm@46 10235 return val;
rlm@46 10236 }
rlm@46 10237 };
rlm@46 10238
rlm@46 10239 Ext.data.Record = function(data, id){
rlm@46 10240 this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID;
rlm@46 10241 this.data = data;
rlm@46 10242 };
rlm@46 10243
rlm@46 10244
rlm@46 10245 Ext.data.Record.create = function(o){
rlm@46 10246 var f = Ext.extend(Ext.data.Record, {});
rlm@46 10247 var p = f.prototype;
rlm@46 10248 p.fields = new Ext.util.MixedCollection(false, function(field){
rlm@46 10249 return field.name;
rlm@46 10250 });
rlm@46 10251 for(var i = 0, len = o.length; i < len; i++){
rlm@46 10252 p.fields.add(new Ext.data.Field(o[i]));
rlm@46 10253 }
rlm@46 10254 f.getField = function(name){
rlm@46 10255 return p.fields.get(name);
rlm@46 10256 };
rlm@46 10257 return f;
rlm@46 10258 };
rlm@46 10259
rlm@46 10260 Ext.data.Record.AUTO_ID = 1000;
rlm@46 10261 Ext.data.Record.EDIT = 'edit';
rlm@46 10262 Ext.data.Record.REJECT = 'reject';
rlm@46 10263 Ext.data.Record.COMMIT = 'commit';
rlm@46 10264
rlm@46 10265 Ext.data.Record.prototype = {
rlm@46 10266
rlm@46 10267
rlm@46 10268
rlm@46 10269 dirty : false,
rlm@46 10270 editing : false,
rlm@46 10271 error: null,
rlm@46 10272
rlm@46 10273 modified: null,
rlm@46 10274
rlm@46 10275 join : function(store){
rlm@46 10276 this.store = store;
rlm@46 10277 },
rlm@46 10278
rlm@46 10279
rlm@46 10280 set : function(name, value){
rlm@46 10281 if(String(this.data[name]) == String(value)){
rlm@46 10282 return;
rlm@46 10283 }
rlm@46 10284 this.dirty = true;
rlm@46 10285 if(!this.modified){
rlm@46 10286 this.modified = {};
rlm@46 10287 }
rlm@46 10288 if(typeof this.modified[name] == 'undefined'){
rlm@46 10289 this.modified[name] = this.data[name];
rlm@46 10290 }
rlm@46 10291 this.data[name] = value;
rlm@46 10292 if(!this.editing && this.store){
rlm@46 10293 this.store.afterEdit(this);
rlm@46 10294 }
rlm@46 10295 },
rlm@46 10296
rlm@46 10297
rlm@46 10298 get : function(name){
rlm@46 10299 return this.data[name];
rlm@46 10300 },
rlm@46 10301
rlm@46 10302
rlm@46 10303 beginEdit : function(){
rlm@46 10304 this.editing = true;
rlm@46 10305 this.modified = {};
rlm@46 10306 },
rlm@46 10307
rlm@46 10308
rlm@46 10309 cancelEdit : function(){
rlm@46 10310 this.editing = false;
rlm@46 10311 delete this.modified;
rlm@46 10312 },
rlm@46 10313
rlm@46 10314
rlm@46 10315 endEdit : function(){
rlm@46 10316 this.editing = false;
rlm@46 10317 if(this.dirty && this.store){
rlm@46 10318 this.store.afterEdit(this);
rlm@46 10319 }
rlm@46 10320 },
rlm@46 10321
rlm@46 10322
rlm@46 10323 reject : function(silent){
rlm@46 10324 var m = this.modified;
rlm@46 10325 for(var n in m){
rlm@46 10326 if(typeof m[n] != "function"){
rlm@46 10327 this.data[n] = m[n];
rlm@46 10328 }
rlm@46 10329 }
rlm@46 10330 this.dirty = false;
rlm@46 10331 delete this.modified;
rlm@46 10332 this.editing = false;
rlm@46 10333 if(this.store && silent !== true){
rlm@46 10334 this.store.afterReject(this);
rlm@46 10335 }
rlm@46 10336 },
rlm@46 10337
rlm@46 10338
rlm@46 10339 commit : function(silent){
rlm@46 10340 this.dirty = false;
rlm@46 10341 delete this.modified;
rlm@46 10342 this.editing = false;
rlm@46 10343 if(this.store && silent !== true){
rlm@46 10344 this.store.afterCommit(this);
rlm@46 10345 }
rlm@46 10346 },
rlm@46 10347
rlm@46 10348
rlm@46 10349 getChanges : function(){
rlm@46 10350 var m = this.modified, cs = {};
rlm@46 10351 for(var n in m){
rlm@46 10352 if(m.hasOwnProperty(n)){
rlm@46 10353 cs[n] = this.data[n];
rlm@46 10354 }
rlm@46 10355 }
rlm@46 10356 return cs;
rlm@46 10357 },
rlm@46 10358
rlm@46 10359 hasError : function(){
rlm@46 10360 return this.error != null;
rlm@46 10361 },
rlm@46 10362
rlm@46 10363 clearError : function(){
rlm@46 10364 this.error = null;
rlm@46 10365 },
rlm@46 10366
rlm@46 10367
rlm@46 10368 copy : function(newId) {
rlm@46 10369 return new this.constructor(Ext.apply({}, this.data), newId || this.id);
rlm@46 10370 },
rlm@46 10371
rlm@46 10372
rlm@46 10373 isModified : function(fieldName){
rlm@46 10374 return this.modified && this.modified.hasOwnProperty(fieldName);
rlm@46 10375 }
rlm@46 10376 };
rlm@46 10377
rlm@46 10378 Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
rlm@46 10379
rlm@46 10380
rlm@46 10381
rlm@46 10382 register : function(){
rlm@46 10383 for(var i = 0, s; s = arguments[i]; i++){
rlm@46 10384 this.add(s);
rlm@46 10385 }
rlm@46 10386 },
rlm@46 10387
rlm@46 10388
rlm@46 10389 unregister : function(){
rlm@46 10390 for(var i = 0, s; s = arguments[i]; i++){
rlm@46 10391 this.remove(this.lookup(s));
rlm@46 10392 }
rlm@46 10393 },
rlm@46 10394
rlm@46 10395
rlm@46 10396 lookup : function(id){
rlm@46 10397 return typeof id == "object" ? id : this.get(id);
rlm@46 10398 },
rlm@46 10399
rlm@46 10400 getKey : function(o){
rlm@46 10401 return o.storeId || o.id;
rlm@46 10402 }
rlm@46 10403 });
rlm@46 10404
rlm@46 10405 Ext.data.Store = function(config){
rlm@46 10406 this.data = new Ext.util.MixedCollection(false);
rlm@46 10407 this.data.getKey = function(o){
rlm@46 10408 return o.id;
rlm@46 10409 };
rlm@46 10410
rlm@46 10411 this.baseParams = {};
rlm@46 10412 this.paramNames = {
rlm@46 10413 "start" : "start",
rlm@46 10414 "limit" : "limit",
rlm@46 10415 "sort" : "sort",
rlm@46 10416 "dir" : "dir"
rlm@46 10417 };
rlm@46 10418
rlm@46 10419 if(config && config.data){
rlm@46 10420 this.inlineData = config.data;
rlm@46 10421 delete config.data;
rlm@46 10422 }
rlm@46 10423
rlm@46 10424 Ext.apply(this, config);
rlm@46 10425
rlm@46 10426 if(this.url && !this.proxy){
rlm@46 10427 this.proxy = new Ext.data.HttpProxy({url: this.url});
rlm@46 10428 }
rlm@46 10429
rlm@46 10430 if(this.reader){ if(!this.recordType){
rlm@46 10431 this.recordType = this.reader.recordType;
rlm@46 10432 }
rlm@46 10433 if(this.reader.onMetaChange){
rlm@46 10434 this.reader.onMetaChange = this.onMetaChange.createDelegate(this);
rlm@46 10435 }
rlm@46 10436 }
rlm@46 10437
rlm@46 10438 if(this.recordType){
rlm@46 10439 this.fields = this.recordType.prototype.fields;
rlm@46 10440 }
rlm@46 10441 this.modified = [];
rlm@46 10442
rlm@46 10443 this.addEvents(
rlm@46 10444
rlm@46 10445 'datachanged',
rlm@46 10446
rlm@46 10447 'metachange',
rlm@46 10448
rlm@46 10449 'add',
rlm@46 10450
rlm@46 10451 'remove',
rlm@46 10452
rlm@46 10453 'update',
rlm@46 10454
rlm@46 10455 'clear',
rlm@46 10456
rlm@46 10457 'beforeload',
rlm@46 10458
rlm@46 10459 'load',
rlm@46 10460
rlm@46 10461 'loadexception'
rlm@46 10462 );
rlm@46 10463
rlm@46 10464 if(this.proxy){
rlm@46 10465 this.relayEvents(this.proxy, ["loadexception"]);
rlm@46 10466 }
rlm@46 10467
rlm@46 10468 this.sortToggle = {};
rlm@46 10469 if(this.sortInfo){
rlm@46 10470 this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);
rlm@46 10471 }
rlm@46 10472
rlm@46 10473 Ext.data.Store.superclass.constructor.call(this);
rlm@46 10474
rlm@46 10475 if(this.storeId || this.id){
rlm@46 10476 Ext.StoreMgr.register(this);
rlm@46 10477 }
rlm@46 10478 if(this.inlineData){
rlm@46 10479 this.loadData(this.inlineData);
rlm@46 10480 delete this.inlineData;
rlm@46 10481 }else if(this.autoLoad){
rlm@46 10482 this.load.defer(10, this, [
rlm@46 10483 typeof this.autoLoad == 'object' ?
rlm@46 10484 this.autoLoad : undefined]);
rlm@46 10485 }
rlm@46 10486 };
rlm@46 10487 Ext.extend(Ext.data.Store, Ext.util.Observable, {
rlm@46 10488
rlm@46 10489
rlm@46 10490
rlm@46 10491
rlm@46 10492
rlm@46 10493
rlm@46 10494
rlm@46 10495
rlm@46 10496
rlm@46 10497 remoteSort : false,
rlm@46 10498
rlm@46 10499
rlm@46 10500 pruneModifiedRecords : false,
rlm@46 10501
rlm@46 10502
rlm@46 10503 lastOptions : null,
rlm@46 10504
rlm@46 10505 destroy : function(){
rlm@46 10506 if(this.id){
rlm@46 10507 Ext.StoreMgr.unregister(this);
rlm@46 10508 }
rlm@46 10509 this.data = null;
rlm@46 10510 this.purgeListeners();
rlm@46 10511 },
rlm@46 10512
rlm@46 10513
rlm@46 10514 add : function(records){
rlm@46 10515 records = [].concat(records);
rlm@46 10516 if(records.length < 1){
rlm@46 10517 return;
rlm@46 10518 }
rlm@46 10519 for(var i = 0, len = records.length; i < len; i++){
rlm@46 10520 records[i].join(this);
rlm@46 10521 }
rlm@46 10522 var index = this.data.length;
rlm@46 10523 this.data.addAll(records);
rlm@46 10524 if(this.snapshot){
rlm@46 10525 this.snapshot.addAll(records);
rlm@46 10526 }
rlm@46 10527 this.fireEvent("add", this, records, index);
rlm@46 10528 },
rlm@46 10529
rlm@46 10530
rlm@46 10531 addSorted : function(record){
rlm@46 10532 var index = this.findInsertIndex(record);
rlm@46 10533 this.insert(index, record);
rlm@46 10534 },
rlm@46 10535
rlm@46 10536
rlm@46 10537 remove : function(record){
rlm@46 10538 var index = this.data.indexOf(record);
rlm@46 10539 this.data.removeAt(index);
rlm@46 10540 if(this.pruneModifiedRecords){
rlm@46 10541 this.modified.remove(record);
rlm@46 10542 }
rlm@46 10543 if(this.snapshot){
rlm@46 10544 this.snapshot.remove(record);
rlm@46 10545 }
rlm@46 10546 this.fireEvent("remove", this, record, index);
rlm@46 10547 },
rlm@46 10548
rlm@46 10549
rlm@46 10550 removeAll : function(){
rlm@46 10551 this.data.clear();
rlm@46 10552 if(this.snapshot){
rlm@46 10553 this.snapshot.clear();
rlm@46 10554 }
rlm@46 10555 if(this.pruneModifiedRecords){
rlm@46 10556 this.modified = [];
rlm@46 10557 }
rlm@46 10558 this.fireEvent("clear", this);
rlm@46 10559 },
rlm@46 10560
rlm@46 10561
rlm@46 10562 insert : function(index, records){
rlm@46 10563 records = [].concat(records);
rlm@46 10564 for(var i = 0, len = records.length; i < len; i++){
rlm@46 10565 this.data.insert(index, records[i]);
rlm@46 10566 records[i].join(this);
rlm@46 10567 }
rlm@46 10568 this.fireEvent("add", this, records, index);
rlm@46 10569 },
rlm@46 10570
rlm@46 10571
rlm@46 10572 indexOf : function(record){
rlm@46 10573 return this.data.indexOf(record);
rlm@46 10574 },
rlm@46 10575
rlm@46 10576
rlm@46 10577 indexOfId : function(id){
rlm@46 10578 return this.data.indexOfKey(id);
rlm@46 10579 },
rlm@46 10580
rlm@46 10581
rlm@46 10582 getById : function(id){
rlm@46 10583 return this.data.key(id);
rlm@46 10584 },
rlm@46 10585
rlm@46 10586
rlm@46 10587 getAt : function(index){
rlm@46 10588 return this.data.itemAt(index);
rlm@46 10589 },
rlm@46 10590
rlm@46 10591
rlm@46 10592 getRange : function(start, end){
rlm@46 10593 return this.data.getRange(start, end);
rlm@46 10594 },
rlm@46 10595
rlm@46 10596 storeOptions : function(o){
rlm@46 10597 o = Ext.apply({}, o);
rlm@46 10598 delete o.callback;
rlm@46 10599 delete o.scope;
rlm@46 10600 this.lastOptions = o;
rlm@46 10601 },
rlm@46 10602
rlm@46 10603
rlm@46 10604 load : function(options){
rlm@46 10605 options = options || {};
rlm@46 10606 if(this.fireEvent("beforeload", this, options) !== false){
rlm@46 10607 this.storeOptions(options);
rlm@46 10608 var p = Ext.apply(options.params || {}, this.baseParams);
rlm@46 10609 if(this.sortInfo && this.remoteSort){
rlm@46 10610 var pn = this.paramNames;
rlm@46 10611 p[pn["sort"]] = this.sortInfo.field;
rlm@46 10612 p[pn["dir"]] = this.sortInfo.direction;
rlm@46 10613 }
rlm@46 10614 this.proxy.load(p, this.reader, this.loadRecords, this, options);
rlm@46 10615 return true;
rlm@46 10616 } else {
rlm@46 10617 return false;
rlm@46 10618 }
rlm@46 10619 },
rlm@46 10620
rlm@46 10621
rlm@46 10622 reload : function(options){
rlm@46 10623 this.load(Ext.applyIf(options||{}, this.lastOptions));
rlm@46 10624 },
rlm@46 10625
rlm@46 10626 loadRecords : function(o, options, success){
rlm@46 10627 if(!o || success === false){
rlm@46 10628 if(success !== false){
rlm@46 10629 this.fireEvent("load", this, [], options);
rlm@46 10630 }
rlm@46 10631 if(options.callback){
rlm@46 10632 options.callback.call(options.scope || this, [], options, false);
rlm@46 10633 }
rlm@46 10634 return;
rlm@46 10635 }
rlm@46 10636 var r = o.records, t = o.totalRecords || r.length;
rlm@46 10637 if(!options || options.add !== true){
rlm@46 10638 if(this.pruneModifiedRecords){
rlm@46 10639 this.modified = [];
rlm@46 10640 }
rlm@46 10641 for(var i = 0, len = r.length; i < len; i++){
rlm@46 10642 r[i].join(this);
rlm@46 10643 }
rlm@46 10644 if(this.snapshot){
rlm@46 10645 this.data = this.snapshot;
rlm@46 10646 delete this.snapshot;
rlm@46 10647 }
rlm@46 10648 this.data.clear();
rlm@46 10649 this.data.addAll(r);
rlm@46 10650 this.totalLength = t;
rlm@46 10651 this.applySort();
rlm@46 10652 this.fireEvent("datachanged", this);
rlm@46 10653 }else{
rlm@46 10654 this.totalLength = Math.max(t, this.data.length+r.length);
rlm@46 10655 this.add(r);
rlm@46 10656 }
rlm@46 10657 this.fireEvent("load", this, r, options);
rlm@46 10658 if(options.callback){
rlm@46 10659 options.callback.call(options.scope || this, r, options, true);
rlm@46 10660 }
rlm@46 10661 },
rlm@46 10662
rlm@46 10663
rlm@46 10664 loadData : function(o, append){
rlm@46 10665 var r = this.reader.readRecords(o);
rlm@46 10666 this.loadRecords(r, {add: append}, true);
rlm@46 10667 },
rlm@46 10668
rlm@46 10669
rlm@46 10670 getCount : function(){
rlm@46 10671 return this.data.length || 0;
rlm@46 10672 },
rlm@46 10673
rlm@46 10674
rlm@46 10675 getTotalCount : function(){
rlm@46 10676 return this.totalLength || 0;
rlm@46 10677 },
rlm@46 10678
rlm@46 10679
rlm@46 10680 getSortState : function(){
rlm@46 10681 return this.sortInfo;
rlm@46 10682 },
rlm@46 10683
rlm@46 10684 applySort : function(){
rlm@46 10685 if(this.sortInfo && !this.remoteSort){
rlm@46 10686 var s = this.sortInfo, f = s.field;
rlm@46 10687 this.sortData(f, s.direction);
rlm@46 10688 }
rlm@46 10689 },
rlm@46 10690
rlm@46 10691 sortData : function(f, direction){
rlm@46 10692 direction = direction || 'ASC';
rlm@46 10693 var st = this.fields.get(f).sortType;
rlm@46 10694 var fn = function(r1, r2){
rlm@46 10695 var v1 = st(r1.data[f]), v2 = st(r2.data[f]);
rlm@46 10696 return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
rlm@46 10697 };
rlm@46 10698 this.data.sort(direction, fn);
rlm@46 10699 if(this.snapshot && this.snapshot != this.data){
rlm@46 10700 this.snapshot.sort(direction, fn);
rlm@46 10701 }
rlm@46 10702 },
rlm@46 10703
rlm@46 10704
rlm@46 10705 setDefaultSort : function(field, dir){
rlm@46 10706 dir = dir ? dir.toUpperCase() : "ASC";
rlm@46 10707 this.sortInfo = {field: field, direction: dir};
rlm@46 10708 this.sortToggle[field] = dir;
rlm@46 10709 },
rlm@46 10710
rlm@46 10711
rlm@46 10712 sort : function(fieldName, dir){
rlm@46 10713 var f = this.fields.get(fieldName);
rlm@46 10714 if(!f){
rlm@46 10715 return false;
rlm@46 10716 }
rlm@46 10717 if(!dir){
rlm@46 10718 if(this.sortInfo && this.sortInfo.field == f.name){ dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC");
rlm@46 10719 }else{
rlm@46 10720 dir = f.sortDir;
rlm@46 10721 }
rlm@46 10722 }
rlm@46 10723 var st = (this.sortToggle) ? this.sortToggle[f.name] : null;
rlm@46 10724 var si = (this.sortInfo) ? this.sortInfo : null;
rlm@46 10725
rlm@46 10726 this.sortToggle[f.name] = dir;
rlm@46 10727 this.sortInfo = {field: f.name, direction: dir};
rlm@46 10728 if(!this.remoteSort){
rlm@46 10729 this.applySort();
rlm@46 10730 this.fireEvent("datachanged", this);
rlm@46 10731 }else{
rlm@46 10732 if (!this.load(this.lastOptions)) {
rlm@46 10733 if (st) {
rlm@46 10734 this.sortToggle[f.name] = st;
rlm@46 10735 }
rlm@46 10736 if (si) {
rlm@46 10737 this.sortInfo = si;
rlm@46 10738 }
rlm@46 10739 }
rlm@46 10740 }
rlm@46 10741 },
rlm@46 10742
rlm@46 10743
rlm@46 10744 each : function(fn, scope){
rlm@46 10745 this.data.each(fn, scope);
rlm@46 10746 },
rlm@46 10747
rlm@46 10748
rlm@46 10749 getModifiedRecords : function(){
rlm@46 10750 return this.modified;
rlm@46 10751 },
rlm@46 10752
rlm@46 10753 createFilterFn : function(property, value, anyMatch, caseSensitive){
rlm@46 10754 if(Ext.isEmpty(value, false)){
rlm@46 10755 return false;
rlm@46 10756 }
rlm@46 10757 value = this.data.createValueMatcher(value, anyMatch, caseSensitive);
rlm@46 10758 return function(r){
rlm@46 10759 return value.test(r.data[property]);
rlm@46 10760 };
rlm@46 10761 },
rlm@46 10762
rlm@46 10763
rlm@46 10764 sum : function(property, start, end){
rlm@46 10765 var rs = this.data.items, v = 0;
rlm@46 10766 start = start || 0;
rlm@46 10767 end = (end || end === 0) ? end : rs.length-1;
rlm@46 10768
rlm@46 10769 for(var i = start; i <= end; i++){
rlm@46 10770 v += (rs[i].data[property] || 0);
rlm@46 10771 }
rlm@46 10772 return v;
rlm@46 10773 },
rlm@46 10774
rlm@46 10775
rlm@46 10776 filter : function(property, value, anyMatch, caseSensitive){
rlm@46 10777 var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
rlm@46 10778 return fn ? this.filterBy(fn) : this.clearFilter();
rlm@46 10779 },
rlm@46 10780
rlm@46 10781
rlm@46 10782 filterBy : function(fn, scope){
rlm@46 10783 this.snapshot = this.snapshot || this.data;
rlm@46 10784 this.data = this.queryBy(fn, scope||this);
rlm@46 10785 this.fireEvent("datachanged", this);
rlm@46 10786 },
rlm@46 10787
rlm@46 10788
rlm@46 10789 query : function(property, value, anyMatch, caseSensitive){
rlm@46 10790 var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
rlm@46 10791 return fn ? this.queryBy(fn) : this.data.clone();
rlm@46 10792 },
rlm@46 10793
rlm@46 10794
rlm@46 10795 queryBy : function(fn, scope){
rlm@46 10796 var data = this.snapshot || this.data;
rlm@46 10797 return data.filterBy(fn, scope||this);
rlm@46 10798 },
rlm@46 10799
rlm@46 10800
rlm@46 10801 find : function(property, value, start, anyMatch, caseSensitive){
rlm@46 10802 var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
rlm@46 10803 return fn ? this.data.findIndexBy(fn, null, start) : -1;
rlm@46 10804 },
rlm@46 10805
rlm@46 10806
rlm@46 10807 findBy : function(fn, scope, start){
rlm@46 10808 return this.data.findIndexBy(fn, scope, start);
rlm@46 10809 },
rlm@46 10810
rlm@46 10811
rlm@46 10812 collect : function(dataIndex, allowNull, bypassFilter){
rlm@46 10813 var d = (bypassFilter === true && this.snapshot) ?
rlm@46 10814 this.snapshot.items : this.data.items;
rlm@46 10815 var v, sv, r = [], l = {};
rlm@46 10816 for(var i = 0, len = d.length; i < len; i++){
rlm@46 10817 v = d[i].data[dataIndex];
rlm@46 10818 sv = String(v);
rlm@46 10819 if((allowNull || !Ext.isEmpty(v)) && !l[sv]){
rlm@46 10820 l[sv] = true;
rlm@46 10821 r[r.length] = v;
rlm@46 10822 }
rlm@46 10823 }
rlm@46 10824 return r;
rlm@46 10825 },
rlm@46 10826
rlm@46 10827
rlm@46 10828 clearFilter : function(suppressEvent){
rlm@46 10829 if(this.isFiltered()){
rlm@46 10830 this.data = this.snapshot;
rlm@46 10831 delete this.snapshot;
rlm@46 10832 if(suppressEvent !== true){
rlm@46 10833 this.fireEvent("datachanged", this);
rlm@46 10834 }
rlm@46 10835 }
rlm@46 10836 },
rlm@46 10837
rlm@46 10838
rlm@46 10839 isFiltered : function(){
rlm@46 10840 return this.snapshot && this.snapshot != this.data;
rlm@46 10841 },
rlm@46 10842
rlm@46 10843 afterEdit : function(record){
rlm@46 10844 if(this.modified.indexOf(record) == -1){
rlm@46 10845 this.modified.push(record);
rlm@46 10846 }
rlm@46 10847 this.fireEvent("update", this, record, Ext.data.Record.EDIT);
rlm@46 10848 },
rlm@46 10849
rlm@46 10850 afterReject : function(record){
rlm@46 10851 this.modified.remove(record);
rlm@46 10852 this.fireEvent("update", this, record, Ext.data.Record.REJECT);
rlm@46 10853 },
rlm@46 10854
rlm@46 10855 afterCommit : function(record){
rlm@46 10856 this.modified.remove(record);
rlm@46 10857 this.fireEvent("update", this, record, Ext.data.Record.COMMIT);
rlm@46 10858 },
rlm@46 10859
rlm@46 10860
rlm@46 10861 commitChanges : function(){
rlm@46 10862 var m = this.modified.slice(0);
rlm@46 10863 this.modified = [];
rlm@46 10864 for(var i = 0, len = m.length; i < len; i++){
rlm@46 10865 m[i].commit();
rlm@46 10866 }
rlm@46 10867 },
rlm@46 10868
rlm@46 10869
rlm@46 10870 rejectChanges : function(){
rlm@46 10871 var m = this.modified.slice(0);
rlm@46 10872 this.modified = [];
rlm@46 10873 for(var i = 0, len = m.length; i < len; i++){
rlm@46 10874 m[i].reject();
rlm@46 10875 }
rlm@46 10876 },
rlm@46 10877
rlm@46 10878 onMetaChange : function(meta, rtype, o){
rlm@46 10879 this.recordType = rtype;
rlm@46 10880 this.fields = rtype.prototype.fields;
rlm@46 10881 delete this.snapshot;
rlm@46 10882 this.sortInfo = meta.sortInfo;
rlm@46 10883 this.modified = [];
rlm@46 10884 this.fireEvent('metachange', this, this.reader.meta);
rlm@46 10885 },
rlm@46 10886
rlm@46 10887 findInsertIndex : function(record){
rlm@46 10888 this.suspendEvents();
rlm@46 10889 var data = this.data.clone();
rlm@46 10890 this.data.add(record);
rlm@46 10891 this.applySort();
rlm@46 10892 var index = this.data.indexOf(record);
rlm@46 10893 this.data = data;
rlm@46 10894 this.resumeEvents();
rlm@46 10895 return index;
rlm@46 10896 }
rlm@46 10897 });
rlm@46 10898
rlm@46 10899 Ext.data.SimpleStore = function(config){
rlm@46 10900 Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {
rlm@46 10901 reader: new Ext.data.ArrayReader({
rlm@46 10902 id: config.id
rlm@46 10903 },
rlm@46 10904 Ext.data.Record.create(config.fields)
rlm@46 10905 )
rlm@46 10906 }));
rlm@46 10907 };
rlm@46 10908 Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {
rlm@46 10909 loadData : function(data, append){
rlm@46 10910 if(this.expandData === true){
rlm@46 10911 var r = [];
rlm@46 10912 for(var i = 0, len = data.length; i < len; i++){
rlm@46 10913 r[r.length] = [data[i]];
rlm@46 10914 }
rlm@46 10915 data = r;
rlm@46 10916 }
rlm@46 10917 Ext.data.SimpleStore.superclass.loadData.call(this, data, append);
rlm@46 10918 }
rlm@46 10919 });
rlm@46 10920
rlm@46 10921 Ext.data.JsonStore = function(c){
rlm@46 10922 Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {
rlm@46 10923 proxy: !c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined,
rlm@46 10924 reader: new Ext.data.JsonReader(c, c.fields)
rlm@46 10925 }));
rlm@46 10926 };
rlm@46 10927 Ext.extend(Ext.data.JsonStore, Ext.data.Store);
rlm@46 10928
rlm@46 10929
rlm@46 10930
rlm@46 10931 Ext.data.Field = function(config){
rlm@46 10932 if(typeof config == "string"){
rlm@46 10933 config = {name: config};
rlm@46 10934 }
rlm@46 10935 Ext.apply(this, config);
rlm@46 10936
rlm@46 10937 if(!this.type){
rlm@46 10938 this.type = "auto";
rlm@46 10939 }
rlm@46 10940
rlm@46 10941 var st = Ext.data.SortTypes;
rlm@46 10942
rlm@46 10943 if(typeof this.sortType == "string"){
rlm@46 10944 this.sortType = st[this.sortType];
rlm@46 10945 }
rlm@46 10946
rlm@46 10947
rlm@46 10948 if(!this.sortType){
rlm@46 10949 switch(this.type){
rlm@46 10950 case "string":
rlm@46 10951 this.sortType = st.asUCString;
rlm@46 10952 break;
rlm@46 10953 case "date":
rlm@46 10954 this.sortType = st.asDate;
rlm@46 10955 break;
rlm@46 10956 default:
rlm@46 10957 this.sortType = st.none;
rlm@46 10958 }
rlm@46 10959 }
rlm@46 10960
rlm@46 10961
rlm@46 10962 var stripRe = /[\$,%]/g;
rlm@46 10963
rlm@46 10964
rlm@46 10965
rlm@46 10966 if(!this.convert){
rlm@46 10967 var cv, dateFormat = this.dateFormat;
rlm@46 10968 switch(this.type){
rlm@46 10969 case "":
rlm@46 10970 case "auto":
rlm@46 10971 case undefined:
rlm@46 10972 cv = function(v){ return v; };
rlm@46 10973 break;
rlm@46 10974 case "string":
rlm@46 10975 cv = function(v){ return (v === undefined || v === null) ? '' : String(v); };
rlm@46 10976 break;
rlm@46 10977 case "int":
rlm@46 10978 cv = function(v){
rlm@46 10979 return v !== undefined && v !== null && v !== '' ?
rlm@46 10980 parseInt(String(v).replace(stripRe, ""), 10) : '';
rlm@46 10981 };
rlm@46 10982 break;
rlm@46 10983 case "float":
rlm@46 10984 cv = function(v){
rlm@46 10985 return v !== undefined && v !== null && v !== '' ?
rlm@46 10986 parseFloat(String(v).replace(stripRe, ""), 10) : '';
rlm@46 10987 };
rlm@46 10988 break;
rlm@46 10989 case "bool":
rlm@46 10990 case "boolean":
rlm@46 10991 cv = function(v){ return v === true || v === "true" || v == 1; };
rlm@46 10992 break;
rlm@46 10993 case "date":
rlm@46 10994 cv = function(v){
rlm@46 10995 if(!v){
rlm@46 10996 return '';
rlm@46 10997 }
rlm@46 10998 if(Ext.isDate(v)){
rlm@46 10999 return v;
rlm@46 11000 }
rlm@46 11001 if(dateFormat){
rlm@46 11002 if(dateFormat == "timestamp"){
rlm@46 11003 return new Date(v*1000);
rlm@46 11004 }
rlm@46 11005 if(dateFormat == "time"){
rlm@46 11006 return new Date(parseInt(v, 10));
rlm@46 11007 }
rlm@46 11008 return Date.parseDate(v, dateFormat);
rlm@46 11009 }
rlm@46 11010 var parsed = Date.parse(v);
rlm@46 11011 return parsed ? new Date(parsed) : null;
rlm@46 11012 };
rlm@46 11013 break;
rlm@46 11014
rlm@46 11015 }
rlm@46 11016 this.convert = cv;
rlm@46 11017 }
rlm@46 11018 };
rlm@46 11019
rlm@46 11020 Ext.data.Field.prototype = {
rlm@46 11021 dateFormat: null,
rlm@46 11022 defaultValue: "",
rlm@46 11023 mapping: null,
rlm@46 11024 sortType : null,
rlm@46 11025 sortDir : "ASC"
rlm@46 11026 };
rlm@46 11027
rlm@46 11028 Ext.data.DataReader = function(meta, recordType){
rlm@46 11029
rlm@46 11030 this.meta = meta;
rlm@46 11031 this.recordType = Ext.isArray(recordType) ?
rlm@46 11032 Ext.data.Record.create(recordType) : recordType;
rlm@46 11033 };
rlm@46 11034
rlm@46 11035 Ext.data.DataReader.prototype = {
rlm@46 11036
rlm@46 11037 };
rlm@46 11038
rlm@46 11039 Ext.data.DataProxy = function(){
rlm@46 11040 this.addEvents(
rlm@46 11041
rlm@46 11042 'beforeload',
rlm@46 11043
rlm@46 11044 'load'
rlm@46 11045 );
rlm@46 11046 Ext.data.DataProxy.superclass.constructor.call(this);
rlm@46 11047 };
rlm@46 11048
rlm@46 11049 Ext.extend(Ext.data.DataProxy, Ext.util.Observable);
rlm@46 11050
rlm@46 11051 Ext.data.MemoryProxy = function(data){
rlm@46 11052 Ext.data.MemoryProxy.superclass.constructor.call(this);
rlm@46 11053 this.data = data;
rlm@46 11054 };
rlm@46 11055
rlm@46 11056 Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
rlm@46 11057
rlm@46 11058
rlm@46 11059
rlm@46 11060 load : function(params, reader, callback, scope, arg){
rlm@46 11061 params = params || {};
rlm@46 11062 var result;
rlm@46 11063 try {
rlm@46 11064 result = reader.readRecords(this.data);
rlm@46 11065 }catch(e){
rlm@46 11066 this.fireEvent("loadexception", this, arg, null, e);
rlm@46 11067 callback.call(scope, null, arg, false);
rlm@46 11068 return;
rlm@46 11069 }
rlm@46 11070 callback.call(scope, result, arg, true);
rlm@46 11071 },
rlm@46 11072
rlm@46 11073
rlm@46 11074 update : function(params, records){
rlm@46 11075
rlm@46 11076 }
rlm@46 11077 });
rlm@46 11078
rlm@46 11079 Ext.data.HttpProxy = function(conn){
rlm@46 11080 Ext.data.HttpProxy.superclass.constructor.call(this);
rlm@46 11081
rlm@46 11082 this.conn = conn;
rlm@46 11083 this.useAjax = !conn || !conn.events;
rlm@46 11084
rlm@46 11085
rlm@46 11086 };
rlm@46 11087
rlm@46 11088 Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
rlm@46 11089
rlm@46 11090 getConnection : function(){
rlm@46 11091 return this.useAjax ? Ext.Ajax : this.conn;
rlm@46 11092 },
rlm@46 11093
rlm@46 11094
rlm@46 11095 load : function(params, reader, callback, scope, arg){
rlm@46 11096 if(this.fireEvent("beforeload", this, params) !== false){
rlm@46 11097 var o = {
rlm@46 11098 params : params || {},
rlm@46 11099 request: {
rlm@46 11100 callback : callback,
rlm@46 11101 scope : scope,
rlm@46 11102 arg : arg
rlm@46 11103 },
rlm@46 11104 reader: reader,
rlm@46 11105 callback : this.loadResponse,
rlm@46 11106 scope: this
rlm@46 11107 };
rlm@46 11108 if(this.useAjax){
rlm@46 11109 Ext.applyIf(o, this.conn);
rlm@46 11110 if(this.activeRequest){
rlm@46 11111 Ext.Ajax.abort(this.activeRequest);
rlm@46 11112 }
rlm@46 11113 this.activeRequest = Ext.Ajax.request(o);
rlm@46 11114 }else{
rlm@46 11115 this.conn.request(o);
rlm@46 11116 }
rlm@46 11117 }else{
rlm@46 11118 callback.call(scope||this, null, arg, false);
rlm@46 11119 }
rlm@46 11120 },
rlm@46 11121
rlm@46 11122
rlm@46 11123 loadResponse : function(o, success, response){
rlm@46 11124 delete this.activeRequest;
rlm@46 11125 if(!success){
rlm@46 11126 this.fireEvent("loadexception", this, o, response);
rlm@46 11127 o.request.callback.call(o.request.scope, null, o.request.arg, false);
rlm@46 11128 return;
rlm@46 11129 }
rlm@46 11130 var result;
rlm@46 11131 try {
rlm@46 11132 result = o.reader.read(response);
rlm@46 11133 }catch(e){
rlm@46 11134 this.fireEvent("loadexception", this, o, response, e);
rlm@46 11135 o.request.callback.call(o.request.scope, null, o.request.arg, false);
rlm@46 11136 return;
rlm@46 11137 }
rlm@46 11138 this.fireEvent("load", this, o, o.request.arg);
rlm@46 11139 o.request.callback.call(o.request.scope, result, o.request.arg, true);
rlm@46 11140 },
rlm@46 11141
rlm@46 11142
rlm@46 11143 update : function(dataSet){
rlm@46 11144
rlm@46 11145 },
rlm@46 11146
rlm@46 11147
rlm@46 11148 updateResponse : function(dataSet){
rlm@46 11149
rlm@46 11150 }
rlm@46 11151 });
rlm@46 11152
rlm@46 11153 Ext.data.ScriptTagProxy = function(config){
rlm@46 11154 Ext.data.ScriptTagProxy.superclass.constructor.call(this);
rlm@46 11155 Ext.apply(this, config);
rlm@46 11156 this.head = document.getElementsByTagName("head")[0];
rlm@46 11157
rlm@46 11158
rlm@46 11159 };
rlm@46 11160
rlm@46 11161 Ext.data.ScriptTagProxy.TRANS_ID = 1000;
rlm@46 11162
rlm@46 11163 Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
rlm@46 11164
rlm@46 11165
rlm@46 11166 timeout : 30000,
rlm@46 11167
rlm@46 11168 callbackParam : "callback",
rlm@46 11169
rlm@46 11170 nocache : true,
rlm@46 11171
rlm@46 11172
rlm@46 11173 load : function(params, reader, callback, scope, arg){
rlm@46 11174 if(this.fireEvent("beforeload", this, params) !== false){
rlm@46 11175
rlm@46 11176 var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
rlm@46 11177
rlm@46 11178 var url = this.url;
rlm@46 11179 url += (url.indexOf("?") != -1 ? "&" : "?") + p;
rlm@46 11180 if(this.nocache){
rlm@46 11181 url += "&_dc=" + (new Date().getTime());
rlm@46 11182 }
rlm@46 11183 var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
rlm@46 11184 var trans = {
rlm@46 11185 id : transId,
rlm@46 11186 cb : "stcCallback"+transId,
rlm@46 11187 scriptId : "stcScript"+transId,
rlm@46 11188 params : params,
rlm@46 11189 arg : arg,
rlm@46 11190 url : url,
rlm@46 11191 callback : callback,
rlm@46 11192 scope : scope,
rlm@46 11193 reader : reader
rlm@46 11194 };
rlm@46 11195 var conn = this;
rlm@46 11196
rlm@46 11197 window[trans.cb] = function(o){
rlm@46 11198 conn.handleResponse(o, trans);
rlm@46 11199 };
rlm@46 11200
rlm@46 11201 url += String.format("&{0}={1}", this.callbackParam, trans.cb);
rlm@46 11202
rlm@46 11203 if(this.autoAbort !== false){
rlm@46 11204 this.abort();
rlm@46 11205 }
rlm@46 11206
rlm@46 11207 trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
rlm@46 11208
rlm@46 11209 var script = document.createElement("script");
rlm@46 11210 script.setAttribute("src", url);
rlm@46 11211 script.setAttribute("type", "text/javascript");
rlm@46 11212 script.setAttribute("id", trans.scriptId);
rlm@46 11213 this.head.appendChild(script);
rlm@46 11214
rlm@46 11215 this.trans = trans;
rlm@46 11216 }else{
rlm@46 11217 callback.call(scope||this, null, arg, false);
rlm@46 11218 }
rlm@46 11219 },
rlm@46 11220
rlm@46 11221
rlm@46 11222 isLoading : function(){
rlm@46 11223 return this.trans ? true : false;
rlm@46 11224 },
rlm@46 11225
rlm@46 11226
rlm@46 11227 abort : function(){
rlm@46 11228 if(this.isLoading()){
rlm@46 11229 this.destroyTrans(this.trans);
rlm@46 11230 }
rlm@46 11231 },
rlm@46 11232
rlm@46 11233
rlm@46 11234 destroyTrans : function(trans, isLoaded){
rlm@46 11235 this.head.removeChild(document.getElementById(trans.scriptId));
rlm@46 11236 clearTimeout(trans.timeoutId);
rlm@46 11237 if(isLoaded){
rlm@46 11238 window[trans.cb] = undefined;
rlm@46 11239 try{
rlm@46 11240 delete window[trans.cb];
rlm@46 11241 }catch(e){}
rlm@46 11242 }else{
rlm@46 11243
rlm@46 11244 window[trans.cb] = function(){
rlm@46 11245 window[trans.cb] = undefined;
rlm@46 11246 try{
rlm@46 11247 delete window[trans.cb];
rlm@46 11248 }catch(e){}
rlm@46 11249 };
rlm@46 11250 }
rlm@46 11251 },
rlm@46 11252
rlm@46 11253
rlm@46 11254 handleResponse : function(o, trans){
rlm@46 11255 this.trans = false;
rlm@46 11256 this.destroyTrans(trans, true);
rlm@46 11257 var result;
rlm@46 11258 try {
rlm@46 11259 result = trans.reader.readRecords(o);
rlm@46 11260 }catch(e){
rlm@46 11261 this.fireEvent("loadexception", this, o, trans.arg, e);
rlm@46 11262 trans.callback.call(trans.scope||window, null, trans.arg, false);
rlm@46 11263 return;
rlm@46 11264 }
rlm@46 11265 this.fireEvent("load", this, o, trans.arg);
rlm@46 11266 trans.callback.call(trans.scope||window, result, trans.arg, true);
rlm@46 11267 },
rlm@46 11268
rlm@46 11269
rlm@46 11270 handleFailure : function(trans){
rlm@46 11271 this.trans = false;
rlm@46 11272 this.destroyTrans(trans, false);
rlm@46 11273 this.fireEvent("loadexception", this, null, trans.arg);
rlm@46 11274 trans.callback.call(trans.scope||window, null, trans.arg, false);
rlm@46 11275 }
rlm@46 11276 });
rlm@46 11277
rlm@46 11278 Ext.data.JsonReader = function(meta, recordType){
rlm@46 11279 meta = meta || {};
rlm@46 11280 Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);
rlm@46 11281 };
rlm@46 11282 Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
rlm@46 11283
rlm@46 11284
rlm@46 11285 read : function(response){
rlm@46 11286 var json = response.responseText;
rlm@46 11287 var o = eval("("+json+")");
rlm@46 11288 if(!o) {
rlm@46 11289 throw {message: "JsonReader.read: Json object not found"};
rlm@46 11290 }
rlm@46 11291 return this.readRecords(o);
rlm@46 11292 },
rlm@46 11293
rlm@46 11294 onMetaChange : function(meta, recordType, o){
rlm@46 11295
rlm@46 11296 },
rlm@46 11297
rlm@46 11298
rlm@46 11299 simpleAccess: function(obj, subsc) {
rlm@46 11300 return obj[subsc];
rlm@46 11301 },
rlm@46 11302
rlm@46 11303
rlm@46 11304 getJsonAccessor: function(){
rlm@46 11305 var re = /[\[\.]/;
rlm@46 11306 return function(expr) {
rlm@46 11307 try {
rlm@46 11308 return(re.test(expr))
rlm@46 11309 ? new Function("obj", "return obj." + expr)
rlm@46 11310 : function(obj){
rlm@46 11311 return obj[expr];
rlm@46 11312 };
rlm@46 11313 } catch(e){}
rlm@46 11314 return Ext.emptyFn;
rlm@46 11315 };
rlm@46 11316 }(),
rlm@46 11317
rlm@46 11318
rlm@46 11319 readRecords : function(o){
rlm@46 11320
rlm@46 11321 this.jsonData = o;
rlm@46 11322 if(o.metaData){
rlm@46 11323 delete this.ef;
rlm@46 11324 this.meta = o.metaData;
rlm@46 11325 this.recordType = Ext.data.Record.create(o.metaData.fields);
rlm@46 11326 this.onMetaChange(this.meta, this.recordType, o);
rlm@46 11327 }
rlm@46 11328 var s = this.meta, Record = this.recordType,
rlm@46 11329 f = Record.prototype.fields, fi = f.items, fl = f.length;
rlm@46 11330
rlm@46 11331 if (!this.ef) {
rlm@46 11332 if(s.totalProperty) {
rlm@46 11333 this.getTotal = this.getJsonAccessor(s.totalProperty);
rlm@46 11334 }
rlm@46 11335 if(s.successProperty) {
rlm@46 11336 this.getSuccess = this.getJsonAccessor(s.successProperty);
rlm@46 11337 }
rlm@46 11338 this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;};
rlm@46 11339 if (s.id) {
rlm@46 11340 var g = this.getJsonAccessor(s.id);
rlm@46 11341 this.getId = function(rec) {
rlm@46 11342 var r = g(rec);
rlm@46 11343 return (r === undefined || r === "") ? null : r;
rlm@46 11344 };
rlm@46 11345 } else {
rlm@46 11346 this.getId = function(){return null;};
rlm@46 11347 }
rlm@46 11348 this.ef = [];
rlm@46 11349 for(var i = 0; i < fl; i++){
rlm@46 11350 f = fi[i];
rlm@46 11351 var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
rlm@46 11352 this.ef[i] = this.getJsonAccessor(map);
rlm@46 11353 }
rlm@46 11354 }
rlm@46 11355
rlm@46 11356 var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;
rlm@46 11357 if(s.totalProperty){
rlm@46 11358 var v = parseInt(this.getTotal(o), 10);
rlm@46 11359 if(!isNaN(v)){
rlm@46 11360 totalRecords = v;
rlm@46 11361 }
rlm@46 11362 }
rlm@46 11363 if(s.successProperty){
rlm@46 11364 var v = this.getSuccess(o);
rlm@46 11365 if(v === false || v === 'false'){
rlm@46 11366 success = false;
rlm@46 11367 }
rlm@46 11368 }
rlm@46 11369 var records = [];
rlm@46 11370 for(var i = 0; i < c; i++){
rlm@46 11371 var n = root[i];
rlm@46 11372 var values = {};
rlm@46 11373 var id = this.getId(n);
rlm@46 11374 for(var j = 0; j < fl; j++){
rlm@46 11375 f = fi[j];
rlm@46 11376 var v = this.ef[j](n);
rlm@46 11377 values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, n);
rlm@46 11378 }
rlm@46 11379 var record = new Record(values, id);
rlm@46 11380 record.json = n;
rlm@46 11381 records[i] = record;
rlm@46 11382 }
rlm@46 11383 return {
rlm@46 11384 success : success,
rlm@46 11385 records : records,
rlm@46 11386 totalRecords : totalRecords
rlm@46 11387 };
rlm@46 11388 }
rlm@46 11389 });
rlm@46 11390
rlm@46 11391 Ext.data.XmlReader = function(meta, recordType){
rlm@46 11392 meta = meta || {};
rlm@46 11393 Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields);
rlm@46 11394 };
rlm@46 11395 Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
rlm@46 11396
rlm@46 11397 read : function(response){
rlm@46 11398 var doc = response.responseXML;
rlm@46 11399 if(!doc) {
rlm@46 11400 throw {message: "XmlReader.read: XML Document not available"};
rlm@46 11401 }
rlm@46 11402 return this.readRecords(doc);
rlm@46 11403 },
rlm@46 11404
rlm@46 11405
rlm@46 11406 readRecords : function(doc){
rlm@46 11407
rlm@46 11408 this.xmlData = doc;
rlm@46 11409 var root = doc.documentElement || doc;
rlm@46 11410 var q = Ext.DomQuery;
rlm@46 11411 var recordType = this.recordType, fields = recordType.prototype.fields;
rlm@46 11412 var sid = this.meta.id;
rlm@46 11413 var totalRecords = 0, success = true;
rlm@46 11414 if(this.meta.totalRecords){
rlm@46 11415 totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);
rlm@46 11416 }
rlm@46 11417
rlm@46 11418 if(this.meta.success){
rlm@46 11419 var sv = q.selectValue(this.meta.success, root, true);
rlm@46 11420 success = sv !== false && sv !== 'false';
rlm@46 11421 }
rlm@46 11422 var records = [];
rlm@46 11423 var ns = q.select(this.meta.record, root);
rlm@46 11424 for(var i = 0, len = ns.length; i < len; i++) {
rlm@46 11425 var n = ns[i];
rlm@46 11426 var values = {};
rlm@46 11427 var id = sid ? q.selectValue(sid, n) : undefined;
rlm@46 11428 for(var j = 0, jlen = fields.length; j < jlen; j++){
rlm@46 11429 var f = fields.items[j];
rlm@46 11430 var v = q.selectValue(f.mapping || f.name, n, f.defaultValue);
rlm@46 11431 v = f.convert(v, n);
rlm@46 11432 values[f.name] = v;
rlm@46 11433 }
rlm@46 11434 var record = new recordType(values, id);
rlm@46 11435 record.node = n;
rlm@46 11436 records[records.length] = record;
rlm@46 11437 }
rlm@46 11438
rlm@46 11439 return {
rlm@46 11440 success : success,
rlm@46 11441 records : records,
rlm@46 11442 totalRecords : totalRecords || records.length
rlm@46 11443 };
rlm@46 11444 }
rlm@46 11445 });
rlm@46 11446
rlm@46 11447 Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
rlm@46 11448
rlm@46 11449 readRecords : function(o){
rlm@46 11450 var sid = this.meta ? this.meta.id : null;
rlm@46 11451 var recordType = this.recordType, fields = recordType.prototype.fields;
rlm@46 11452 var records = [];
rlm@46 11453 var root = o;
rlm@46 11454 for(var i = 0; i < root.length; i++){
rlm@46 11455 var n = root[i];
rlm@46 11456 var values = {};
rlm@46 11457 var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
rlm@46 11458 for(var j = 0, jlen = fields.length; j < jlen; j++){
rlm@46 11459 var f = fields.items[j];
rlm@46 11460 var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
rlm@46 11461 var v = n[k] !== undefined ? n[k] : f.defaultValue;
rlm@46 11462 v = f.convert(v, n);
rlm@46 11463 values[f.name] = v;
rlm@46 11464 }
rlm@46 11465 var record = new recordType(values, id);
rlm@46 11466 record.json = n;
rlm@46 11467 records[records.length] = record;
rlm@46 11468 }
rlm@46 11469 return {
rlm@46 11470 records : records,
rlm@46 11471 totalRecords : records.length
rlm@46 11472 };
rlm@46 11473 }
rlm@46 11474 });
rlm@46 11475
rlm@46 11476 Ext.data.Tree = function(root){
rlm@46 11477 this.nodeHash = {};
rlm@46 11478
rlm@46 11479 this.root = null;
rlm@46 11480 if(root){
rlm@46 11481 this.setRootNode(root);
rlm@46 11482 }
rlm@46 11483 this.addEvents(
rlm@46 11484
rlm@46 11485 "append",
rlm@46 11486
rlm@46 11487 "remove",
rlm@46 11488
rlm@46 11489 "move",
rlm@46 11490
rlm@46 11491 "insert",
rlm@46 11492
rlm@46 11493 "beforeappend",
rlm@46 11494
rlm@46 11495 "beforeremove",
rlm@46 11496
rlm@46 11497 "beforemove",
rlm@46 11498
rlm@46 11499 "beforeinsert"
rlm@46 11500 );
rlm@46 11501
rlm@46 11502 Ext.data.Tree.superclass.constructor.call(this);
rlm@46 11503 };
rlm@46 11504
rlm@46 11505 Ext.extend(Ext.data.Tree, Ext.util.Observable, {
rlm@46 11506
rlm@46 11507 pathSeparator: "/",
rlm@46 11508
rlm@46 11509
rlm@46 11510 proxyNodeEvent : function(){
rlm@46 11511 return this.fireEvent.apply(this, arguments);
rlm@46 11512 },
rlm@46 11513
rlm@46 11514
rlm@46 11515 getRootNode : function(){
rlm@46 11516 return this.root;
rlm@46 11517 },
rlm@46 11518
rlm@46 11519
rlm@46 11520 setRootNode : function(node){
rlm@46 11521 this.root = node;
rlm@46 11522 node.ownerTree = this;
rlm@46 11523 node.isRoot = true;
rlm@46 11524 this.registerNode(node);
rlm@46 11525 return node;
rlm@46 11526 },
rlm@46 11527
rlm@46 11528
rlm@46 11529 getNodeById : function(id){
rlm@46 11530 return this.nodeHash[id];
rlm@46 11531 },
rlm@46 11532
rlm@46 11533
rlm@46 11534 registerNode : function(node){
rlm@46 11535 this.nodeHash[node.id] = node;
rlm@46 11536 },
rlm@46 11537
rlm@46 11538
rlm@46 11539 unregisterNode : function(node){
rlm@46 11540 delete this.nodeHash[node.id];
rlm@46 11541 },
rlm@46 11542
rlm@46 11543 toString : function(){
rlm@46 11544 return "[Tree"+(this.id?" "+this.id:"")+"]";
rlm@46 11545 }
rlm@46 11546 });
rlm@46 11547
rlm@46 11548
rlm@46 11549 Ext.data.Node = function(attributes){
rlm@46 11550
rlm@46 11551 this.attributes = attributes || {};
rlm@46 11552 this.leaf = this.attributes.leaf;
rlm@46 11553
rlm@46 11554 this.id = this.attributes.id;
rlm@46 11555 if(!this.id){
rlm@46 11556 this.id = Ext.id(null, "ynode-");
rlm@46 11557 this.attributes.id = this.id;
rlm@46 11558 }
rlm@46 11559
rlm@46 11560 this.childNodes = [];
rlm@46 11561 if(!this.childNodes.indexOf){
rlm@46 11562 this.childNodes.indexOf = function(o){
rlm@46 11563 for(var i = 0, len = this.length; i < len; i++){
rlm@46 11564 if(this[i] == o) return i;
rlm@46 11565 }
rlm@46 11566 return -1;
rlm@46 11567 };
rlm@46 11568 }
rlm@46 11569
rlm@46 11570 this.parentNode = null;
rlm@46 11571
rlm@46 11572 this.firstChild = null;
rlm@46 11573
rlm@46 11574 this.lastChild = null;
rlm@46 11575
rlm@46 11576 this.previousSibling = null;
rlm@46 11577
rlm@46 11578 this.nextSibling = null;
rlm@46 11579
rlm@46 11580 this.addEvents({
rlm@46 11581
rlm@46 11582 "append" : true,
rlm@46 11583
rlm@46 11584 "remove" : true,
rlm@46 11585
rlm@46 11586 "move" : true,
rlm@46 11587
rlm@46 11588 "insert" : true,
rlm@46 11589
rlm@46 11590 "beforeappend" : true,
rlm@46 11591
rlm@46 11592 "beforeremove" : true,
rlm@46 11593
rlm@46 11594 "beforemove" : true,
rlm@46 11595
rlm@46 11596 "beforeinsert" : true
rlm@46 11597 });
rlm@46 11598 this.listeners = this.attributes.listeners;
rlm@46 11599 Ext.data.Node.superclass.constructor.call(this);
rlm@46 11600 };
rlm@46 11601
rlm@46 11602 Ext.extend(Ext.data.Node, Ext.util.Observable, {
rlm@46 11603
rlm@46 11604 fireEvent : function(evtName){
rlm@46 11605
rlm@46 11606 if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){
rlm@46 11607 return false;
rlm@46 11608 }
rlm@46 11609
rlm@46 11610 var ot = this.getOwnerTree();
rlm@46 11611 if(ot){
rlm@46 11612 if(ot.proxyNodeEvent.apply(ot, arguments) === false){
rlm@46 11613 return false;
rlm@46 11614 }
rlm@46 11615 }
rlm@46 11616 return true;
rlm@46 11617 },
rlm@46 11618
rlm@46 11619
rlm@46 11620 isLeaf : function(){
rlm@46 11621 return this.leaf === true;
rlm@46 11622 },
rlm@46 11623
rlm@46 11624
rlm@46 11625 setFirstChild : function(node){
rlm@46 11626 this.firstChild = node;
rlm@46 11627 },
rlm@46 11628
rlm@46 11629
rlm@46 11630 setLastChild : function(node){
rlm@46 11631 this.lastChild = node;
rlm@46 11632 },
rlm@46 11633
rlm@46 11634
rlm@46 11635
rlm@46 11636 isLast : function(){
rlm@46 11637 return (!this.parentNode ? true : this.parentNode.lastChild == this);
rlm@46 11638 },
rlm@46 11639
rlm@46 11640
rlm@46 11641 isFirst : function(){
rlm@46 11642 return (!this.parentNode ? true : this.parentNode.firstChild == this);
rlm@46 11643 },
rlm@46 11644
rlm@46 11645 hasChildNodes : function(){
rlm@46 11646 return !this.isLeaf() && this.childNodes.length > 0;
rlm@46 11647 },
rlm@46 11648
rlm@46 11649
rlm@46 11650 appendChild : function(node){
rlm@46 11651 var multi = false;
rlm@46 11652 if(Ext.isArray(node)){
rlm@46 11653 multi = node;
rlm@46 11654 }else if(arguments.length > 1){
rlm@46 11655 multi = arguments;
rlm@46 11656 }
rlm@46 11657
rlm@46 11658 if(multi){
rlm@46 11659 for(var i = 0, len = multi.length; i < len; i++) {
rlm@46 11660 this.appendChild(multi[i]);
rlm@46 11661 }
rlm@46 11662 }else{
rlm@46 11663 if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){
rlm@46 11664 return false;
rlm@46 11665 }
rlm@46 11666 var index = this.childNodes.length;
rlm@46 11667 var oldParent = node.parentNode;
rlm@46 11668
rlm@46 11669 if(oldParent){
rlm@46 11670 if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){
rlm@46 11671 return false;
rlm@46 11672 }
rlm@46 11673 oldParent.removeChild(node);
rlm@46 11674 }
rlm@46 11675 index = this.childNodes.length;
rlm@46 11676 if(index == 0){
rlm@46 11677 this.setFirstChild(node);
rlm@46 11678 }
rlm@46 11679 this.childNodes.push(node);
rlm@46 11680 node.parentNode = this;
rlm@46 11681 var ps = this.childNodes[index-1];
rlm@46 11682 if(ps){
rlm@46 11683 node.previousSibling = ps;
rlm@46 11684 ps.nextSibling = node;
rlm@46 11685 }else{
rlm@46 11686 node.previousSibling = null;
rlm@46 11687 }
rlm@46 11688 node.nextSibling = null;
rlm@46 11689 this.setLastChild(node);
rlm@46 11690 node.setOwnerTree(this.getOwnerTree());
rlm@46 11691 this.fireEvent("append", this.ownerTree, this, node, index);
rlm@46 11692 if(oldParent){
rlm@46 11693 node.fireEvent("move", this.ownerTree, node, oldParent, this, index);
rlm@46 11694 }
rlm@46 11695 return node;
rlm@46 11696 }
rlm@46 11697 },
rlm@46 11698
rlm@46 11699
rlm@46 11700 removeChild : function(node){
rlm@46 11701 var index = this.childNodes.indexOf(node);
rlm@46 11702 if(index == -1){
rlm@46 11703 return false;
rlm@46 11704 }
rlm@46 11705 if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){
rlm@46 11706 return false;
rlm@46 11707 }
rlm@46 11708
rlm@46 11709
rlm@46 11710 this.childNodes.splice(index, 1);
rlm@46 11711
rlm@46 11712
rlm@46 11713 if(node.previousSibling){
rlm@46 11714 node.previousSibling.nextSibling = node.nextSibling;
rlm@46 11715 }
rlm@46 11716 if(node.nextSibling){
rlm@46 11717 node.nextSibling.previousSibling = node.previousSibling;
rlm@46 11718 }
rlm@46 11719
rlm@46 11720
rlm@46 11721 if(this.firstChild == node){
rlm@46 11722 this.setFirstChild(node.nextSibling);
rlm@46 11723 }
rlm@46 11724 if(this.lastChild == node){
rlm@46 11725 this.setLastChild(node.previousSibling);
rlm@46 11726 }
rlm@46 11727
rlm@46 11728 node.setOwnerTree(null);
rlm@46 11729
rlm@46 11730 node.parentNode = null;
rlm@46 11731 node.previousSibling = null;
rlm@46 11732 node.nextSibling = null;
rlm@46 11733 this.fireEvent("remove", this.ownerTree, this, node);
rlm@46 11734 return node;
rlm@46 11735 },
rlm@46 11736
rlm@46 11737
rlm@46 11738 insertBefore : function(node, refNode){
rlm@46 11739 if(!refNode){
rlm@46 11740 return this.appendChild(node);
rlm@46 11741 }
rlm@46 11742
rlm@46 11743 if(node == refNode){
rlm@46 11744 return false;
rlm@46 11745 }
rlm@46 11746
rlm@46 11747 if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){
rlm@46 11748 return false;
rlm@46 11749 }
rlm@46 11750 var index = this.childNodes.indexOf(refNode);
rlm@46 11751 var oldParent = node.parentNode;
rlm@46 11752 var refIndex = index;
rlm@46 11753
rlm@46 11754
rlm@46 11755 if(oldParent == this && this.childNodes.indexOf(node) < index){
rlm@46 11756 refIndex--;
rlm@46 11757 }
rlm@46 11758
rlm@46 11759
rlm@46 11760 if(oldParent){
rlm@46 11761 if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){
rlm@46 11762 return false;
rlm@46 11763 }
rlm@46 11764 oldParent.removeChild(node);
rlm@46 11765 }
rlm@46 11766 if(refIndex == 0){
rlm@46 11767 this.setFirstChild(node);
rlm@46 11768 }
rlm@46 11769 this.childNodes.splice(refIndex, 0, node);
rlm@46 11770 node.parentNode = this;
rlm@46 11771 var ps = this.childNodes[refIndex-1];
rlm@46 11772 if(ps){
rlm@46 11773 node.previousSibling = ps;
rlm@46 11774 ps.nextSibling = node;
rlm@46 11775 }else{
rlm@46 11776 node.previousSibling = null;
rlm@46 11777 }
rlm@46 11778 node.nextSibling = refNode;
rlm@46 11779 refNode.previousSibling = node;
rlm@46 11780 node.setOwnerTree(this.getOwnerTree());
rlm@46 11781 this.fireEvent("insert", this.ownerTree, this, node, refNode);
rlm@46 11782 if(oldParent){
rlm@46 11783 node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);
rlm@46 11784 }
rlm@46 11785 return node;
rlm@46 11786 },
rlm@46 11787
rlm@46 11788
rlm@46 11789 remove : function(){
rlm@46 11790 this.parentNode.removeChild(this);
rlm@46 11791 return this;
rlm@46 11792 },
rlm@46 11793
rlm@46 11794
rlm@46 11795 item : function(index){
rlm@46 11796 return this.childNodes[index];
rlm@46 11797 },
rlm@46 11798
rlm@46 11799
rlm@46 11800 replaceChild : function(newChild, oldChild){
rlm@46 11801 this.insertBefore(newChild, oldChild);
rlm@46 11802 this.removeChild(oldChild);
rlm@46 11803 return oldChild;
rlm@46 11804 },
rlm@46 11805
rlm@46 11806
rlm@46 11807 indexOf : function(child){
rlm@46 11808 return this.childNodes.indexOf(child);
rlm@46 11809 },
rlm@46 11810
rlm@46 11811
rlm@46 11812 getOwnerTree : function(){
rlm@46 11813
rlm@46 11814 if(!this.ownerTree){
rlm@46 11815 var p = this;
rlm@46 11816 while(p){
rlm@46 11817 if(p.ownerTree){
rlm@46 11818 this.ownerTree = p.ownerTree;
rlm@46 11819 break;
rlm@46 11820 }
rlm@46 11821 p = p.parentNode;
rlm@46 11822 }
rlm@46 11823 }
rlm@46 11824 return this.ownerTree;
rlm@46 11825 },
rlm@46 11826
rlm@46 11827
rlm@46 11828 getDepth : function(){
rlm@46 11829 var depth = 0;
rlm@46 11830 var p = this;
rlm@46 11831 while(p.parentNode){
rlm@46 11832 ++depth;
rlm@46 11833 p = p.parentNode;
rlm@46 11834 }
rlm@46 11835 return depth;
rlm@46 11836 },
rlm@46 11837
rlm@46 11838
rlm@46 11839 setOwnerTree : function(tree){
rlm@46 11840
rlm@46 11841 if(tree != this.ownerTree){
rlm@46 11842 if(this.ownerTree){
rlm@46 11843 this.ownerTree.unregisterNode(this);
rlm@46 11844 }
rlm@46 11845 this.ownerTree = tree;
rlm@46 11846 var cs = this.childNodes;
rlm@46 11847 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 11848 cs[i].setOwnerTree(tree);
rlm@46 11849 }
rlm@46 11850 if(tree){
rlm@46 11851 tree.registerNode(this);
rlm@46 11852 }
rlm@46 11853 }
rlm@46 11854 },
rlm@46 11855
rlm@46 11856
rlm@46 11857 getPath : function(attr){
rlm@46 11858 attr = attr || "id";
rlm@46 11859 var p = this.parentNode;
rlm@46 11860 var b = [this.attributes[attr]];
rlm@46 11861 while(p){
rlm@46 11862 b.unshift(p.attributes[attr]);
rlm@46 11863 p = p.parentNode;
rlm@46 11864 }
rlm@46 11865 var sep = this.getOwnerTree().pathSeparator;
rlm@46 11866 return sep + b.join(sep);
rlm@46 11867 },
rlm@46 11868
rlm@46 11869
rlm@46 11870 bubble : function(fn, scope, args){
rlm@46 11871 var p = this;
rlm@46 11872 while(p){
rlm@46 11873 if(fn.apply(scope || p, args || [p]) === false){
rlm@46 11874 break;
rlm@46 11875 }
rlm@46 11876 p = p.parentNode;
rlm@46 11877 }
rlm@46 11878 },
rlm@46 11879
rlm@46 11880
rlm@46 11881 cascade : function(fn, scope, args){
rlm@46 11882 if(fn.apply(scope || this, args || [this]) !== false){
rlm@46 11883 var cs = this.childNodes;
rlm@46 11884 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 11885 cs[i].cascade(fn, scope, args);
rlm@46 11886 }
rlm@46 11887 }
rlm@46 11888 },
rlm@46 11889
rlm@46 11890
rlm@46 11891 eachChild : function(fn, scope, args){
rlm@46 11892 var cs = this.childNodes;
rlm@46 11893 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 11894 if(fn.apply(scope || this, args || [cs[i]]) === false){
rlm@46 11895 break;
rlm@46 11896 }
rlm@46 11897 }
rlm@46 11898 },
rlm@46 11899
rlm@46 11900
rlm@46 11901 findChild : function(attribute, value){
rlm@46 11902 var cs = this.childNodes;
rlm@46 11903 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 11904 if(cs[i].attributes[attribute] == value){
rlm@46 11905 return cs[i];
rlm@46 11906 }
rlm@46 11907 }
rlm@46 11908 return null;
rlm@46 11909 },
rlm@46 11910
rlm@46 11911
rlm@46 11912 findChildBy : function(fn, scope){
rlm@46 11913 var cs = this.childNodes;
rlm@46 11914 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 11915 if(fn.call(scope||cs[i], cs[i]) === true){
rlm@46 11916 return cs[i];
rlm@46 11917 }
rlm@46 11918 }
rlm@46 11919 return null;
rlm@46 11920 },
rlm@46 11921
rlm@46 11922
rlm@46 11923 sort : function(fn, scope){
rlm@46 11924 var cs = this.childNodes;
rlm@46 11925 var len = cs.length;
rlm@46 11926 if(len > 0){
rlm@46 11927 var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;
rlm@46 11928 cs.sort(sortFn);
rlm@46 11929 for(var i = 0; i < len; i++){
rlm@46 11930 var n = cs[i];
rlm@46 11931 n.previousSibling = cs[i-1];
rlm@46 11932 n.nextSibling = cs[i+1];
rlm@46 11933 if(i == 0){
rlm@46 11934 this.setFirstChild(n);
rlm@46 11935 }
rlm@46 11936 if(i == len-1){
rlm@46 11937 this.setLastChild(n);
rlm@46 11938 }
rlm@46 11939 }
rlm@46 11940 }
rlm@46 11941 },
rlm@46 11942
rlm@46 11943
rlm@46 11944 contains : function(node){
rlm@46 11945 return node.isAncestor(this);
rlm@46 11946 },
rlm@46 11947
rlm@46 11948
rlm@46 11949 isAncestor : function(node){
rlm@46 11950 var p = this.parentNode;
rlm@46 11951 while(p){
rlm@46 11952 if(p == node){
rlm@46 11953 return true;
rlm@46 11954 }
rlm@46 11955 p = p.parentNode;
rlm@46 11956 }
rlm@46 11957 return false;
rlm@46 11958 },
rlm@46 11959
rlm@46 11960 toString : function(){
rlm@46 11961 return "[Node"+(this.id?" "+this.id:"")+"]";
rlm@46 11962 }
rlm@46 11963 });
rlm@46 11964
rlm@46 11965 Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
rlm@46 11966
rlm@46 11967
rlm@46 11968 remoteGroup : false,
rlm@46 11969
rlm@46 11970 groupOnSort:false,
rlm@46 11971
rlm@46 11972
rlm@46 11973 clearGrouping : function(){
rlm@46 11974 this.groupField = false;
rlm@46 11975 if(this.remoteGroup){
rlm@46 11976 if(this.baseParams){
rlm@46 11977 delete this.baseParams.groupBy;
rlm@46 11978 }
rlm@46 11979 this.reload();
rlm@46 11980 }else{
rlm@46 11981 this.applySort();
rlm@46 11982 this.fireEvent('datachanged', this);
rlm@46 11983 }
rlm@46 11984 },
rlm@46 11985
rlm@46 11986
rlm@46 11987 groupBy : function(field, forceRegroup){
rlm@46 11988 if(this.groupField == field && !forceRegroup){
rlm@46 11989 return;
rlm@46 11990 }
rlm@46 11991 this.groupField = field;
rlm@46 11992 if(this.remoteGroup){
rlm@46 11993 if(!this.baseParams){
rlm@46 11994 this.baseParams = {};
rlm@46 11995 }
rlm@46 11996 this.baseParams['groupBy'] = field;
rlm@46 11997 }
rlm@46 11998 if(this.groupOnSort){
rlm@46 11999 this.sort(field);
rlm@46 12000 return;
rlm@46 12001 }
rlm@46 12002 if(this.remoteGroup){
rlm@46 12003 this.reload();
rlm@46 12004 }else{
rlm@46 12005 var si = this.sortInfo || {};
rlm@46 12006 if(si.field != field){
rlm@46 12007 this.applySort();
rlm@46 12008 }else{
rlm@46 12009 this.sortData(field);
rlm@46 12010 }
rlm@46 12011 this.fireEvent('datachanged', this);
rlm@46 12012 }
rlm@46 12013 },
rlm@46 12014
rlm@46 12015
rlm@46 12016 applySort : function(){
rlm@46 12017 Ext.data.GroupingStore.superclass.applySort.call(this);
rlm@46 12018 if(!this.groupOnSort && !this.remoteGroup){
rlm@46 12019 var gs = this.getGroupState();
rlm@46 12020 if(gs && gs != this.sortInfo.field){
rlm@46 12021 this.sortData(this.groupField);
rlm@46 12022 }
rlm@46 12023 }
rlm@46 12024 },
rlm@46 12025
rlm@46 12026
rlm@46 12027 applyGrouping : function(alwaysFireChange){
rlm@46 12028 if(this.groupField !== false){
rlm@46 12029 this.groupBy(this.groupField, true);
rlm@46 12030 return true;
rlm@46 12031 }else{
rlm@46 12032 if(alwaysFireChange === true){
rlm@46 12033 this.fireEvent('datachanged', this);
rlm@46 12034 }
rlm@46 12035 return false;
rlm@46 12036 }
rlm@46 12037 },
rlm@46 12038
rlm@46 12039
rlm@46 12040 getGroupState : function(){
rlm@46 12041 return this.groupOnSort && this.groupField !== false ?
rlm@46 12042 (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;
rlm@46 12043 }
rlm@46 12044 });
rlm@46 12045
rlm@46 12046 Ext.ComponentMgr = function(){
rlm@46 12047 var all = new Ext.util.MixedCollection();
rlm@46 12048 var types = {};
rlm@46 12049
rlm@46 12050 return {
rlm@46 12051
rlm@46 12052 register : function(c){
rlm@46 12053 all.add(c);
rlm@46 12054 },
rlm@46 12055
rlm@46 12056
rlm@46 12057 unregister : function(c){
rlm@46 12058 all.remove(c);
rlm@46 12059 },
rlm@46 12060
rlm@46 12061
rlm@46 12062 get : function(id){
rlm@46 12063 return all.get(id);
rlm@46 12064 },
rlm@46 12065
rlm@46 12066
rlm@46 12067 onAvailable : function(id, fn, scope){
rlm@46 12068 all.on("add", function(index, o){
rlm@46 12069 if(o.id == id){
rlm@46 12070 fn.call(scope || o, o);
rlm@46 12071 all.un("add", fn, scope);
rlm@46 12072 }
rlm@46 12073 });
rlm@46 12074 },
rlm@46 12075
rlm@46 12076
rlm@46 12077 all : all,
rlm@46 12078
rlm@46 12079
rlm@46 12080 registerType : function(xtype, cls){
rlm@46 12081 types[xtype] = cls;
rlm@46 12082 cls.xtype = xtype;
rlm@46 12083 },
rlm@46 12084
rlm@46 12085 create : function(config, defaultType){
rlm@46 12086 return new types[config.xtype || defaultType](config);
rlm@46 12087 }
rlm@46 12088 };
rlm@46 12089 }();
rlm@46 12090
rlm@46 12091
rlm@46 12092 Ext.reg = Ext.ComponentMgr.registerType; // this will be called a lot internally, shorthand to keep the bytes down
rlm@46 12093
rlm@46 12094 Ext.Component = function(config){
rlm@46 12095 config = config || {};
rlm@46 12096 if(config.initialConfig){
rlm@46 12097 if(config.isAction){ this.baseAction = config;
rlm@46 12098 }
rlm@46 12099 config = config.initialConfig; }else if(config.tagName || config.dom || typeof config == "string"){ config = {applyTo: config, id: config.id || config};
rlm@46 12100 }
rlm@46 12101
rlm@46 12102
rlm@46 12103 this.initialConfig = config;
rlm@46 12104
rlm@46 12105 Ext.apply(this, config);
rlm@46 12106 this.addEvents(
rlm@46 12107
rlm@46 12108 'disable',
rlm@46 12109
rlm@46 12110 'enable',
rlm@46 12111
rlm@46 12112 'beforeshow',
rlm@46 12113
rlm@46 12114 'show',
rlm@46 12115
rlm@46 12116 'beforehide',
rlm@46 12117
rlm@46 12118 'hide',
rlm@46 12119
rlm@46 12120 'beforerender',
rlm@46 12121
rlm@46 12122 'render',
rlm@46 12123
rlm@46 12124 'beforedestroy',
rlm@46 12125
rlm@46 12126 'destroy',
rlm@46 12127
rlm@46 12128 'beforestaterestore',
rlm@46 12129
rlm@46 12130 'staterestore',
rlm@46 12131
rlm@46 12132 'beforestatesave',
rlm@46 12133
rlm@46 12134 'statesave'
rlm@46 12135 );
rlm@46 12136 this.getId();
rlm@46 12137 Ext.ComponentMgr.register(this);
rlm@46 12138 Ext.Component.superclass.constructor.call(this);
rlm@46 12139
rlm@46 12140 if(this.baseAction){
rlm@46 12141 this.baseAction.addComponent(this);
rlm@46 12142 }
rlm@46 12143
rlm@46 12144 this.initComponent();
rlm@46 12145
rlm@46 12146 if(this.plugins){
rlm@46 12147 if(Ext.isArray(this.plugins)){
rlm@46 12148 for(var i = 0, len = this.plugins.length; i < len; i++){
rlm@46 12149 this.plugins[i].init(this);
rlm@46 12150 }
rlm@46 12151 }else{
rlm@46 12152 this.plugins.init(this);
rlm@46 12153 }
rlm@46 12154 }
rlm@46 12155
rlm@46 12156 if(this.stateful !== false){
rlm@46 12157 this.initState(config);
rlm@46 12158 }
rlm@46 12159
rlm@46 12160 if(this.applyTo){
rlm@46 12161 this.applyToMarkup(this.applyTo);
rlm@46 12162 delete this.applyTo;
rlm@46 12163 }else if(this.renderTo){
rlm@46 12164 this.render(this.renderTo);
rlm@46 12165 delete this.renderTo;
rlm@46 12166 }
rlm@46 12167 };
rlm@46 12168
rlm@46 12169 Ext.Component.AUTO_ID = 1000;
rlm@46 12170
rlm@46 12171 Ext.extend(Ext.Component, Ext.util.Observable, {
rlm@46 12172
rlm@46 12173
rlm@46 12174
rlm@46 12175
rlm@46 12176
rlm@46 12177
rlm@46 12178
rlm@46 12179
rlm@46 12180
rlm@46 12181
rlm@46 12182
rlm@46 12183
rlm@46 12184
rlm@46 12185
rlm@46 12186
rlm@46 12187
rlm@46 12188 disabledClass : "x-item-disabled",
rlm@46 12189
rlm@46 12190 allowDomMove : true,
rlm@46 12191
rlm@46 12192 autoShow : false,
rlm@46 12193
rlm@46 12194 hideMode: 'display',
rlm@46 12195
rlm@46 12196 hideParent: false,
rlm@46 12197
rlm@46 12198
rlm@46 12199
rlm@46 12200 hidden : false,
rlm@46 12201
rlm@46 12202 disabled : false,
rlm@46 12203
rlm@46 12204 rendered : false,
rlm@46 12205
rlm@46 12206 ctype : "Ext.Component",
rlm@46 12207
rlm@46 12208 actionMode : "el",
rlm@46 12209
rlm@46 12210 getActionEl : function(){
rlm@46 12211 return this[this.actionMode];
rlm@46 12212 },
rlm@46 12213
rlm@46 12214
rlm@46 12215 initComponent : Ext.emptyFn,
rlm@46 12216
rlm@46 12217
rlm@46 12218 render : function(container, position){
rlm@46 12219 if(!this.rendered && this.fireEvent("beforerender", this) !== false){
rlm@46 12220 if(!container && this.el){
rlm@46 12221 this.el = Ext.get(this.el);
rlm@46 12222 container = this.el.dom.parentNode;
rlm@46 12223 this.allowDomMove = false;
rlm@46 12224 }
rlm@46 12225 this.container = Ext.get(container);
rlm@46 12226 if(this.ctCls){
rlm@46 12227 this.container.addClass(this.ctCls);
rlm@46 12228 }
rlm@46 12229 this.rendered = true;
rlm@46 12230 if(position !== undefined){
rlm@46 12231 if(typeof position == 'number'){
rlm@46 12232 position = this.container.dom.childNodes[position];
rlm@46 12233 }else{
rlm@46 12234 position = Ext.getDom(position);
rlm@46 12235 }
rlm@46 12236 }
rlm@46 12237 this.onRender(this.container, position || null);
rlm@46 12238 if(this.autoShow){
rlm@46 12239 this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
rlm@46 12240 }
rlm@46 12241 if(this.cls){
rlm@46 12242 this.el.addClass(this.cls);
rlm@46 12243 delete this.cls;
rlm@46 12244 }
rlm@46 12245 if(this.style){
rlm@46 12246 this.el.applyStyles(this.style);
rlm@46 12247 delete this.style;
rlm@46 12248 }
rlm@46 12249 this.fireEvent("render", this);
rlm@46 12250 this.afterRender(this.container);
rlm@46 12251 if(this.hidden){
rlm@46 12252 this.hide();
rlm@46 12253 }
rlm@46 12254 if(this.disabled){
rlm@46 12255 this.disable();
rlm@46 12256 }
rlm@46 12257
rlm@46 12258 this.initStateEvents();
rlm@46 12259 }
rlm@46 12260 return this;
rlm@46 12261 },
rlm@46 12262
rlm@46 12263 initState : function(config){
rlm@46 12264 if(Ext.state.Manager){
rlm@46 12265 var state = Ext.state.Manager.get(this.stateId || this.id);
rlm@46 12266 if(state){
rlm@46 12267 if(this.fireEvent('beforestaterestore', this, state) !== false){
rlm@46 12268 this.applyState(state);
rlm@46 12269 this.fireEvent('staterestore', this, state);
rlm@46 12270 }
rlm@46 12271 }
rlm@46 12272 }
rlm@46 12273 },
rlm@46 12274
rlm@46 12275 initStateEvents : function(){
rlm@46 12276 if(this.stateEvents){
rlm@46 12277 for(var i = 0, e; e = this.stateEvents[i]; i++){
rlm@46 12278 this.on(e, this.saveState, this, {delay:100});
rlm@46 12279 }
rlm@46 12280 }
rlm@46 12281 },
rlm@46 12282
rlm@46 12283 applyState : function(state, config){
rlm@46 12284 if(state){
rlm@46 12285 Ext.apply(this, state);
rlm@46 12286 }
rlm@46 12287 },
rlm@46 12288
rlm@46 12289 getState : function(){
rlm@46 12290 return null;
rlm@46 12291 },
rlm@46 12292
rlm@46 12293 saveState : function(){
rlm@46 12294 if(Ext.state.Manager){
rlm@46 12295 var state = this.getState();
rlm@46 12296 if(this.fireEvent('beforestatesave', this, state) !== false){
rlm@46 12297 Ext.state.Manager.set(this.stateId || this.id, state);
rlm@46 12298 this.fireEvent('statesave', this, state);
rlm@46 12299 }
rlm@46 12300 }
rlm@46 12301 },
rlm@46 12302
rlm@46 12303
rlm@46 12304 applyToMarkup : function(el){
rlm@46 12305 this.allowDomMove = false;
rlm@46 12306 this.el = Ext.get(el);
rlm@46 12307 this.render(this.el.dom.parentNode);
rlm@46 12308 },
rlm@46 12309
rlm@46 12310
rlm@46 12311 addClass : function(cls){
rlm@46 12312 if(this.el){
rlm@46 12313 this.el.addClass(cls);
rlm@46 12314 }else{
rlm@46 12315 this.cls = this.cls ? this.cls + ' ' + cls : cls;
rlm@46 12316 }
rlm@46 12317 },
rlm@46 12318
rlm@46 12319
rlm@46 12320 removeClass : function(cls){
rlm@46 12321 if(this.el){
rlm@46 12322 this.el.removeClass(cls);
rlm@46 12323 }else if(this.cls){
rlm@46 12324 this.cls = this.cls.split(' ').remove(cls).join(' ');
rlm@46 12325 }
rlm@46 12326 },
rlm@46 12327
rlm@46 12328 onRender : function(ct, position){
rlm@46 12329 if(this.autoEl){
rlm@46 12330 if(typeof this.autoEl == 'string'){
rlm@46 12331 this.el = document.createElement(this.autoEl);
rlm@46 12332 }else{
rlm@46 12333 var div = document.createElement('div');
rlm@46 12334 Ext.DomHelper.overwrite(div, this.autoEl);
rlm@46 12335 this.el = div.firstChild;
rlm@46 12336 }
rlm@46 12337 if (!this.el.id) {
rlm@46 12338 this.el.id = this.getId();
rlm@46 12339 }
rlm@46 12340 }
rlm@46 12341 if(this.el){
rlm@46 12342 this.el = Ext.get(this.el);
rlm@46 12343 if(this.allowDomMove !== false){
rlm@46 12344 ct.dom.insertBefore(this.el.dom, position);
rlm@46 12345 }
rlm@46 12346 if(this.overCls) {
rlm@46 12347 this.el.addClassOnOver(this.overCls);
rlm@46 12348 }
rlm@46 12349 }
rlm@46 12350 },
rlm@46 12351
rlm@46 12352 getAutoCreate : function(){
rlm@46 12353 var cfg = typeof this.autoCreate == "object" ?
rlm@46 12354 this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
rlm@46 12355 if(this.id && !cfg.id){
rlm@46 12356 cfg.id = this.id;
rlm@46 12357 }
rlm@46 12358 return cfg;
rlm@46 12359 },
rlm@46 12360
rlm@46 12361 afterRender : Ext.emptyFn,
rlm@46 12362
rlm@46 12363
rlm@46 12364 destroy : function(){
rlm@46 12365 if(this.fireEvent("beforedestroy", this) !== false){
rlm@46 12366 this.beforeDestroy();
rlm@46 12367 if(this.rendered){
rlm@46 12368 this.el.removeAllListeners();
rlm@46 12369 this.el.remove();
rlm@46 12370 if(this.actionMode == "container"){
rlm@46 12371 this.container.remove();
rlm@46 12372 }
rlm@46 12373 }
rlm@46 12374 this.onDestroy();
rlm@46 12375 Ext.ComponentMgr.unregister(this);
rlm@46 12376 this.fireEvent("destroy", this);
rlm@46 12377 this.purgeListeners();
rlm@46 12378 }
rlm@46 12379 },
rlm@46 12380
rlm@46 12381 beforeDestroy : Ext.emptyFn,
rlm@46 12382
rlm@46 12383 onDestroy : Ext.emptyFn,
rlm@46 12384
rlm@46 12385
rlm@46 12386 getEl : function(){
rlm@46 12387 return this.el;
rlm@46 12388 },
rlm@46 12389
rlm@46 12390
rlm@46 12391 getId : function(){
rlm@46 12392 return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID));
rlm@46 12393 },
rlm@46 12394
rlm@46 12395
rlm@46 12396 getItemId : function(){
rlm@46 12397 return this.itemId || this.getId();
rlm@46 12398 },
rlm@46 12399
rlm@46 12400
rlm@46 12401 focus : function(selectText, delay){
rlm@46 12402 if(delay){
rlm@46 12403 this.focus.defer(typeof delay == 'number' ? delay : 10, this, [selectText, false]);
rlm@46 12404 return;
rlm@46 12405 }
rlm@46 12406 if(this.rendered){
rlm@46 12407 this.el.focus();
rlm@46 12408 if(selectText === true){
rlm@46 12409 this.el.dom.select();
rlm@46 12410 }
rlm@46 12411 }
rlm@46 12412 return this;
rlm@46 12413 },
rlm@46 12414
rlm@46 12415 blur : function(){
rlm@46 12416 if(this.rendered){
rlm@46 12417 this.el.blur();
rlm@46 12418 }
rlm@46 12419 return this;
rlm@46 12420 },
rlm@46 12421
rlm@46 12422
rlm@46 12423 disable : function(){
rlm@46 12424 if(this.rendered){
rlm@46 12425 this.onDisable();
rlm@46 12426 }
rlm@46 12427 this.disabled = true;
rlm@46 12428 this.fireEvent("disable", this);
rlm@46 12429 return this;
rlm@46 12430 },
rlm@46 12431
rlm@46 12432 onDisable : function(){
rlm@46 12433 this.getActionEl().addClass(this.disabledClass);
rlm@46 12434 this.el.dom.disabled = true;
rlm@46 12435 },
rlm@46 12436
rlm@46 12437
rlm@46 12438 enable : function(){
rlm@46 12439 if(this.rendered){
rlm@46 12440 this.onEnable();
rlm@46 12441 }
rlm@46 12442 this.disabled = false;
rlm@46 12443 this.fireEvent("enable", this);
rlm@46 12444 return this;
rlm@46 12445 },
rlm@46 12446
rlm@46 12447 onEnable : function(){
rlm@46 12448 this.getActionEl().removeClass(this.disabledClass);
rlm@46 12449 this.el.dom.disabled = false;
rlm@46 12450 },
rlm@46 12451
rlm@46 12452
rlm@46 12453 setDisabled : function(disabled){
rlm@46 12454 this[disabled ? "disable" : "enable"]();
rlm@46 12455 },
rlm@46 12456
rlm@46 12457
rlm@46 12458 show: function(){
rlm@46 12459 if(this.fireEvent("beforeshow", this) !== false){
rlm@46 12460 this.hidden = false;
rlm@46 12461 if(this.autoRender){
rlm@46 12462 this.render(typeof this.autoRender == 'boolean' ? Ext.getBody() : this.autoRender);
rlm@46 12463 }
rlm@46 12464 if(this.rendered){
rlm@46 12465 this.onShow();
rlm@46 12466 }
rlm@46 12467 this.fireEvent("show", this);
rlm@46 12468 }
rlm@46 12469 return this;
rlm@46 12470 },
rlm@46 12471
rlm@46 12472 onShow : function(){
rlm@46 12473 if(this.hideParent){
rlm@46 12474 this.container.removeClass('x-hide-' + this.hideMode);
rlm@46 12475 }else{
rlm@46 12476 this.getActionEl().removeClass('x-hide-' + this.hideMode);
rlm@46 12477 }
rlm@46 12478
rlm@46 12479 },
rlm@46 12480
rlm@46 12481
rlm@46 12482 hide: function(){
rlm@46 12483 if(this.fireEvent("beforehide", this) !== false){
rlm@46 12484 this.hidden = true;
rlm@46 12485 if(this.rendered){
rlm@46 12486 this.onHide();
rlm@46 12487 }
rlm@46 12488 this.fireEvent("hide", this);
rlm@46 12489 }
rlm@46 12490 return this;
rlm@46 12491 },
rlm@46 12492
rlm@46 12493 onHide : function(){
rlm@46 12494 if(this.hideParent){
rlm@46 12495 this.container.addClass('x-hide-' + this.hideMode);
rlm@46 12496 }else{
rlm@46 12497 this.getActionEl().addClass('x-hide-' + this.hideMode);
rlm@46 12498 }
rlm@46 12499 },
rlm@46 12500
rlm@46 12501
rlm@46 12502 setVisible: function(visible){
rlm@46 12503 if(visible) {
rlm@46 12504 this.show();
rlm@46 12505 }else{
rlm@46 12506 this.hide();
rlm@46 12507 }
rlm@46 12508 return this;
rlm@46 12509 },
rlm@46 12510
rlm@46 12511
rlm@46 12512 isVisible : function(){
rlm@46 12513 return this.rendered && this.getActionEl().isVisible();
rlm@46 12514 },
rlm@46 12515
rlm@46 12516
rlm@46 12517 cloneConfig : function(overrides){
rlm@46 12518 overrides = overrides || {};
rlm@46 12519 var id = overrides.id || Ext.id();
rlm@46 12520 var cfg = Ext.applyIf(overrides, this.initialConfig);
rlm@46 12521 cfg.id = id; return new this.constructor(cfg);
rlm@46 12522 },
rlm@46 12523
rlm@46 12524
rlm@46 12525 getXType : function(){
rlm@46 12526 return this.constructor.xtype;
rlm@46 12527 },
rlm@46 12528
rlm@46 12529
rlm@46 12530 isXType : function(xtype, shallow){
rlm@46 12531 return !shallow ?
rlm@46 12532 ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 :
rlm@46 12533 this.constructor.xtype == xtype;
rlm@46 12534 },
rlm@46 12535
rlm@46 12536
rlm@46 12537 getXTypes : function(){
rlm@46 12538 var tc = this.constructor;
rlm@46 12539 if(!tc.xtypes){
rlm@46 12540 var c = [], sc = this;
rlm@46 12541 while(sc && sc.constructor.xtype){
rlm@46 12542 c.unshift(sc.constructor.xtype);
rlm@46 12543 sc = sc.constructor.superclass;
rlm@46 12544 }
rlm@46 12545 tc.xtypeChain = c;
rlm@46 12546 tc.xtypes = c.join('/');
rlm@46 12547 }
rlm@46 12548 return tc.xtypes;
rlm@46 12549 },
rlm@46 12550
rlm@46 12551
rlm@46 12552 findParentBy: function(fn) {
rlm@46 12553 for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);
rlm@46 12554 return p || null;
rlm@46 12555 },
rlm@46 12556
rlm@46 12557
rlm@46 12558 findParentByType: function(xtype) {
rlm@46 12559 return typeof xtype == 'function' ?
rlm@46 12560 this.findParentBy(function(p){
rlm@46 12561 return p.constructor === xtype;
rlm@46 12562 }) :
rlm@46 12563 this.findParentBy(function(p){
rlm@46 12564 return p.constructor.xtype === xtype;
rlm@46 12565 });
rlm@46 12566 },
rlm@46 12567
rlm@46 12568 mon : function(item, ename, fn, scope, opt){
rlm@46 12569 if(!this.mons){
rlm@46 12570 this.mons = [];
rlm@46 12571 this.on('beforedestroy', function(){
rlm@46 12572 for(var i= 0, len = this.mons.length; i < len; i++){
rlm@46 12573 var m = this.mons[i];
rlm@46 12574 m.item.un(m.ename, m.fn, m.scope);
rlm@46 12575 }
rlm@46 12576 }, this);
rlm@46 12577 }
rlm@46 12578 this.mons.push({
rlm@46 12579 item: item, ename: ename, fn: fn, scope: scope
rlm@46 12580 });
rlm@46 12581 item.on(ename, fn, scope, opt);
rlm@46 12582 }
rlm@46 12583 });
rlm@46 12584
rlm@46 12585 Ext.reg('component', Ext.Component);
rlm@46 12586
rlm@46 12587
rlm@46 12588 Ext.Action = function(config){
rlm@46 12589 this.initialConfig = config;
rlm@46 12590 this.items = [];
rlm@46 12591 }
rlm@46 12592
rlm@46 12593 Ext.Action.prototype = {
rlm@46 12594
rlm@46 12595
rlm@46 12596
rlm@46 12597
rlm@46 12598
rlm@46 12599
rlm@46 12600
rlm@46 12601
rlm@46 12602 isAction : true,
rlm@46 12603
rlm@46 12604
rlm@46 12605 setText : function(text){
rlm@46 12606 this.initialConfig.text = text;
rlm@46 12607 this.callEach('setText', [text]);
rlm@46 12608 },
rlm@46 12609
rlm@46 12610
rlm@46 12611 getText : function(){
rlm@46 12612 return this.initialConfig.text;
rlm@46 12613 },
rlm@46 12614
rlm@46 12615
rlm@46 12616 setIconClass : function(cls){
rlm@46 12617 this.initialConfig.iconCls = cls;
rlm@46 12618 this.callEach('setIconClass', [cls]);
rlm@46 12619 },
rlm@46 12620
rlm@46 12621
rlm@46 12622 getIconClass : function(){
rlm@46 12623 return this.initialConfig.iconCls;
rlm@46 12624 },
rlm@46 12625
rlm@46 12626
rlm@46 12627 setDisabled : function(v){
rlm@46 12628 this.initialConfig.disabled = v;
rlm@46 12629 this.callEach('setDisabled', [v]);
rlm@46 12630 },
rlm@46 12631
rlm@46 12632
rlm@46 12633 enable : function(){
rlm@46 12634 this.setDisabled(false);
rlm@46 12635 },
rlm@46 12636
rlm@46 12637
rlm@46 12638 disable : function(){
rlm@46 12639 this.setDisabled(true);
rlm@46 12640 },
rlm@46 12641
rlm@46 12642
rlm@46 12643 isDisabled : function(){
rlm@46 12644 return this.initialConfig.disabled;
rlm@46 12645 },
rlm@46 12646
rlm@46 12647
rlm@46 12648 setHidden : function(v){
rlm@46 12649 this.initialConfig.hidden = v;
rlm@46 12650 this.callEach('setVisible', [!v]);
rlm@46 12651 },
rlm@46 12652
rlm@46 12653
rlm@46 12654 show : function(){
rlm@46 12655 this.setHidden(false);
rlm@46 12656 },
rlm@46 12657
rlm@46 12658
rlm@46 12659 hide : function(){
rlm@46 12660 this.setHidden(true);
rlm@46 12661 },
rlm@46 12662
rlm@46 12663
rlm@46 12664 isHidden : function(){
rlm@46 12665 return this.initialConfig.hidden;
rlm@46 12666 },
rlm@46 12667
rlm@46 12668
rlm@46 12669 setHandler : function(fn, scope){
rlm@46 12670 this.initialConfig.handler = fn;
rlm@46 12671 this.initialConfig.scope = scope;
rlm@46 12672 this.callEach('setHandler', [fn, scope]);
rlm@46 12673 },
rlm@46 12674
rlm@46 12675
rlm@46 12676 each : function(fn, scope){
rlm@46 12677 Ext.each(this.items, fn, scope);
rlm@46 12678 },
rlm@46 12679
rlm@46 12680
rlm@46 12681 callEach : function(fnName, args){
rlm@46 12682 var cs = this.items;
rlm@46 12683 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 12684 cs[i][fnName].apply(cs[i], args);
rlm@46 12685 }
rlm@46 12686 },
rlm@46 12687
rlm@46 12688
rlm@46 12689 addComponent : function(comp){
rlm@46 12690 this.items.push(comp);
rlm@46 12691 comp.on('destroy', this.removeComponent, this);
rlm@46 12692 },
rlm@46 12693
rlm@46 12694
rlm@46 12695 removeComponent : function(comp){
rlm@46 12696 this.items.remove(comp);
rlm@46 12697 },
rlm@46 12698
rlm@46 12699
rlm@46 12700 execute : function(){
rlm@46 12701 this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);
rlm@46 12702 }
rlm@46 12703 };
rlm@46 12704
rlm@46 12705 (function(){
rlm@46 12706 Ext.Layer = function(config, existingEl){
rlm@46 12707 config = config || {};
rlm@46 12708 var dh = Ext.DomHelper;
rlm@46 12709 var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
rlm@46 12710 if(existingEl){
rlm@46 12711 this.dom = Ext.getDom(existingEl);
rlm@46 12712 }
rlm@46 12713 if(!this.dom){
rlm@46 12714 var o = config.dh || {tag: "div", cls: "x-layer"};
rlm@46 12715 this.dom = dh.append(pel, o);
rlm@46 12716 }
rlm@46 12717 if(config.cls){
rlm@46 12718 this.addClass(config.cls);
rlm@46 12719 }
rlm@46 12720 this.constrain = config.constrain !== false;
rlm@46 12721 this.visibilityMode = Ext.Element.VISIBILITY;
rlm@46 12722 if(config.id){
rlm@46 12723 this.id = this.dom.id = config.id;
rlm@46 12724 }else{
rlm@46 12725 this.id = Ext.id(this.dom);
rlm@46 12726 }
rlm@46 12727 this.zindex = config.zindex || this.getZIndex();
rlm@46 12728 this.position("absolute", this.zindex);
rlm@46 12729 if(config.shadow){
rlm@46 12730 this.shadowOffset = config.shadowOffset || 4;
rlm@46 12731 this.shadow = new Ext.Shadow({
rlm@46 12732 offset : this.shadowOffset,
rlm@46 12733 mode : config.shadow
rlm@46 12734 });
rlm@46 12735 }else{
rlm@46 12736 this.shadowOffset = 0;
rlm@46 12737 }
rlm@46 12738 this.useShim = config.shim !== false && Ext.useShims;
rlm@46 12739 this.useDisplay = config.useDisplay;
rlm@46 12740 this.hide();
rlm@46 12741 };
rlm@46 12742
rlm@46 12743 var supr = Ext.Element.prototype;
rlm@46 12744
rlm@46 12745
rlm@46 12746 var shims = [];
rlm@46 12747
rlm@46 12748 Ext.extend(Ext.Layer, Ext.Element, {
rlm@46 12749
rlm@46 12750 getZIndex : function(){
rlm@46 12751 return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000;
rlm@46 12752 },
rlm@46 12753
rlm@46 12754 getShim : function(){
rlm@46 12755 if(!this.useShim){
rlm@46 12756 return null;
rlm@46 12757 }
rlm@46 12758 if(this.shim){
rlm@46 12759 return this.shim;
rlm@46 12760 }
rlm@46 12761 var shim = shims.shift();
rlm@46 12762 if(!shim){
rlm@46 12763 shim = this.createShim();
rlm@46 12764 shim.enableDisplayMode('block');
rlm@46 12765 shim.dom.style.display = 'none';
rlm@46 12766 shim.dom.style.visibility = 'visible';
rlm@46 12767 }
rlm@46 12768 var pn = this.dom.parentNode;
rlm@46 12769 if(shim.dom.parentNode != pn){
rlm@46 12770 pn.insertBefore(shim.dom, this.dom);
rlm@46 12771 }
rlm@46 12772 shim.setStyle('z-index', this.getZIndex()-2);
rlm@46 12773 this.shim = shim;
rlm@46 12774 return shim;
rlm@46 12775 },
rlm@46 12776
rlm@46 12777 hideShim : function(){
rlm@46 12778 if(this.shim){
rlm@46 12779 this.shim.setDisplayed(false);
rlm@46 12780 shims.push(this.shim);
rlm@46 12781 delete this.shim;
rlm@46 12782 }
rlm@46 12783 },
rlm@46 12784
rlm@46 12785 disableShadow : function(){
rlm@46 12786 if(this.shadow){
rlm@46 12787 this.shadowDisabled = true;
rlm@46 12788 this.shadow.hide();
rlm@46 12789 this.lastShadowOffset = this.shadowOffset;
rlm@46 12790 this.shadowOffset = 0;
rlm@46 12791 }
rlm@46 12792 },
rlm@46 12793
rlm@46 12794 enableShadow : function(show){
rlm@46 12795 if(this.shadow){
rlm@46 12796 this.shadowDisabled = false;
rlm@46 12797 this.shadowOffset = this.lastShadowOffset;
rlm@46 12798 delete this.lastShadowOffset;
rlm@46 12799 if(show){
rlm@46 12800 this.sync(true);
rlm@46 12801 }
rlm@46 12802 }
rlm@46 12803 },
rlm@46 12804
rlm@46 12805
rlm@46 12806
rlm@46 12807
rlm@46 12808 sync : function(doShow){
rlm@46 12809 var sw = this.shadow;
rlm@46 12810 if(!this.updating && this.isVisible() && (sw || this.useShim)){
rlm@46 12811 var sh = this.getShim();
rlm@46 12812
rlm@46 12813 var w = this.getWidth(),
rlm@46 12814 h = this.getHeight();
rlm@46 12815
rlm@46 12816 var l = this.getLeft(true),
rlm@46 12817 t = this.getTop(true);
rlm@46 12818
rlm@46 12819 if(sw && !this.shadowDisabled){
rlm@46 12820 if(doShow && !sw.isVisible()){
rlm@46 12821 sw.show(this);
rlm@46 12822 }else{
rlm@46 12823 sw.realign(l, t, w, h);
rlm@46 12824 }
rlm@46 12825 if(sh){
rlm@46 12826 if(doShow){
rlm@46 12827 sh.show();
rlm@46 12828 }
rlm@46 12829
rlm@46 12830 var a = sw.adjusts, s = sh.dom.style;
rlm@46 12831 s.left = (Math.min(l, l+a.l))+"px";
rlm@46 12832 s.top = (Math.min(t, t+a.t))+"px";
rlm@46 12833 s.width = (w+a.w)+"px";
rlm@46 12834 s.height = (h+a.h)+"px";
rlm@46 12835 }
rlm@46 12836 }else if(sh){
rlm@46 12837 if(doShow){
rlm@46 12838 sh.show();
rlm@46 12839 }
rlm@46 12840 sh.setSize(w, h);
rlm@46 12841 sh.setLeftTop(l, t);
rlm@46 12842 }
rlm@46 12843
rlm@46 12844 }
rlm@46 12845 },
rlm@46 12846
rlm@46 12847
rlm@46 12848 destroy : function(){
rlm@46 12849 this.hideShim();
rlm@46 12850 if(this.shadow){
rlm@46 12851 this.shadow.hide();
rlm@46 12852 }
rlm@46 12853 this.removeAllListeners();
rlm@46 12854 Ext.removeNode(this.dom);
rlm@46 12855 Ext.Element.uncache(this.id);
rlm@46 12856 },
rlm@46 12857
rlm@46 12858 remove : function(){
rlm@46 12859 this.destroy();
rlm@46 12860 },
rlm@46 12861
rlm@46 12862
rlm@46 12863 beginUpdate : function(){
rlm@46 12864 this.updating = true;
rlm@46 12865 },
rlm@46 12866
rlm@46 12867
rlm@46 12868 endUpdate : function(){
rlm@46 12869 this.updating = false;
rlm@46 12870 this.sync(true);
rlm@46 12871 },
rlm@46 12872
rlm@46 12873
rlm@46 12874 hideUnders : function(negOffset){
rlm@46 12875 if(this.shadow){
rlm@46 12876 this.shadow.hide();
rlm@46 12877 }
rlm@46 12878 this.hideShim();
rlm@46 12879 },
rlm@46 12880
rlm@46 12881
rlm@46 12882 constrainXY : function(){
rlm@46 12883 if(this.constrain){
rlm@46 12884 var vw = Ext.lib.Dom.getViewWidth(),
rlm@46 12885 vh = Ext.lib.Dom.getViewHeight();
rlm@46 12886 var s = Ext.getDoc().getScroll();
rlm@46 12887
rlm@46 12888 var xy = this.getXY();
rlm@46 12889 var x = xy[0], y = xy[1];
rlm@46 12890 var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset;
rlm@46 12891
rlm@46 12892 var moved = false;
rlm@46 12893
rlm@46 12894 if((x + w) > vw+s.left){
rlm@46 12895 x = vw - w - this.shadowOffset;
rlm@46 12896 moved = true;
rlm@46 12897 }
rlm@46 12898 if((y + h) > vh+s.top){
rlm@46 12899 y = vh - h - this.shadowOffset;
rlm@46 12900 moved = true;
rlm@46 12901 }
rlm@46 12902
rlm@46 12903 if(x < s.left){
rlm@46 12904 x = s.left;
rlm@46 12905 moved = true;
rlm@46 12906 }
rlm@46 12907 if(y < s.top){
rlm@46 12908 y = s.top;
rlm@46 12909 moved = true;
rlm@46 12910 }
rlm@46 12911 if(moved){
rlm@46 12912 if(this.avoidY){
rlm@46 12913 var ay = this.avoidY;
rlm@46 12914 if(y <= ay && (y+h) >= ay){
rlm@46 12915 y = ay-h-5;
rlm@46 12916 }
rlm@46 12917 }
rlm@46 12918 xy = [x, y];
rlm@46 12919 this.storeXY(xy);
rlm@46 12920 supr.setXY.call(this, xy);
rlm@46 12921 this.sync();
rlm@46 12922 }
rlm@46 12923 }
rlm@46 12924 },
rlm@46 12925
rlm@46 12926 isVisible : function(){
rlm@46 12927 return this.visible;
rlm@46 12928 },
rlm@46 12929
rlm@46 12930
rlm@46 12931 showAction : function(){
rlm@46 12932 this.visible = true;
rlm@46 12933 if(this.useDisplay === true){
rlm@46 12934 this.setDisplayed("");
rlm@46 12935 }else if(this.lastXY){
rlm@46 12936 supr.setXY.call(this, this.lastXY);
rlm@46 12937 }else if(this.lastLT){
rlm@46 12938 supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);
rlm@46 12939 }
rlm@46 12940 },
rlm@46 12941
rlm@46 12942
rlm@46 12943 hideAction : function(){
rlm@46 12944 this.visible = false;
rlm@46 12945 if(this.useDisplay === true){
rlm@46 12946 this.setDisplayed(false);
rlm@46 12947 }else{
rlm@46 12948 this.setLeftTop(-10000,-10000);
rlm@46 12949 }
rlm@46 12950 },
rlm@46 12951
rlm@46 12952
rlm@46 12953 setVisible : function(v, a, d, c, e){
rlm@46 12954 if(v){
rlm@46 12955 this.showAction();
rlm@46 12956 }
rlm@46 12957 if(a && v){
rlm@46 12958 var cb = function(){
rlm@46 12959 this.sync(true);
rlm@46 12960 if(c){
rlm@46 12961 c();
rlm@46 12962 }
rlm@46 12963 }.createDelegate(this);
rlm@46 12964 supr.setVisible.call(this, true, true, d, cb, e);
rlm@46 12965 }else{
rlm@46 12966 if(!v){
rlm@46 12967 this.hideUnders(true);
rlm@46 12968 }
rlm@46 12969 var cb = c;
rlm@46 12970 if(a){
rlm@46 12971 cb = function(){
rlm@46 12972 this.hideAction();
rlm@46 12973 if(c){
rlm@46 12974 c();
rlm@46 12975 }
rlm@46 12976 }.createDelegate(this);
rlm@46 12977 }
rlm@46 12978 supr.setVisible.call(this, v, a, d, cb, e);
rlm@46 12979 if(v){
rlm@46 12980 this.sync(true);
rlm@46 12981 }else if(!a){
rlm@46 12982 this.hideAction();
rlm@46 12983 }
rlm@46 12984 }
rlm@46 12985 },
rlm@46 12986
rlm@46 12987 storeXY : function(xy){
rlm@46 12988 delete this.lastLT;
rlm@46 12989 this.lastXY = xy;
rlm@46 12990 },
rlm@46 12991
rlm@46 12992 storeLeftTop : function(left, top){
rlm@46 12993 delete this.lastXY;
rlm@46 12994 this.lastLT = [left, top];
rlm@46 12995 },
rlm@46 12996
rlm@46 12997
rlm@46 12998 beforeFx : function(){
rlm@46 12999 this.beforeAction();
rlm@46 13000 return Ext.Layer.superclass.beforeFx.apply(this, arguments);
rlm@46 13001 },
rlm@46 13002
rlm@46 13003
rlm@46 13004 afterFx : function(){
rlm@46 13005 Ext.Layer.superclass.afterFx.apply(this, arguments);
rlm@46 13006 this.sync(this.isVisible());
rlm@46 13007 },
rlm@46 13008
rlm@46 13009
rlm@46 13010 beforeAction : function(){
rlm@46 13011 if(!this.updating && this.shadow){
rlm@46 13012 this.shadow.hide();
rlm@46 13013 }
rlm@46 13014 },
rlm@46 13015
rlm@46 13016
rlm@46 13017 setLeft : function(left){
rlm@46 13018 this.storeLeftTop(left, this.getTop(true));
rlm@46 13019 supr.setLeft.apply(this, arguments);
rlm@46 13020 this.sync();
rlm@46 13021 },
rlm@46 13022
rlm@46 13023 setTop : function(top){
rlm@46 13024 this.storeLeftTop(this.getLeft(true), top);
rlm@46 13025 supr.setTop.apply(this, arguments);
rlm@46 13026 this.sync();
rlm@46 13027 },
rlm@46 13028
rlm@46 13029 setLeftTop : function(left, top){
rlm@46 13030 this.storeLeftTop(left, top);
rlm@46 13031 supr.setLeftTop.apply(this, arguments);
rlm@46 13032 this.sync();
rlm@46 13033 },
rlm@46 13034
rlm@46 13035 setXY : function(xy, a, d, c, e){
rlm@46 13036 this.fixDisplay();
rlm@46 13037 this.beforeAction();
rlm@46 13038 this.storeXY(xy);
rlm@46 13039 var cb = this.createCB(c);
rlm@46 13040 supr.setXY.call(this, xy, a, d, cb, e);
rlm@46 13041 if(!a){
rlm@46 13042 cb();
rlm@46 13043 }
rlm@46 13044 },
rlm@46 13045
rlm@46 13046
rlm@46 13047 createCB : function(c){
rlm@46 13048 var el = this;
rlm@46 13049 return function(){
rlm@46 13050 el.constrainXY();
rlm@46 13051 el.sync(true);
rlm@46 13052 if(c){
rlm@46 13053 c();
rlm@46 13054 }
rlm@46 13055 };
rlm@46 13056 },
rlm@46 13057
rlm@46 13058
rlm@46 13059 setX : function(x, a, d, c, e){
rlm@46 13060 this.setXY([x, this.getY()], a, d, c, e);
rlm@46 13061 },
rlm@46 13062
rlm@46 13063
rlm@46 13064 setY : function(y, a, d, c, e){
rlm@46 13065 this.setXY([this.getX(), y], a, d, c, e);
rlm@46 13066 },
rlm@46 13067
rlm@46 13068
rlm@46 13069 setSize : function(w, h, a, d, c, e){
rlm@46 13070 this.beforeAction();
rlm@46 13071 var cb = this.createCB(c);
rlm@46 13072 supr.setSize.call(this, w, h, a, d, cb, e);
rlm@46 13073 if(!a){
rlm@46 13074 cb();
rlm@46 13075 }
rlm@46 13076 },
rlm@46 13077
rlm@46 13078
rlm@46 13079 setWidth : function(w, a, d, c, e){
rlm@46 13080 this.beforeAction();
rlm@46 13081 var cb = this.createCB(c);
rlm@46 13082 supr.setWidth.call(this, w, a, d, cb, e);
rlm@46 13083 if(!a){
rlm@46 13084 cb();
rlm@46 13085 }
rlm@46 13086 },
rlm@46 13087
rlm@46 13088
rlm@46 13089 setHeight : function(h, a, d, c, e){
rlm@46 13090 this.beforeAction();
rlm@46 13091 var cb = this.createCB(c);
rlm@46 13092 supr.setHeight.call(this, h, a, d, cb, e);
rlm@46 13093 if(!a){
rlm@46 13094 cb();
rlm@46 13095 }
rlm@46 13096 },
rlm@46 13097
rlm@46 13098
rlm@46 13099 setBounds : function(x, y, w, h, a, d, c, e){
rlm@46 13100 this.beforeAction();
rlm@46 13101 var cb = this.createCB(c);
rlm@46 13102 if(!a){
rlm@46 13103 this.storeXY([x, y]);
rlm@46 13104 supr.setXY.call(this, [x, y]);
rlm@46 13105 supr.setSize.call(this, w, h, a, d, cb, e);
rlm@46 13106 cb();
rlm@46 13107 }else{
rlm@46 13108 supr.setBounds.call(this, x, y, w, h, a, d, cb, e);
rlm@46 13109 }
rlm@46 13110 return this;
rlm@46 13111 },
rlm@46 13112
rlm@46 13113
rlm@46 13114 setZIndex : function(zindex){
rlm@46 13115 this.zindex = zindex;
rlm@46 13116 this.setStyle("z-index", zindex + 2);
rlm@46 13117 if(this.shadow){
rlm@46 13118 this.shadow.setZIndex(zindex + 1);
rlm@46 13119 }
rlm@46 13120 if(this.shim){
rlm@46 13121 this.shim.setStyle("z-index", zindex);
rlm@46 13122 }
rlm@46 13123 }
rlm@46 13124 });
rlm@46 13125 })();
rlm@46 13126
rlm@46 13127 Ext.Shadow = function(config){
rlm@46 13128 Ext.apply(this, config);
rlm@46 13129 if(typeof this.mode != "string"){
rlm@46 13130 this.mode = this.defaultMode;
rlm@46 13131 }
rlm@46 13132 var o = this.offset, a = {h: 0};
rlm@46 13133 var rad = Math.floor(this.offset/2);
rlm@46 13134 switch(this.mode.toLowerCase()){ case "drop":
rlm@46 13135 a.w = 0;
rlm@46 13136 a.l = a.t = o;
rlm@46 13137 a.t -= 1;
rlm@46 13138 if(Ext.isIE){
rlm@46 13139 a.l -= this.offset + rad;
rlm@46 13140 a.t -= this.offset + rad;
rlm@46 13141 a.w -= rad;
rlm@46 13142 a.h -= rad;
rlm@46 13143 a.t += 1;
rlm@46 13144 }
rlm@46 13145 break;
rlm@46 13146 case "sides":
rlm@46 13147 a.w = (o*2);
rlm@46 13148 a.l = -o;
rlm@46 13149 a.t = o-1;
rlm@46 13150 if(Ext.isIE){
rlm@46 13151 a.l -= (this.offset - rad);
rlm@46 13152 a.t -= this.offset + rad;
rlm@46 13153 a.l += 1;
rlm@46 13154 a.w -= (this.offset - rad)*2;
rlm@46 13155 a.w -= rad + 1;
rlm@46 13156 a.h -= 1;
rlm@46 13157 }
rlm@46 13158 break;
rlm@46 13159 case "frame":
rlm@46 13160 a.w = a.h = (o*2);
rlm@46 13161 a.l = a.t = -o;
rlm@46 13162 a.t += 1;
rlm@46 13163 a.h -= 2;
rlm@46 13164 if(Ext.isIE){
rlm@46 13165 a.l -= (this.offset - rad);
rlm@46 13166 a.t -= (this.offset - rad);
rlm@46 13167 a.l += 1;
rlm@46 13168 a.w -= (this.offset + rad + 1);
rlm@46 13169 a.h -= (this.offset + rad);
rlm@46 13170 a.h += 1;
rlm@46 13171 }
rlm@46 13172 break;
rlm@46 13173 };
rlm@46 13174
rlm@46 13175 this.adjusts = a;
rlm@46 13176 };
rlm@46 13177
rlm@46 13178 Ext.Shadow.prototype = {
rlm@46 13179
rlm@46 13180
rlm@46 13181 offset: 4,
rlm@46 13182
rlm@46 13183 defaultMode: "drop",
rlm@46 13184
rlm@46 13185
rlm@46 13186 show : function(target){
rlm@46 13187 target = Ext.get(target);
rlm@46 13188 if(!this.el){
rlm@46 13189 this.el = Ext.Shadow.Pool.pull();
rlm@46 13190 if(this.el.dom.nextSibling != target.dom){
rlm@46 13191 this.el.insertBefore(target);
rlm@46 13192 }
rlm@46 13193 }
rlm@46 13194 this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1);
rlm@46 13195 if(Ext.isIE){
rlm@46 13196 this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")";
rlm@46 13197 }
rlm@46 13198 this.realign(
rlm@46 13199 target.getLeft(true),
rlm@46 13200 target.getTop(true),
rlm@46 13201 target.getWidth(),
rlm@46 13202 target.getHeight()
rlm@46 13203 );
rlm@46 13204 this.el.dom.style.display = "block";
rlm@46 13205 },
rlm@46 13206
rlm@46 13207
rlm@46 13208 isVisible : function(){
rlm@46 13209 return this.el ? true : false;
rlm@46 13210 },
rlm@46 13211
rlm@46 13212
rlm@46 13213 realign : function(l, t, w, h){
rlm@46 13214 if(!this.el){
rlm@46 13215 return;
rlm@46 13216 }
rlm@46 13217 var a = this.adjusts, d = this.el.dom, s = d.style;
rlm@46 13218 var iea = 0;
rlm@46 13219 s.left = (l+a.l)+"px";
rlm@46 13220 s.top = (t+a.t)+"px";
rlm@46 13221 var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px";
rlm@46 13222 if(s.width != sws || s.height != shs){
rlm@46 13223 s.width = sws;
rlm@46 13224 s.height = shs;
rlm@46 13225 if(!Ext.isIE){
rlm@46 13226 var cn = d.childNodes;
rlm@46 13227 var sww = Math.max(0, (sw-12))+"px";
rlm@46 13228 cn[0].childNodes[1].style.width = sww;
rlm@46 13229 cn[1].childNodes[1].style.width = sww;
rlm@46 13230 cn[2].childNodes[1].style.width = sww;
rlm@46 13231 cn[1].style.height = Math.max(0, (sh-12))+"px";
rlm@46 13232 }
rlm@46 13233 }
rlm@46 13234 },
rlm@46 13235
rlm@46 13236
rlm@46 13237 hide : function(){
rlm@46 13238 if(this.el){
rlm@46 13239 this.el.dom.style.display = "none";
rlm@46 13240 Ext.Shadow.Pool.push(this.el);
rlm@46 13241 delete this.el;
rlm@46 13242 }
rlm@46 13243 },
rlm@46 13244
rlm@46 13245
rlm@46 13246 setZIndex : function(z){
rlm@46 13247 this.zIndex = z;
rlm@46 13248 if(this.el){
rlm@46 13249 this.el.setStyle("z-index", z);
rlm@46 13250 }
rlm@46 13251 }
rlm@46 13252 };
rlm@46 13253
rlm@46 13254 Ext.Shadow.Pool = function(){
rlm@46 13255 var p = [];
rlm@46 13256 var markup = Ext.isIE ?
rlm@46 13257 '<div class="x-ie-shadow"></div>' :
rlm@46 13258 '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';
rlm@46 13259 return {
rlm@46 13260 pull : function(){
rlm@46 13261 var sh = p.shift();
rlm@46 13262 if(!sh){
rlm@46 13263 sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));
rlm@46 13264 sh.autoBoxAdjust = false;
rlm@46 13265 }
rlm@46 13266 return sh;
rlm@46 13267 },
rlm@46 13268
rlm@46 13269 push : function(sh){
rlm@46 13270 p.push(sh);
rlm@46 13271 }
rlm@46 13272 };
rlm@46 13273 }();
rlm@46 13274
rlm@46 13275 Ext.BoxComponent = Ext.extend(Ext.Component, {
rlm@46 13276
rlm@46 13277
rlm@46 13278
rlm@46 13279
rlm@46 13280
rlm@46 13281
rlm@46 13282
rlm@46 13283
rlm@46 13284
rlm@46 13285
rlm@46 13286
rlm@46 13287 initComponent : function(){
rlm@46 13288 Ext.BoxComponent.superclass.initComponent.call(this);
rlm@46 13289 this.addEvents(
rlm@46 13290
rlm@46 13291 'resize',
rlm@46 13292
rlm@46 13293 'move'
rlm@46 13294 );
rlm@46 13295 },
rlm@46 13296
rlm@46 13297 boxReady : false,
rlm@46 13298 deferHeight: false,
rlm@46 13299
rlm@46 13300
rlm@46 13301 setSize : function(w, h){
rlm@46 13302 if(typeof w == 'object'){
rlm@46 13303 h = w.height;
rlm@46 13304 w = w.width;
rlm@46 13305 }
rlm@46 13306 if(!this.boxReady){
rlm@46 13307 this.width = w;
rlm@46 13308 this.height = h;
rlm@46 13309 return this;
rlm@46 13310 }
rlm@46 13311
rlm@46 13312 if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){
rlm@46 13313 return this;
rlm@46 13314 }
rlm@46 13315 this.lastSize = {width: w, height: h};
rlm@46 13316 var adj = this.adjustSize(w, h);
rlm@46 13317 var aw = adj.width, ah = adj.height;
rlm@46 13318 if(aw !== undefined || ah !== undefined){ var rz = this.getResizeEl();
rlm@46 13319 if(!this.deferHeight && aw !== undefined && ah !== undefined){
rlm@46 13320 rz.setSize(aw, ah);
rlm@46 13321 }else if(!this.deferHeight && ah !== undefined){
rlm@46 13322 rz.setHeight(ah);
rlm@46 13323 }else if(aw !== undefined){
rlm@46 13324 rz.setWidth(aw);
rlm@46 13325 }
rlm@46 13326 this.onResize(aw, ah, w, h);
rlm@46 13327 this.fireEvent('resize', this, aw, ah, w, h);
rlm@46 13328 }
rlm@46 13329 return this;
rlm@46 13330 },
rlm@46 13331
rlm@46 13332
rlm@46 13333 setWidth : function(width){
rlm@46 13334 return this.setSize(width);
rlm@46 13335 },
rlm@46 13336
rlm@46 13337
rlm@46 13338 setHeight : function(height){
rlm@46 13339 return this.setSize(undefined, height);
rlm@46 13340 },
rlm@46 13341
rlm@46 13342
rlm@46 13343 getSize : function(){
rlm@46 13344 return this.el.getSize();
rlm@46 13345 },
rlm@46 13346
rlm@46 13347
rlm@46 13348 getPosition : function(local){
rlm@46 13349 if(local === true){
rlm@46 13350 return [this.el.getLeft(true), this.el.getTop(true)];
rlm@46 13351 }
rlm@46 13352 return this.xy || this.el.getXY();
rlm@46 13353 },
rlm@46 13354
rlm@46 13355
rlm@46 13356 getBox : function(local){
rlm@46 13357 var s = this.el.getSize();
rlm@46 13358 if(local === true){
rlm@46 13359 s.x = this.el.getLeft(true);
rlm@46 13360 s.y = this.el.getTop(true);
rlm@46 13361 }else{
rlm@46 13362 var xy = this.xy || this.el.getXY();
rlm@46 13363 s.x = xy[0];
rlm@46 13364 s.y = xy[1];
rlm@46 13365 }
rlm@46 13366 return s;
rlm@46 13367 },
rlm@46 13368
rlm@46 13369
rlm@46 13370 updateBox : function(box){
rlm@46 13371 this.setSize(box.width, box.height);
rlm@46 13372 this.setPagePosition(box.x, box.y);
rlm@46 13373 return this;
rlm@46 13374 },
rlm@46 13375
rlm@46 13376 getResizeEl : function(){
rlm@46 13377 return this.resizeEl || this.el;
rlm@46 13378 },
rlm@46 13379
rlm@46 13380 getPositionEl : function(){
rlm@46 13381 return this.positionEl || this.el;
rlm@46 13382 },
rlm@46 13383
rlm@46 13384
rlm@46 13385 setPosition : function(x, y){
rlm@46 13386 if(x && typeof x[1] == 'number'){
rlm@46 13387 y = x[1];
rlm@46 13388 x = x[0];
rlm@46 13389 }
rlm@46 13390 this.x = x;
rlm@46 13391 this.y = y;
rlm@46 13392 if(!this.boxReady){
rlm@46 13393 return this;
rlm@46 13394 }
rlm@46 13395 var adj = this.adjustPosition(x, y);
rlm@46 13396 var ax = adj.x, ay = adj.y;
rlm@46 13397
rlm@46 13398 var el = this.getPositionEl();
rlm@46 13399 if(ax !== undefined || ay !== undefined){
rlm@46 13400 if(ax !== undefined && ay !== undefined){
rlm@46 13401 el.setLeftTop(ax, ay);
rlm@46 13402 }else if(ax !== undefined){
rlm@46 13403 el.setLeft(ax);
rlm@46 13404 }else if(ay !== undefined){
rlm@46 13405 el.setTop(ay);
rlm@46 13406 }
rlm@46 13407 this.onPosition(ax, ay);
rlm@46 13408 this.fireEvent('move', this, ax, ay);
rlm@46 13409 }
rlm@46 13410 return this;
rlm@46 13411 },
rlm@46 13412
rlm@46 13413
rlm@46 13414 setPagePosition : function(x, y){
rlm@46 13415 if(x && typeof x[1] == 'number'){
rlm@46 13416 y = x[1];
rlm@46 13417 x = x[0];
rlm@46 13418 }
rlm@46 13419 this.pageX = x;
rlm@46 13420 this.pageY = y;
rlm@46 13421 if(!this.boxReady){
rlm@46 13422 return;
rlm@46 13423 }
rlm@46 13424 if(x === undefined || y === undefined){ return;
rlm@46 13425 }
rlm@46 13426 var p = this.el.translatePoints(x, y);
rlm@46 13427 this.setPosition(p.left, p.top);
rlm@46 13428 return this;
rlm@46 13429 },
rlm@46 13430
rlm@46 13431 onRender : function(ct, position){
rlm@46 13432 Ext.BoxComponent.superclass.onRender.call(this, ct, position);
rlm@46 13433 if(this.resizeEl){
rlm@46 13434 this.resizeEl = Ext.get(this.resizeEl);
rlm@46 13435 }
rlm@46 13436 if(this.positionEl){
rlm@46 13437 this.positionEl = Ext.get(this.positionEl);
rlm@46 13438 }
rlm@46 13439 },
rlm@46 13440
rlm@46 13441 afterRender : function(){
rlm@46 13442 Ext.BoxComponent.superclass.afterRender.call(this);
rlm@46 13443 this.boxReady = true;
rlm@46 13444 this.setSize(this.width, this.height);
rlm@46 13445 if(this.x || this.y){
rlm@46 13446 this.setPosition(this.x, this.y);
rlm@46 13447 }else if(this.pageX || this.pageY){
rlm@46 13448 this.setPagePosition(this.pageX, this.pageY);
rlm@46 13449 }
rlm@46 13450 },
rlm@46 13451
rlm@46 13452
rlm@46 13453 syncSize : function(){
rlm@46 13454 delete this.lastSize;
rlm@46 13455 this.setSize(this.autoWidth ? undefined : this.el.getWidth(), this.autoHeight ? undefined : this.el.getHeight());
rlm@46 13456 return this;
rlm@46 13457 },
rlm@46 13458
rlm@46 13459
rlm@46 13460 onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
rlm@46 13461
rlm@46 13462 },
rlm@46 13463
rlm@46 13464
rlm@46 13465 onPosition : function(x, y){
rlm@46 13466
rlm@46 13467 },
rlm@46 13468
rlm@46 13469 adjustSize : function(w, h){
rlm@46 13470 if(this.autoWidth){
rlm@46 13471 w = 'auto';
rlm@46 13472 }
rlm@46 13473 if(this.autoHeight){
rlm@46 13474 h = 'auto';
rlm@46 13475 }
rlm@46 13476 return {width : w, height: h};
rlm@46 13477 },
rlm@46 13478
rlm@46 13479 adjustPosition : function(x, y){
rlm@46 13480 return {x : x, y: y};
rlm@46 13481 }
rlm@46 13482 });
rlm@46 13483 Ext.reg('box', Ext.BoxComponent);
rlm@46 13484
rlm@46 13485 Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
rlm@46 13486
rlm@46 13487
rlm@46 13488 this.el = Ext.get(dragElement, true);
rlm@46 13489 this.el.dom.unselectable = "on";
rlm@46 13490
rlm@46 13491 this.resizingEl = Ext.get(resizingElement, true);
rlm@46 13492
rlm@46 13493
rlm@46 13494 this.orientation = orientation || Ext.SplitBar.HORIZONTAL;
rlm@46 13495
rlm@46 13496
rlm@46 13497 this.minSize = 0;
rlm@46 13498
rlm@46 13499
rlm@46 13500 this.maxSize = 2000;
rlm@46 13501
rlm@46 13502
rlm@46 13503 this.animate = false;
rlm@46 13504
rlm@46 13505
rlm@46 13506 this.useShim = false;
rlm@46 13507
rlm@46 13508
rlm@46 13509 this.shim = null;
rlm@46 13510
rlm@46 13511 if(!existingProxy){
rlm@46 13512
rlm@46 13513 this.proxy = Ext.SplitBar.createProxy(this.orientation);
rlm@46 13514 }else{
rlm@46 13515 this.proxy = Ext.get(existingProxy).dom;
rlm@46 13516 }
rlm@46 13517
rlm@46 13518 this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});
rlm@46 13519
rlm@46 13520
rlm@46 13521 this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
rlm@46 13522
rlm@46 13523
rlm@46 13524 this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
rlm@46 13525
rlm@46 13526
rlm@46 13527 this.dragSpecs = {};
rlm@46 13528
rlm@46 13529
rlm@46 13530 this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
rlm@46 13531 this.adapter.init(this);
rlm@46 13532
rlm@46 13533 if(this.orientation == Ext.SplitBar.HORIZONTAL){
rlm@46 13534
rlm@46 13535 this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
rlm@46 13536 this.el.addClass("x-splitbar-h");
rlm@46 13537 }else{
rlm@46 13538
rlm@46 13539 this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
rlm@46 13540 this.el.addClass("x-splitbar-v");
rlm@46 13541 }
rlm@46 13542
rlm@46 13543 this.addEvents(
rlm@46 13544
rlm@46 13545 "resize",
rlm@46 13546
rlm@46 13547 "moved",
rlm@46 13548
rlm@46 13549 "beforeresize",
rlm@46 13550
rlm@46 13551 "beforeapply"
rlm@46 13552 );
rlm@46 13553
rlm@46 13554 Ext.SplitBar.superclass.constructor.call(this);
rlm@46 13555 };
rlm@46 13556
rlm@46 13557 Ext.extend(Ext.SplitBar, Ext.util.Observable, {
rlm@46 13558 onStartProxyDrag : function(x, y){
rlm@46 13559 this.fireEvent("beforeresize", this);
rlm@46 13560 this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: "&#160;"}, true);
rlm@46 13561 this.overlay.unselectable();
rlm@46 13562 this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
rlm@46 13563 this.overlay.show();
rlm@46 13564 Ext.get(this.proxy).setDisplayed("block");
rlm@46 13565 var size = this.adapter.getElementSize(this);
rlm@46 13566 this.activeMinSize = this.getMinimumSize();;
rlm@46 13567 this.activeMaxSize = this.getMaximumSize();;
rlm@46 13568 var c1 = size - this.activeMinSize;
rlm@46 13569 var c2 = Math.max(this.activeMaxSize - size, 0);
rlm@46 13570 if(this.orientation == Ext.SplitBar.HORIZONTAL){
rlm@46 13571 this.dd.resetConstraints();
rlm@46 13572 this.dd.setXConstraint(
rlm@46 13573 this.placement == Ext.SplitBar.LEFT ? c1 : c2,
rlm@46 13574 this.placement == Ext.SplitBar.LEFT ? c2 : c1
rlm@46 13575 );
rlm@46 13576 this.dd.setYConstraint(0, 0);
rlm@46 13577 }else{
rlm@46 13578 this.dd.resetConstraints();
rlm@46 13579 this.dd.setXConstraint(0, 0);
rlm@46 13580 this.dd.setYConstraint(
rlm@46 13581 this.placement == Ext.SplitBar.TOP ? c1 : c2,
rlm@46 13582 this.placement == Ext.SplitBar.TOP ? c2 : c1
rlm@46 13583 );
rlm@46 13584 }
rlm@46 13585 this.dragSpecs.startSize = size;
rlm@46 13586 this.dragSpecs.startPoint = [x, y];
rlm@46 13587 Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
rlm@46 13588 },
rlm@46 13589
rlm@46 13590
rlm@46 13591 onEndProxyDrag : function(e){
rlm@46 13592 Ext.get(this.proxy).setDisplayed(false);
rlm@46 13593 var endPoint = Ext.lib.Event.getXY(e);
rlm@46 13594 if(this.overlay){
rlm@46 13595 this.overlay.remove();
rlm@46 13596 delete this.overlay;
rlm@46 13597 }
rlm@46 13598 var newSize;
rlm@46 13599 if(this.orientation == Ext.SplitBar.HORIZONTAL){
rlm@46 13600 newSize = this.dragSpecs.startSize +
rlm@46 13601 (this.placement == Ext.SplitBar.LEFT ?
rlm@46 13602 endPoint[0] - this.dragSpecs.startPoint[0] :
rlm@46 13603 this.dragSpecs.startPoint[0] - endPoint[0]
rlm@46 13604 );
rlm@46 13605 }else{
rlm@46 13606 newSize = this.dragSpecs.startSize +
rlm@46 13607 (this.placement == Ext.SplitBar.TOP ?
rlm@46 13608 endPoint[1] - this.dragSpecs.startPoint[1] :
rlm@46 13609 this.dragSpecs.startPoint[1] - endPoint[1]
rlm@46 13610 );
rlm@46 13611 }
rlm@46 13612 newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
rlm@46 13613 if(newSize != this.dragSpecs.startSize){
rlm@46 13614 if(this.fireEvent('beforeapply', this, newSize) !== false){
rlm@46 13615 this.adapter.setElementSize(this, newSize);
rlm@46 13616 this.fireEvent("moved", this, newSize);
rlm@46 13617 this.fireEvent("resize", this, newSize);
rlm@46 13618 }
rlm@46 13619 }
rlm@46 13620 },
rlm@46 13621
rlm@46 13622
rlm@46 13623 getAdapter : function(){
rlm@46 13624 return this.adapter;
rlm@46 13625 },
rlm@46 13626
rlm@46 13627
rlm@46 13628 setAdapter : function(adapter){
rlm@46 13629 this.adapter = adapter;
rlm@46 13630 this.adapter.init(this);
rlm@46 13631 },
rlm@46 13632
rlm@46 13633
rlm@46 13634 getMinimumSize : function(){
rlm@46 13635 return this.minSize;
rlm@46 13636 },
rlm@46 13637
rlm@46 13638
rlm@46 13639 setMinimumSize : function(minSize){
rlm@46 13640 this.minSize = minSize;
rlm@46 13641 },
rlm@46 13642
rlm@46 13643
rlm@46 13644 getMaximumSize : function(){
rlm@46 13645 return this.maxSize;
rlm@46 13646 },
rlm@46 13647
rlm@46 13648
rlm@46 13649 setMaximumSize : function(maxSize){
rlm@46 13650 this.maxSize = maxSize;
rlm@46 13651 },
rlm@46 13652
rlm@46 13653
rlm@46 13654 setCurrentSize : function(size){
rlm@46 13655 var oldAnimate = this.animate;
rlm@46 13656 this.animate = false;
rlm@46 13657 this.adapter.setElementSize(this, size);
rlm@46 13658 this.animate = oldAnimate;
rlm@46 13659 },
rlm@46 13660
rlm@46 13661
rlm@46 13662 destroy : function(removeEl){
rlm@46 13663 if(this.shim){
rlm@46 13664 this.shim.remove();
rlm@46 13665 }
rlm@46 13666 this.dd.unreg();
rlm@46 13667 Ext.removeNode(this.proxy);
rlm@46 13668 if(removeEl){
rlm@46 13669 this.el.remove();
rlm@46 13670 }
rlm@46 13671 }
rlm@46 13672 });
rlm@46 13673
rlm@46 13674
rlm@46 13675 Ext.SplitBar.createProxy = function(dir){
rlm@46 13676 var proxy = new Ext.Element(document.createElement("div"));
rlm@46 13677 proxy.unselectable();
rlm@46 13678 var cls = 'x-splitbar-proxy';
rlm@46 13679 proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
rlm@46 13680 document.body.appendChild(proxy.dom);
rlm@46 13681 return proxy.dom;
rlm@46 13682 };
rlm@46 13683
rlm@46 13684
rlm@46 13685 Ext.SplitBar.BasicLayoutAdapter = function(){
rlm@46 13686 };
rlm@46 13687
rlm@46 13688 Ext.SplitBar.BasicLayoutAdapter.prototype = {
rlm@46 13689
rlm@46 13690 init : function(s){
rlm@46 13691
rlm@46 13692 },
rlm@46 13693
rlm@46 13694 getElementSize : function(s){
rlm@46 13695 if(s.orientation == Ext.SplitBar.HORIZONTAL){
rlm@46 13696 return s.resizingEl.getWidth();
rlm@46 13697 }else{
rlm@46 13698 return s.resizingEl.getHeight();
rlm@46 13699 }
rlm@46 13700 },
rlm@46 13701
rlm@46 13702
rlm@46 13703 setElementSize : function(s, newSize, onComplete){
rlm@46 13704 if(s.orientation == Ext.SplitBar.HORIZONTAL){
rlm@46 13705 if(!s.animate){
rlm@46 13706 s.resizingEl.setWidth(newSize);
rlm@46 13707 if(onComplete){
rlm@46 13708 onComplete(s, newSize);
rlm@46 13709 }
rlm@46 13710 }else{
rlm@46 13711 s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
rlm@46 13712 }
rlm@46 13713 }else{
rlm@46 13714
rlm@46 13715 if(!s.animate){
rlm@46 13716 s.resizingEl.setHeight(newSize);
rlm@46 13717 if(onComplete){
rlm@46 13718 onComplete(s, newSize);
rlm@46 13719 }
rlm@46 13720 }else{
rlm@46 13721 s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
rlm@46 13722 }
rlm@46 13723 }
rlm@46 13724 }
rlm@46 13725 };
rlm@46 13726
rlm@46 13727
rlm@46 13728 Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
rlm@46 13729 this.basic = new Ext.SplitBar.BasicLayoutAdapter();
rlm@46 13730 this.container = Ext.get(container);
rlm@46 13731 };
rlm@46 13732
rlm@46 13733 Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
rlm@46 13734 init : function(s){
rlm@46 13735 this.basic.init(s);
rlm@46 13736 },
rlm@46 13737
rlm@46 13738 getElementSize : function(s){
rlm@46 13739 return this.basic.getElementSize(s);
rlm@46 13740 },
rlm@46 13741
rlm@46 13742 setElementSize : function(s, newSize, onComplete){
rlm@46 13743 this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
rlm@46 13744 },
rlm@46 13745
rlm@46 13746 moveSplitter : function(s){
rlm@46 13747 var yes = Ext.SplitBar;
rlm@46 13748 switch(s.placement){
rlm@46 13749 case yes.LEFT:
rlm@46 13750 s.el.setX(s.resizingEl.getRight());
rlm@46 13751 break;
rlm@46 13752 case yes.RIGHT:
rlm@46 13753 s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");
rlm@46 13754 break;
rlm@46 13755 case yes.TOP:
rlm@46 13756 s.el.setY(s.resizingEl.getBottom());
rlm@46 13757 break;
rlm@46 13758 case yes.BOTTOM:
rlm@46 13759 s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
rlm@46 13760 break;
rlm@46 13761 }
rlm@46 13762 }
rlm@46 13763 };
rlm@46 13764
rlm@46 13765
rlm@46 13766 Ext.SplitBar.VERTICAL = 1;
rlm@46 13767
rlm@46 13768
rlm@46 13769 Ext.SplitBar.HORIZONTAL = 2;
rlm@46 13770
rlm@46 13771
rlm@46 13772 Ext.SplitBar.LEFT = 1;
rlm@46 13773
rlm@46 13774
rlm@46 13775 Ext.SplitBar.RIGHT = 2;
rlm@46 13776
rlm@46 13777
rlm@46 13778 Ext.SplitBar.TOP = 3;
rlm@46 13779
rlm@46 13780
rlm@46 13781 Ext.SplitBar.BOTTOM = 4;
rlm@46 13782
rlm@46 13783
rlm@46 13784 Ext.Container = Ext.extend(Ext.BoxComponent, {
rlm@46 13785
rlm@46 13786
rlm@46 13787
rlm@46 13788
rlm@46 13789
rlm@46 13790
rlm@46 13791
rlm@46 13792
rlm@46 13793
rlm@46 13794 autoDestroy: true,
rlm@46 13795
rlm@46 13796
rlm@46 13797 defaultType: 'panel',
rlm@46 13798
rlm@46 13799 initComponent : function(){
rlm@46 13800 Ext.Container.superclass.initComponent.call(this);
rlm@46 13801
rlm@46 13802 this.addEvents(
rlm@46 13803
rlm@46 13804 'afterlayout',
rlm@46 13805
rlm@46 13806 'beforeadd',
rlm@46 13807
rlm@46 13808 'beforeremove',
rlm@46 13809
rlm@46 13810 'add',
rlm@46 13811
rlm@46 13812 'remove'
rlm@46 13813 );
rlm@46 13814
rlm@46 13815
rlm@46 13816 var items = this.items;
rlm@46 13817 if(items){
rlm@46 13818 delete this.items;
rlm@46 13819 if(Ext.isArray(items)){
rlm@46 13820 this.add.apply(this, items);
rlm@46 13821 }else{
rlm@46 13822 this.add(items);
rlm@46 13823 }
rlm@46 13824 }
rlm@46 13825 },
rlm@46 13826
rlm@46 13827 initItems : function(){
rlm@46 13828 if(!this.items){
rlm@46 13829 this.items = new Ext.util.MixedCollection(false, this.getComponentId);
rlm@46 13830 this.getLayout(); }
rlm@46 13831 },
rlm@46 13832
rlm@46 13833 setLayout : function(layout){
rlm@46 13834 if(this.layout && this.layout != layout){
rlm@46 13835 this.layout.setContainer(null);
rlm@46 13836 }
rlm@46 13837 this.initItems();
rlm@46 13838 this.layout = layout;
rlm@46 13839 layout.setContainer(this);
rlm@46 13840 },
rlm@46 13841
rlm@46 13842 render : function(){
rlm@46 13843 Ext.Container.superclass.render.apply(this, arguments);
rlm@46 13844 if(this.layout){
rlm@46 13845 if(typeof this.layout == 'string'){
rlm@46 13846 this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);
rlm@46 13847 }
rlm@46 13848 this.setLayout(this.layout);
rlm@46 13849
rlm@46 13850 if(this.activeItem !== undefined){
rlm@46 13851 var item = this.activeItem;
rlm@46 13852 delete this.activeItem;
rlm@46 13853 this.layout.setActiveItem(item);
rlm@46 13854 return;
rlm@46 13855 }
rlm@46 13856 }
rlm@46 13857 if(!this.ownerCt){
rlm@46 13858 this.doLayout();
rlm@46 13859 }
rlm@46 13860 if(this.monitorResize === true){
rlm@46 13861 Ext.EventManager.onWindowResize(this.doLayout, this, [false]);
rlm@46 13862 }
rlm@46 13863 },
rlm@46 13864
rlm@46 13865 getLayoutTarget : function(){
rlm@46 13866 return this.el;
rlm@46 13867 },
rlm@46 13868
rlm@46 13869 getComponentId : function(comp){
rlm@46 13870 return comp.itemId || comp.id;
rlm@46 13871 },
rlm@46 13872
rlm@46 13873
rlm@46 13874 add : function(comp){
rlm@46 13875 if(!this.items){
rlm@46 13876 this.initItems();
rlm@46 13877 }
rlm@46 13878 var a = arguments, len = a.length;
rlm@46 13879 if(len > 1){
rlm@46 13880 for(var i = 0; i < len; i++) {
rlm@46 13881 this.add(a[i]);
rlm@46 13882 }
rlm@46 13883 return;
rlm@46 13884 }
rlm@46 13885 var c = this.lookupComponent(this.applyDefaults(comp));
rlm@46 13886 var pos = this.items.length;
rlm@46 13887 if(this.fireEvent('beforeadd', this, c, pos) !== false && this.onBeforeAdd(c) !== false){
rlm@46 13888 this.items.add(c);
rlm@46 13889 c.ownerCt = this;
rlm@46 13890 this.fireEvent('add', this, c, pos);
rlm@46 13891 }
rlm@46 13892 return c;
rlm@46 13893 },
rlm@46 13894
rlm@46 13895
rlm@46 13896 insert : function(index, comp){
rlm@46 13897 if(!this.items){
rlm@46 13898 this.initItems();
rlm@46 13899 }
rlm@46 13900 var a = arguments, len = a.length;
rlm@46 13901 if(len > 2){
rlm@46 13902 for(var i = len-1; i >= 1; --i) {
rlm@46 13903 this.insert(index, a[i]);
rlm@46 13904 }
rlm@46 13905 return;
rlm@46 13906 }
rlm@46 13907 var c = this.lookupComponent(this.applyDefaults(comp));
rlm@46 13908
rlm@46 13909 if(c.ownerCt == this && this.items.indexOf(c) < index){
rlm@46 13910 --index;
rlm@46 13911 }
rlm@46 13912
rlm@46 13913 if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){
rlm@46 13914 this.items.insert(index, c);
rlm@46 13915 c.ownerCt = this;
rlm@46 13916 this.fireEvent('add', this, c, index);
rlm@46 13917 }
rlm@46 13918 return c;
rlm@46 13919 },
rlm@46 13920
rlm@46 13921 applyDefaults : function(c){
rlm@46 13922 if(this.defaults){
rlm@46 13923 if(typeof c == 'string'){
rlm@46 13924 c = Ext.ComponentMgr.get(c);
rlm@46 13925 Ext.apply(c, this.defaults);
rlm@46 13926 }else if(!c.events){
rlm@46 13927 Ext.applyIf(c, this.defaults);
rlm@46 13928 }else{
rlm@46 13929 Ext.apply(c, this.defaults);
rlm@46 13930 }
rlm@46 13931 }
rlm@46 13932 return c;
rlm@46 13933 },
rlm@46 13934
rlm@46 13935 onBeforeAdd : function(item){
rlm@46 13936 if(item.ownerCt){
rlm@46 13937 item.ownerCt.remove(item, false);
rlm@46 13938 }
rlm@46 13939 if(this.hideBorders === true){
rlm@46 13940 item.border = (item.border === true);
rlm@46 13941 }
rlm@46 13942 },
rlm@46 13943
rlm@46 13944
rlm@46 13945 remove : function(comp, autoDestroy){
rlm@46 13946 var c = this.getComponent(comp);
rlm@46 13947 if(c && this.fireEvent('beforeremove', this, c) !== false){
rlm@46 13948 this.items.remove(c);
rlm@46 13949 delete c.ownerCt;
rlm@46 13950 if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){
rlm@46 13951 c.destroy();
rlm@46 13952 }
rlm@46 13953 if(this.layout && this.layout.activeItem == c){
rlm@46 13954 delete this.layout.activeItem;
rlm@46 13955 }
rlm@46 13956 this.fireEvent('remove', this, c);
rlm@46 13957 }
rlm@46 13958 return c;
rlm@46 13959 },
rlm@46 13960
rlm@46 13961
rlm@46 13962 getComponent : function(comp){
rlm@46 13963 if(typeof comp == 'object'){
rlm@46 13964 return comp;
rlm@46 13965 }
rlm@46 13966 return this.items.get(comp);
rlm@46 13967 },
rlm@46 13968
rlm@46 13969 lookupComponent : function(comp){
rlm@46 13970 if(typeof comp == 'string'){
rlm@46 13971 return Ext.ComponentMgr.get(comp);
rlm@46 13972 }else if(!comp.events){
rlm@46 13973 return this.createComponent(comp);
rlm@46 13974 }
rlm@46 13975 return comp;
rlm@46 13976 },
rlm@46 13977
rlm@46 13978 createComponent : function(config){
rlm@46 13979 return Ext.ComponentMgr.create(config, this.defaultType);
rlm@46 13980 },
rlm@46 13981
rlm@46 13982
rlm@46 13983 doLayout : function(shallow){
rlm@46 13984 if(this.rendered && this.layout){
rlm@46 13985 this.layout.layout();
rlm@46 13986 }
rlm@46 13987 if(shallow !== false && this.items){
rlm@46 13988 var cs = this.items.items;
rlm@46 13989 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 13990 var c = cs[i];
rlm@46 13991 if(c.doLayout){
rlm@46 13992 c.doLayout();
rlm@46 13993 }
rlm@46 13994 }
rlm@46 13995 }
rlm@46 13996 },
rlm@46 13997
rlm@46 13998
rlm@46 13999 getLayout : function(){
rlm@46 14000 if(!this.layout){
rlm@46 14001 var layout = new Ext.layout.ContainerLayout(this.layoutConfig);
rlm@46 14002 this.setLayout(layout);
rlm@46 14003 }
rlm@46 14004 return this.layout;
rlm@46 14005 },
rlm@46 14006
rlm@46 14007 onDestroy : function(){
rlm@46 14008 if(this.items){
rlm@46 14009 var cs = this.items.items;
rlm@46 14010 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 14011 Ext.destroy(cs[i]);
rlm@46 14012 }
rlm@46 14013 }
rlm@46 14014 if(this.monitorResize){
rlm@46 14015 Ext.EventManager.removeResizeListener(this.doLayout, this);
rlm@46 14016 }
rlm@46 14017 Ext.Container.superclass.onDestroy.call(this);
rlm@46 14018 },
rlm@46 14019
rlm@46 14020
rlm@46 14021 bubble : function(fn, scope, args){
rlm@46 14022 var p = this;
rlm@46 14023 while(p){
rlm@46 14024 if(fn.apply(scope || p, args || [p]) === false){
rlm@46 14025 break;
rlm@46 14026 }
rlm@46 14027 p = p.ownerCt;
rlm@46 14028 }
rlm@46 14029 },
rlm@46 14030
rlm@46 14031
rlm@46 14032 cascade : function(fn, scope, args){
rlm@46 14033 if(fn.apply(scope || this, args || [this]) !== false){
rlm@46 14034 if(this.items){
rlm@46 14035 var cs = this.items.items;
rlm@46 14036 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 14037 if(cs[i].cascade){
rlm@46 14038 cs[i].cascade(fn, scope, args);
rlm@46 14039 }else{
rlm@46 14040 fn.apply(scope || this, args || [cs[i]]);
rlm@46 14041 }
rlm@46 14042 }
rlm@46 14043 }
rlm@46 14044 }
rlm@46 14045 },
rlm@46 14046
rlm@46 14047
rlm@46 14048 findById : function(id){
rlm@46 14049 var m, ct = this;
rlm@46 14050 this.cascade(function(c){
rlm@46 14051 if(ct != c && c.id === id){
rlm@46 14052 m = c;
rlm@46 14053 return false;
rlm@46 14054 }
rlm@46 14055 });
rlm@46 14056 return m || null;
rlm@46 14057 },
rlm@46 14058
rlm@46 14059
rlm@46 14060 findByType : function(xtype){
rlm@46 14061 return typeof xtype == 'function' ?
rlm@46 14062 this.findBy(function(c){
rlm@46 14063 return c.constructor === xtype;
rlm@46 14064 }) :
rlm@46 14065 this.findBy(function(c){
rlm@46 14066 return c.constructor.xtype === xtype;
rlm@46 14067 });
rlm@46 14068 },
rlm@46 14069
rlm@46 14070
rlm@46 14071 find : function(prop, value){
rlm@46 14072 return this.findBy(function(c){
rlm@46 14073 return c[prop] === value;
rlm@46 14074 });
rlm@46 14075 },
rlm@46 14076
rlm@46 14077
rlm@46 14078 findBy : function(fn, scope){
rlm@46 14079 var m = [], ct = this;
rlm@46 14080 this.cascade(function(c){
rlm@46 14081 if(ct != c && fn.call(scope || c, c, ct) === true){
rlm@46 14082 m.push(c);
rlm@46 14083 }
rlm@46 14084 });
rlm@46 14085 return m;
rlm@46 14086 }
rlm@46 14087 });
rlm@46 14088
rlm@46 14089 Ext.Container.LAYOUTS = {};
rlm@46 14090 Ext.reg('container', Ext.Container);
rlm@46 14091
rlm@46 14092 Ext.layout.ContainerLayout = function(config){
rlm@46 14093 Ext.apply(this, config);
rlm@46 14094 };
rlm@46 14095
rlm@46 14096 Ext.layout.ContainerLayout.prototype = {
rlm@46 14097
rlm@46 14098
rlm@46 14099
rlm@46 14100
rlm@46 14101
rlm@46 14102 monitorResize:false,
rlm@46 14103 activeItem : null,
rlm@46 14104
rlm@46 14105 layout : function(){
rlm@46 14106 var target = this.container.getLayoutTarget();
rlm@46 14107 this.onLayout(this.container, target);
rlm@46 14108 this.container.fireEvent('afterlayout', this.container, this);
rlm@46 14109 },
rlm@46 14110
rlm@46 14111 onLayout : function(ct, target){
rlm@46 14112 this.renderAll(ct, target);
rlm@46 14113 },
rlm@46 14114
rlm@46 14115 isValidParent : function(c, target){
rlm@46 14116 var el = c.getPositionEl ? c.getPositionEl() : c.getEl();
rlm@46 14117 return el.dom.parentNode == target.dom;
rlm@46 14118 },
rlm@46 14119
rlm@46 14120 renderAll : function(ct, target){
rlm@46 14121 var items = ct.items.items;
rlm@46 14122 for(var i = 0, len = items.length; i < len; i++) {
rlm@46 14123 var c = items[i];
rlm@46 14124 if(c && (!c.rendered || !this.isValidParent(c, target))){
rlm@46 14125 this.renderItem(c, i, target);
rlm@46 14126 }
rlm@46 14127 }
rlm@46 14128 },
rlm@46 14129
rlm@46 14130 renderItem : function(c, position, target){
rlm@46 14131 if(c && !c.rendered){
rlm@46 14132 c.render(target, position);
rlm@46 14133 if(this.extraCls){
rlm@46 14134 var t = c.getPositionEl ? c.getPositionEl() : c;
rlm@46 14135 t.addClass(this.extraCls);
rlm@46 14136 }
rlm@46 14137 if (this.renderHidden && c != this.activeItem) {
rlm@46 14138 c.hide();
rlm@46 14139 }
rlm@46 14140 }else if(c && !this.isValidParent(c, target)){
rlm@46 14141 if(this.extraCls){
rlm@46 14142 c.addClass(this.extraCls);
rlm@46 14143 }
rlm@46 14144 if(typeof position == 'number'){
rlm@46 14145 position = target.dom.childNodes[position];
rlm@46 14146 }
rlm@46 14147 target.dom.insertBefore(c.getEl().dom, position || null);
rlm@46 14148 if (this.renderHidden && c != this.activeItem) {
rlm@46 14149 c.hide();
rlm@46 14150 }
rlm@46 14151 }
rlm@46 14152 },
rlm@46 14153
rlm@46 14154 onResize: function(){
rlm@46 14155 if(this.container.collapsed){
rlm@46 14156 return;
rlm@46 14157 }
rlm@46 14158 var b = this.container.bufferResize;
rlm@46 14159 if(b){
rlm@46 14160 if(!this.resizeTask){
rlm@46 14161 this.resizeTask = new Ext.util.DelayedTask(this.layout, this);
rlm@46 14162 this.resizeBuffer = typeof b == 'number' ? b : 100;
rlm@46 14163 }
rlm@46 14164 this.resizeTask.delay(this.resizeBuffer);
rlm@46 14165 }else{
rlm@46 14166 this.layout();
rlm@46 14167 }
rlm@46 14168 },
rlm@46 14169
rlm@46 14170 setContainer : function(ct){
rlm@46 14171 if(this.monitorResize && ct != this.container){
rlm@46 14172 if(this.container){
rlm@46 14173 this.container.un('resize', this.onResize, this);
rlm@46 14174 }
rlm@46 14175 if(ct){
rlm@46 14176 ct.on('resize', this.onResize, this);
rlm@46 14177 }
rlm@46 14178 }
rlm@46 14179 this.container = ct;
rlm@46 14180 },
rlm@46 14181
rlm@46 14182 parseMargins : function(v){
rlm@46 14183 var ms = v.split(' ');
rlm@46 14184 var len = ms.length;
rlm@46 14185 if(len == 1){
rlm@46 14186 ms[1] = ms[0];
rlm@46 14187 ms[2] = ms[0];
rlm@46 14188 ms[3] = ms[0];
rlm@46 14189 }
rlm@46 14190 if(len == 2){
rlm@46 14191 ms[2] = ms[0];
rlm@46 14192 ms[3] = ms[1];
rlm@46 14193 }
rlm@46 14194 return {
rlm@46 14195 top:parseInt(ms[0], 10) || 0,
rlm@46 14196 right:parseInt(ms[1], 10) || 0,
rlm@46 14197 bottom:parseInt(ms[2], 10) || 0,
rlm@46 14198 left:parseInt(ms[3], 10) || 0
rlm@46 14199 };
rlm@46 14200 }
rlm@46 14201 };
rlm@46 14202 Ext.Container.LAYOUTS['auto'] = Ext.layout.ContainerLayout;
rlm@46 14203
rlm@46 14204 Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
rlm@46 14205
rlm@46 14206 monitorResize:true,
rlm@46 14207
rlm@46 14208
rlm@46 14209 onLayout : function(ct, target){
rlm@46 14210 Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);
rlm@46 14211 if(!this.container.collapsed){
rlm@46 14212 this.setItemSize(this.activeItem || ct.items.itemAt(0), target.getStyleSize());
rlm@46 14213 }
rlm@46 14214 },
rlm@46 14215
rlm@46 14216
rlm@46 14217 setItemSize : function(item, size){
rlm@46 14218 if(item && size.height > 0){
rlm@46 14219 item.setSize(size);
rlm@46 14220 }
rlm@46 14221 }
rlm@46 14222 });
rlm@46 14223 Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout;
rlm@46 14224
rlm@46 14225 Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
rlm@46 14226
rlm@46 14227 deferredRender : false,
rlm@46 14228
rlm@46 14229
rlm@46 14230 renderHidden : true,
rlm@46 14231
rlm@46 14232
rlm@46 14233 setActiveItem : function(item){
rlm@46 14234 item = this.container.getComponent(item);
rlm@46 14235 if(this.activeItem != item){
rlm@46 14236 if(this.activeItem){
rlm@46 14237 this.activeItem.hide();
rlm@46 14238 }
rlm@46 14239 this.activeItem = item;
rlm@46 14240 item.show();
rlm@46 14241 this.layout();
rlm@46 14242 }
rlm@46 14243 },
rlm@46 14244
rlm@46 14245
rlm@46 14246 renderAll : function(ct, target){
rlm@46 14247 if(this.deferredRender){
rlm@46 14248 this.renderItem(this.activeItem, undefined, target);
rlm@46 14249 }else{
rlm@46 14250 Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target);
rlm@46 14251 }
rlm@46 14252 }
rlm@46 14253 });
rlm@46 14254 Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout;
rlm@46 14255
rlm@46 14256 Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
rlm@46 14257
rlm@46 14258 monitorResize:true,
rlm@46 14259
rlm@46 14260
rlm@46 14261 getAnchorViewSize : function(ct, target){
rlm@46 14262 return target.dom == document.body ?
rlm@46 14263 target.getViewSize() : target.getStyleSize();
rlm@46 14264 },
rlm@46 14265
rlm@46 14266
rlm@46 14267 onLayout : function(ct, target){
rlm@46 14268 Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target);
rlm@46 14269
rlm@46 14270 var size = this.getAnchorViewSize(ct, target);
rlm@46 14271
rlm@46 14272 var w = size.width, h = size.height;
rlm@46 14273
rlm@46 14274 if(w < 20 || h < 20){
rlm@46 14275 return;
rlm@46 14276 }
rlm@46 14277
rlm@46 14278
rlm@46 14279 var aw, ah;
rlm@46 14280 if(ct.anchorSize){
rlm@46 14281 if(typeof ct.anchorSize == 'number'){
rlm@46 14282 aw = ct.anchorSize;
rlm@46 14283 }else{
rlm@46 14284 aw = ct.anchorSize.width;
rlm@46 14285 ah = ct.anchorSize.height;
rlm@46 14286 }
rlm@46 14287 }else{
rlm@46 14288 aw = ct.initialConfig.width;
rlm@46 14289 ah = ct.initialConfig.height;
rlm@46 14290 }
rlm@46 14291
rlm@46 14292 var cs = ct.items.items, len = cs.length, i, c, a, cw, ch;
rlm@46 14293 for(i = 0; i < len; i++){
rlm@46 14294 c = cs[i];
rlm@46 14295 if(c.anchor){
rlm@46 14296 a = c.anchorSpec;
rlm@46 14297 if(!a){
rlm@46 14298 var vs = c.anchor.split(' ');
rlm@46 14299 c.anchorSpec = a = {
rlm@46 14300 right: this.parseAnchor(vs[0], c.initialConfig.width, aw),
rlm@46 14301 bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)
rlm@46 14302 };
rlm@46 14303 }
rlm@46 14304 cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;
rlm@46 14305 ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;
rlm@46 14306
rlm@46 14307 if(cw || ch){
rlm@46 14308 c.setSize(cw || undefined, ch || undefined);
rlm@46 14309 }
rlm@46 14310 }
rlm@46 14311 }
rlm@46 14312 },
rlm@46 14313
rlm@46 14314
rlm@46 14315 parseAnchor : function(a, start, cstart){
rlm@46 14316 if(a && a != 'none'){
rlm@46 14317 var last;
rlm@46 14318 if(/^(r|right|b|bottom)$/i.test(a)){
rlm@46 14319 var diff = cstart - start;
rlm@46 14320 return function(v){
rlm@46 14321 if(v !== last){
rlm@46 14322 last = v;
rlm@46 14323 return v - diff;
rlm@46 14324 }
rlm@46 14325 }
rlm@46 14326 }else if(a.indexOf('%') != -1){
rlm@46 14327 var ratio = parseFloat(a.replace('%', ''))*.01;
rlm@46 14328 return function(v){
rlm@46 14329 if(v !== last){
rlm@46 14330 last = v;
rlm@46 14331 return Math.floor(v*ratio);
rlm@46 14332 }
rlm@46 14333 }
rlm@46 14334 }else{
rlm@46 14335 a = parseInt(a, 10);
rlm@46 14336 if(!isNaN(a)){
rlm@46 14337 return function(v){
rlm@46 14338 if(v !== last){
rlm@46 14339 last = v;
rlm@46 14340 return v + a;
rlm@46 14341 }
rlm@46 14342 }
rlm@46 14343 }
rlm@46 14344 }
rlm@46 14345 }
rlm@46 14346 return false;
rlm@46 14347 },
rlm@46 14348
rlm@46 14349
rlm@46 14350 adjustWidthAnchor : function(value, comp){
rlm@46 14351 return value;
rlm@46 14352 },
rlm@46 14353
rlm@46 14354
rlm@46 14355 adjustHeightAnchor : function(value, comp){
rlm@46 14356 return value;
rlm@46 14357 }
rlm@46 14358
rlm@46 14359
rlm@46 14360 });
rlm@46 14361 Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;
rlm@46 14362
rlm@46 14363 Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
rlm@46 14364
rlm@46 14365 monitorResize:true,
rlm@46 14366
rlm@46 14367 extraCls: 'x-column',
rlm@46 14368
rlm@46 14369 scrollOffset : 0,
rlm@46 14370
rlm@46 14371
rlm@46 14372 isValidParent : function(c, target){
rlm@46 14373 return c.getEl().dom.parentNode == this.innerCt.dom;
rlm@46 14374 },
rlm@46 14375
rlm@46 14376
rlm@46 14377 onLayout : function(ct, target){
rlm@46 14378 var cs = ct.items.items, len = cs.length, c, i;
rlm@46 14379
rlm@46 14380 if(!this.innerCt){
rlm@46 14381 target.addClass('x-column-layout-ct');
rlm@46 14382
rlm@46 14383
rlm@46 14384
rlm@46 14385 this.innerCt = target.createChild({cls:'x-column-inner'});
rlm@46 14386 this.innerCt.createChild({cls:'x-clear'});
rlm@46 14387 }
rlm@46 14388 this.renderAll(ct, this.innerCt);
rlm@46 14389
rlm@46 14390 var size = target.getViewSize();
rlm@46 14391
rlm@46 14392 if(size.width < 1 && size.height < 1){
rlm@46 14393 return;
rlm@46 14394 }
rlm@46 14395
rlm@46 14396 var w = size.width - target.getPadding('lr') - this.scrollOffset,
rlm@46 14397 h = size.height - target.getPadding('tb'),
rlm@46 14398 pw = w;
rlm@46 14399
rlm@46 14400 this.innerCt.setWidth(w);
rlm@46 14401
rlm@46 14402
rlm@46 14403
rlm@46 14404
rlm@46 14405 for(i = 0; i < len; i++){
rlm@46 14406 c = cs[i];
rlm@46 14407 if(!c.columnWidth){
rlm@46 14408 pw -= (c.getSize().width + c.getEl().getMargins('lr'));
rlm@46 14409 }
rlm@46 14410 }
rlm@46 14411
rlm@46 14412 pw = pw < 0 ? 0 : pw;
rlm@46 14413
rlm@46 14414 for(i = 0; i < len; i++){
rlm@46 14415 c = cs[i];
rlm@46 14416 if(c.columnWidth){
rlm@46 14417 c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr'));
rlm@46 14418 }
rlm@46 14419 }
rlm@46 14420 }
rlm@46 14421
rlm@46 14422
rlm@46 14423 });
rlm@46 14424
rlm@46 14425 Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;
rlm@46 14426
rlm@46 14427 Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
rlm@46 14428 monitorResize:true,
rlm@46 14429 rendered : false,
rlm@46 14430
rlm@46 14431 onLayout : function(ct, target){
rlm@46 14432 var collapsed;
rlm@46 14433 if(!this.rendered){
rlm@46 14434 target.position();
rlm@46 14435 target.addClass('x-border-layout-ct');
rlm@46 14436 var items = ct.items.items;
rlm@46 14437 collapsed = [];
rlm@46 14438 for(var i = 0, len = items.length; i < len; i++) {
rlm@46 14439 var c = items[i];
rlm@46 14440 var pos = c.region;
rlm@46 14441 if(c.collapsed){
rlm@46 14442 collapsed.push(c);
rlm@46 14443 }
rlm@46 14444 c.collapsed = false;
rlm@46 14445 if(!c.rendered){
rlm@46 14446 c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';
rlm@46 14447 c.render(target, i);
rlm@46 14448 }
rlm@46 14449 this[pos] = pos != 'center' && c.split ?
rlm@46 14450 new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
rlm@46 14451 new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
rlm@46 14452 this[pos].render(target, c);
rlm@46 14453 }
rlm@46 14454 this.rendered = true;
rlm@46 14455 }
rlm@46 14456
rlm@46 14457 var size = target.getViewSize();
rlm@46 14458 if(size.width < 20 || size.height < 20){ if(collapsed){
rlm@46 14459 this.restoreCollapsed = collapsed;
rlm@46 14460 }
rlm@46 14461 return;
rlm@46 14462 }else if(this.restoreCollapsed){
rlm@46 14463 collapsed = this.restoreCollapsed;
rlm@46 14464 delete this.restoreCollapsed;
rlm@46 14465 }
rlm@46 14466
rlm@46 14467 var w = size.width, h = size.height;
rlm@46 14468 var centerW = w, centerH = h, centerY = 0, centerX = 0;
rlm@46 14469
rlm@46 14470 var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;
rlm@46 14471 if(!c){
rlm@46 14472 throw 'No center region defined in BorderLayout ' + ct.id;
rlm@46 14473 }
rlm@46 14474
rlm@46 14475 if(n && n.isVisible()){
rlm@46 14476 var b = n.getSize();
rlm@46 14477 var m = n.getMargins();
rlm@46 14478 b.width = w - (m.left+m.right);
rlm@46 14479 b.x = m.left;
rlm@46 14480 b.y = m.top;
rlm@46 14481 centerY = b.height + b.y + m.bottom;
rlm@46 14482 centerH -= centerY;
rlm@46 14483 n.applyLayout(b);
rlm@46 14484 }
rlm@46 14485 if(s && s.isVisible()){
rlm@46 14486 var b = s.getSize();
rlm@46 14487 var m = s.getMargins();
rlm@46 14488 b.width = w - (m.left+m.right);
rlm@46 14489 b.x = m.left;
rlm@46 14490 var totalHeight = (b.height + m.top + m.bottom);
rlm@46 14491 b.y = h - totalHeight + m.top;
rlm@46 14492 centerH -= totalHeight;
rlm@46 14493 s.applyLayout(b);
rlm@46 14494 }
rlm@46 14495 if(west && west.isVisible()){
rlm@46 14496 var b = west.getSize();
rlm@46 14497 var m = west.getMargins();
rlm@46 14498 b.height = centerH - (m.top+m.bottom);
rlm@46 14499 b.x = m.left;
rlm@46 14500 b.y = centerY + m.top;
rlm@46 14501 var totalWidth = (b.width + m.left + m.right);
rlm@46 14502 centerX += totalWidth;
rlm@46 14503 centerW -= totalWidth;
rlm@46 14504 west.applyLayout(b);
rlm@46 14505 }
rlm@46 14506 if(e && e.isVisible()){
rlm@46 14507 var b = e.getSize();
rlm@46 14508 var m = e.getMargins();
rlm@46 14509 b.height = centerH - (m.top+m.bottom);
rlm@46 14510 var totalWidth = (b.width + m.left + m.right);
rlm@46 14511 b.x = w - totalWidth + m.left;
rlm@46 14512 b.y = centerY + m.top;
rlm@46 14513 centerW -= totalWidth;
rlm@46 14514 e.applyLayout(b);
rlm@46 14515 }
rlm@46 14516
rlm@46 14517 var m = c.getMargins();
rlm@46 14518 var centerBox = {
rlm@46 14519 x: centerX + m.left,
rlm@46 14520 y: centerY + m.top,
rlm@46 14521 width: centerW - (m.left+m.right),
rlm@46 14522 height: centerH - (m.top+m.bottom)
rlm@46 14523 };
rlm@46 14524 c.applyLayout(centerBox);
rlm@46 14525
rlm@46 14526 if(collapsed){
rlm@46 14527 for(var i = 0, len = collapsed.length; i < len; i++){
rlm@46 14528 collapsed[i].collapse(false);
rlm@46 14529 }
rlm@46 14530 }
rlm@46 14531
rlm@46 14532 if(Ext.isIE && Ext.isStrict){ target.repaint();
rlm@46 14533 }
rlm@46 14534 }
rlm@46 14535
rlm@46 14536
rlm@46 14537 });
rlm@46 14538
rlm@46 14539
rlm@46 14540 Ext.layout.BorderLayout.Region = function(layout, config, pos){
rlm@46 14541 Ext.apply(this, config);
rlm@46 14542 this.layout = layout;
rlm@46 14543 this.position = pos;
rlm@46 14544 this.state = {};
rlm@46 14545 if(typeof this.margins == 'string'){
rlm@46 14546 this.margins = this.layout.parseMargins(this.margins);
rlm@46 14547 }
rlm@46 14548 this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
rlm@46 14549 if(this.collapsible){
rlm@46 14550 if(typeof this.cmargins == 'string'){
rlm@46 14551 this.cmargins = this.layout.parseMargins(this.cmargins);
rlm@46 14552 }
rlm@46 14553 if(this.collapseMode == 'mini' && !this.cmargins){
rlm@46 14554 this.cmargins = {left:0,top:0,right:0,bottom:0};
rlm@46 14555 }else{
rlm@46 14556 this.cmargins = Ext.applyIf(this.cmargins || {},
rlm@46 14557 pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);
rlm@46 14558 }
rlm@46 14559 }
rlm@46 14560 };
rlm@46 14561
rlm@46 14562 Ext.layout.BorderLayout.Region.prototype = {
rlm@46 14563
rlm@46 14564
rlm@46 14565
rlm@46 14566
rlm@46 14567
rlm@46 14568
rlm@46 14569
rlm@46 14570 collapsible : false,
rlm@46 14571
rlm@46 14572 split:false,
rlm@46 14573
rlm@46 14574 floatable: true,
rlm@46 14575
rlm@46 14576 minWidth:50,
rlm@46 14577
rlm@46 14578 minHeight:50,
rlm@46 14579
rlm@46 14580 defaultMargins : {left:0,top:0,right:0,bottom:0},
rlm@46 14581 defaultNSCMargins : {left:5,top:5,right:5,bottom:5},
rlm@46 14582 defaultEWCMargins : {left:5,top:0,right:5,bottom:0},
rlm@46 14583
rlm@46 14584
rlm@46 14585 isCollapsed : false,
rlm@46 14586
rlm@46 14587
rlm@46 14588
rlm@46 14589
rlm@46 14590
rlm@46 14591 render : function(ct, p){
rlm@46 14592 this.panel = p;
rlm@46 14593 p.el.enableDisplayMode();
rlm@46 14594 this.targetEl = ct;
rlm@46 14595 this.el = p.el;
rlm@46 14596
rlm@46 14597 var gs = p.getState, ps = this.position;
rlm@46 14598 p.getState = function(){
rlm@46 14599 return Ext.apply(gs.call(p) || {}, this.state);
rlm@46 14600 }.createDelegate(this);
rlm@46 14601
rlm@46 14602 if(ps != 'center'){
rlm@46 14603 p.allowQueuedExpand = false;
rlm@46 14604 p.on({
rlm@46 14605 beforecollapse: this.beforeCollapse,
rlm@46 14606 collapse: this.onCollapse,
rlm@46 14607 beforeexpand: this.beforeExpand,
rlm@46 14608 expand: this.onExpand,
rlm@46 14609 hide: this.onHide,
rlm@46 14610 show: this.onShow,
rlm@46 14611 scope: this
rlm@46 14612 });
rlm@46 14613 if(this.collapsible){
rlm@46 14614 p.collapseEl = 'el';
rlm@46 14615 p.slideAnchor = this.getSlideAnchor();
rlm@46 14616 }
rlm@46 14617 if(p.tools && p.tools.toggle){
rlm@46 14618 p.tools.toggle.addClass('x-tool-collapse-'+ps);
rlm@46 14619 p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');
rlm@46 14620 }
rlm@46 14621 }
rlm@46 14622 },
rlm@46 14623
rlm@46 14624 getCollapsedEl : function(){
rlm@46 14625 if(!this.collapsedEl){
rlm@46 14626 if(!this.toolTemplate){
rlm@46 14627 var tt = new Ext.Template(
rlm@46 14628 '<div class="x-tool x-tool-{id}">&#160;</div>'
rlm@46 14629 );
rlm@46 14630 tt.disableFormats = true;
rlm@46 14631 tt.compile();
rlm@46 14632 Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;
rlm@46 14633 }
rlm@46 14634 this.collapsedEl = this.targetEl.createChild({
rlm@46 14635 cls: "x-layout-collapsed x-layout-collapsed-"+this.position,
rlm@46 14636 id: this.panel.id + '-xcollapsed'
rlm@46 14637 });
rlm@46 14638 this.collapsedEl.enableDisplayMode('block');
rlm@46 14639
rlm@46 14640 if(this.collapseMode == 'mini'){
rlm@46 14641 this.collapsedEl.addClass('x-layout-cmini-'+this.position);
rlm@46 14642 this.miniCollapsedEl = this.collapsedEl.createChild({
rlm@46 14643 cls: "x-layout-mini x-layout-mini-"+this.position, html: "&#160;"
rlm@46 14644 });
rlm@46 14645 this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');
rlm@46 14646 this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
rlm@46 14647 this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});
rlm@46 14648 }else {
rlm@46 14649 var t = this.toolTemplate.append(
rlm@46 14650 this.collapsedEl.dom,
rlm@46 14651 {id:'expand-'+this.position}, true);
rlm@46 14652 t.addClassOnOver('x-tool-expand-'+this.position+'-over');
rlm@46 14653 t.on('click', this.onExpandClick, this, {stopEvent:true});
rlm@46 14654
rlm@46 14655 if(this.floatable !== false){
rlm@46 14656 this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
rlm@46 14657 this.collapsedEl.on("click", this.collapseClick, this);
rlm@46 14658 }
rlm@46 14659 }
rlm@46 14660 }
rlm@46 14661 return this.collapsedEl;
rlm@46 14662 },
rlm@46 14663
rlm@46 14664 onExpandClick : function(e){
rlm@46 14665 if(this.isSlid){
rlm@46 14666 this.afterSlideIn();
rlm@46 14667 this.panel.expand(false);
rlm@46 14668 }else{
rlm@46 14669 this.panel.expand();
rlm@46 14670 }
rlm@46 14671 },
rlm@46 14672
rlm@46 14673 onCollapseClick : function(e){
rlm@46 14674 this.panel.collapse();
rlm@46 14675 },
rlm@46 14676
rlm@46 14677 beforeCollapse : function(p, animate){
rlm@46 14678 this.lastAnim = animate;
rlm@46 14679 if(this.splitEl){
rlm@46 14680 this.splitEl.hide();
rlm@46 14681 }
rlm@46 14682 this.getCollapsedEl().show();
rlm@46 14683 this.panel.el.setStyle('z-index', 100);
rlm@46 14684 this.isCollapsed = true;
rlm@46 14685 this.layout.layout();
rlm@46 14686 },
rlm@46 14687
rlm@46 14688 onCollapse : function(animate){
rlm@46 14689 this.panel.el.setStyle('z-index', 1);
rlm@46 14690 if(this.lastAnim === false || this.panel.animCollapse === false){
rlm@46 14691 this.getCollapsedEl().dom.style.visibility = 'visible';
rlm@46 14692 }else{
rlm@46 14693 this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});
rlm@46 14694 }
rlm@46 14695 this.state.collapsed = true;
rlm@46 14696 this.panel.saveState();
rlm@46 14697 },
rlm@46 14698
rlm@46 14699 beforeExpand : function(animate){
rlm@46 14700 var c = this.getCollapsedEl();
rlm@46 14701 this.el.show();
rlm@46 14702 if(this.position == 'east' || this.position == 'west'){
rlm@46 14703 this.panel.setSize(undefined, c.getHeight());
rlm@46 14704 }else{
rlm@46 14705 this.panel.setSize(c.getWidth(), undefined);
rlm@46 14706 }
rlm@46 14707 c.hide();
rlm@46 14708 c.dom.style.visibility = 'hidden';
rlm@46 14709 this.panel.el.setStyle('z-index', 100);
rlm@46 14710 },
rlm@46 14711
rlm@46 14712 onExpand : function(){
rlm@46 14713 this.isCollapsed = false;
rlm@46 14714 if(this.splitEl){
rlm@46 14715 this.splitEl.show();
rlm@46 14716 }
rlm@46 14717 this.layout.layout();
rlm@46 14718 this.panel.el.setStyle('z-index', 1);
rlm@46 14719 this.state.collapsed = false;
rlm@46 14720 this.panel.saveState();
rlm@46 14721 },
rlm@46 14722
rlm@46 14723 collapseClick : function(e){
rlm@46 14724 if(this.isSlid){
rlm@46 14725 e.stopPropagation();
rlm@46 14726 this.slideIn();
rlm@46 14727 }else{
rlm@46 14728 e.stopPropagation();
rlm@46 14729 this.slideOut();
rlm@46 14730 }
rlm@46 14731 },
rlm@46 14732
rlm@46 14733 onHide : function(){
rlm@46 14734 if(this.isCollapsed){
rlm@46 14735 this.getCollapsedEl().hide();
rlm@46 14736 }else if(this.splitEl){
rlm@46 14737 this.splitEl.hide();
rlm@46 14738 }
rlm@46 14739 },
rlm@46 14740
rlm@46 14741 onShow : function(){
rlm@46 14742 if(this.isCollapsed){
rlm@46 14743 this.getCollapsedEl().show();
rlm@46 14744 }else if(this.splitEl){
rlm@46 14745 this.splitEl.show();
rlm@46 14746 }
rlm@46 14747 },
rlm@46 14748
rlm@46 14749
rlm@46 14750 isVisible : function(){
rlm@46 14751 return !this.panel.hidden;
rlm@46 14752 },
rlm@46 14753
rlm@46 14754
rlm@46 14755 getMargins : function(){
rlm@46 14756 return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;
rlm@46 14757 },
rlm@46 14758
rlm@46 14759
rlm@46 14760 getSize : function(){
rlm@46 14761 return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();
rlm@46 14762 },
rlm@46 14763
rlm@46 14764
rlm@46 14765 setPanel : function(panel){
rlm@46 14766 this.panel = panel;
rlm@46 14767 },
rlm@46 14768
rlm@46 14769
rlm@46 14770 getMinWidth: function(){
rlm@46 14771 return this.minWidth;
rlm@46 14772 },
rlm@46 14773
rlm@46 14774
rlm@46 14775 getMinHeight: function(){
rlm@46 14776 return this.minHeight;
rlm@46 14777 },
rlm@46 14778
rlm@46 14779 applyLayoutCollapsed : function(box){
rlm@46 14780 var ce = this.getCollapsedEl();
rlm@46 14781 ce.setLeftTop(box.x, box.y);
rlm@46 14782 ce.setSize(box.width, box.height);
rlm@46 14783 },
rlm@46 14784
rlm@46 14785 applyLayout : function(box){
rlm@46 14786 if(this.isCollapsed){
rlm@46 14787 this.applyLayoutCollapsed(box);
rlm@46 14788 }else{
rlm@46 14789 this.panel.setPosition(box.x, box.y);
rlm@46 14790 this.panel.setSize(box.width, box.height);
rlm@46 14791 }
rlm@46 14792 },
rlm@46 14793
rlm@46 14794 beforeSlide: function(){
rlm@46 14795 this.panel.beforeEffect();
rlm@46 14796 },
rlm@46 14797
rlm@46 14798 afterSlide : function(){
rlm@46 14799 this.panel.afterEffect();
rlm@46 14800 },
rlm@46 14801
rlm@46 14802 initAutoHide : function(){
rlm@46 14803 if(this.autoHide !== false){
rlm@46 14804 if(!this.autoHideHd){
rlm@46 14805 var st = new Ext.util.DelayedTask(this.slideIn, this);
rlm@46 14806 this.autoHideHd = {
rlm@46 14807 "mouseout": function(e){
rlm@46 14808 if(!e.within(this.el, true)){
rlm@46 14809 st.delay(500);
rlm@46 14810 }
rlm@46 14811 },
rlm@46 14812 "mouseover" : function(e){
rlm@46 14813 st.cancel();
rlm@46 14814 },
rlm@46 14815 scope : this
rlm@46 14816 };
rlm@46 14817 }
rlm@46 14818 this.el.on(this.autoHideHd);
rlm@46 14819 }
rlm@46 14820 },
rlm@46 14821
rlm@46 14822 clearAutoHide : function(){
rlm@46 14823 if(this.autoHide !== false){
rlm@46 14824 this.el.un("mouseout", this.autoHideHd.mouseout);
rlm@46 14825 this.el.un("mouseover", this.autoHideHd.mouseover);
rlm@46 14826 }
rlm@46 14827 },
rlm@46 14828
rlm@46 14829 clearMonitor : function(){
rlm@46 14830 Ext.getDoc().un("click", this.slideInIf, this);
rlm@46 14831 },
rlm@46 14832
rlm@46 14833 slideOut : function(){
rlm@46 14834 if(this.isSlid || this.el.hasActiveFx()){
rlm@46 14835 return;
rlm@46 14836 }
rlm@46 14837 this.isSlid = true;
rlm@46 14838 var ts = this.panel.tools;
rlm@46 14839 if(ts && ts.toggle){
rlm@46 14840 ts.toggle.hide();
rlm@46 14841 }
rlm@46 14842 this.el.show();
rlm@46 14843 if(this.position == 'east' || this.position == 'west'){
rlm@46 14844 this.panel.setSize(undefined, this.collapsedEl.getHeight());
rlm@46 14845 }else{
rlm@46 14846 this.panel.setSize(this.collapsedEl.getWidth(), undefined);
rlm@46 14847 }
rlm@46 14848 this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];
rlm@46 14849 this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
rlm@46 14850 this.el.setStyle("z-index", 102);
rlm@46 14851 if(this.animFloat !== false){
rlm@46 14852 this.beforeSlide();
rlm@46 14853 this.el.slideIn(this.getSlideAnchor(), {
rlm@46 14854 callback: function(){
rlm@46 14855 this.afterSlide();
rlm@46 14856 this.initAutoHide();
rlm@46 14857 Ext.getDoc().on("click", this.slideInIf, this);
rlm@46 14858 },
rlm@46 14859 scope: this,
rlm@46 14860 block: true
rlm@46 14861 });
rlm@46 14862 }else{
rlm@46 14863 this.initAutoHide();
rlm@46 14864 Ext.getDoc().on("click", this.slideInIf, this);
rlm@46 14865 }
rlm@46 14866 },
rlm@46 14867
rlm@46 14868 afterSlideIn : function(){
rlm@46 14869 this.clearAutoHide();
rlm@46 14870 this.isSlid = false;
rlm@46 14871 this.clearMonitor();
rlm@46 14872 this.el.setStyle("z-index", "");
rlm@46 14873 this.el.dom.style.left = this.restoreLT[0];
rlm@46 14874 this.el.dom.style.top = this.restoreLT[1];
rlm@46 14875
rlm@46 14876 var ts = this.panel.tools;
rlm@46 14877 if(ts && ts.toggle){
rlm@46 14878 ts.toggle.show();
rlm@46 14879 }
rlm@46 14880 },
rlm@46 14881
rlm@46 14882 slideIn : function(cb){
rlm@46 14883 if(!this.isSlid || this.el.hasActiveFx()){
rlm@46 14884 Ext.callback(cb);
rlm@46 14885 return;
rlm@46 14886 }
rlm@46 14887 this.isSlid = false;
rlm@46 14888 if(this.animFloat !== false){
rlm@46 14889 this.beforeSlide();
rlm@46 14890 this.el.slideOut(this.getSlideAnchor(), {
rlm@46 14891 callback: function(){
rlm@46 14892 this.el.hide();
rlm@46 14893 this.afterSlide();
rlm@46 14894 this.afterSlideIn();
rlm@46 14895 Ext.callback(cb);
rlm@46 14896 },
rlm@46 14897 scope: this,
rlm@46 14898 block: true
rlm@46 14899 });
rlm@46 14900 }else{
rlm@46 14901 this.el.hide();
rlm@46 14902 this.afterSlideIn();
rlm@46 14903 }
rlm@46 14904 },
rlm@46 14905
rlm@46 14906 slideInIf : function(e){
rlm@46 14907 if(!e.within(this.el)){
rlm@46 14908 this.slideIn();
rlm@46 14909 }
rlm@46 14910 },
rlm@46 14911
rlm@46 14912 anchors : {
rlm@46 14913 "west" : "left",
rlm@46 14914 "east" : "right",
rlm@46 14915 "north" : "top",
rlm@46 14916 "south" : "bottom"
rlm@46 14917 },
rlm@46 14918
rlm@46 14919 sanchors : {
rlm@46 14920 "west" : "l",
rlm@46 14921 "east" : "r",
rlm@46 14922 "north" : "t",
rlm@46 14923 "south" : "b"
rlm@46 14924 },
rlm@46 14925
rlm@46 14926 canchors : {
rlm@46 14927 "west" : "tl-tr",
rlm@46 14928 "east" : "tr-tl",
rlm@46 14929 "north" : "tl-bl",
rlm@46 14930 "south" : "bl-tl"
rlm@46 14931 },
rlm@46 14932
rlm@46 14933 getAnchor : function(){
rlm@46 14934 return this.anchors[this.position];
rlm@46 14935 },
rlm@46 14936
rlm@46 14937 getCollapseAnchor : function(){
rlm@46 14938 return this.canchors[this.position];
rlm@46 14939 },
rlm@46 14940
rlm@46 14941 getSlideAnchor : function(){
rlm@46 14942 return this.sanchors[this.position];
rlm@46 14943 },
rlm@46 14944
rlm@46 14945 getAlignAdj : function(){
rlm@46 14946 var cm = this.cmargins;
rlm@46 14947 switch(this.position){
rlm@46 14948 case "west":
rlm@46 14949 return [0, 0];
rlm@46 14950 break;
rlm@46 14951 case "east":
rlm@46 14952 return [0, 0];
rlm@46 14953 break;
rlm@46 14954 case "north":
rlm@46 14955 return [0, 0];
rlm@46 14956 break;
rlm@46 14957 case "south":
rlm@46 14958 return [0, 0];
rlm@46 14959 break;
rlm@46 14960 }
rlm@46 14961 },
rlm@46 14962
rlm@46 14963 getExpandAdj : function(){
rlm@46 14964 var c = this.collapsedEl, cm = this.cmargins;
rlm@46 14965 switch(this.position){
rlm@46 14966 case "west":
rlm@46 14967 return [-(cm.right+c.getWidth()+cm.left), 0];
rlm@46 14968 break;
rlm@46 14969 case "east":
rlm@46 14970 return [cm.right+c.getWidth()+cm.left, 0];
rlm@46 14971 break;
rlm@46 14972 case "north":
rlm@46 14973 return [0, -(cm.top+cm.bottom+c.getHeight())];
rlm@46 14974 break;
rlm@46 14975 case "south":
rlm@46 14976 return [0, cm.top+cm.bottom+c.getHeight()];
rlm@46 14977 break;
rlm@46 14978 }
rlm@46 14979 }
rlm@46 14980 };
rlm@46 14981
rlm@46 14982
rlm@46 14983 Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){
rlm@46 14984 Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);
rlm@46 14985 this.applyLayout = this.applyFns[pos];
rlm@46 14986 };
rlm@46 14987
rlm@46 14988 Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
rlm@46 14989
rlm@46 14990 splitTip : "Drag to resize.",
rlm@46 14991
rlm@46 14992 collapsibleSplitTip : "Drag to resize. Double click to hide.",
rlm@46 14993
rlm@46 14994 useSplitTips : false,
rlm@46 14995
rlm@46 14996 splitSettings : {
rlm@46 14997 north : {
rlm@46 14998 orientation: Ext.SplitBar.VERTICAL,
rlm@46 14999 placement: Ext.SplitBar.TOP,
rlm@46 15000 maxFn : 'getVMaxSize',
rlm@46 15001 minProp: 'minHeight',
rlm@46 15002 maxProp: 'maxHeight'
rlm@46 15003 },
rlm@46 15004 south : {
rlm@46 15005 orientation: Ext.SplitBar.VERTICAL,
rlm@46 15006 placement: Ext.SplitBar.BOTTOM,
rlm@46 15007 maxFn : 'getVMaxSize',
rlm@46 15008 minProp: 'minHeight',
rlm@46 15009 maxProp: 'maxHeight'
rlm@46 15010 },
rlm@46 15011 east : {
rlm@46 15012 orientation: Ext.SplitBar.HORIZONTAL,
rlm@46 15013 placement: Ext.SplitBar.RIGHT,
rlm@46 15014 maxFn : 'getHMaxSize',
rlm@46 15015 minProp: 'minWidth',
rlm@46 15016 maxProp: 'maxWidth'
rlm@46 15017 },
rlm@46 15018 west : {
rlm@46 15019 orientation: Ext.SplitBar.HORIZONTAL,
rlm@46 15020 placement: Ext.SplitBar.LEFT,
rlm@46 15021 maxFn : 'getHMaxSize',
rlm@46 15022 minProp: 'minWidth',
rlm@46 15023 maxProp: 'maxWidth'
rlm@46 15024 }
rlm@46 15025 },
rlm@46 15026
rlm@46 15027 applyFns : {
rlm@46 15028 west : function(box){
rlm@46 15029 if(this.isCollapsed){
rlm@46 15030 return this.applyLayoutCollapsed(box);
rlm@46 15031 }
rlm@46 15032 var sd = this.splitEl.dom, s = sd.style;
rlm@46 15033 this.panel.setPosition(box.x, box.y);
rlm@46 15034 var sw = sd.offsetWidth;
rlm@46 15035 s.left = (box.x+box.width-sw)+'px';
rlm@46 15036 s.top = (box.y)+'px';
rlm@46 15037 s.height = Math.max(0, box.height)+'px';
rlm@46 15038 this.panel.setSize(box.width-sw, box.height);
rlm@46 15039 },
rlm@46 15040 east : function(box){
rlm@46 15041 if(this.isCollapsed){
rlm@46 15042 return this.applyLayoutCollapsed(box);
rlm@46 15043 }
rlm@46 15044 var sd = this.splitEl.dom, s = sd.style;
rlm@46 15045 var sw = sd.offsetWidth;
rlm@46 15046 this.panel.setPosition(box.x+sw, box.y);
rlm@46 15047 s.left = (box.x)+'px';
rlm@46 15048 s.top = (box.y)+'px';
rlm@46 15049 s.height = Math.max(0, box.height)+'px';
rlm@46 15050 this.panel.setSize(box.width-sw, box.height);
rlm@46 15051 },
rlm@46 15052 north : function(box){
rlm@46 15053 if(this.isCollapsed){
rlm@46 15054 return this.applyLayoutCollapsed(box);
rlm@46 15055 }
rlm@46 15056 var sd = this.splitEl.dom, s = sd.style;
rlm@46 15057 var sh = sd.offsetHeight;
rlm@46 15058 this.panel.setPosition(box.x, box.y);
rlm@46 15059 s.left = (box.x)+'px';
rlm@46 15060 s.top = (box.y+box.height-sh)+'px';
rlm@46 15061 s.width = Math.max(0, box.width)+'px';
rlm@46 15062 this.panel.setSize(box.width, box.height-sh);
rlm@46 15063 },
rlm@46 15064 south : function(box){
rlm@46 15065 if(this.isCollapsed){
rlm@46 15066 return this.applyLayoutCollapsed(box);
rlm@46 15067 }
rlm@46 15068 var sd = this.splitEl.dom, s = sd.style;
rlm@46 15069 var sh = sd.offsetHeight;
rlm@46 15070 this.panel.setPosition(box.x, box.y+sh);
rlm@46 15071 s.left = (box.x)+'px';
rlm@46 15072 s.top = (box.y)+'px';
rlm@46 15073 s.width = Math.max(0, box.width)+'px';
rlm@46 15074 this.panel.setSize(box.width, box.height-sh);
rlm@46 15075 }
rlm@46 15076 },
rlm@46 15077
rlm@46 15078 render : function(ct, p){
rlm@46 15079 Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);
rlm@46 15080
rlm@46 15081 var ps = this.position;
rlm@46 15082
rlm@46 15083 this.splitEl = ct.createChild({
rlm@46 15084 cls: "x-layout-split x-layout-split-"+ps, html: "&#160;",
rlm@46 15085 id: this.panel.id + '-xsplit'
rlm@46 15086 });
rlm@46 15087
rlm@46 15088 if(this.collapseMode == 'mini'){
rlm@46 15089 this.miniSplitEl = this.splitEl.createChild({
rlm@46 15090 cls: "x-layout-mini x-layout-mini-"+ps, html: "&#160;"
rlm@46 15091 });
rlm@46 15092 this.miniSplitEl.addClassOnOver('x-layout-mini-over');
rlm@46 15093 this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});
rlm@46 15094 }
rlm@46 15095
rlm@46 15096 var s = this.splitSettings[ps];
rlm@46 15097
rlm@46 15098 this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);
rlm@46 15099 this.split.placement = s.placement;
rlm@46 15100 this.split.getMaximumSize = this[s.maxFn].createDelegate(this);
rlm@46 15101 this.split.minSize = this.minSize || this[s.minProp];
rlm@46 15102 this.split.on("beforeapply", this.onSplitMove, this);
rlm@46 15103 this.split.useShim = this.useShim === true;
rlm@46 15104 this.maxSize = this.maxSize || this[s.maxProp];
rlm@46 15105
rlm@46 15106 if(p.hidden){
rlm@46 15107 this.splitEl.hide();
rlm@46 15108 }
rlm@46 15109
rlm@46 15110 if(this.useSplitTips){
rlm@46 15111 this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;
rlm@46 15112 }
rlm@46 15113 if(this.collapsible){
rlm@46 15114 this.splitEl.on("dblclick", this.onCollapseClick, this);
rlm@46 15115 }
rlm@46 15116 },
rlm@46 15117
rlm@46 15118 getSize : function(){
rlm@46 15119 if(this.isCollapsed){
rlm@46 15120 return this.collapsedEl.getSize();
rlm@46 15121 }
rlm@46 15122 var s = this.panel.getSize();
rlm@46 15123 if(this.position == 'north' || this.position == 'south'){
rlm@46 15124 s.height += this.splitEl.dom.offsetHeight;
rlm@46 15125 }else{
rlm@46 15126 s.width += this.splitEl.dom.offsetWidth;
rlm@46 15127 }
rlm@46 15128 return s;
rlm@46 15129 },
rlm@46 15130
rlm@46 15131 getHMaxSize : function(){
rlm@46 15132 var cmax = this.maxSize || 10000;
rlm@46 15133 var center = this.layout.center;
rlm@46 15134 return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());
rlm@46 15135 },
rlm@46 15136
rlm@46 15137 getVMaxSize : function(){
rlm@46 15138 var cmax = this.maxSize || 10000;
rlm@46 15139 var center = this.layout.center;
rlm@46 15140 return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());
rlm@46 15141 },
rlm@46 15142
rlm@46 15143 onSplitMove : function(split, newSize){
rlm@46 15144 var s = this.panel.getSize();
rlm@46 15145 this.lastSplitSize = newSize;
rlm@46 15146 if(this.position == 'north' || this.position == 'south'){
rlm@46 15147 this.panel.setSize(s.width, newSize);
rlm@46 15148 this.state.height = newSize;
rlm@46 15149 }else{
rlm@46 15150 this.panel.setSize(newSize, s.height);
rlm@46 15151 this.state.width = newSize;
rlm@46 15152 }
rlm@46 15153 this.layout.layout();
rlm@46 15154 this.panel.saveState();
rlm@46 15155 return false;
rlm@46 15156 },
rlm@46 15157
rlm@46 15158
rlm@46 15159 getSplitBar : function(){
rlm@46 15160 return this.split;
rlm@46 15161 }
rlm@46 15162 });
rlm@46 15163
rlm@46 15164 Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;
rlm@46 15165
rlm@46 15166 Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {
rlm@46 15167
rlm@46 15168
rlm@46 15169
rlm@46 15170 labelSeparator : ':',
rlm@46 15171
rlm@46 15172 getAnchorViewSize : function(ct, target){
rlm@46 15173 return ct.body.getStyleSize();
rlm@46 15174 },
rlm@46 15175
rlm@46 15176 setContainer : function(ct){
rlm@46 15177 Ext.layout.FormLayout.superclass.setContainer.call(this, ct);
rlm@46 15178
rlm@46 15179 if(ct.labelAlign){
rlm@46 15180 ct.addClass('x-form-label-'+ct.labelAlign);
rlm@46 15181 }
rlm@46 15182
rlm@46 15183 if(ct.hideLabels){
rlm@46 15184 this.labelStyle = "display:none";
rlm@46 15185 this.elementStyle = "padding-left:0;";
rlm@46 15186 this.labelAdjust = 0;
rlm@46 15187 }else{
rlm@46 15188 this.labelSeparator = ct.labelSeparator || this.labelSeparator;
rlm@46 15189 ct.labelWidth = ct.labelWidth || 100;
rlm@46 15190 if(typeof ct.labelWidth == 'number'){
rlm@46 15191 var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5);
rlm@46 15192 this.labelAdjust = ct.labelWidth+pad;
rlm@46 15193 this.labelStyle = "width:"+ct.labelWidth+"px;";
rlm@46 15194 this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px';
rlm@46 15195 }
rlm@46 15196 if(ct.labelAlign == 'top'){
rlm@46 15197 this.labelStyle = "width:auto;";
rlm@46 15198 this.labelAdjust = 0;
rlm@46 15199 this.elementStyle = "padding-left:0;";
rlm@46 15200 }
rlm@46 15201 }
rlm@46 15202
rlm@46 15203 if(!this.fieldTpl){
rlm@46 15204 var t = new Ext.Template(
rlm@46 15205 '<div class="x-form-item {5}" tabIndex="-1">',
rlm@46 15206 '<label for="{0}" style="{2}" class="x-form-item-label">{1}{4}</label>',
rlm@46 15207 '<div class="x-form-element" id="x-form-el-{0}" style="{3}">',
rlm@46 15208 '</div><div class="{6}"></div>',
rlm@46 15209 '</div>'
rlm@46 15210 );
rlm@46 15211 t.disableFormats = true;
rlm@46 15212 t.compile();
rlm@46 15213 Ext.layout.FormLayout.prototype.fieldTpl = t;
rlm@46 15214 }
rlm@46 15215 },
rlm@46 15216
rlm@46 15217 renderItem : function(c, position, target){
rlm@46 15218 if(c && !c.rendered && c.isFormField && c.inputType != 'hidden'){
rlm@46 15219 var args = [
rlm@46 15220 c.id, c.fieldLabel,
rlm@46 15221 c.labelStyle||this.labelStyle||'',
rlm@46 15222 this.elementStyle||'',
rlm@46 15223 typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator,
rlm@46 15224 (c.itemCls||this.container.itemCls||'') + (c.hideLabel ? ' x-hide-label' : ''),
rlm@46 15225 c.clearCls || 'x-form-clear-left'
rlm@46 15226 ];
rlm@46 15227 if(typeof position == 'number'){
rlm@46 15228 position = target.dom.childNodes[position] || null;
rlm@46 15229 }
rlm@46 15230 if(position){
rlm@46 15231 this.fieldTpl.insertBefore(position, args);
rlm@46 15232 }else{
rlm@46 15233 this.fieldTpl.append(target, args);
rlm@46 15234 }
rlm@46 15235 c.render('x-form-el-'+c.id);
rlm@46 15236 }else {
rlm@46 15237 Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
rlm@46 15238 }
rlm@46 15239 },
rlm@46 15240
rlm@46 15241 adjustWidthAnchor : function(value, comp){
rlm@46 15242 return value - (comp.isFormField ? (comp.hideLabel ? 0 : this.labelAdjust) : 0);
rlm@46 15243 },
rlm@46 15244
rlm@46 15245 isValidParent : function(c, target){
rlm@46 15246 return true;
rlm@46 15247 }
rlm@46 15248
rlm@46 15249
rlm@46 15250 });
rlm@46 15251
rlm@46 15252 Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;
rlm@46 15253
rlm@46 15254 Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, {
rlm@46 15255
rlm@46 15256 fill : true,
rlm@46 15257
rlm@46 15258 autoWidth : true,
rlm@46 15259
rlm@46 15260 titleCollapse : true,
rlm@46 15261
rlm@46 15262 hideCollapseTool : false,
rlm@46 15263
rlm@46 15264 collapseFirst : false,
rlm@46 15265
rlm@46 15266 animate : false,
rlm@46 15267
rlm@46 15268 sequence : false,
rlm@46 15269
rlm@46 15270 activeOnTop : false,
rlm@46 15271
rlm@46 15272 renderItem : function(c){
rlm@46 15273 if(this.animate === false){
rlm@46 15274 c.animCollapse = false;
rlm@46 15275 }
rlm@46 15276 c.collapsible = true;
rlm@46 15277 if(this.autoWidth){
rlm@46 15278 c.autoWidth = true;
rlm@46 15279 }
rlm@46 15280 if(this.titleCollapse){
rlm@46 15281 c.titleCollapse = true;
rlm@46 15282 }
rlm@46 15283 if(this.hideCollapseTool){
rlm@46 15284 c.hideCollapseTool = true;
rlm@46 15285 }
rlm@46 15286 if(this.collapseFirst !== undefined){
rlm@46 15287 c.collapseFirst = this.collapseFirst;
rlm@46 15288 }
rlm@46 15289 if(!this.activeItem && !c.collapsed){
rlm@46 15290 this.activeItem = c;
rlm@46 15291 }else if(this.activeItem){
rlm@46 15292 c.collapsed = true;
rlm@46 15293 }
rlm@46 15294 Ext.layout.Accordion.superclass.renderItem.apply(this, arguments);
rlm@46 15295 c.header.addClass('x-accordion-hd');
rlm@46 15296 c.on('beforeexpand', this.beforeExpand, this);
rlm@46 15297 },
rlm@46 15298
rlm@46 15299
rlm@46 15300 beforeExpand : function(p, anim){
rlm@46 15301 var ai = this.activeItem;
rlm@46 15302 if(ai){
rlm@46 15303 if(this.sequence){
rlm@46 15304 delete this.activeItem;
rlm@46 15305 if (!ai.collapsed){
rlm@46 15306 ai.collapse({callback:function(){
rlm@46 15307 p.expand(anim || true);
rlm@46 15308 }, scope: this});
rlm@46 15309 return false;
rlm@46 15310 }
rlm@46 15311 }else{
rlm@46 15312 ai.collapse(this.animate);
rlm@46 15313 }
rlm@46 15314 }
rlm@46 15315 this.activeItem = p;
rlm@46 15316 if(this.activeOnTop){
rlm@46 15317 p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);
rlm@46 15318 }
rlm@46 15319 this.layout();
rlm@46 15320 },
rlm@46 15321
rlm@46 15322
rlm@46 15323 setItemSize : function(item, size){
rlm@46 15324 if(this.fill && item){
rlm@46 15325 var items = this.container.items.items;
rlm@46 15326 var hh = 0;
rlm@46 15327 for(var i = 0, len = items.length; i < len; i++){
rlm@46 15328 var p = items[i];
rlm@46 15329 if(p != item){
rlm@46 15330 hh += (p.getSize().height - p.bwrap.getHeight());
rlm@46 15331 }
rlm@46 15332 }
rlm@46 15333 size.height -= hh;
rlm@46 15334 item.setSize(size);
rlm@46 15335 }
rlm@46 15336 }
rlm@46 15337 });
rlm@46 15338 Ext.Container.LAYOUTS['accordion'] = Ext.layout.Accordion;
rlm@46 15339
rlm@46 15340 Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
rlm@46 15341
rlm@46 15342
rlm@46 15343
rlm@46 15344 monitorResize:false,
rlm@46 15345
rlm@46 15346
rlm@46 15347 setContainer : function(ct){
rlm@46 15348 Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
rlm@46 15349
rlm@46 15350 this.currentRow = 0;
rlm@46 15351 this.currentColumn = 0;
rlm@46 15352 this.cells = [];
rlm@46 15353 },
rlm@46 15354
rlm@46 15355
rlm@46 15356 onLayout : function(ct, target){
rlm@46 15357 var cs = ct.items.items, len = cs.length, c, i;
rlm@46 15358
rlm@46 15359 if(!this.table){
rlm@46 15360 target.addClass('x-table-layout-ct');
rlm@46 15361
rlm@46 15362 this.table = target.createChild(
rlm@46 15363 {tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, null, true);
rlm@46 15364
rlm@46 15365 this.renderAll(ct, target);
rlm@46 15366 }
rlm@46 15367 },
rlm@46 15368
rlm@46 15369
rlm@46 15370 getRow : function(index){
rlm@46 15371 var row = this.table.tBodies[0].childNodes[index];
rlm@46 15372 if(!row){
rlm@46 15373 row = document.createElement('tr');
rlm@46 15374 this.table.tBodies[0].appendChild(row);
rlm@46 15375 }
rlm@46 15376 return row;
rlm@46 15377 },
rlm@46 15378
rlm@46 15379
rlm@46 15380 getNextCell : function(c){
rlm@46 15381 var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
rlm@46 15382 var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
rlm@46 15383 for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
rlm@46 15384 if(!this.cells[rowIndex]){
rlm@46 15385 this.cells[rowIndex] = [];
rlm@46 15386 }
rlm@46 15387 for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
rlm@46 15388 this.cells[rowIndex][colIndex] = true;
rlm@46 15389 }
rlm@46 15390 }
rlm@46 15391 var td = document.createElement('td');
rlm@46 15392 if(c.cellId){
rlm@46 15393 td.id = c.cellId;
rlm@46 15394 }
rlm@46 15395 var cls = 'x-table-layout-cell';
rlm@46 15396 if(c.cellCls){
rlm@46 15397 cls += ' ' + c.cellCls;
rlm@46 15398 }
rlm@46 15399 td.className = cls;
rlm@46 15400 if(c.colspan){
rlm@46 15401 td.colSpan = c.colspan;
rlm@46 15402 }
rlm@46 15403 if(c.rowspan){
rlm@46 15404 td.rowSpan = c.rowspan;
rlm@46 15405 }
rlm@46 15406 this.getRow(curRow).appendChild(td);
rlm@46 15407 return td;
rlm@46 15408 },
rlm@46 15409
rlm@46 15410
rlm@46 15411 getNextNonSpan: function(colIndex, rowIndex){
rlm@46 15412 var cols = this.columns;
rlm@46 15413 while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
rlm@46 15414 if(cols && colIndex >= cols){
rlm@46 15415 rowIndex++;
rlm@46 15416 colIndex = 0;
rlm@46 15417 }else{
rlm@46 15418 colIndex++;
rlm@46 15419 }
rlm@46 15420 }
rlm@46 15421 return [colIndex, rowIndex];
rlm@46 15422 },
rlm@46 15423
rlm@46 15424
rlm@46 15425 renderItem : function(c, position, target){
rlm@46 15426 if(c && !c.rendered){
rlm@46 15427 c.render(this.getNextCell(c));
rlm@46 15428 }
rlm@46 15429 },
rlm@46 15430
rlm@46 15431
rlm@46 15432 isValidParent : function(c, target){
rlm@46 15433 return true;
rlm@46 15434 }
rlm@46 15435
rlm@46 15436
rlm@46 15437 });
rlm@46 15438
rlm@46 15439 Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;
rlm@46 15440
rlm@46 15441 Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
rlm@46 15442 extraCls: 'x-abs-layout-item',
rlm@46 15443 isForm: false,
rlm@46 15444
rlm@46 15445 setContainer : function(ct){
rlm@46 15446 Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, ct);
rlm@46 15447 if(ct.isXType('form')){
rlm@46 15448 this.isForm = true;
rlm@46 15449 }
rlm@46 15450 },
rlm@46 15451
rlm@46 15452 onLayout : function(ct, target){
rlm@46 15453 if(this.isForm){ ct.body.position(); } else { target.position(); }
rlm@46 15454 Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);
rlm@46 15455 },
rlm@46 15456
rlm@46 15457
rlm@46 15458 getAnchorViewSize : function(ct, target){
rlm@46 15459 return this.isForm ? ct.body.getStyleSize() : Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this, ct, target);
rlm@46 15460 },
rlm@46 15461
rlm@46 15462
rlm@46 15463 isValidParent : function(c, target){
rlm@46 15464 return this.isForm ? true : Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this, c, target);
rlm@46 15465 },
rlm@46 15466
rlm@46 15467
rlm@46 15468 adjustWidthAnchor : function(value, comp){
rlm@46 15469 return value ? value - comp.getPosition(true)[0] : value;
rlm@46 15470 },
rlm@46 15471
rlm@46 15472
rlm@46 15473 adjustHeightAnchor : function(value, comp){
rlm@46 15474 return value ? value - comp.getPosition(true)[1] : value;
rlm@46 15475 }
rlm@46 15476
rlm@46 15477 });
rlm@46 15478 Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout;
rlm@46 15479
rlm@46 15480 Ext.Viewport = Ext.extend(Ext.Container, {
rlm@46 15481
rlm@46 15482
rlm@46 15483
rlm@46 15484
rlm@46 15485
rlm@46 15486
rlm@46 15487
rlm@46 15488
rlm@46 15489
rlm@46 15490
rlm@46 15491
rlm@46 15492
rlm@46 15493 initComponent : function() {
rlm@46 15494 Ext.Viewport.superclass.initComponent.call(this);
rlm@46 15495 document.getElementsByTagName('html')[0].className += ' x-viewport';
rlm@46 15496 this.el = Ext.getBody();
rlm@46 15497 this.el.setHeight = Ext.emptyFn;
rlm@46 15498 this.el.setWidth = Ext.emptyFn;
rlm@46 15499 this.el.setSize = Ext.emptyFn;
rlm@46 15500 this.el.dom.scroll = 'no';
rlm@46 15501 this.allowDomMove = false;
rlm@46 15502 this.autoWidth = true;
rlm@46 15503 this.autoHeight = true;
rlm@46 15504 Ext.EventManager.onWindowResize(this.fireResize, this);
rlm@46 15505 this.renderTo = this.el;
rlm@46 15506 },
rlm@46 15507
rlm@46 15508 fireResize : function(w, h){
rlm@46 15509 this.fireEvent('resize', this, w, h, w, h);
rlm@46 15510 }
rlm@46 15511 });
rlm@46 15512 Ext.reg('viewport', Ext.Viewport);
rlm@46 15513
rlm@46 15514 Ext.Panel = Ext.extend(Ext.Container, {
rlm@46 15515
rlm@46 15516
rlm@46 15517
rlm@46 15518
rlm@46 15519
rlm@46 15520
rlm@46 15521
rlm@46 15522
rlm@46 15523
rlm@46 15524
rlm@46 15525
rlm@46 15526
rlm@46 15527
rlm@46 15528
rlm@46 15529
rlm@46 15530
rlm@46 15531
rlm@46 15532
rlm@46 15533
rlm@46 15534
rlm@46 15535
rlm@46 15536
rlm@46 15537
rlm@46 15538
rlm@46 15539
rlm@46 15540
rlm@46 15541
rlm@46 15542
rlm@46 15543
rlm@46 15544
rlm@46 15545
rlm@46 15546
rlm@46 15547
rlm@46 15548 baseCls : 'x-panel',
rlm@46 15549
rlm@46 15550 collapsedCls : 'x-panel-collapsed',
rlm@46 15551
rlm@46 15552 maskDisabled: true,
rlm@46 15553
rlm@46 15554 animCollapse: Ext.enableFx,
rlm@46 15555
rlm@46 15556 headerAsText: true,
rlm@46 15557
rlm@46 15558 buttonAlign: 'right',
rlm@46 15559
rlm@46 15560 collapsed : false,
rlm@46 15561
rlm@46 15562 collapseFirst: true,
rlm@46 15563
rlm@46 15564 minButtonWidth:75,
rlm@46 15565
rlm@46 15566 elements : 'body',
rlm@46 15567
rlm@46 15568 toolTarget : 'header',
rlm@46 15569 collapseEl : 'bwrap',
rlm@46 15570 slideAnchor : 't',
rlm@46 15571
rlm@46 15572 deferHeight: true,
rlm@46 15573 expandDefaults: {
rlm@46 15574 duration:.25
rlm@46 15575 },
rlm@46 15576 collapseDefaults: {
rlm@46 15577 duration:.25
rlm@46 15578 },
rlm@46 15579
rlm@46 15580 initComponent : function(){
rlm@46 15581 Ext.Panel.superclass.initComponent.call(this);
rlm@46 15582
rlm@46 15583 this.addEvents(
rlm@46 15584
rlm@46 15585 'bodyresize',
rlm@46 15586
rlm@46 15587 'titlechange',
rlm@46 15588
rlm@46 15589 'collapse',
rlm@46 15590
rlm@46 15591 'expand',
rlm@46 15592
rlm@46 15593 'beforecollapse',
rlm@46 15594
rlm@46 15595 'beforeexpand',
rlm@46 15596
rlm@46 15597 'beforeclose',
rlm@46 15598
rlm@46 15599 'close',
rlm@46 15600
rlm@46 15601 'activate',
rlm@46 15602
rlm@46 15603 'deactivate'
rlm@46 15604 );
rlm@46 15605
rlm@46 15606 if(this.tbar){
rlm@46 15607 this.elements += ',tbar';
rlm@46 15608 if(typeof this.tbar == 'object'){
rlm@46 15609 this.topToolbar = this.tbar;
rlm@46 15610 }
rlm@46 15611 delete this.tbar;
rlm@46 15612 }
rlm@46 15613 if(this.bbar){
rlm@46 15614 this.elements += ',bbar';
rlm@46 15615 if(typeof this.bbar == 'object'){
rlm@46 15616 this.bottomToolbar = this.bbar;
rlm@46 15617 }
rlm@46 15618 delete this.bbar;
rlm@46 15619 }
rlm@46 15620
rlm@46 15621 if(this.header === true){
rlm@46 15622 this.elements += ',header';
rlm@46 15623 delete this.header;
rlm@46 15624 }else if(this.title && this.header !== false){
rlm@46 15625 this.elements += ',header';
rlm@46 15626 }
rlm@46 15627
rlm@46 15628 if(this.footer === true){
rlm@46 15629 this.elements += ',footer';
rlm@46 15630 delete this.footer;
rlm@46 15631 }
rlm@46 15632
rlm@46 15633 if(this.buttons){
rlm@46 15634 var btns = this.buttons;
rlm@46 15635
rlm@46 15636 this.buttons = [];
rlm@46 15637 for(var i = 0, len = btns.length; i < len; i++) {
rlm@46 15638 if(btns[i].render){ this.buttons.push(btns[i]);
rlm@46 15639 }else{
rlm@46 15640 this.addButton(btns[i]);
rlm@46 15641 }
rlm@46 15642 }
rlm@46 15643 }
rlm@46 15644 if(this.autoLoad){
rlm@46 15645 this.on('render', this.doAutoLoad, this, {delay:10});
rlm@46 15646 }
rlm@46 15647 },
rlm@46 15648
rlm@46 15649 createElement : function(name, pnode){
rlm@46 15650 if(this[name]){
rlm@46 15651 pnode.appendChild(this[name].dom);
rlm@46 15652 return;
rlm@46 15653 }
rlm@46 15654
rlm@46 15655 if(name === 'bwrap' || this.elements.indexOf(name) != -1){
rlm@46 15656 if(this[name+'Cfg']){
rlm@46 15657 this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
rlm@46 15658 }else{
rlm@46 15659 var el = document.createElement('div');
rlm@46 15660 el.className = this[name+'Cls'];
rlm@46 15661 this[name] = Ext.get(pnode.appendChild(el));
rlm@46 15662 }
rlm@46 15663 }
rlm@46 15664 },
rlm@46 15665
rlm@46 15666 onRender : function(ct, position){
rlm@46 15667 Ext.Panel.superclass.onRender.call(this, ct, position);
rlm@46 15668
rlm@46 15669 this.createClasses();
rlm@46 15670
rlm@46 15671 if(this.el){ this.el.addClass(this.baseCls);
rlm@46 15672 this.header = this.el.down('.'+this.headerCls);
rlm@46 15673 this.bwrap = this.el.down('.'+this.bwrapCls);
rlm@46 15674 var cp = this.bwrap ? this.bwrap : this.el;
rlm@46 15675 this.tbar = cp.down('.'+this.tbarCls);
rlm@46 15676 this.body = cp.down('.'+this.bodyCls);
rlm@46 15677 this.bbar = cp.down('.'+this.bbarCls);
rlm@46 15678 this.footer = cp.down('.'+this.footerCls);
rlm@46 15679 this.fromMarkup = true;
rlm@46 15680 }else{
rlm@46 15681 this.el = ct.createChild({
rlm@46 15682 id: this.id,
rlm@46 15683 cls: this.baseCls
rlm@46 15684 }, position);
rlm@46 15685 }
rlm@46 15686 var el = this.el, d = el.dom;
rlm@46 15687
rlm@46 15688 if(this.cls){
rlm@46 15689 this.el.addClass(this.cls);
rlm@46 15690 }
rlm@46 15691
rlm@46 15692 if(this.buttons){
rlm@46 15693 this.elements += ',footer';
rlm@46 15694 }
rlm@46 15695
rlm@46 15696
rlm@46 15697 if(this.frame){
rlm@46 15698 el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
rlm@46 15699
rlm@46 15700 this.createElement('header', d.firstChild.firstChild.firstChild);
rlm@46 15701 this.createElement('bwrap', d);
rlm@46 15702
rlm@46 15703 var bw = this.bwrap.dom;
rlm@46 15704 var ml = d.childNodes[1], bl = d.childNodes[2];
rlm@46 15705 bw.appendChild(ml);
rlm@46 15706 bw.appendChild(bl);
rlm@46 15707
rlm@46 15708 var mc = bw.firstChild.firstChild.firstChild;
rlm@46 15709 this.createElement('tbar', mc);
rlm@46 15710 this.createElement('body', mc);
rlm@46 15711 this.createElement('bbar', mc);
rlm@46 15712 this.createElement('footer', bw.lastChild.firstChild.firstChild);
rlm@46 15713
rlm@46 15714 if(!this.footer){
rlm@46 15715 this.bwrap.dom.lastChild.className += ' x-panel-nofooter';
rlm@46 15716 }
rlm@46 15717 }else{
rlm@46 15718 this.createElement('header', d);
rlm@46 15719 this.createElement('bwrap', d);
rlm@46 15720
rlm@46 15721 var bw = this.bwrap.dom;
rlm@46 15722 this.createElement('tbar', bw);
rlm@46 15723 this.createElement('body', bw);
rlm@46 15724 this.createElement('bbar', bw);
rlm@46 15725 this.createElement('footer', bw);
rlm@46 15726
rlm@46 15727 if(!this.header){
rlm@46 15728 this.body.addClass(this.bodyCls + '-noheader');
rlm@46 15729 if(this.tbar){
rlm@46 15730 this.tbar.addClass(this.tbarCls + '-noheader');
rlm@46 15731 }
rlm@46 15732 }
rlm@46 15733 }
rlm@46 15734
rlm@46 15735 if(this.border === false){
rlm@46 15736 this.el.addClass(this.baseCls + '-noborder');
rlm@46 15737 this.body.addClass(this.bodyCls + '-noborder');
rlm@46 15738 if(this.header){
rlm@46 15739 this.header.addClass(this.headerCls + '-noborder');
rlm@46 15740 }
rlm@46 15741 if(this.footer){
rlm@46 15742 this.footer.addClass(this.footerCls + '-noborder');
rlm@46 15743 }
rlm@46 15744 if(this.tbar){
rlm@46 15745 this.tbar.addClass(this.tbarCls + '-noborder');
rlm@46 15746 }
rlm@46 15747 if(this.bbar){
rlm@46 15748 this.bbar.addClass(this.bbarCls + '-noborder');
rlm@46 15749 }
rlm@46 15750 }
rlm@46 15751
rlm@46 15752 if(this.bodyBorder === false){
rlm@46 15753 this.body.addClass(this.bodyCls + '-noborder');
rlm@46 15754 }
rlm@46 15755
rlm@46 15756 if(this.bodyStyle){
rlm@46 15757 this.body.applyStyles(this.bodyStyle);
rlm@46 15758 }
rlm@46 15759
rlm@46 15760 this.bwrap.enableDisplayMode('block');
rlm@46 15761
rlm@46 15762 if(this.header){
rlm@46 15763 this.header.unselectable();
rlm@46 15764
rlm@46 15765 if(this.headerAsText){
rlm@46 15766 this.header.dom.innerHTML =
rlm@46 15767 '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
rlm@46 15768
rlm@46 15769 if(this.iconCls){
rlm@46 15770 this.setIconClass(this.iconCls);
rlm@46 15771 }
rlm@46 15772 }
rlm@46 15773 }
rlm@46 15774
rlm@46 15775 if(this.floating){
rlm@46 15776 this.makeFloating(this.floating);
rlm@46 15777 }
rlm@46 15778
rlm@46 15779 if(this.collapsible){
rlm@46 15780 this.tools = this.tools ? this.tools.slice(0) : [];
rlm@46 15781 if(!this.hideCollapseTool){
rlm@46 15782 this.tools[this.collapseFirst?'unshift':'push']({
rlm@46 15783 id: 'toggle',
rlm@46 15784 handler : this.toggleCollapse,
rlm@46 15785 scope: this
rlm@46 15786 });
rlm@46 15787 }
rlm@46 15788 if(this.titleCollapse && this.header){
rlm@46 15789 this.header.on('click', this.toggleCollapse, this);
rlm@46 15790 this.header.setStyle('cursor', 'pointer');
rlm@46 15791 }
rlm@46 15792 }
rlm@46 15793 if(this.tools){
rlm@46 15794 var ts = this.tools;
rlm@46 15795 this.tools = {};
rlm@46 15796 this.addTool.apply(this, ts);
rlm@46 15797 }else{
rlm@46 15798 this.tools = {};
rlm@46 15799 }
rlm@46 15800
rlm@46 15801 if(this.buttons && this.buttons.length > 0){
rlm@46 15802 var tb = this.footer.createChild({cls:'x-panel-btns-ct', cn: {
rlm@46 15803 cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,
rlm@46 15804 html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'
rlm@46 15805 }}, null, true);
rlm@46 15806 var tr = tb.getElementsByTagName('tr')[0];
rlm@46 15807 for(var i = 0, len = this.buttons.length; i < len; i++) {
rlm@46 15808 var b = this.buttons[i];
rlm@46 15809 var td = document.createElement('td');
rlm@46 15810 td.className = 'x-panel-btn-td';
rlm@46 15811 b.render(tr.appendChild(td));
rlm@46 15812 }
rlm@46 15813 }
rlm@46 15814
rlm@46 15815 if(this.tbar && this.topToolbar){
rlm@46 15816 if(Ext.isArray(this.topToolbar)){
rlm@46 15817 this.topToolbar = new Ext.Toolbar(this.topToolbar);
rlm@46 15818 }
rlm@46 15819 this.topToolbar.render(this.tbar);
rlm@46 15820 this.topToolbar.ownerCt = this;
rlm@46 15821 }
rlm@46 15822 if(this.bbar && this.bottomToolbar){
rlm@46 15823 if(Ext.isArray(this.bottomToolbar)){
rlm@46 15824 this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar);
rlm@46 15825 }
rlm@46 15826 this.bottomToolbar.render(this.bbar);
rlm@46 15827 this.bottomToolbar.ownerCt = this;
rlm@46 15828 }
rlm@46 15829 },
rlm@46 15830
rlm@46 15831
rlm@46 15832 setIconClass : function(cls){
rlm@46 15833 var old = this.iconCls;
rlm@46 15834 this.iconCls = cls;
rlm@46 15835 if(this.rendered && this.header){
rlm@46 15836 if(this.frame){
rlm@46 15837 this.header.addClass('x-panel-icon');
rlm@46 15838 this.header.replaceClass(old, this.iconCls);
rlm@46 15839 }else{
rlm@46 15840 var hd = this.header.dom;
rlm@46 15841 var img = hd.firstChild && String(hd.firstChild.tagName).toLowerCase() == 'img' ? hd.firstChild : null;
rlm@46 15842 if(img){
rlm@46 15843 Ext.fly(img).replaceClass(old, this.iconCls);
rlm@46 15844 }else{
rlm@46 15845 Ext.DomHelper.insertBefore(hd.firstChild, {
rlm@46 15846 tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls
rlm@46 15847 });
rlm@46 15848 }
rlm@46 15849 }
rlm@46 15850 }
rlm@46 15851 },
rlm@46 15852
rlm@46 15853 makeFloating : function(cfg){
rlm@46 15854 this.floating = true;
rlm@46 15855 this.el = new Ext.Layer(
rlm@46 15856 typeof cfg == 'object' ? cfg : {
rlm@46 15857 shadow: this.shadow !== undefined ? this.shadow : 'sides',
rlm@46 15858 shadowOffset: this.shadowOffset,
rlm@46 15859 constrain:false,
rlm@46 15860 shim: this.shim === false ? false : undefined
rlm@46 15861 }, this.el
rlm@46 15862 );
rlm@46 15863 },
rlm@46 15864
rlm@46 15865
rlm@46 15866 getTopToolbar : function(){
rlm@46 15867 return this.topToolbar;
rlm@46 15868 },
rlm@46 15869
rlm@46 15870
rlm@46 15871 getBottomToolbar : function(){
rlm@46 15872 return this.bottomToolbar;
rlm@46 15873 },
rlm@46 15874
rlm@46 15875
rlm@46 15876 addButton : function(config, handler, scope){
rlm@46 15877 var bc = {
rlm@46 15878 handler: handler,
rlm@46 15879 scope: scope,
rlm@46 15880 minWidth: this.minButtonWidth,
rlm@46 15881 hideParent:true
rlm@46 15882 };
rlm@46 15883 if(typeof config == "string"){
rlm@46 15884 bc.text = config;
rlm@46 15885 }else{
rlm@46 15886 Ext.apply(bc, config);
rlm@46 15887 }
rlm@46 15888 var btn = new Ext.Button(bc);
rlm@46 15889 btn.ownerCt = this;
rlm@46 15890 if(!this.buttons){
rlm@46 15891 this.buttons = [];
rlm@46 15892 }
rlm@46 15893 this.buttons.push(btn);
rlm@46 15894 return btn;
rlm@46 15895 },
rlm@46 15896
rlm@46 15897 addTool : function(){
rlm@46 15898 if(!this[this.toolTarget]) { return;
rlm@46 15899 }
rlm@46 15900 if(!this.toolTemplate){
rlm@46 15901 var tt = new Ext.Template(
rlm@46 15902 '<div class="x-tool x-tool-{id}">&#160;</div>'
rlm@46 15903 );
rlm@46 15904 tt.disableFormats = true;
rlm@46 15905 tt.compile();
rlm@46 15906 Ext.Panel.prototype.toolTemplate = tt;
rlm@46 15907 }
rlm@46 15908 for(var i = 0, a = arguments, len = a.length; i < len; i++) {
rlm@46 15909 var tc = a[i], overCls = 'x-tool-'+tc.id+'-over';
rlm@46 15910 var t = this.toolTemplate.insertFirst((tc.align !== 'left') ? this[this.toolTarget] : this[this.toolTarget].child('span'), tc, true);
rlm@46 15911 this.tools[tc.id] = t;
rlm@46 15912 t.enableDisplayMode('block');
rlm@46 15913 t.on('click', this.createToolHandler(t, tc, overCls, this));
rlm@46 15914 if(tc.on){
rlm@46 15915 t.on(tc.on);
rlm@46 15916 }
rlm@46 15917 if(tc.hidden){
rlm@46 15918 t.hide();
rlm@46 15919 }
rlm@46 15920 if(tc.qtip){
rlm@46 15921 if(typeof tc.qtip == 'object'){
rlm@46 15922 Ext.QuickTips.register(Ext.apply({
rlm@46 15923 target: t.id
rlm@46 15924 }, tc.qtip));
rlm@46 15925 } else {
rlm@46 15926 t.dom.qtip = tc.qtip;
rlm@46 15927 }
rlm@46 15928 }
rlm@46 15929 t.addClassOnOver(overCls);
rlm@46 15930 }
rlm@46 15931 },
rlm@46 15932
rlm@46 15933 onShow : function(){
rlm@46 15934 if(this.floating){
rlm@46 15935 return this.el.show();
rlm@46 15936 }
rlm@46 15937 Ext.Panel.superclass.onShow.call(this);
rlm@46 15938 },
rlm@46 15939
rlm@46 15940 onHide : function(){
rlm@46 15941 if(this.floating){
rlm@46 15942 return this.el.hide();
rlm@46 15943 }
rlm@46 15944 Ext.Panel.superclass.onHide.call(this);
rlm@46 15945 },
rlm@46 15946
rlm@46 15947 createToolHandler : function(t, tc, overCls, panel){
rlm@46 15948 return function(e){
rlm@46 15949 t.removeClass(overCls);
rlm@46 15950 e.stopEvent();
rlm@46 15951 if(tc.handler){
rlm@46 15952 tc.handler.call(tc.scope || t, e, t, panel);
rlm@46 15953 }
rlm@46 15954 };
rlm@46 15955 },
rlm@46 15956
rlm@46 15957 afterRender : function(){
rlm@46 15958 if(this.fromMarkup && this.height === undefined && !this.autoHeight){
rlm@46 15959 this.height = this.el.getHeight();
rlm@46 15960 }
rlm@46 15961 if(this.floating && !this.hidden && !this.initHidden){
rlm@46 15962 this.el.show();
rlm@46 15963 }
rlm@46 15964 if(this.title){
rlm@46 15965 this.setTitle(this.title);
rlm@46 15966 }
rlm@46 15967 this.setAutoScroll();
rlm@46 15968 if(this.html){
rlm@46 15969 this.body.update(typeof this.html == 'object' ?
rlm@46 15970 Ext.DomHelper.markup(this.html) :
rlm@46 15971 this.html);
rlm@46 15972 delete this.html;
rlm@46 15973 }
rlm@46 15974 if(this.contentEl){
rlm@46 15975 var ce = Ext.getDom(this.contentEl);
rlm@46 15976 Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);
rlm@46 15977 this.body.dom.appendChild(ce);
rlm@46 15978 }
rlm@46 15979 if(this.collapsed){
rlm@46 15980 this.collapsed = false;
rlm@46 15981 this.collapse(false);
rlm@46 15982 }
rlm@46 15983 Ext.Panel.superclass.afterRender.call(this); this.initEvents();
rlm@46 15984 },
rlm@46 15985
rlm@46 15986 setAutoScroll : function(){
rlm@46 15987 if(this.rendered && this.autoScroll){
rlm@46 15988 this.body.setOverflow('auto');
rlm@46 15989 }
rlm@46 15990 },
rlm@46 15991
rlm@46 15992 getKeyMap : function(){
rlm@46 15993 if(!this.keyMap){
rlm@46 15994 this.keyMap = new Ext.KeyMap(this.el, this.keys);
rlm@46 15995 }
rlm@46 15996 return this.keyMap;
rlm@46 15997 },
rlm@46 15998
rlm@46 15999 initEvents : function(){
rlm@46 16000 if(this.keys){
rlm@46 16001 this.getKeyMap();
rlm@46 16002 }
rlm@46 16003 if(this.draggable){
rlm@46 16004 this.initDraggable();
rlm@46 16005 }
rlm@46 16006 },
rlm@46 16007
rlm@46 16008 initDraggable : function(){
rlm@46 16009
rlm@46 16010 this.dd = new Ext.Panel.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);
rlm@46 16011 },
rlm@46 16012
rlm@46 16013 beforeEffect : function(){
rlm@46 16014 if(this.floating){
rlm@46 16015 this.el.beforeAction();
rlm@46 16016 }
rlm@46 16017 this.el.addClass('x-panel-animated');
rlm@46 16018 },
rlm@46 16019
rlm@46 16020 afterEffect : function(){
rlm@46 16021 this.syncShadow();
rlm@46 16022 this.el.removeClass('x-panel-animated');
rlm@46 16023 },
rlm@46 16024
rlm@46 16025 createEffect : function(a, cb, scope){
rlm@46 16026 var o = {
rlm@46 16027 scope:scope,
rlm@46 16028 block:true
rlm@46 16029 };
rlm@46 16030 if(a === true){
rlm@46 16031 o.callback = cb;
rlm@46 16032 return o;
rlm@46 16033 }else if(!a.callback){
rlm@46 16034 o.callback = cb;
rlm@46 16035 }else { o.callback = function(){
rlm@46 16036 cb.call(scope);
rlm@46 16037 Ext.callback(a.callback, a.scope);
rlm@46 16038 };
rlm@46 16039 }
rlm@46 16040 return Ext.applyIf(o, a);
rlm@46 16041 },
rlm@46 16042
rlm@46 16043
rlm@46 16044 collapse : function(animate){
rlm@46 16045 if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
rlm@46 16046 return;
rlm@46 16047 }
rlm@46 16048 var doAnim = animate === true || (animate !== false && this.animCollapse);
rlm@46 16049 this.beforeEffect();
rlm@46 16050 this.onCollapse(doAnim, animate);
rlm@46 16051 return this;
rlm@46 16052 },
rlm@46 16053
rlm@46 16054 onCollapse : function(doAnim, animArg){
rlm@46 16055 if(doAnim){
rlm@46 16056 this[this.collapseEl].slideOut(this.slideAnchor,
rlm@46 16057 Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),
rlm@46 16058 this.collapseDefaults));
rlm@46 16059 }else{
rlm@46 16060 this[this.collapseEl].hide();
rlm@46 16061 this.afterCollapse();
rlm@46 16062 }
rlm@46 16063 },
rlm@46 16064
rlm@46 16065 afterCollapse : function(){
rlm@46 16066 this.collapsed = true;
rlm@46 16067 this.el.addClass(this.collapsedCls);
rlm@46 16068 this.afterEffect();
rlm@46 16069 this.fireEvent('collapse', this);
rlm@46 16070 },
rlm@46 16071
rlm@46 16072
rlm@46 16073 expand : function(animate){
rlm@46 16074 if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
rlm@46 16075 return;
rlm@46 16076 }
rlm@46 16077 var doAnim = animate === true || (animate !== false && this.animCollapse);
rlm@46 16078 this.el.removeClass(this.collapsedCls);
rlm@46 16079 this.beforeEffect();
rlm@46 16080 this.onExpand(doAnim, animate);
rlm@46 16081 return this;
rlm@46 16082 },
rlm@46 16083
rlm@46 16084 onExpand : function(doAnim, animArg){
rlm@46 16085 if(doAnim){
rlm@46 16086 this[this.collapseEl].slideIn(this.slideAnchor,
rlm@46 16087 Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),
rlm@46 16088 this.expandDefaults));
rlm@46 16089 }else{
rlm@46 16090 this[this.collapseEl].show();
rlm@46 16091 this.afterExpand();
rlm@46 16092 }
rlm@46 16093 },
rlm@46 16094
rlm@46 16095 afterExpand : function(){
rlm@46 16096 this.collapsed = false;
rlm@46 16097 this.afterEffect();
rlm@46 16098 this.fireEvent('expand', this);
rlm@46 16099 },
rlm@46 16100
rlm@46 16101
rlm@46 16102 toggleCollapse : function(animate){
rlm@46 16103 this[this.collapsed ? 'expand' : 'collapse'](animate);
rlm@46 16104 return this;
rlm@46 16105 },
rlm@46 16106
rlm@46 16107 onDisable : function(){
rlm@46 16108 if(this.rendered && this.maskDisabled){
rlm@46 16109 this.el.mask();
rlm@46 16110 }
rlm@46 16111 Ext.Panel.superclass.onDisable.call(this);
rlm@46 16112 },
rlm@46 16113
rlm@46 16114 onEnable : function(){
rlm@46 16115 if(this.rendered && this.maskDisabled){
rlm@46 16116 this.el.unmask();
rlm@46 16117 }
rlm@46 16118 Ext.Panel.superclass.onEnable.call(this);
rlm@46 16119 },
rlm@46 16120
rlm@46 16121 onResize : function(w, h){
rlm@46 16122 if(w !== undefined || h !== undefined){
rlm@46 16123 if(!this.collapsed){
rlm@46 16124 if(typeof w == 'number'){
rlm@46 16125 this.body.setWidth(
rlm@46 16126 this.adjustBodyWidth(w - this.getFrameWidth()));
rlm@46 16127 }else if(w == 'auto'){
rlm@46 16128 this.body.setWidth(w);
rlm@46 16129 }
rlm@46 16130
rlm@46 16131 if(typeof h == 'number'){
rlm@46 16132 this.body.setHeight(
rlm@46 16133 this.adjustBodyHeight(h - this.getFrameHeight()));
rlm@46 16134 }else if(h == 'auto'){
rlm@46 16135 this.body.setHeight(h);
rlm@46 16136 }
rlm@46 16137 }else{
rlm@46 16138 this.queuedBodySize = {width: w, height: h};
rlm@46 16139 if(!this.queuedExpand && this.allowQueuedExpand !== false){
rlm@46 16140 this.queuedExpand = true;
rlm@46 16141 this.on('expand', function(){
rlm@46 16142 delete this.queuedExpand;
rlm@46 16143 this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
rlm@46 16144 this.doLayout();
rlm@46 16145 }, this, {single:true});
rlm@46 16146 }
rlm@46 16147 }
rlm@46 16148 this.fireEvent('bodyresize', this, w, h);
rlm@46 16149 }
rlm@46 16150 this.syncShadow();
rlm@46 16151 },
rlm@46 16152
rlm@46 16153 adjustBodyHeight : function(h){
rlm@46 16154 return h;
rlm@46 16155 },
rlm@46 16156
rlm@46 16157 adjustBodyWidth : function(w){
rlm@46 16158 return w;
rlm@46 16159 },
rlm@46 16160
rlm@46 16161 onPosition : function(){
rlm@46 16162 this.syncShadow();
rlm@46 16163 },
rlm@46 16164
rlm@46 16165 onDestroy : function(){
rlm@46 16166 if(this.tools){
rlm@46 16167 for(var k in this.tools){
rlm@46 16168 Ext.destroy(this.tools[k]);
rlm@46 16169 }
rlm@46 16170 }
rlm@46 16171 if(this.buttons){
rlm@46 16172 for(var b in this.buttons){
rlm@46 16173 Ext.destroy(this.buttons[b]);
rlm@46 16174 }
rlm@46 16175 }
rlm@46 16176 Ext.destroy(
rlm@46 16177 this.topToolbar,
rlm@46 16178 this.bottomToolbar
rlm@46 16179 );
rlm@46 16180 Ext.Panel.superclass.onDestroy.call(this);
rlm@46 16181 },
rlm@46 16182
rlm@46 16183
rlm@46 16184 getFrameWidth : function(){
rlm@46 16185 var w = this.el.getFrameWidth('lr');
rlm@46 16186
rlm@46 16187 if(this.frame){
rlm@46 16188 var l = this.bwrap.dom.firstChild;
rlm@46 16189 w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
rlm@46 16190 var mc = this.bwrap.dom.firstChild.firstChild.firstChild;
rlm@46 16191 w += Ext.fly(mc).getFrameWidth('lr');
rlm@46 16192 }
rlm@46 16193 return w;
rlm@46 16194 },
rlm@46 16195
rlm@46 16196
rlm@46 16197 getFrameHeight : function(){
rlm@46 16198 var h = this.el.getFrameWidth('tb');
rlm@46 16199 h += (this.tbar ? this.tbar.getHeight() : 0) +
rlm@46 16200 (this.bbar ? this.bbar.getHeight() : 0);
rlm@46 16201
rlm@46 16202 if(this.frame){
rlm@46 16203 var hd = this.el.dom.firstChild;
rlm@46 16204 var ft = this.bwrap.dom.lastChild;
rlm@46 16205 h += (hd.offsetHeight + ft.offsetHeight);
rlm@46 16206 var mc = this.bwrap.dom.firstChild.firstChild.firstChild;
rlm@46 16207 h += Ext.fly(mc).getFrameWidth('tb');
rlm@46 16208 }else{
rlm@46 16209 h += (this.header ? this.header.getHeight() : 0) +
rlm@46 16210 (this.footer ? this.footer.getHeight() : 0);
rlm@46 16211 }
rlm@46 16212 return h;
rlm@46 16213 },
rlm@46 16214
rlm@46 16215
rlm@46 16216 getInnerWidth : function(){
rlm@46 16217 return this.getSize().width - this.getFrameWidth();
rlm@46 16218 },
rlm@46 16219
rlm@46 16220
rlm@46 16221 getInnerHeight : function(){
rlm@46 16222 return this.getSize().height - this.getFrameHeight();
rlm@46 16223 },
rlm@46 16224
rlm@46 16225 syncShadow : function(){
rlm@46 16226 if(this.floating){
rlm@46 16227 this.el.sync(true);
rlm@46 16228 }
rlm@46 16229 },
rlm@46 16230
rlm@46 16231 getLayoutTarget : function(){
rlm@46 16232 return this.body;
rlm@46 16233 },
rlm@46 16234
rlm@46 16235
rlm@46 16236 setTitle : function(title, iconCls){
rlm@46 16237 this.title = title;
rlm@46 16238 if(this.header && this.headerAsText){
rlm@46 16239 this.header.child('span').update(title);
rlm@46 16240 }
rlm@46 16241 if(iconCls){
rlm@46 16242 this.setIconClass(iconCls);
rlm@46 16243 }
rlm@46 16244 this.fireEvent('titlechange', this, title);
rlm@46 16245 return this;
rlm@46 16246 },
rlm@46 16247
rlm@46 16248
rlm@46 16249 getUpdater : function(){
rlm@46 16250 return this.body.getUpdater();
rlm@46 16251 },
rlm@46 16252
rlm@46 16253
rlm@46 16254 load : function(){
rlm@46 16255 var um = this.body.getUpdater();
rlm@46 16256 um.update.apply(um, arguments);
rlm@46 16257 return this;
rlm@46 16258 },
rlm@46 16259
rlm@46 16260 beforeDestroy : function(){
rlm@46 16261 Ext.Element.uncache(
rlm@46 16262 this.header,
rlm@46 16263 this.tbar,
rlm@46 16264 this.bbar,
rlm@46 16265 this.footer,
rlm@46 16266 this.body
rlm@46 16267 );
rlm@46 16268 },
rlm@46 16269
rlm@46 16270 createClasses : function(){
rlm@46 16271 this.headerCls = this.baseCls + '-header';
rlm@46 16272 this.headerTextCls = this.baseCls + '-header-text';
rlm@46 16273 this.bwrapCls = this.baseCls + '-bwrap';
rlm@46 16274 this.tbarCls = this.baseCls + '-tbar';
rlm@46 16275 this.bodyCls = this.baseCls + '-body';
rlm@46 16276 this.bbarCls = this.baseCls + '-bbar';
rlm@46 16277 this.footerCls = this.baseCls + '-footer';
rlm@46 16278 },
rlm@46 16279
rlm@46 16280 createGhost : function(cls, useShim, appendTo){
rlm@46 16281 var el = document.createElement('div');
rlm@46 16282 el.className = 'x-panel-ghost ' + (cls ? cls : '');
rlm@46 16283 if(this.header){
rlm@46 16284 el.appendChild(this.el.dom.firstChild.cloneNode(true));
rlm@46 16285 }
rlm@46 16286 Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());
rlm@46 16287 el.style.width = this.el.dom.offsetWidth + 'px';;
rlm@46 16288 if(!appendTo){
rlm@46 16289 this.container.dom.appendChild(el);
rlm@46 16290 }else{
rlm@46 16291 Ext.getDom(appendTo).appendChild(el);
rlm@46 16292 }
rlm@46 16293 if(useShim !== false && this.el.useShim !== false){
rlm@46 16294 var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
rlm@46 16295 layer.show();
rlm@46 16296 return layer;
rlm@46 16297 }else{
rlm@46 16298 return new Ext.Element(el);
rlm@46 16299 }
rlm@46 16300 },
rlm@46 16301
rlm@46 16302 doAutoLoad : function(){
rlm@46 16303 this.body.load(
rlm@46 16304 typeof this.autoLoad == 'object' ?
rlm@46 16305 this.autoLoad : {url: this.autoLoad});
rlm@46 16306 }
rlm@46 16307
rlm@46 16308
rlm@46 16309 });
rlm@46 16310 Ext.reg('panel', Ext.Panel);
rlm@46 16311
rlm@46 16312
rlm@46 16313 Ext.Window = Ext.extend(Ext.Panel, {
rlm@46 16314
rlm@46 16315
rlm@46 16316
rlm@46 16317
rlm@46 16318
rlm@46 16319
rlm@46 16320
rlm@46 16321
rlm@46 16322
rlm@46 16323 baseCls : 'x-window',
rlm@46 16324
rlm@46 16325 resizable:true,
rlm@46 16326
rlm@46 16327 draggable:true,
rlm@46 16328
rlm@46 16329 closable : true,
rlm@46 16330
rlm@46 16331 constrain:false,
rlm@46 16332
rlm@46 16333 constrainHeader:false,
rlm@46 16334
rlm@46 16335 plain:false,
rlm@46 16336
rlm@46 16337 minimizable : false,
rlm@46 16338
rlm@46 16339 maximizable : false,
rlm@46 16340
rlm@46 16341 minHeight: 100,
rlm@46 16342
rlm@46 16343 minWidth: 200,
rlm@46 16344
rlm@46 16345 expandOnShow: true,
rlm@46 16346
rlm@46 16347 closeAction: 'close',
rlm@46 16348
rlm@46 16349 elements: 'header,body',
rlm@46 16350
rlm@46 16351 collapsible:false,
rlm@46 16352
rlm@46 16353 initHidden : true,
rlm@46 16354
rlm@46 16355 monitorResize : true,
rlm@46 16356
rlm@46 16357 frame:true,
rlm@46 16358
rlm@46 16359 floating:true,
rlm@46 16360
rlm@46 16361 initComponent : function(){
rlm@46 16362 Ext.Window.superclass.initComponent.call(this);
rlm@46 16363 this.addEvents(
rlm@46 16364
rlm@46 16365
rlm@46 16366
rlm@46 16367 'resize',
rlm@46 16368
rlm@46 16369 'maximize',
rlm@46 16370
rlm@46 16371 'minimize',
rlm@46 16372
rlm@46 16373 'restore'
rlm@46 16374 );
rlm@46 16375 },
rlm@46 16376
rlm@46 16377 getState : function(){
rlm@46 16378 return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox());
rlm@46 16379 },
rlm@46 16380
rlm@46 16381 onRender : function(ct, position){
rlm@46 16382 Ext.Window.superclass.onRender.call(this, ct, position);
rlm@46 16383
rlm@46 16384 if(this.plain){
rlm@46 16385 this.el.addClass('x-window-plain');
rlm@46 16386 }
rlm@46 16387
rlm@46 16388 this.focusEl = this.el.createChild({
rlm@46 16389 tag: "a", href:"#", cls:"x-dlg-focus",
rlm@46 16390 tabIndex:"-1", html: "&#160;"});
rlm@46 16391 this.focusEl.swallowEvent('click', true);
rlm@46 16392
rlm@46 16393 this.proxy = this.el.createProxy("x-window-proxy");
rlm@46 16394 this.proxy.enableDisplayMode('block');
rlm@46 16395
rlm@46 16396 if(this.modal){
rlm@46 16397 this.mask = this.container.createChild({cls:"ext-el-mask"}, this.el.dom);
rlm@46 16398 this.mask.enableDisplayMode("block");
rlm@46 16399 this.mask.hide();
rlm@46 16400 }
rlm@46 16401 },
rlm@46 16402
rlm@46 16403 initEvents : function(){
rlm@46 16404 Ext.Window.superclass.initEvents.call(this);
rlm@46 16405 if(this.animateTarget){
rlm@46 16406 this.setAnimateTarget(this.animateTarget);
rlm@46 16407 }
rlm@46 16408
rlm@46 16409 if(this.resizable){
rlm@46 16410 this.resizer = new Ext.Resizable(this.el, {
rlm@46 16411 minWidth: this.minWidth,
rlm@46 16412 minHeight:this.minHeight,
rlm@46 16413 handles: this.resizeHandles || "all",
rlm@46 16414 pinned: true,
rlm@46 16415 resizeElement : this.resizerAction
rlm@46 16416 });
rlm@46 16417 this.resizer.window = this;
rlm@46 16418 this.resizer.on("beforeresize", this.beforeResize, this);
rlm@46 16419 }
rlm@46 16420
rlm@46 16421 if(this.draggable){
rlm@46 16422 this.header.addClass("x-window-draggable");
rlm@46 16423 }
rlm@46 16424 this.initTools();
rlm@46 16425
rlm@46 16426 this.el.on("mousedown", this.toFront, this);
rlm@46 16427 this.manager = this.manager || Ext.WindowMgr;
rlm@46 16428 this.manager.register(this);
rlm@46 16429 this.hidden = true;
rlm@46 16430 if(this.maximized){
rlm@46 16431 this.maximized = false;
rlm@46 16432 this.maximize();
rlm@46 16433 }
rlm@46 16434 if(this.closable){
rlm@46 16435 var km = this.getKeyMap();
rlm@46 16436 km.on(27, this.onEsc, this);
rlm@46 16437 km.disable();
rlm@46 16438 }
rlm@46 16439 },
rlm@46 16440
rlm@46 16441 initDraggable : function(){
rlm@46 16442
rlm@46 16443 this.dd = new Ext.Window.DD(this);
rlm@46 16444 },
rlm@46 16445
rlm@46 16446 onEsc : function(){
rlm@46 16447 this[this.closeAction]();
rlm@46 16448 },
rlm@46 16449
rlm@46 16450 beforeDestroy : function(){
rlm@46 16451 Ext.destroy(
rlm@46 16452 this.resizer,
rlm@46 16453 this.dd,
rlm@46 16454 this.proxy,
rlm@46 16455 this.mask
rlm@46 16456 );
rlm@46 16457 Ext.Window.superclass.beforeDestroy.call(this);
rlm@46 16458 },
rlm@46 16459
rlm@46 16460 onDestroy : function(){
rlm@46 16461 if(this.manager){
rlm@46 16462 this.manager.unregister(this);
rlm@46 16463 }
rlm@46 16464 Ext.Window.superclass.onDestroy.call(this);
rlm@46 16465 },
rlm@46 16466
rlm@46 16467 initTools : function(){
rlm@46 16468 if(this.minimizable){
rlm@46 16469 this.addTool({
rlm@46 16470 id: 'minimize',
rlm@46 16471 handler: this.minimize.createDelegate(this, [])
rlm@46 16472 });
rlm@46 16473 }
rlm@46 16474 if(this.maximizable){
rlm@46 16475 this.addTool({
rlm@46 16476 id: 'maximize',
rlm@46 16477 handler: this.maximize.createDelegate(this, [])
rlm@46 16478 });
rlm@46 16479 this.addTool({
rlm@46 16480 id: 'restore',
rlm@46 16481 handler: this.restore.createDelegate(this, []),
rlm@46 16482 hidden:true
rlm@46 16483 });
rlm@46 16484 this.header.on('dblclick', this.toggleMaximize, this);
rlm@46 16485 }
rlm@46 16486 if(this.closable){
rlm@46 16487 this.addTool({
rlm@46 16488 id: 'close',
rlm@46 16489 handler: this[this.closeAction].createDelegate(this, [])
rlm@46 16490 });
rlm@46 16491 }
rlm@46 16492 },
rlm@46 16493
rlm@46 16494 resizerAction : function(){
rlm@46 16495 var box = this.proxy.getBox();
rlm@46 16496 this.proxy.hide();
rlm@46 16497 this.window.handleResize(box);
rlm@46 16498 return box;
rlm@46 16499 },
rlm@46 16500
rlm@46 16501 beforeResize : function(){
rlm@46 16502 this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
rlm@46 16503 this.resizeBox = this.el.getBox();
rlm@46 16504 },
rlm@46 16505
rlm@46 16506 updateHandles : function(){
rlm@46 16507 if(Ext.isIE && this.resizer){
rlm@46 16508 this.resizer.syncHandleHeight();
rlm@46 16509 this.el.repaint();
rlm@46 16510 }
rlm@46 16511 },
rlm@46 16512
rlm@46 16513 handleResize : function(box){
rlm@46 16514 var rz = this.resizeBox;
rlm@46 16515 if(rz.x != box.x || rz.y != box.y){
rlm@46 16516 this.updateBox(box);
rlm@46 16517 }else{
rlm@46 16518 this.setSize(box);
rlm@46 16519 }
rlm@46 16520 this.focus();
rlm@46 16521 this.updateHandles();
rlm@46 16522 this.saveState();
rlm@46 16523 this.fireEvent("resize", this, box.width, box.height);
rlm@46 16524 },
rlm@46 16525
rlm@46 16526
rlm@46 16527 focus : function(){
rlm@46 16528 var f = this.focusEl, db = this.defaultButton, t = typeof db;
rlm@46 16529 if(t != 'undefined'){
rlm@46 16530 if(t == 'number'){
rlm@46 16531 f = this.buttons[db];
rlm@46 16532 }else if(t == 'string'){
rlm@46 16533 f = Ext.getCmp(db);
rlm@46 16534 }else{
rlm@46 16535 f = db;
rlm@46 16536 }
rlm@46 16537 }
rlm@46 16538 f.focus.defer(10, f);
rlm@46 16539 },
rlm@46 16540
rlm@46 16541
rlm@46 16542 setAnimateTarget : function(el){
rlm@46 16543 el = Ext.get(el);
rlm@46 16544 this.animateTarget = el;
rlm@46 16545 },
rlm@46 16546
rlm@46 16547 beforeShow : function(){
rlm@46 16548 delete this.el.lastXY;
rlm@46 16549 delete this.el.lastLT;
rlm@46 16550 if(this.x === undefined || this.y === undefined){
rlm@46 16551 var xy = this.el.getAlignToXY(this.container, 'c-c');
rlm@46 16552 var pos = this.el.translatePoints(xy[0], xy[1]);
rlm@46 16553 this.x = this.x === undefined? pos.left : this.x;
rlm@46 16554 this.y = this.y === undefined? pos.top : this.y;
rlm@46 16555 }
rlm@46 16556 this.el.setLeftTop(this.x, this.y);
rlm@46 16557
rlm@46 16558 if(this.expandOnShow){
rlm@46 16559 this.expand(false);
rlm@46 16560 }
rlm@46 16561
rlm@46 16562 if(this.modal){
rlm@46 16563 Ext.getBody().addClass("x-body-masked");
rlm@46 16564 this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
rlm@46 16565 this.mask.show();
rlm@46 16566 }
rlm@46 16567 },
rlm@46 16568
rlm@46 16569
rlm@46 16570 show : function(animateTarget, cb, scope){
rlm@46 16571 if(!this.rendered){
rlm@46 16572 this.render(Ext.getBody());
rlm@46 16573 }
rlm@46 16574 if(this.hidden === false){
rlm@46 16575 this.toFront();
rlm@46 16576 return;
rlm@46 16577 }
rlm@46 16578 if(this.fireEvent("beforeshow", this) === false){
rlm@46 16579 return;
rlm@46 16580 }
rlm@46 16581 if(cb){
rlm@46 16582 this.on('show', cb, scope, {single:true});
rlm@46 16583 }
rlm@46 16584 this.hidden = false;
rlm@46 16585 if(animateTarget !== undefined){
rlm@46 16586 this.setAnimateTarget(animateTarget);
rlm@46 16587 }
rlm@46 16588 this.beforeShow();
rlm@46 16589 if(this.animateTarget){
rlm@46 16590 this.animShow();
rlm@46 16591 }else{
rlm@46 16592 this.afterShow();
rlm@46 16593 }
rlm@46 16594 },
rlm@46 16595
rlm@46 16596 afterShow : function(){
rlm@46 16597 this.proxy.hide();
rlm@46 16598 this.el.setStyle('display', 'block');
rlm@46 16599 this.el.show();
rlm@46 16600 if(this.maximized){
rlm@46 16601 this.fitContainer();
rlm@46 16602 }
rlm@46 16603 if(Ext.isMac && Ext.isGecko){ this.cascade(this.setAutoScroll);
rlm@46 16604 }
rlm@46 16605
rlm@46 16606 if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
rlm@46 16607 Ext.EventManager.onWindowResize(this.onWindowResize, this);
rlm@46 16608 }
rlm@46 16609 this.doConstrain();
rlm@46 16610 if(this.layout){
rlm@46 16611 this.doLayout();
rlm@46 16612 }
rlm@46 16613 if(this.keyMap){
rlm@46 16614 this.keyMap.enable();
rlm@46 16615 }
rlm@46 16616 this.toFront();
rlm@46 16617 this.updateHandles();
rlm@46 16618 this.fireEvent("show", this);
rlm@46 16619 },
rlm@46 16620
rlm@46 16621 animShow : function(){
rlm@46 16622 this.proxy.show();
rlm@46 16623 this.proxy.setBox(this.animateTarget.getBox());
rlm@46 16624 this.proxy.setOpacity(0);
rlm@46 16625 var b = this.getBox(false);
rlm@46 16626 b.callback = this.afterShow;
rlm@46 16627 b.scope = this;
rlm@46 16628 b.duration = .25;
rlm@46 16629 b.easing = 'easeNone';
rlm@46 16630 b.opacity = .5;
rlm@46 16631 b.block = true;
rlm@46 16632 this.el.setStyle('display', 'none');
rlm@46 16633 this.proxy.shift(b);
rlm@46 16634 },
rlm@46 16635
rlm@46 16636
rlm@46 16637 hide : function(animateTarget, cb, scope){
rlm@46 16638 if(this.hidden || this.fireEvent("beforehide", this) === false){
rlm@46 16639 return;
rlm@46 16640 }
rlm@46 16641 if(cb){
rlm@46 16642 this.on('hide', cb, scope, {single:true});
rlm@46 16643 }
rlm@46 16644 this.hidden = true;
rlm@46 16645 if(animateTarget !== undefined){
rlm@46 16646 this.setAnimateTarget(animateTarget);
rlm@46 16647 }
rlm@46 16648 if(this.animateTarget){
rlm@46 16649 this.animHide();
rlm@46 16650 }else{
rlm@46 16651 this.el.hide();
rlm@46 16652 this.afterHide();
rlm@46 16653 }
rlm@46 16654 },
rlm@46 16655
rlm@46 16656 afterHide : function(){
rlm@46 16657 this.proxy.hide();
rlm@46 16658 if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
rlm@46 16659 Ext.EventManager.removeResizeListener(this.onWindowResize, this);
rlm@46 16660 }
rlm@46 16661 if(this.modal){
rlm@46 16662 this.mask.hide();
rlm@46 16663 Ext.getBody().removeClass("x-body-masked");
rlm@46 16664 }
rlm@46 16665 if(this.keyMap){
rlm@46 16666 this.keyMap.disable();
rlm@46 16667 }
rlm@46 16668 this.fireEvent("hide", this);
rlm@46 16669 },
rlm@46 16670
rlm@46 16671 animHide : function(){
rlm@46 16672 this.proxy.setOpacity(.5);
rlm@46 16673 this.proxy.show();
rlm@46 16674 var tb = this.getBox(false);
rlm@46 16675 this.proxy.setBox(tb);
rlm@46 16676 this.el.hide();
rlm@46 16677 var b = this.animateTarget.getBox();
rlm@46 16678 b.callback = this.afterHide;
rlm@46 16679 b.scope = this;
rlm@46 16680 b.duration = .25;
rlm@46 16681 b.easing = 'easeNone';
rlm@46 16682 b.block = true;
rlm@46 16683 b.opacity = 0;
rlm@46 16684 this.proxy.shift(b);
rlm@46 16685 },
rlm@46 16686
rlm@46 16687 onWindowResize : function(){
rlm@46 16688 if(this.maximized){
rlm@46 16689 this.fitContainer();
rlm@46 16690 }
rlm@46 16691 if(this.modal){
rlm@46 16692 this.mask.setSize('100%', '100%');
rlm@46 16693 var force = this.mask.dom.offsetHeight;
rlm@46 16694 this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
rlm@46 16695 }
rlm@46 16696 this.doConstrain();
rlm@46 16697 },
rlm@46 16698
rlm@46 16699 doConstrain : function(){
rlm@46 16700 if(this.constrain || this.constrainHeader){
rlm@46 16701 var offsets;
rlm@46 16702 if(this.constrain){
rlm@46 16703 offsets = {
rlm@46 16704 right:this.el.shadowOffset,
rlm@46 16705 left:this.el.shadowOffset,
rlm@46 16706 bottom:this.el.shadowOffset
rlm@46 16707 };
rlm@46 16708 }else {
rlm@46 16709 var s = this.getSize();
rlm@46 16710 offsets = {
rlm@46 16711 right:-(s.width - 100),
rlm@46 16712 bottom:-(s.height - 25)
rlm@46 16713 };
rlm@46 16714 }
rlm@46 16715
rlm@46 16716 var xy = this.el.getConstrainToXY(this.container, true, offsets);
rlm@46 16717 if(xy){
rlm@46 16718 this.setPosition(xy[0], xy[1]);
rlm@46 16719 }
rlm@46 16720 }
rlm@46 16721 },
rlm@46 16722
rlm@46 16723 ghost : function(cls){
rlm@46 16724 var ghost = this.createGhost(cls);
rlm@46 16725 var box = this.getBox(true);
rlm@46 16726 ghost.setLeftTop(box.x, box.y);
rlm@46 16727 ghost.setWidth(box.width);
rlm@46 16728 this.el.hide();
rlm@46 16729 this.activeGhost = ghost;
rlm@46 16730 return ghost;
rlm@46 16731 },
rlm@46 16732
rlm@46 16733 unghost : function(show, matchPosition){
rlm@46 16734 if(show !== false){
rlm@46 16735 this.el.show();
rlm@46 16736 this.focus();
rlm@46 16737 if(Ext.isMac && Ext.isGecko){ this.cascade(this.setAutoScroll);
rlm@46 16738 }
rlm@46 16739 }
rlm@46 16740 if(matchPosition !== false){
rlm@46 16741 this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));
rlm@46 16742 }
rlm@46 16743 this.activeGhost.hide();
rlm@46 16744 this.activeGhost.remove();
rlm@46 16745 delete this.activeGhost;
rlm@46 16746 },
rlm@46 16747
rlm@46 16748
rlm@46 16749 minimize : function(){
rlm@46 16750 this.fireEvent('minimize', this);
rlm@46 16751 },
rlm@46 16752
rlm@46 16753
rlm@46 16754 close : function(){
rlm@46 16755 if(this.fireEvent("beforeclose", this) !== false){
rlm@46 16756 this.hide(null, function(){
rlm@46 16757 this.fireEvent('close', this);
rlm@46 16758 this.destroy();
rlm@46 16759 }, this);
rlm@46 16760 }
rlm@46 16761 },
rlm@46 16762
rlm@46 16763
rlm@46 16764 maximize : function(){
rlm@46 16765 if(!this.maximized){
rlm@46 16766 this.expand(false);
rlm@46 16767 this.restoreSize = this.getSize();
rlm@46 16768 this.restorePos = this.getPosition(true);
rlm@46 16769 if (this.maximizable){
rlm@46 16770 this.tools.maximize.hide();
rlm@46 16771 this.tools.restore.show();
rlm@46 16772 }
rlm@46 16773 this.maximized = true;
rlm@46 16774 this.el.disableShadow();
rlm@46 16775
rlm@46 16776 if(this.dd){
rlm@46 16777 this.dd.lock();
rlm@46 16778 }
rlm@46 16779 if(this.collapsible){
rlm@46 16780 this.tools.toggle.hide();
rlm@46 16781 }
rlm@46 16782 this.el.addClass('x-window-maximized');
rlm@46 16783 this.container.addClass('x-window-maximized-ct');
rlm@46 16784
rlm@46 16785 this.setPosition(0, 0);
rlm@46 16786 this.fitContainer();
rlm@46 16787 this.fireEvent('maximize', this);
rlm@46 16788 }
rlm@46 16789 },
rlm@46 16790
rlm@46 16791
rlm@46 16792 restore : function(){
rlm@46 16793 if(this.maximized){
rlm@46 16794 this.el.removeClass('x-window-maximized');
rlm@46 16795 this.tools.restore.hide();
rlm@46 16796 this.tools.maximize.show();
rlm@46 16797 this.setPosition(this.restorePos[0], this.restorePos[1]);
rlm@46 16798 this.setSize(this.restoreSize.width, this.restoreSize.height);
rlm@46 16799 delete this.restorePos;
rlm@46 16800 delete this.restoreSize;
rlm@46 16801 this.maximized = false;
rlm@46 16802 this.el.enableShadow(true);
rlm@46 16803
rlm@46 16804 if(this.dd){
rlm@46 16805 this.dd.unlock();
rlm@46 16806 }
rlm@46 16807 if(this.collapsible){
rlm@46 16808 this.tools.toggle.show();
rlm@46 16809 }
rlm@46 16810 this.container.removeClass('x-window-maximized-ct');
rlm@46 16811
rlm@46 16812 this.doConstrain();
rlm@46 16813 this.fireEvent('restore', this);
rlm@46 16814 }
rlm@46 16815 },
rlm@46 16816
rlm@46 16817
rlm@46 16818 toggleMaximize : function(){
rlm@46 16819 this[this.maximized ? 'restore' : 'maximize']();
rlm@46 16820 },
rlm@46 16821
rlm@46 16822 fitContainer : function(){
rlm@46 16823 var vs = this.container.getViewSize();
rlm@46 16824 this.setSize(vs.width, vs.height);
rlm@46 16825 },
rlm@46 16826
rlm@46 16827 setZIndex : function(index){
rlm@46 16828 if(this.modal){
rlm@46 16829 this.mask.setStyle("z-index", index);
rlm@46 16830 }
rlm@46 16831 this.el.setZIndex(++index);
rlm@46 16832 index += 5;
rlm@46 16833
rlm@46 16834 if(this.resizer){
rlm@46 16835 this.resizer.proxy.setStyle("z-index", ++index);
rlm@46 16836 }
rlm@46 16837
rlm@46 16838 this.lastZIndex = index;
rlm@46 16839 },
rlm@46 16840
rlm@46 16841
rlm@46 16842 alignTo : function(element, position, offsets){
rlm@46 16843 var xy = this.el.getAlignToXY(element, position, offsets);
rlm@46 16844 this.setPagePosition(xy[0], xy[1]);
rlm@46 16845 return this;
rlm@46 16846 },
rlm@46 16847
rlm@46 16848
rlm@46 16849 anchorTo : function(el, alignment, offsets, monitorScroll, _pname){
rlm@46 16850 var action = function(){
rlm@46 16851 this.alignTo(el, alignment, offsets);
rlm@46 16852 };
rlm@46 16853 Ext.EventManager.onWindowResize(action, this);
rlm@46 16854 var tm = typeof monitorScroll;
rlm@46 16855 if(tm != 'undefined'){
rlm@46 16856 Ext.EventManager.on(window, 'scroll', action, this,
rlm@46 16857 {buffer: tm == 'number' ? monitorScroll : 50});
rlm@46 16858 }
rlm@46 16859 action.call(this);
rlm@46 16860 this[_pname] = action;
rlm@46 16861 return this;
rlm@46 16862 },
rlm@46 16863
rlm@46 16864
rlm@46 16865 toFront : function(){
rlm@46 16866 if(this.manager.bringToFront(this)){
rlm@46 16867 this.focus();
rlm@46 16868 }
rlm@46 16869 return this;
rlm@46 16870 },
rlm@46 16871
rlm@46 16872
rlm@46 16873 setActive : function(active){
rlm@46 16874 if(active){
rlm@46 16875 if(!this.maximized){
rlm@46 16876 this.el.enableShadow(true);
rlm@46 16877 }
rlm@46 16878 this.fireEvent('activate', this);
rlm@46 16879 }else{
rlm@46 16880 this.el.disableShadow();
rlm@46 16881 this.fireEvent('deactivate', this);
rlm@46 16882 }
rlm@46 16883 },
rlm@46 16884
rlm@46 16885
rlm@46 16886 toBack : function(){
rlm@46 16887 this.manager.sendToBack(this);
rlm@46 16888 return this;
rlm@46 16889 },
rlm@46 16890
rlm@46 16891
rlm@46 16892 center : function(){
rlm@46 16893 var xy = this.el.getAlignToXY(this.container, 'c-c');
rlm@46 16894 this.setPagePosition(xy[0], xy[1]);
rlm@46 16895 return this;
rlm@46 16896 }
rlm@46 16897 });
rlm@46 16898 Ext.reg('window', Ext.Window);
rlm@46 16899
rlm@46 16900 Ext.Window.DD = function(win){
rlm@46 16901 this.win = win;
rlm@46 16902 Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
rlm@46 16903 this.setHandleElId(win.header.id);
rlm@46 16904 this.scroll = false;
rlm@46 16905 };
rlm@46 16906
rlm@46 16907 Ext.extend(Ext.Window.DD, Ext.dd.DD, {
rlm@46 16908 moveOnly:true,
rlm@46 16909 headerOffsets:[100, 25],
rlm@46 16910 startDrag : function(){
rlm@46 16911 var w = this.win;
rlm@46 16912 this.proxy = w.ghost();
rlm@46 16913 if(w.constrain !== false){
rlm@46 16914 var so = w.el.shadowOffset;
rlm@46 16915 this.constrainTo(w.container, {right: so, left: so, bottom: so});
rlm@46 16916 }else if(w.constrainHeader !== false){
rlm@46 16917 var s = this.proxy.getSize();
rlm@46 16918 this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});
rlm@46 16919 }
rlm@46 16920 },
rlm@46 16921 b4Drag : Ext.emptyFn,
rlm@46 16922
rlm@46 16923 onDrag : function(e){
rlm@46 16924 this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());
rlm@46 16925 },
rlm@46 16926
rlm@46 16927 endDrag : function(e){
rlm@46 16928 this.win.unghost();
rlm@46 16929 this.win.saveState();
rlm@46 16930 }
rlm@46 16931 });
rlm@46 16932
rlm@46 16933
rlm@46 16934 Ext.WindowGroup = function(){
rlm@46 16935 var list = {};
rlm@46 16936 var accessList = [];
rlm@46 16937 var front = null;
rlm@46 16938
rlm@46 16939 var sortWindows = function(d1, d2){
rlm@46 16940 return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;
rlm@46 16941 };
rlm@46 16942
rlm@46 16943 var orderWindows = function(){
rlm@46 16944 var a = accessList, len = a.length;
rlm@46 16945 if(len > 0){
rlm@46 16946 a.sort(sortWindows);
rlm@46 16947 var seed = a[0].manager.zseed;
rlm@46 16948 for(var i = 0; i < len; i++){
rlm@46 16949 var win = a[i];
rlm@46 16950 if(win && !win.hidden){
rlm@46 16951 win.setZIndex(seed + (i*10));
rlm@46 16952 }
rlm@46 16953 }
rlm@46 16954 }
rlm@46 16955 activateLast();
rlm@46 16956 };
rlm@46 16957
rlm@46 16958 var setActiveWin = function(win){
rlm@46 16959 if(win != front){
rlm@46 16960 if(front){
rlm@46 16961 front.setActive(false);
rlm@46 16962 }
rlm@46 16963 front = win;
rlm@46 16964 if(win){
rlm@46 16965 win.setActive(true);
rlm@46 16966 }
rlm@46 16967 }
rlm@46 16968 };
rlm@46 16969
rlm@46 16970 var activateLast = function(){
rlm@46 16971 for(var i = accessList.length-1; i >=0; --i) {
rlm@46 16972 if(!accessList[i].hidden){
rlm@46 16973 setActiveWin(accessList[i]);
rlm@46 16974 return;
rlm@46 16975 }
rlm@46 16976 }
rlm@46 16977 setActiveWin(null);
rlm@46 16978 };
rlm@46 16979
rlm@46 16980 return {
rlm@46 16981
rlm@46 16982 zseed : 9000,
rlm@46 16983
rlm@46 16984 register : function(win){
rlm@46 16985 list[win.id] = win;
rlm@46 16986 accessList.push(win);
rlm@46 16987 win.on('hide', activateLast);
rlm@46 16988 },
rlm@46 16989
rlm@46 16990 unregister : function(win){
rlm@46 16991 delete list[win.id];
rlm@46 16992 win.un('hide', activateLast);
rlm@46 16993 accessList.remove(win);
rlm@46 16994 },
rlm@46 16995
rlm@46 16996
rlm@46 16997 get : function(id){
rlm@46 16998 return typeof id == "object" ? id : list[id];
rlm@46 16999 },
rlm@46 17000
rlm@46 17001
rlm@46 17002 bringToFront : function(win){
rlm@46 17003 win = this.get(win);
rlm@46 17004 if(win != front){
rlm@46 17005 win._lastAccess = new Date().getTime();
rlm@46 17006 orderWindows();
rlm@46 17007 return true;
rlm@46 17008 }
rlm@46 17009 return false;
rlm@46 17010 },
rlm@46 17011
rlm@46 17012
rlm@46 17013 sendToBack : function(win){
rlm@46 17014 win = this.get(win);
rlm@46 17015 win._lastAccess = -(new Date().getTime());
rlm@46 17016 orderWindows();
rlm@46 17017 return win;
rlm@46 17018 },
rlm@46 17019
rlm@46 17020
rlm@46 17021 hideAll : function(){
rlm@46 17022 for(var id in list){
rlm@46 17023 if(list[id] && typeof list[id] != "function" && list[id].isVisible()){
rlm@46 17024 list[id].hide();
rlm@46 17025 }
rlm@46 17026 }
rlm@46 17027 },
rlm@46 17028
rlm@46 17029
rlm@46 17030 getActive : function(){
rlm@46 17031 return front;
rlm@46 17032 },
rlm@46 17033
rlm@46 17034
rlm@46 17035 getBy : function(fn, scope){
rlm@46 17036 var r = [];
rlm@46 17037 for(var i = accessList.length-1; i >=0; --i) {
rlm@46 17038 var win = accessList[i];
rlm@46 17039 if(fn.call(scope||win, win) !== false){
rlm@46 17040 r.push(win);
rlm@46 17041 }
rlm@46 17042 }
rlm@46 17043 return r;
rlm@46 17044 },
rlm@46 17045
rlm@46 17046
rlm@46 17047 each : function(fn, scope){
rlm@46 17048 for(var id in list){
rlm@46 17049 if(list[id] && typeof list[id] != "function"){
rlm@46 17050 if(fn.call(scope || list[id], list[id]) === false){
rlm@46 17051 return;
rlm@46 17052 }
rlm@46 17053 }
rlm@46 17054 }
rlm@46 17055 }
rlm@46 17056 };
rlm@46 17057 };
rlm@46 17058
rlm@46 17059
rlm@46 17060
rlm@46 17061 Ext.WindowMgr = new Ext.WindowGroup();
rlm@46 17062
rlm@46 17063 Ext.dd.PanelProxy = function(panel, config){
rlm@46 17064 this.panel = panel;
rlm@46 17065 this.id = this.panel.id +'-ddproxy';
rlm@46 17066 Ext.apply(this, config);
rlm@46 17067 };
rlm@46 17068
rlm@46 17069 Ext.dd.PanelProxy.prototype = {
rlm@46 17070
rlm@46 17071 insertProxy : true,
rlm@46 17072
rlm@46 17073
rlm@46 17074 setStatus : Ext.emptyFn,
rlm@46 17075 reset : Ext.emptyFn,
rlm@46 17076 update : Ext.emptyFn,
rlm@46 17077 stop : Ext.emptyFn,
rlm@46 17078 sync: Ext.emptyFn,
rlm@46 17079
rlm@46 17080
rlm@46 17081 getEl : function(){
rlm@46 17082 return this.ghost;
rlm@46 17083 },
rlm@46 17084
rlm@46 17085
rlm@46 17086 getGhost : function(){
rlm@46 17087 return this.ghost;
rlm@46 17088 },
rlm@46 17089
rlm@46 17090
rlm@46 17091 getProxy : function(){
rlm@46 17092 return this.proxy;
rlm@46 17093 },
rlm@46 17094
rlm@46 17095
rlm@46 17096 hide : function(){
rlm@46 17097 if(this.ghost){
rlm@46 17098 if(this.proxy){
rlm@46 17099 this.proxy.remove();
rlm@46 17100 delete this.proxy;
rlm@46 17101 }
rlm@46 17102 this.panel.el.dom.style.display = '';
rlm@46 17103 this.ghost.remove();
rlm@46 17104 delete this.ghost;
rlm@46 17105 }
rlm@46 17106 },
rlm@46 17107
rlm@46 17108
rlm@46 17109 show : function(){
rlm@46 17110 if(!this.ghost){
rlm@46 17111 this.ghost = this.panel.createGhost(undefined, undefined, Ext.getBody());
rlm@46 17112 this.ghost.setXY(this.panel.el.getXY())
rlm@46 17113 if(this.insertProxy){
rlm@46 17114 this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});
rlm@46 17115 this.proxy.setSize(this.panel.getSize());
rlm@46 17116 }
rlm@46 17117 this.panel.el.dom.style.display = 'none';
rlm@46 17118 }
rlm@46 17119 },
rlm@46 17120
rlm@46 17121
rlm@46 17122 repair : function(xy, callback, scope){
rlm@46 17123 this.hide();
rlm@46 17124 if(typeof callback == "function"){
rlm@46 17125 callback.call(scope || this);
rlm@46 17126 }
rlm@46 17127 },
rlm@46 17128
rlm@46 17129
rlm@46 17130 moveProxy : function(parentNode, before){
rlm@46 17131 if(this.proxy){
rlm@46 17132 parentNode.insertBefore(this.proxy.dom, before);
rlm@46 17133 }
rlm@46 17134 }
rlm@46 17135 };
rlm@46 17136
rlm@46 17137
rlm@46 17138 Ext.Panel.DD = function(panel, cfg){
rlm@46 17139 this.panel = panel;
rlm@46 17140 this.dragData = {panel: panel};
rlm@46 17141 this.proxy = new Ext.dd.PanelProxy(panel, cfg);
rlm@46 17142 Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg);
rlm@46 17143 var h = panel.header;
rlm@46 17144 if(h){
rlm@46 17145 this.setHandleElId(h.id);
rlm@46 17146 }
rlm@46 17147 (h ? h : this.panel.body).setStyle('cursor', 'move');
rlm@46 17148 this.scroll = false;
rlm@46 17149 };
rlm@46 17150
rlm@46 17151 Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, {
rlm@46 17152 showFrame: Ext.emptyFn,
rlm@46 17153 startDrag: Ext.emptyFn,
rlm@46 17154 b4StartDrag: function(x, y) {
rlm@46 17155 this.proxy.show();
rlm@46 17156 },
rlm@46 17157 b4MouseDown: function(e) {
rlm@46 17158 var x = e.getPageX();
rlm@46 17159 var y = e.getPageY();
rlm@46 17160 this.autoOffset(x, y);
rlm@46 17161 },
rlm@46 17162 onInitDrag : function(x, y){
rlm@46 17163 this.onStartDrag(x, y);
rlm@46 17164 return true;
rlm@46 17165 },
rlm@46 17166 createFrame : Ext.emptyFn,
rlm@46 17167 getDragEl : function(e){
rlm@46 17168 return this.proxy.ghost.dom;
rlm@46 17169 },
rlm@46 17170 endDrag : function(e){
rlm@46 17171 this.proxy.hide();
rlm@46 17172 this.panel.saveState();
rlm@46 17173 },
rlm@46 17174
rlm@46 17175 autoOffset : function(x, y) {
rlm@46 17176 x -= this.startPageX;
rlm@46 17177 y -= this.startPageY;
rlm@46 17178 this.setDelta(x, y);
rlm@46 17179 }
rlm@46 17180 });
rlm@46 17181
rlm@46 17182 Ext.state.Provider = function(){
rlm@46 17183
rlm@46 17184 this.addEvents("statechange");
rlm@46 17185 this.state = {};
rlm@46 17186 Ext.state.Provider.superclass.constructor.call(this);
rlm@46 17187 };
rlm@46 17188 Ext.extend(Ext.state.Provider, Ext.util.Observable, {
rlm@46 17189
rlm@46 17190 get : function(name, defaultValue){
rlm@46 17191 return typeof this.state[name] == "undefined" ?
rlm@46 17192 defaultValue : this.state[name];
rlm@46 17193 },
rlm@46 17194
rlm@46 17195
rlm@46 17196 clear : function(name){
rlm@46 17197 delete this.state[name];
rlm@46 17198 this.fireEvent("statechange", this, name, null);
rlm@46 17199 },
rlm@46 17200
rlm@46 17201
rlm@46 17202 set : function(name, value){
rlm@46 17203 this.state[name] = value;
rlm@46 17204 this.fireEvent("statechange", this, name, value);
rlm@46 17205 },
rlm@46 17206
rlm@46 17207
rlm@46 17208 decodeValue : function(cookie){
rlm@46 17209 var re = /^(a|n|d|b|s|o)\:(.*)$/;
rlm@46 17210 var matches = re.exec(unescape(cookie));
rlm@46 17211 if(!matches || !matches[1]) return;
rlm@46 17212 var type = matches[1];
rlm@46 17213 var v = matches[2];
rlm@46 17214 switch(type){
rlm@46 17215 case "n":
rlm@46 17216 return parseFloat(v);
rlm@46 17217 case "d":
rlm@46 17218 return new Date(Date.parse(v));
rlm@46 17219 case "b":
rlm@46 17220 return (v == "1");
rlm@46 17221 case "a":
rlm@46 17222 var all = [];
rlm@46 17223 var values = v.split("^");
rlm@46 17224 for(var i = 0, len = values.length; i < len; i++){
rlm@46 17225 all.push(this.decodeValue(values[i]));
rlm@46 17226 }
rlm@46 17227 return all;
rlm@46 17228 case "o":
rlm@46 17229 var all = {};
rlm@46 17230 var values = v.split("^");
rlm@46 17231 for(var i = 0, len = values.length; i < len; i++){
rlm@46 17232 var kv = values[i].split("=");
rlm@46 17233 all[kv[0]] = this.decodeValue(kv[1]);
rlm@46 17234 }
rlm@46 17235 return all;
rlm@46 17236 default:
rlm@46 17237 return v;
rlm@46 17238 }
rlm@46 17239 },
rlm@46 17240
rlm@46 17241
rlm@46 17242 encodeValue : function(v){
rlm@46 17243 var enc;
rlm@46 17244 if(typeof v == "number"){
rlm@46 17245 enc = "n:" + v;
rlm@46 17246 }else if(typeof v == "boolean"){
rlm@46 17247 enc = "b:" + (v ? "1" : "0");
rlm@46 17248 }else if(Ext.isDate(v)){
rlm@46 17249 enc = "d:" + v.toGMTString();
rlm@46 17250 }else if(Ext.isArray(v)){
rlm@46 17251 var flat = "";
rlm@46 17252 for(var i = 0, len = v.length; i < len; i++){
rlm@46 17253 flat += this.encodeValue(v[i]);
rlm@46 17254 if(i != len-1) flat += "^";
rlm@46 17255 }
rlm@46 17256 enc = "a:" + flat;
rlm@46 17257 }else if(typeof v == "object"){
rlm@46 17258 var flat = "";
rlm@46 17259 for(var key in v){
rlm@46 17260 if(typeof v[key] != "function" && v[key] !== undefined){
rlm@46 17261 flat += key + "=" + this.encodeValue(v[key]) + "^";
rlm@46 17262 }
rlm@46 17263 }
rlm@46 17264 enc = "o:" + flat.substring(0, flat.length-1);
rlm@46 17265 }else{
rlm@46 17266 enc = "s:" + v;
rlm@46 17267 }
rlm@46 17268 return escape(enc);
rlm@46 17269 }
rlm@46 17270 });
rlm@46 17271
rlm@46 17272
rlm@46 17273 Ext.state.Manager = function(){
rlm@46 17274 var provider = new Ext.state.Provider();
rlm@46 17275
rlm@46 17276 return {
rlm@46 17277
rlm@46 17278 setProvider : function(stateProvider){
rlm@46 17279 provider = stateProvider;
rlm@46 17280 },
rlm@46 17281
rlm@46 17282
rlm@46 17283 get : function(key, defaultValue){
rlm@46 17284 return provider.get(key, defaultValue);
rlm@46 17285 },
rlm@46 17286
rlm@46 17287
rlm@46 17288 set : function(key, value){
rlm@46 17289 provider.set(key, value);
rlm@46 17290 },
rlm@46 17291
rlm@46 17292
rlm@46 17293 clear : function(key){
rlm@46 17294 provider.clear(key);
rlm@46 17295 },
rlm@46 17296
rlm@46 17297
rlm@46 17298 getProvider : function(){
rlm@46 17299 return provider;
rlm@46 17300 }
rlm@46 17301 };
rlm@46 17302 }();
rlm@46 17303
rlm@46 17304
rlm@46 17305 Ext.state.CookieProvider = function(config){
rlm@46 17306 Ext.state.CookieProvider.superclass.constructor.call(this);
rlm@46 17307 this.path = "/";
rlm@46 17308 this.expires = new Date(new Date().getTime()+(1000*60*60*24*7));
rlm@46 17309 this.domain = null;
rlm@46 17310 this.secure = false;
rlm@46 17311 Ext.apply(this, config);
rlm@46 17312 this.state = this.readCookies();
rlm@46 17313 };
rlm@46 17314
rlm@46 17315 Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
rlm@46 17316
rlm@46 17317 set : function(name, value){
rlm@46 17318 if(typeof value == "undefined" || value === null){
rlm@46 17319 this.clear(name);
rlm@46 17320 return;
rlm@46 17321 }
rlm@46 17322 this.setCookie(name, value);
rlm@46 17323 Ext.state.CookieProvider.superclass.set.call(this, name, value);
rlm@46 17324 },
rlm@46 17325
rlm@46 17326
rlm@46 17327 clear : function(name){
rlm@46 17328 this.clearCookie(name);
rlm@46 17329 Ext.state.CookieProvider.superclass.clear.call(this, name);
rlm@46 17330 },
rlm@46 17331
rlm@46 17332
rlm@46 17333 readCookies : function(){
rlm@46 17334 var cookies = {};
rlm@46 17335 var c = document.cookie + ";";
rlm@46 17336 var re = /\s?(.*?)=(.*?);/g;
rlm@46 17337 var matches;
rlm@46 17338 while((matches = re.exec(c)) != null){
rlm@46 17339 var name = matches[1];
rlm@46 17340 var value = matches[2];
rlm@46 17341 if(name && name.substring(0,3) == "ys-"){
rlm@46 17342 cookies[name.substr(3)] = this.decodeValue(value);
rlm@46 17343 }
rlm@46 17344 }
rlm@46 17345 return cookies;
rlm@46 17346 },
rlm@46 17347
rlm@46 17348
rlm@46 17349 setCookie : function(name, value){
rlm@46 17350 document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
rlm@46 17351 ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
rlm@46 17352 ((this.path == null) ? "" : ("; path=" + this.path)) +
rlm@46 17353 ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
rlm@46 17354 ((this.secure == true) ? "; secure" : "");
rlm@46 17355 },
rlm@46 17356
rlm@46 17357
rlm@46 17358 clearCookie : function(name){
rlm@46 17359 document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
rlm@46 17360 ((this.path == null) ? "" : ("; path=" + this.path)) +
rlm@46 17361 ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
rlm@46 17362 ((this.secure == true) ? "; secure" : "");
rlm@46 17363 }
rlm@46 17364 });
rlm@46 17365
rlm@46 17366 Ext.DataView = Ext.extend(Ext.BoxComponent, {
rlm@46 17367
rlm@46 17368
rlm@46 17369
rlm@46 17370
rlm@46 17371
rlm@46 17372
rlm@46 17373
rlm@46 17374
rlm@46 17375
rlm@46 17376 selectedClass : "x-view-selected",
rlm@46 17377
rlm@46 17378 emptyText : "",
rlm@46 17379
rlm@46 17380
rlm@46 17381 deferEmptyText: true,
rlm@46 17382
rlm@46 17383 last: false,
rlm@46 17384
rlm@46 17385 initComponent : function(){
rlm@46 17386 Ext.DataView.superclass.initComponent.call(this);
rlm@46 17387 if(typeof this.tpl == "string"){
rlm@46 17388 this.tpl = new Ext.XTemplate(this.tpl);
rlm@46 17389 }
rlm@46 17390
rlm@46 17391 this.addEvents(
rlm@46 17392
rlm@46 17393 "beforeclick",
rlm@46 17394
rlm@46 17395 "click",
rlm@46 17396
rlm@46 17397 "containerclick",
rlm@46 17398
rlm@46 17399 "dblclick",
rlm@46 17400
rlm@46 17401 "contextmenu",
rlm@46 17402
rlm@46 17403 "selectionchange",
rlm@46 17404
rlm@46 17405
rlm@46 17406 "beforeselect"
rlm@46 17407 );
rlm@46 17408
rlm@46 17409 this.all = new Ext.CompositeElementLite();
rlm@46 17410 this.selected = new Ext.CompositeElementLite();
rlm@46 17411 },
rlm@46 17412
rlm@46 17413 onRender : function(){
rlm@46 17414 if(!this.el){
rlm@46 17415 this.el = document.createElement('div');
rlm@46 17416 this.el.id = this.id;
rlm@46 17417 }
rlm@46 17418 Ext.DataView.superclass.onRender.apply(this, arguments);
rlm@46 17419 },
rlm@46 17420
rlm@46 17421 afterRender : function(){
rlm@46 17422 Ext.DataView.superclass.afterRender.call(this);
rlm@46 17423
rlm@46 17424 this.el.on({
rlm@46 17425 "click": this.onClick,
rlm@46 17426 "dblclick": this.onDblClick,
rlm@46 17427 "contextmenu": this.onContextMenu,
rlm@46 17428 scope:this
rlm@46 17429 });
rlm@46 17430
rlm@46 17431 if(this.overClass){
rlm@46 17432 this.el.on({
rlm@46 17433 "mouseover": this.onMouseOver,
rlm@46 17434 "mouseout": this.onMouseOut,
rlm@46 17435 scope:this
rlm@46 17436 });
rlm@46 17437 }
rlm@46 17438
rlm@46 17439 if(this.store){
rlm@46 17440 this.setStore(this.store, true);
rlm@46 17441 }
rlm@46 17442 },
rlm@46 17443
rlm@46 17444
rlm@46 17445 refresh : function(){
rlm@46 17446 this.clearSelections(false, true);
rlm@46 17447 this.el.update("");
rlm@46 17448 var html = [];
rlm@46 17449 var records = this.store.getRange();
rlm@46 17450 if(records.length < 1){
rlm@46 17451 if(!this.deferEmptyText || this.hasSkippedEmptyText){
rlm@46 17452 this.el.update(this.emptyText);
rlm@46 17453 }
rlm@46 17454 this.hasSkippedEmptyText = true;
rlm@46 17455 this.all.clear();
rlm@46 17456 return;
rlm@46 17457 }
rlm@46 17458 this.tpl.overwrite(this.el, this.collectData(records, 0));
rlm@46 17459 this.all.fill(Ext.query(this.itemSelector, this.el.dom));
rlm@46 17460 this.updateIndexes(0);
rlm@46 17461 },
rlm@46 17462
rlm@46 17463
rlm@46 17464 prepareData : function(data){
rlm@46 17465 return data;
rlm@46 17466 },
rlm@46 17467
rlm@46 17468 collectData : function(records, startIndex){
rlm@46 17469 var r = [];
rlm@46 17470 for(var i = 0, len = records.length; i < len; i++){
rlm@46 17471 r[r.length] = this.prepareData(records[i].data, startIndex+i, records[i]);
rlm@46 17472 }
rlm@46 17473 return r;
rlm@46 17474 },
rlm@46 17475
rlm@46 17476 bufferRender : function(records){
rlm@46 17477 var div = document.createElement('div');
rlm@46 17478 this.tpl.overwrite(div, this.collectData(records));
rlm@46 17479 return Ext.query(this.itemSelector, div);
rlm@46 17480 },
rlm@46 17481
rlm@46 17482 onUpdate : function(ds, record){
rlm@46 17483 var index = this.store.indexOf(record);
rlm@46 17484 var sel = this.isSelected(index);
rlm@46 17485 var original = this.all.elements[index];
rlm@46 17486 var node = this.bufferRender([record], index)[0];
rlm@46 17487
rlm@46 17488 this.all.replaceElement(index, node, true);
rlm@46 17489 if(sel){
rlm@46 17490 this.selected.replaceElement(original, node);
rlm@46 17491 this.all.item(index).addClass(this.selectedClass);
rlm@46 17492 }
rlm@46 17493 this.updateIndexes(index, index);
rlm@46 17494 },
rlm@46 17495
rlm@46 17496 onAdd : function(ds, records, index){
rlm@46 17497 if(this.all.getCount() == 0){
rlm@46 17498 this.refresh();
rlm@46 17499 return;
rlm@46 17500 }
rlm@46 17501 var nodes = this.bufferRender(records, index), n, a = this.all.elements;
rlm@46 17502 if(index < this.all.getCount()){
rlm@46 17503 n = this.all.item(index).insertSibling(nodes, 'before', true);
rlm@46 17504 a.splice.apply(a, [index, 0].concat(nodes));
rlm@46 17505 }else{
rlm@46 17506 n = this.all.last().insertSibling(nodes, 'after', true);
rlm@46 17507 a.push.apply(a, nodes);
rlm@46 17508 }
rlm@46 17509 this.updateIndexes(index);
rlm@46 17510 },
rlm@46 17511
rlm@46 17512 onRemove : function(ds, record, index){
rlm@46 17513 this.deselect(index);
rlm@46 17514 this.all.removeElement(index, true);
rlm@46 17515 this.updateIndexes(index);
rlm@46 17516 },
rlm@46 17517
rlm@46 17518
rlm@46 17519 refreshNode : function(index){
rlm@46 17520 this.onUpdate(this.store, this.store.getAt(index));
rlm@46 17521 },
rlm@46 17522
rlm@46 17523 updateIndexes : function(startIndex, endIndex){
rlm@46 17524 var ns = this.all.elements;
rlm@46 17525 startIndex = startIndex || 0;
rlm@46 17526 endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));
rlm@46 17527 for(var i = startIndex; i <= endIndex; i++){
rlm@46 17528 ns[i].viewIndex = i;
rlm@46 17529 }
rlm@46 17530 },
rlm@46 17531
rlm@46 17532
rlm@46 17533 setStore : function(store, initial){
rlm@46 17534 if(!initial && this.store){
rlm@46 17535 this.store.un("beforeload", this.onBeforeLoad, this);
rlm@46 17536 this.store.un("datachanged", this.refresh, this);
rlm@46 17537 this.store.un("add", this.onAdd, this);
rlm@46 17538 this.store.un("remove", this.onRemove, this);
rlm@46 17539 this.store.un("update", this.onUpdate, this);
rlm@46 17540 this.store.un("clear", this.refresh, this);
rlm@46 17541 }
rlm@46 17542 if(store){
rlm@46 17543 store = Ext.StoreMgr.lookup(store);
rlm@46 17544 store.on("beforeload", this.onBeforeLoad, this);
rlm@46 17545 store.on("datachanged", this.refresh, this);
rlm@46 17546 store.on("add", this.onAdd, this);
rlm@46 17547 store.on("remove", this.onRemove, this);
rlm@46 17548 store.on("update", this.onUpdate, this);
rlm@46 17549 store.on("clear", this.refresh, this);
rlm@46 17550 }
rlm@46 17551 this.store = store;
rlm@46 17552 if(store){
rlm@46 17553 this.refresh();
rlm@46 17554 }
rlm@46 17555 },
rlm@46 17556
rlm@46 17557
rlm@46 17558 findItemFromChild : function(node){
rlm@46 17559 return Ext.fly(node).findParent(this.itemSelector, this.el);
rlm@46 17560 },
rlm@46 17561
rlm@46 17562 onClick : function(e){
rlm@46 17563 var item = e.getTarget(this.itemSelector, this.el);
rlm@46 17564 if(item){
rlm@46 17565 var index = this.indexOf(item);
rlm@46 17566 if(this.onItemClick(item, index, e) !== false){
rlm@46 17567 this.fireEvent("click", this, index, item, e);
rlm@46 17568 }
rlm@46 17569 }else{
rlm@46 17570 if(this.fireEvent("containerclick", this, e) !== false){
rlm@46 17571 this.clearSelections();
rlm@46 17572 }
rlm@46 17573 }
rlm@46 17574 },
rlm@46 17575
rlm@46 17576 onContextMenu : function(e){
rlm@46 17577 var item = e.getTarget(this.itemSelector, this.el);
rlm@46 17578 if(item){
rlm@46 17579 this.fireEvent("contextmenu", this, this.indexOf(item), item, e);
rlm@46 17580 }
rlm@46 17581 },
rlm@46 17582
rlm@46 17583 onDblClick : function(e){
rlm@46 17584 var item = e.getTarget(this.itemSelector, this.el);
rlm@46 17585 if(item){
rlm@46 17586 this.fireEvent("dblclick", this, this.indexOf(item), item, e);
rlm@46 17587 }
rlm@46 17588 },
rlm@46 17589
rlm@46 17590 onMouseOver : function(e){
rlm@46 17591 var item = e.getTarget(this.itemSelector, this.el);
rlm@46 17592 if(item && item !== this.lastItem){
rlm@46 17593 this.lastItem = item;
rlm@46 17594 Ext.fly(item).addClass(this.overClass);
rlm@46 17595 }
rlm@46 17596 },
rlm@46 17597
rlm@46 17598 onMouseOut : function(e){
rlm@46 17599 if(this.lastItem){
rlm@46 17600 if(!e.within(this.lastItem, true)){
rlm@46 17601 Ext.fly(this.lastItem).removeClass(this.overClass);
rlm@46 17602 delete this.lastItem;
rlm@46 17603 }
rlm@46 17604 }
rlm@46 17605 },
rlm@46 17606
rlm@46 17607 onItemClick : function(item, index, e){
rlm@46 17608 if(this.fireEvent("beforeclick", this, index, item, e) === false){
rlm@46 17609 return false;
rlm@46 17610 }
rlm@46 17611 if(this.multiSelect){
rlm@46 17612 this.doMultiSelection(item, index, e);
rlm@46 17613 e.preventDefault();
rlm@46 17614 }else if(this.singleSelect){
rlm@46 17615 this.doSingleSelection(item, index, e);
rlm@46 17616 e.preventDefault();
rlm@46 17617 }
rlm@46 17618 return true;
rlm@46 17619 },
rlm@46 17620
rlm@46 17621 doSingleSelection : function(item, index, e){
rlm@46 17622 if(e.ctrlKey && this.isSelected(index)){
rlm@46 17623 this.deselect(index);
rlm@46 17624 }else{
rlm@46 17625 this.select(index, false);
rlm@46 17626 }
rlm@46 17627 },
rlm@46 17628
rlm@46 17629 doMultiSelection : function(item, index, e){
rlm@46 17630 if(e.shiftKey && this.last !== false){
rlm@46 17631 var last = this.last;
rlm@46 17632 this.selectRange(last, index, e.ctrlKey);
rlm@46 17633 this.last = last; }else{
rlm@46 17634 if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){
rlm@46 17635 this.deselect(index);
rlm@46 17636 }else{
rlm@46 17637 this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect);
rlm@46 17638 }
rlm@46 17639 }
rlm@46 17640 },
rlm@46 17641
rlm@46 17642
rlm@46 17643 getSelectionCount : function(){
rlm@46 17644 return this.selected.getCount()
rlm@46 17645 },
rlm@46 17646
rlm@46 17647
rlm@46 17648 getSelectedNodes : function(){
rlm@46 17649 return this.selected.elements;
rlm@46 17650 },
rlm@46 17651
rlm@46 17652
rlm@46 17653 getSelectedIndexes : function(){
rlm@46 17654 var indexes = [], s = this.selected.elements;
rlm@46 17655 for(var i = 0, len = s.length; i < len; i++){
rlm@46 17656 indexes.push(s[i].viewIndex);
rlm@46 17657 }
rlm@46 17658 return indexes;
rlm@46 17659 },
rlm@46 17660
rlm@46 17661
rlm@46 17662 getSelectedRecords : function(){
rlm@46 17663 var r = [], s = this.selected.elements;
rlm@46 17664 for(var i = 0, len = s.length; i < len; i++){
rlm@46 17665 r[r.length] = this.store.getAt(s[i].viewIndex);
rlm@46 17666 }
rlm@46 17667 return r;
rlm@46 17668 },
rlm@46 17669
rlm@46 17670
rlm@46 17671 getRecords : function(nodes){
rlm@46 17672 var r = [], s = nodes;
rlm@46 17673 for(var i = 0, len = s.length; i < len; i++){
rlm@46 17674 r[r.length] = this.store.getAt(s[i].viewIndex);
rlm@46 17675 }
rlm@46 17676 return r;
rlm@46 17677 },
rlm@46 17678
rlm@46 17679
rlm@46 17680 getRecord : function(node){
rlm@46 17681 return this.store.getAt(node.viewIndex);
rlm@46 17682 },
rlm@46 17683
rlm@46 17684
rlm@46 17685 clearSelections : function(suppressEvent, skipUpdate){
rlm@46 17686 if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){
rlm@46 17687 if(!skipUpdate){
rlm@46 17688 this.selected.removeClass(this.selectedClass);
rlm@46 17689 }
rlm@46 17690 this.selected.clear();
rlm@46 17691 this.last = false;
rlm@46 17692 if(!suppressEvent){
rlm@46 17693 this.fireEvent("selectionchange", this, this.selected.elements);
rlm@46 17694 }
rlm@46 17695 }
rlm@46 17696 },
rlm@46 17697
rlm@46 17698
rlm@46 17699 isSelected : function(node){
rlm@46 17700 return this.selected.contains(this.getNode(node));
rlm@46 17701 },
rlm@46 17702
rlm@46 17703
rlm@46 17704 deselect : function(node){
rlm@46 17705 if(this.isSelected(node)){
rlm@46 17706 var node = this.getNode(node);
rlm@46 17707 this.selected.removeElement(node);
rlm@46 17708 if(this.last == node.viewIndex){
rlm@46 17709 this.last = false;
rlm@46 17710 }
rlm@46 17711 Ext.fly(node).removeClass(this.selectedClass);
rlm@46 17712 this.fireEvent("selectionchange", this, this.selected.elements);
rlm@46 17713 }
rlm@46 17714 },
rlm@46 17715
rlm@46 17716
rlm@46 17717 select : function(nodeInfo, keepExisting, suppressEvent){
rlm@46 17718 if(Ext.isArray(nodeInfo)){
rlm@46 17719 if(!keepExisting){
rlm@46 17720 this.clearSelections(true);
rlm@46 17721 }
rlm@46 17722 for(var i = 0, len = nodeInfo.length; i < len; i++){
rlm@46 17723 this.select(nodeInfo[i], true, true);
rlm@46 17724 }
rlm@46 17725 if(!suppressEvent){
rlm@46 17726 this.fireEvent("selectionchange", this, this.selected.elements);
rlm@46 17727 }
rlm@46 17728 } else{
rlm@46 17729 var node = this.getNode(nodeInfo);
rlm@46 17730 if(!keepExisting){
rlm@46 17731 this.clearSelections(true);
rlm@46 17732 }
rlm@46 17733 if(node && !this.isSelected(node)){
rlm@46 17734 if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){
rlm@46 17735 Ext.fly(node).addClass(this.selectedClass);
rlm@46 17736 this.selected.add(node);
rlm@46 17737 this.last = node.viewIndex;
rlm@46 17738 if(!suppressEvent){
rlm@46 17739 this.fireEvent("selectionchange", this, this.selected.elements);
rlm@46 17740 }
rlm@46 17741 }
rlm@46 17742 }
rlm@46 17743 }
rlm@46 17744 },
rlm@46 17745
rlm@46 17746
rlm@46 17747 selectRange : function(start, end, keepExisting){
rlm@46 17748 if(!keepExisting){
rlm@46 17749 this.clearSelections(true);
rlm@46 17750 }
rlm@46 17751 this.select(this.getNodes(start, end), true);
rlm@46 17752 },
rlm@46 17753
rlm@46 17754
rlm@46 17755 getNode : function(nodeInfo){
rlm@46 17756 if(typeof nodeInfo == "string"){
rlm@46 17757 return document.getElementById(nodeInfo);
rlm@46 17758 }else if(typeof nodeInfo == "number"){
rlm@46 17759 return this.all.elements[nodeInfo];
rlm@46 17760 }
rlm@46 17761 return nodeInfo;
rlm@46 17762 },
rlm@46 17763
rlm@46 17764
rlm@46 17765 getNodes : function(start, end){
rlm@46 17766 var ns = this.all.elements;
rlm@46 17767 start = start || 0;
rlm@46 17768 end = typeof end == "undefined" ? ns.length - 1 : end;
rlm@46 17769 var nodes = [], i;
rlm@46 17770 if(start <= end){
rlm@46 17771 for(i = start; i <= end; i++){
rlm@46 17772 nodes.push(ns[i]);
rlm@46 17773 }
rlm@46 17774 } else{
rlm@46 17775 for(i = start; i >= end; i--){
rlm@46 17776 nodes.push(ns[i]);
rlm@46 17777 }
rlm@46 17778 }
rlm@46 17779 return nodes;
rlm@46 17780 },
rlm@46 17781
rlm@46 17782
rlm@46 17783 indexOf : function(node){
rlm@46 17784 node = this.getNode(node);
rlm@46 17785 if(typeof node.viewIndex == "number"){
rlm@46 17786 return node.viewIndex;
rlm@46 17787 }
rlm@46 17788 return this.all.indexOf(node);
rlm@46 17789 },
rlm@46 17790
rlm@46 17791 onBeforeLoad : function(){
rlm@46 17792 if(this.loadingText){
rlm@46 17793 this.clearSelections(false, true);
rlm@46 17794 this.el.update('<div class="loading-indicator">'+this.loadingText+'</div>');
rlm@46 17795 this.all.clear();
rlm@46 17796 }
rlm@46 17797 },
rlm@46 17798
rlm@46 17799 onDestroy : function(){
rlm@46 17800 Ext.DataView.superclass.onDestroy.call(this);
rlm@46 17801 this.setStore(null);
rlm@46 17802 }
rlm@46 17803 });
rlm@46 17804
rlm@46 17805 Ext.reg('dataview', Ext.DataView);
rlm@46 17806
rlm@46 17807 Ext.ColorPalette = function(config){
rlm@46 17808 Ext.ColorPalette.superclass.constructor.call(this, config);
rlm@46 17809 this.addEvents(
rlm@46 17810
rlm@46 17811 'select'
rlm@46 17812 );
rlm@46 17813
rlm@46 17814 if(this.handler){
rlm@46 17815 this.on("select", this.handler, this.scope, true);
rlm@46 17816 }
rlm@46 17817 };
rlm@46 17818 Ext.extend(Ext.ColorPalette, Ext.Component, {
rlm@46 17819
rlm@46 17820
rlm@46 17821 itemCls : "x-color-palette",
rlm@46 17822
rlm@46 17823 value : null,
rlm@46 17824 clickEvent:'click',
rlm@46 17825 ctype: "Ext.ColorPalette",
rlm@46 17826
rlm@46 17827
rlm@46 17828 allowReselect : false,
rlm@46 17829
rlm@46 17830
rlm@46 17831 colors : [
rlm@46 17832 "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333",
rlm@46 17833 "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080",
rlm@46 17834 "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696",
rlm@46 17835 "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0",
rlm@46 17836 "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"
rlm@46 17837 ],
rlm@46 17838
rlm@46 17839 onRender : function(container, position){
rlm@46 17840 var t = this.tpl || new Ext.XTemplate(
rlm@46 17841 '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>'
rlm@46 17842 );
rlm@46 17843 var el = document.createElement("div");
rlm@46 17844 el.className = this.itemCls;
rlm@46 17845 t.overwrite(el, this.colors);
rlm@46 17846 container.dom.insertBefore(el, position);
rlm@46 17847 this.el = Ext.get(el);
rlm@46 17848 this.el.on(this.clickEvent, this.handleClick, this, {delegate: "a"});
rlm@46 17849 if(this.clickEvent != 'click'){
rlm@46 17850 this.el.on('click', Ext.emptyFn, this, {delegate: "a", preventDefault:true});
rlm@46 17851 }
rlm@46 17852 },
rlm@46 17853
rlm@46 17854 afterRender : function(){
rlm@46 17855 Ext.ColorPalette.superclass.afterRender.call(this);
rlm@46 17856 if(this.value){
rlm@46 17857 var s = this.value;
rlm@46 17858 this.value = null;
rlm@46 17859 this.select(s);
rlm@46 17860 }
rlm@46 17861 },
rlm@46 17862
rlm@46 17863 handleClick : function(e, t){
rlm@46 17864 e.preventDefault();
rlm@46 17865 if(!this.disabled){
rlm@46 17866 var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
rlm@46 17867 this.select(c.toUpperCase());
rlm@46 17868 }
rlm@46 17869 },
rlm@46 17870
rlm@46 17871
rlm@46 17872 select : function(color){
rlm@46 17873 color = color.replace("#", "");
rlm@46 17874 if(color != this.value || this.allowReselect){
rlm@46 17875 var el = this.el;
rlm@46 17876 if(this.value){
rlm@46 17877 el.child("a.color-"+this.value).removeClass("x-color-palette-sel");
rlm@46 17878 }
rlm@46 17879 el.child("a.color-"+color).addClass("x-color-palette-sel");
rlm@46 17880 this.value = color;
rlm@46 17881 this.fireEvent("select", this, color);
rlm@46 17882 }
rlm@46 17883 }
rlm@46 17884
rlm@46 17885
rlm@46 17886 });
rlm@46 17887 Ext.reg('colorpalette', Ext.ColorPalette);
rlm@46 17888
rlm@46 17889 Ext.DatePicker = Ext.extend(Ext.Component, {
rlm@46 17890
rlm@46 17891 todayText : "Today",
rlm@46 17892
rlm@46 17893 okText : "&#160;OK&#160;",
rlm@46 17894
rlm@46 17895 cancelText : "Cancel",
rlm@46 17896
rlm@46 17897 todayTip : "{0} (Spacebar)",
rlm@46 17898
rlm@46 17899 minDate : null,
rlm@46 17900
rlm@46 17901 maxDate : null,
rlm@46 17902
rlm@46 17903 minText : "This date is before the minimum date",
rlm@46 17904
rlm@46 17905 maxText : "This date is after the maximum date",
rlm@46 17906
rlm@46 17907 format : "m/d/y",
rlm@46 17908
rlm@46 17909 disabledDays : null,
rlm@46 17910
rlm@46 17911 disabledDaysText : "",
rlm@46 17912
rlm@46 17913 disabledDatesRE : null,
rlm@46 17914
rlm@46 17915 disabledDatesText : "",
rlm@46 17916
rlm@46 17917 constrainToViewport : true,
rlm@46 17918
rlm@46 17919 monthNames : Date.monthNames,
rlm@46 17920
rlm@46 17921 dayNames : Date.dayNames,
rlm@46 17922
rlm@46 17923 nextText: 'Next Month (Control+Right)',
rlm@46 17924
rlm@46 17925 prevText: 'Previous Month (Control+Left)',
rlm@46 17926
rlm@46 17927 monthYearText: 'Choose a month (Control+Up/Down to move years)',
rlm@46 17928
rlm@46 17929 startDay : 0,
rlm@46 17930
rlm@46 17931 initComponent : function(){
rlm@46 17932 Ext.DatePicker.superclass.initComponent.call(this);
rlm@46 17933
rlm@46 17934 this.value = this.value ?
rlm@46 17935 this.value.clearTime() : new Date().clearTime();
rlm@46 17936
rlm@46 17937 this.addEvents(
rlm@46 17938
rlm@46 17939 'select'
rlm@46 17940 );
rlm@46 17941
rlm@46 17942 if(this.handler){
rlm@46 17943 this.on("select", this.handler, this.scope || this);
rlm@46 17944 }
rlm@46 17945
rlm@46 17946 this.initDisabledDays();
rlm@46 17947 },
rlm@46 17948
rlm@46 17949
rlm@46 17950 initDisabledDays : function(){
rlm@46 17951 if(!this.disabledDatesRE && this.disabledDates){
rlm@46 17952 var dd = this.disabledDates;
rlm@46 17953 var re = "(?:";
rlm@46 17954 for(var i = 0; i < dd.length; i++){
rlm@46 17955 re += dd[i];
rlm@46 17956 if(i != dd.length-1) re += "|";
rlm@46 17957 }
rlm@46 17958 this.disabledDatesRE = new RegExp(re + ")");
rlm@46 17959 }
rlm@46 17960 },
rlm@46 17961
rlm@46 17962
rlm@46 17963 setValue : function(value){
rlm@46 17964 var old = this.value;
rlm@46 17965 this.value = value.clearTime(true);
rlm@46 17966 if(this.el){
rlm@46 17967 this.update(this.value);
rlm@46 17968 }
rlm@46 17969 },
rlm@46 17970
rlm@46 17971
rlm@46 17972 getValue : function(){
rlm@46 17973 return this.value;
rlm@46 17974 },
rlm@46 17975
rlm@46 17976
rlm@46 17977 focus : function(){
rlm@46 17978 if(this.el){
rlm@46 17979 this.update(this.activeDate);
rlm@46 17980 }
rlm@46 17981 },
rlm@46 17982
rlm@46 17983
rlm@46 17984 onRender : function(container, position){
rlm@46 17985 var m = [
rlm@46 17986 '<table cellspacing="0">',
rlm@46 17987 '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',
rlm@46 17988 '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'];
rlm@46 17989 var dn = this.dayNames;
rlm@46 17990 for(var i = 0; i < 7; i++){
rlm@46 17991 var d = this.startDay+i;
rlm@46 17992 if(d > 6){
rlm@46 17993 d = d-7;
rlm@46 17994 }
rlm@46 17995 m.push("<th><span>", dn[d].substr(0,1), "</span></th>");
rlm@46 17996 }
rlm@46 17997 m[m.length] = "</tr></thead><tbody><tr>";
rlm@46 17998 for(var i = 0; i < 42; i++) {
rlm@46 17999 if(i % 7 == 0 && i != 0){
rlm@46 18000 m[m.length] = "</tr><tr>";
rlm@46 18001 }
rlm@46 18002 m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
rlm@46 18003 }
rlm@46 18004 m[m.length] = '</tr></tbody></table></td></tr><tr><td colspan="3" class="x-date-bottom" align="center"></td></tr></table><div class="x-date-mp"></div>';
rlm@46 18005
rlm@46 18006 var el = document.createElement("div");
rlm@46 18007 el.className = "x-date-picker";
rlm@46 18008 el.innerHTML = m.join("");
rlm@46 18009
rlm@46 18010 container.dom.insertBefore(el, position);
rlm@46 18011
rlm@46 18012 this.el = Ext.get(el);
rlm@46 18013 this.eventEl = Ext.get(el.firstChild);
rlm@46 18014
rlm@46 18015 new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {
rlm@46 18016 handler: this.showPrevMonth,
rlm@46 18017 scope: this,
rlm@46 18018 preventDefault:true,
rlm@46 18019 stopDefault:true
rlm@46 18020 });
rlm@46 18021
rlm@46 18022 new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {
rlm@46 18023 handler: this.showNextMonth,
rlm@46 18024 scope: this,
rlm@46 18025 preventDefault:true,
rlm@46 18026 stopDefault:true
rlm@46 18027 });
rlm@46 18028
rlm@46 18029 this.eventEl.on("mousewheel", this.handleMouseWheel, this);
rlm@46 18030
rlm@46 18031 this.monthPicker = this.el.down('div.x-date-mp');
rlm@46 18032 this.monthPicker.enableDisplayMode('block');
rlm@46 18033
rlm@46 18034 var kn = new Ext.KeyNav(this.eventEl, {
rlm@46 18035 "left" : function(e){
rlm@46 18036 e.ctrlKey ?
rlm@46 18037 this.showPrevMonth() :
rlm@46 18038 this.update(this.activeDate.add("d", -1));
rlm@46 18039 },
rlm@46 18040
rlm@46 18041 "right" : function(e){
rlm@46 18042 e.ctrlKey ?
rlm@46 18043 this.showNextMonth() :
rlm@46 18044 this.update(this.activeDate.add("d", 1));
rlm@46 18045 },
rlm@46 18046
rlm@46 18047 "up" : function(e){
rlm@46 18048 e.ctrlKey ?
rlm@46 18049 this.showNextYear() :
rlm@46 18050 this.update(this.activeDate.add("d", -7));
rlm@46 18051 },
rlm@46 18052
rlm@46 18053 "down" : function(e){
rlm@46 18054 e.ctrlKey ?
rlm@46 18055 this.showPrevYear() :
rlm@46 18056 this.update(this.activeDate.add("d", 7));
rlm@46 18057 },
rlm@46 18058
rlm@46 18059 "pageUp" : function(e){
rlm@46 18060 this.showNextMonth();
rlm@46 18061 },
rlm@46 18062
rlm@46 18063 "pageDown" : function(e){
rlm@46 18064 this.showPrevMonth();
rlm@46 18065 },
rlm@46 18066
rlm@46 18067 "enter" : function(e){
rlm@46 18068 e.stopPropagation();
rlm@46 18069 return true;
rlm@46 18070 },
rlm@46 18071
rlm@46 18072 scope : this
rlm@46 18073 });
rlm@46 18074
rlm@46 18075 this.eventEl.on("click", this.handleDateClick, this, {delegate: "a.x-date-date"});
rlm@46 18076
rlm@46 18077 this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this);
rlm@46 18078
rlm@46 18079 this.el.unselectable();
rlm@46 18080
rlm@46 18081 this.cells = this.el.select("table.x-date-inner tbody td");
rlm@46 18082 this.textNodes = this.el.query("table.x-date-inner tbody span");
rlm@46 18083
rlm@46 18084 this.mbtn = new Ext.Button({
rlm@46 18085 text: "&#160;",
rlm@46 18086 tooltip: this.monthYearText,
rlm@46 18087 renderTo: this.el.child("td.x-date-middle", true)
rlm@46 18088 });
rlm@46 18089
rlm@46 18090 this.mbtn.on('click', this.showMonthPicker, this);
rlm@46 18091 this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");
rlm@46 18092
rlm@46 18093
rlm@46 18094 var today = (new Date()).dateFormat(this.format);
rlm@46 18095 this.todayBtn = new Ext.Button({
rlm@46 18096 renderTo: this.el.child("td.x-date-bottom", true),
rlm@46 18097 text: String.format(this.todayText, today),
rlm@46 18098 tooltip: String.format(this.todayTip, today),
rlm@46 18099 handler: this.selectToday,
rlm@46 18100 scope: this
rlm@46 18101 });
rlm@46 18102
rlm@46 18103 if(Ext.isIE){
rlm@46 18104 this.el.repaint();
rlm@46 18105 }
rlm@46 18106 this.update(this.value);
rlm@46 18107 },
rlm@46 18108
rlm@46 18109 createMonthPicker : function(){
rlm@46 18110 if(!this.monthPicker.dom.firstChild){
rlm@46 18111 var buf = ['<table border="0" cellspacing="0">'];
rlm@46 18112 for(var i = 0; i < 6; i++){
rlm@46 18113 buf.push(
rlm@46 18114 '<tr><td class="x-date-mp-month"><a href="#">', this.monthNames[i].substr(0, 3), '</a></td>',
rlm@46 18115 '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', this.monthNames[i+6].substr(0, 3), '</a></td>',
rlm@46 18116 i == 0 ?
rlm@46 18117 '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :
rlm@46 18118 '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'
rlm@46 18119 );
rlm@46 18120 }
rlm@46 18121 buf.push(
rlm@46 18122 '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',
rlm@46 18123 this.okText,
rlm@46 18124 '</button><button type="button" class="x-date-mp-cancel">',
rlm@46 18125 this.cancelText,
rlm@46 18126 '</button></td></tr>',
rlm@46 18127 '</table>'
rlm@46 18128 );
rlm@46 18129 this.monthPicker.update(buf.join(''));
rlm@46 18130 this.monthPicker.on('click', this.onMonthClick, this);
rlm@46 18131 this.monthPicker.on('dblclick', this.onMonthDblClick, this);
rlm@46 18132
rlm@46 18133 this.mpMonths = this.monthPicker.select('td.x-date-mp-month');
rlm@46 18134 this.mpYears = this.monthPicker.select('td.x-date-mp-year');
rlm@46 18135
rlm@46 18136 this.mpMonths.each(function(m, a, i){
rlm@46 18137 i += 1;
rlm@46 18138 if((i%2) == 0){
rlm@46 18139 m.dom.xmonth = 5 + Math.round(i * .5);
rlm@46 18140 }else{
rlm@46 18141 m.dom.xmonth = Math.round((i-1) * .5);
rlm@46 18142 }
rlm@46 18143 });
rlm@46 18144 }
rlm@46 18145 },
rlm@46 18146
rlm@46 18147 showMonthPicker : function(){
rlm@46 18148 this.createMonthPicker();
rlm@46 18149 var size = this.el.getSize();
rlm@46 18150 this.monthPicker.setSize(size);
rlm@46 18151 this.monthPicker.child('table').setSize(size);
rlm@46 18152
rlm@46 18153 this.mpSelMonth = (this.activeDate || this.value).getMonth();
rlm@46 18154 this.updateMPMonth(this.mpSelMonth);
rlm@46 18155 this.mpSelYear = (this.activeDate || this.value).getFullYear();
rlm@46 18156 this.updateMPYear(this.mpSelYear);
rlm@46 18157
rlm@46 18158 this.monthPicker.slideIn('t', {duration:.2});
rlm@46 18159 },
rlm@46 18160
rlm@46 18161 updateMPYear : function(y){
rlm@46 18162 this.mpyear = y;
rlm@46 18163 var ys = this.mpYears.elements;
rlm@46 18164 for(var i = 1; i <= 10; i++){
rlm@46 18165 var td = ys[i-1], y2;
rlm@46 18166 if((i%2) == 0){
rlm@46 18167 y2 = y + Math.round(i * .5);
rlm@46 18168 td.firstChild.innerHTML = y2;
rlm@46 18169 td.xyear = y2;
rlm@46 18170 }else{
rlm@46 18171 y2 = y - (5-Math.round(i * .5));
rlm@46 18172 td.firstChild.innerHTML = y2;
rlm@46 18173 td.xyear = y2;
rlm@46 18174 }
rlm@46 18175 this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');
rlm@46 18176 }
rlm@46 18177 },
rlm@46 18178
rlm@46 18179 updateMPMonth : function(sm){
rlm@46 18180 this.mpMonths.each(function(m, a, i){
rlm@46 18181 m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');
rlm@46 18182 });
rlm@46 18183 },
rlm@46 18184
rlm@46 18185 selectMPMonth: function(m){
rlm@46 18186
rlm@46 18187 },
rlm@46 18188
rlm@46 18189 onMonthClick : function(e, t){
rlm@46 18190 e.stopEvent();
rlm@46 18191 var el = new Ext.Element(t), pn;
rlm@46 18192 if(el.is('button.x-date-mp-cancel')){
rlm@46 18193 this.hideMonthPicker();
rlm@46 18194 }
rlm@46 18195 else if(el.is('button.x-date-mp-ok')){
rlm@46 18196 var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
rlm@46 18197 if(d.getMonth() != this.mpSelMonth){
rlm@46 18198
rlm@46 18199 d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();
rlm@46 18200 }
rlm@46 18201 this.update(d);
rlm@46 18202 this.hideMonthPicker();
rlm@46 18203 }
rlm@46 18204 else if(pn = el.up('td.x-date-mp-month', 2)){
rlm@46 18205 this.mpMonths.removeClass('x-date-mp-sel');
rlm@46 18206 pn.addClass('x-date-mp-sel');
rlm@46 18207 this.mpSelMonth = pn.dom.xmonth;
rlm@46 18208 }
rlm@46 18209 else if(pn = el.up('td.x-date-mp-year', 2)){
rlm@46 18210 this.mpYears.removeClass('x-date-mp-sel');
rlm@46 18211 pn.addClass('x-date-mp-sel');
rlm@46 18212 this.mpSelYear = pn.dom.xyear;
rlm@46 18213 }
rlm@46 18214 else if(el.is('a.x-date-mp-prev')){
rlm@46 18215 this.updateMPYear(this.mpyear-10);
rlm@46 18216 }
rlm@46 18217 else if(el.is('a.x-date-mp-next')){
rlm@46 18218 this.updateMPYear(this.mpyear+10);
rlm@46 18219 }
rlm@46 18220 },
rlm@46 18221
rlm@46 18222 onMonthDblClick : function(e, t){
rlm@46 18223 e.stopEvent();
rlm@46 18224 var el = new Ext.Element(t), pn;
rlm@46 18225 if(pn = el.up('td.x-date-mp-month', 2)){
rlm@46 18226 this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));
rlm@46 18227 this.hideMonthPicker();
rlm@46 18228 }
rlm@46 18229 else if(pn = el.up('td.x-date-mp-year', 2)){
rlm@46 18230 this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
rlm@46 18231 this.hideMonthPicker();
rlm@46 18232 }
rlm@46 18233 },
rlm@46 18234
rlm@46 18235 hideMonthPicker : function(disableAnim){
rlm@46 18236 if(this.monthPicker){
rlm@46 18237 if(disableAnim === true){
rlm@46 18238 this.monthPicker.hide();
rlm@46 18239 }else{
rlm@46 18240 this.monthPicker.slideOut('t', {duration:.2});
rlm@46 18241 }
rlm@46 18242 }
rlm@46 18243 },
rlm@46 18244
rlm@46 18245
rlm@46 18246 showPrevMonth : function(e){
rlm@46 18247 this.update(this.activeDate.add("mo", -1));
rlm@46 18248 },
rlm@46 18249
rlm@46 18250
rlm@46 18251 showNextMonth : function(e){
rlm@46 18252 this.update(this.activeDate.add("mo", 1));
rlm@46 18253 },
rlm@46 18254
rlm@46 18255
rlm@46 18256 showPrevYear : function(){
rlm@46 18257 this.update(this.activeDate.add("y", -1));
rlm@46 18258 },
rlm@46 18259
rlm@46 18260
rlm@46 18261 showNextYear : function(){
rlm@46 18262 this.update(this.activeDate.add("y", 1));
rlm@46 18263 },
rlm@46 18264
rlm@46 18265
rlm@46 18266 handleMouseWheel : function(e){
rlm@46 18267 var delta = e.getWheelDelta();
rlm@46 18268 if(delta > 0){
rlm@46 18269 this.showPrevMonth();
rlm@46 18270 e.stopEvent();
rlm@46 18271 } else if(delta < 0){
rlm@46 18272 this.showNextMonth();
rlm@46 18273 e.stopEvent();
rlm@46 18274 }
rlm@46 18275 },
rlm@46 18276
rlm@46 18277
rlm@46 18278 handleDateClick : function(e, t){
rlm@46 18279 e.stopEvent();
rlm@46 18280 if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){
rlm@46 18281 this.setValue(new Date(t.dateValue));
rlm@46 18282 this.fireEvent("select", this, this.value);
rlm@46 18283 }
rlm@46 18284 },
rlm@46 18285
rlm@46 18286
rlm@46 18287 selectToday : function(){
rlm@46 18288 this.setValue(new Date().clearTime());
rlm@46 18289 this.fireEvent("select", this, this.value);
rlm@46 18290 },
rlm@46 18291
rlm@46 18292
rlm@46 18293 update : function(date){
rlm@46 18294 var vd = this.activeDate;
rlm@46 18295 this.activeDate = date;
rlm@46 18296 if(vd && this.el){
rlm@46 18297 var t = date.getTime();
rlm@46 18298 if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){
rlm@46 18299 this.cells.removeClass("x-date-selected");
rlm@46 18300 this.cells.each(function(c){
rlm@46 18301 if(c.dom.firstChild.dateValue == t){
rlm@46 18302 c.addClass("x-date-selected");
rlm@46 18303 setTimeout(function(){
rlm@46 18304 try{c.dom.firstChild.focus();}catch(e){}
rlm@46 18305 }, 50);
rlm@46 18306 return false;
rlm@46 18307 }
rlm@46 18308 });
rlm@46 18309 return;
rlm@46 18310 }
rlm@46 18311 }
rlm@46 18312 var days = date.getDaysInMonth();
rlm@46 18313 var firstOfMonth = date.getFirstDateOfMonth();
rlm@46 18314 var startingPos = firstOfMonth.getDay()-this.startDay;
rlm@46 18315
rlm@46 18316 if(startingPos <= this.startDay){
rlm@46 18317 startingPos += 7;
rlm@46 18318 }
rlm@46 18319
rlm@46 18320 var pm = date.add("mo", -1);
rlm@46 18321 var prevStart = pm.getDaysInMonth()-startingPos;
rlm@46 18322
rlm@46 18323 var cells = this.cells.elements;
rlm@46 18324 var textEls = this.textNodes;
rlm@46 18325 days += startingPos;
rlm@46 18326
rlm@46 18327
rlm@46 18328 var day = 86400000;
rlm@46 18329 var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime();
rlm@46 18330 var today = new Date().clearTime().getTime();
rlm@46 18331 var sel = date.clearTime().getTime();
rlm@46 18332 var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY;
rlm@46 18333 var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY;
rlm@46 18334 var ddMatch = this.disabledDatesRE;
rlm@46 18335 var ddText = this.disabledDatesText;
rlm@46 18336 var ddays = this.disabledDays ? this.disabledDays.join("") : false;
rlm@46 18337 var ddaysText = this.disabledDaysText;
rlm@46 18338 var format = this.format;
rlm@46 18339
rlm@46 18340 var setCellClass = function(cal, cell){
rlm@46 18341 cell.title = "";
rlm@46 18342 var t = d.getTime();
rlm@46 18343 cell.firstChild.dateValue = t;
rlm@46 18344 if(t == today){
rlm@46 18345 cell.className += " x-date-today";
rlm@46 18346 cell.title = cal.todayText;
rlm@46 18347 }
rlm@46 18348 if(t == sel){
rlm@46 18349 cell.className += " x-date-selected";
rlm@46 18350 setTimeout(function(){
rlm@46 18351 try{cell.firstChild.focus();}catch(e){}
rlm@46 18352 }, 50);
rlm@46 18353 }
rlm@46 18354
rlm@46 18355 if(t < min) {
rlm@46 18356 cell.className = " x-date-disabled";
rlm@46 18357 cell.title = cal.minText;
rlm@46 18358 return;
rlm@46 18359 }
rlm@46 18360 if(t > max) {
rlm@46 18361 cell.className = " x-date-disabled";
rlm@46 18362 cell.title = cal.maxText;
rlm@46 18363 return;
rlm@46 18364 }
rlm@46 18365 if(ddays){
rlm@46 18366 if(ddays.indexOf(d.getDay()) != -1){
rlm@46 18367 cell.title = ddaysText;
rlm@46 18368 cell.className = " x-date-disabled";
rlm@46 18369 }
rlm@46 18370 }
rlm@46 18371 if(ddMatch && format){
rlm@46 18372 var fvalue = d.dateFormat(format);
rlm@46 18373 if(ddMatch.test(fvalue)){
rlm@46 18374 cell.title = ddText.replace("%0", fvalue);
rlm@46 18375 cell.className = " x-date-disabled";
rlm@46 18376 }
rlm@46 18377 }
rlm@46 18378 };
rlm@46 18379
rlm@46 18380 var i = 0;
rlm@46 18381 for(; i < startingPos; i++) {
rlm@46 18382 textEls[i].innerHTML = (++prevStart);
rlm@46 18383 d.setDate(d.getDate()+1);
rlm@46 18384 cells[i].className = "x-date-prevday";
rlm@46 18385 setCellClass(this, cells[i]);
rlm@46 18386 }
rlm@46 18387 for(; i < days; i++){
rlm@46 18388 intDay = i - startingPos + 1;
rlm@46 18389 textEls[i].innerHTML = (intDay);
rlm@46 18390 d.setDate(d.getDate()+1);
rlm@46 18391 cells[i].className = "x-date-active";
rlm@46 18392 setCellClass(this, cells[i]);
rlm@46 18393 }
rlm@46 18394 var extraDays = 0;
rlm@46 18395 for(; i < 42; i++) {
rlm@46 18396 textEls[i].innerHTML = (++extraDays);
rlm@46 18397 d.setDate(d.getDate()+1);
rlm@46 18398 cells[i].className = "x-date-nextday";
rlm@46 18399 setCellClass(this, cells[i]);
rlm@46 18400 }
rlm@46 18401
rlm@46 18402 this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear());
rlm@46 18403
rlm@46 18404 if(!this.internalRender){
rlm@46 18405 var main = this.el.dom.firstChild;
rlm@46 18406 var w = main.offsetWidth;
rlm@46 18407 this.el.setWidth(w + this.el.getBorderWidth("lr"));
rlm@46 18408 Ext.fly(main).setWidth(w);
rlm@46 18409 this.internalRender = true;
rlm@46 18410
rlm@46 18411
rlm@46 18412
rlm@46 18413 if(Ext.isOpera && !this.secondPass){
rlm@46 18414 main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px";
rlm@46 18415 this.secondPass = true;
rlm@46 18416 this.update.defer(10, this, [date]);
rlm@46 18417 }
rlm@46 18418 }
rlm@46 18419 },
rlm@46 18420
rlm@46 18421
rlm@46 18422 beforeDestroy : function() {
rlm@46 18423 if(this.rendered){
rlm@46 18424 this.mbtn.destroy();
rlm@46 18425 this.todayBtn.destroy();
rlm@46 18426 }
rlm@46 18427 }
rlm@46 18428
rlm@46 18429
rlm@46 18430 });
rlm@46 18431 Ext.reg('datepicker', Ext.DatePicker);
rlm@46 18432
rlm@46 18433 Ext.TabPanel = Ext.extend(Ext.Panel, {
rlm@46 18434
rlm@46 18435
rlm@46 18436 monitorResize : true,
rlm@46 18437
rlm@46 18438 deferredRender : true,
rlm@46 18439
rlm@46 18440 tabWidth: 120,
rlm@46 18441
rlm@46 18442 minTabWidth: 30,
rlm@46 18443
rlm@46 18444 resizeTabs:false,
rlm@46 18445
rlm@46 18446 enableTabScroll: false,
rlm@46 18447
rlm@46 18448 scrollIncrement : 0,
rlm@46 18449
rlm@46 18450 scrollRepeatInterval : 400,
rlm@46 18451
rlm@46 18452 scrollDuration : .35,
rlm@46 18453
rlm@46 18454 animScroll : true,
rlm@46 18455
rlm@46 18456 tabPosition: 'top',
rlm@46 18457
rlm@46 18458 baseCls: 'x-tab-panel',
rlm@46 18459
rlm@46 18460 autoTabs : false,
rlm@46 18461
rlm@46 18462 autoTabSelector:'div.x-tab',
rlm@46 18463
rlm@46 18464 activeTab : null,
rlm@46 18465
rlm@46 18466 tabMargin : 2,
rlm@46 18467
rlm@46 18468 plain: false,
rlm@46 18469
rlm@46 18470 wheelIncrement : 20,
rlm@46 18471
rlm@46 18472
rlm@46 18473 idDelimiter : '__',
rlm@46 18474
rlm@46 18475 itemCls : 'x-tab-item',
rlm@46 18476
rlm@46 18477 elements: 'body',
rlm@46 18478 headerAsText: false,
rlm@46 18479 frame: false,
rlm@46 18480 hideBorders:true,
rlm@46 18481
rlm@46 18482 initComponent : function(){
rlm@46 18483 this.frame = false;
rlm@46 18484 Ext.TabPanel.superclass.initComponent.call(this);
rlm@46 18485 this.addEvents(
rlm@46 18486
rlm@46 18487 'beforetabchange',
rlm@46 18488
rlm@46 18489 'tabchange',
rlm@46 18490
rlm@46 18491 'contextmenu'
rlm@46 18492 );
rlm@46 18493 this.setLayout(new Ext.layout.CardLayout({
rlm@46 18494 deferredRender: this.deferredRender
rlm@46 18495 }));
rlm@46 18496 if(this.tabPosition == 'top'){
rlm@46 18497 this.elements += ',header';
rlm@46 18498 this.stripTarget = 'header';
rlm@46 18499 }else {
rlm@46 18500 this.elements += ',footer';
rlm@46 18501 this.stripTarget = 'footer';
rlm@46 18502 }
rlm@46 18503 if(!this.stack){
rlm@46 18504 this.stack = Ext.TabPanel.AccessStack();
rlm@46 18505 }
rlm@46 18506 this.initItems();
rlm@46 18507 },
rlm@46 18508
rlm@46 18509 render : function(){
rlm@46 18510 Ext.TabPanel.superclass.render.apply(this, arguments);
rlm@46 18511 if(this.activeTab !== undefined){
rlm@46 18512 var item = this.activeTab;
rlm@46 18513 delete this.activeTab;
rlm@46 18514 this.setActiveTab(item);
rlm@46 18515 }
rlm@46 18516 },
rlm@46 18517
rlm@46 18518 onRender : function(ct, position){
rlm@46 18519 Ext.TabPanel.superclass.onRender.call(this, ct, position);
rlm@46 18520
rlm@46 18521 if(this.plain){
rlm@46 18522 var pos = this.tabPosition == 'top' ? 'header' : 'footer';
rlm@46 18523 this[pos].addClass('x-tab-panel-'+pos+'-plain');
rlm@46 18524 }
rlm@46 18525
rlm@46 18526 var st = this[this.stripTarget];
rlm@46 18527
rlm@46 18528 this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{
rlm@46 18529 tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});
rlm@46 18530 this.stripSpacer = st.createChild({cls:'x-tab-strip-spacer'});
rlm@46 18531 this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
rlm@46 18532
rlm@46 18533 this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge'});
rlm@46 18534 this.strip.createChild({cls:'x-clear'});
rlm@46 18535
rlm@46 18536 this.body.addClass('x-tab-panel-body-'+this.tabPosition);
rlm@46 18537
rlm@46 18538 if(!this.itemTpl){
rlm@46 18539 var tt = new Ext.Template(
rlm@46 18540 '<li class="{cls}" id="{id}"><a class="x-tab-strip-close" onclick="return false;"></a>',
rlm@46 18541 '<a class="x-tab-right" href="#" onclick="return false;"><em class="x-tab-left">',
rlm@46 18542 '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',
rlm@46 18543 '</em></a></li>'
rlm@46 18544 );
rlm@46 18545 tt.disableFormats = true;
rlm@46 18546 tt.compile();
rlm@46 18547 Ext.TabPanel.prototype.itemTpl = tt;
rlm@46 18548 }
rlm@46 18549
rlm@46 18550 this.items.each(this.initTab, this);
rlm@46 18551 },
rlm@46 18552
rlm@46 18553 afterRender : function(){
rlm@46 18554 Ext.TabPanel.superclass.afterRender.call(this);
rlm@46 18555 if(this.autoTabs){
rlm@46 18556 this.readTabs(false);
rlm@46 18557 }
rlm@46 18558 },
rlm@46 18559
rlm@46 18560 initEvents : function(){
rlm@46 18561 Ext.TabPanel.superclass.initEvents.call(this);
rlm@46 18562 this.on('add', this.onAdd, this);
rlm@46 18563 this.on('remove', this.onRemove, this);
rlm@46 18564
rlm@46 18565 this.strip.on('mousedown', this.onStripMouseDown, this);
rlm@46 18566 this.strip.on('click', this.onStripClick, this);
rlm@46 18567 this.strip.on('contextmenu', this.onStripContextMenu, this);
rlm@46 18568 if(this.enableTabScroll){
rlm@46 18569 this.strip.on('mousewheel', this.onWheel, this);
rlm@46 18570 }
rlm@46 18571 },
rlm@46 18572
rlm@46 18573 findTargets : function(e){
rlm@46 18574 var item = null;
rlm@46 18575 var itemEl = e.getTarget('li', this.strip);
rlm@46 18576 if(itemEl){
rlm@46 18577 item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);
rlm@46 18578 if(item.disabled){
rlm@46 18579 return {
rlm@46 18580 close : null,
rlm@46 18581 item : null,
rlm@46 18582 el : null
rlm@46 18583 };
rlm@46 18584 }
rlm@46 18585 }
rlm@46 18586 return {
rlm@46 18587 close : e.getTarget('.x-tab-strip-close', this.strip),
rlm@46 18588 item : item,
rlm@46 18589 el : itemEl
rlm@46 18590 };
rlm@46 18591 },
rlm@46 18592
rlm@46 18593 onStripMouseDown : function(e){
rlm@46 18594 e.preventDefault();
rlm@46 18595 if(e.button != 0){
rlm@46 18596 return;
rlm@46 18597 }
rlm@46 18598 var t = this.findTargets(e);
rlm@46 18599 if(t.close){
rlm@46 18600 this.remove(t.item);
rlm@46 18601 return;
rlm@46 18602 }
rlm@46 18603 if(t.item && t.item != this.activeTab){
rlm@46 18604 this.setActiveTab(t.item);
rlm@46 18605 }
rlm@46 18606 },
rlm@46 18607
rlm@46 18608 onStripClick : function(e){
rlm@46 18609 var t = this.findTargets(e);
rlm@46 18610 if(!t.close && t.item && t.item != this.activeTab){
rlm@46 18611 this.setActiveTab(t.item);
rlm@46 18612 }
rlm@46 18613 },
rlm@46 18614
rlm@46 18615 onStripContextMenu : function(e){
rlm@46 18616 e.preventDefault();
rlm@46 18617 var t = this.findTargets(e);
rlm@46 18618 if(t.item){
rlm@46 18619 this.fireEvent('contextmenu', this, t.item, e);
rlm@46 18620 }
rlm@46 18621 },
rlm@46 18622
rlm@46 18623
rlm@46 18624 readTabs : function(removeExisting){
rlm@46 18625 if(removeExisting === true){
rlm@46 18626 this.items.each(function(item){
rlm@46 18627 this.remove(item);
rlm@46 18628 }, this);
rlm@46 18629 }
rlm@46 18630 var tabs = this.el.query(this.autoTabSelector);
rlm@46 18631 for(var i = 0, len = tabs.length; i < len; i++){
rlm@46 18632 var tab = tabs[i];
rlm@46 18633 var title = tab.getAttribute('title');
rlm@46 18634 tab.removeAttribute('title');
rlm@46 18635 this.add({
rlm@46 18636 title: title,
rlm@46 18637 el: tab
rlm@46 18638 });
rlm@46 18639 }
rlm@46 18640 },
rlm@46 18641
rlm@46 18642 initTab : function(item, index){
rlm@46 18643 var before = this.strip.dom.childNodes[index];
rlm@46 18644 var cls = item.closable ? 'x-tab-strip-closable' : '';
rlm@46 18645 if(item.disabled){
rlm@46 18646 cls += ' x-item-disabled';
rlm@46 18647 }
rlm@46 18648 if(item.iconCls){
rlm@46 18649 cls += ' x-tab-with-icon';
rlm@46 18650 }
rlm@46 18651 if(item.tabCls){
rlm@46 18652 cls += ' ' + item.tabCls;
rlm@46 18653 }
rlm@46 18654
rlm@46 18655 var p = {
rlm@46 18656 id: this.id + this.idDelimiter + item.getItemId(),
rlm@46 18657 text: item.title,
rlm@46 18658 cls: cls,
rlm@46 18659 iconCls: item.iconCls || ''
rlm@46 18660 };
rlm@46 18661 var el = before ?
rlm@46 18662 this.itemTpl.insertBefore(before, p) :
rlm@46 18663 this.itemTpl.append(this.strip, p);
rlm@46 18664
rlm@46 18665 Ext.fly(el).addClassOnOver('x-tab-strip-over');
rlm@46 18666
rlm@46 18667 if(item.tabTip){
rlm@46 18668 Ext.fly(el).child('span.x-tab-strip-text', true).qtip = item.tabTip;
rlm@46 18669 }
rlm@46 18670 item.on('disable', this.onItemDisabled, this);
rlm@46 18671 item.on('enable', this.onItemEnabled, this);
rlm@46 18672 item.on('titlechange', this.onItemTitleChanged, this);
rlm@46 18673 item.on('beforeshow', this.onBeforeShowItem, this);
rlm@46 18674 },
rlm@46 18675
rlm@46 18676 onAdd : function(tp, item, index){
rlm@46 18677 this.initTab(item, index);
rlm@46 18678 if(this.items.getCount() == 1){
rlm@46 18679 this.syncSize();
rlm@46 18680 }
rlm@46 18681 this.delegateUpdates();
rlm@46 18682 },
rlm@46 18683
rlm@46 18684 onBeforeAdd : function(item){
rlm@46 18685 var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);
rlm@46 18686 if(existing){
rlm@46 18687 this.setActiveTab(item);
rlm@46 18688 return false;
rlm@46 18689 }
rlm@46 18690 Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
rlm@46 18691 var es = item.elements;
rlm@46 18692 item.elements = es ? es.replace(',header', '') : es;
rlm@46 18693 item.border = (item.border === true);
rlm@46 18694 },
rlm@46 18695
rlm@46 18696 onRemove : function(tp, item){
rlm@46 18697 Ext.removeNode(this.getTabEl(item));
rlm@46 18698 this.stack.remove(item);
rlm@46 18699 item.un('disable', this.onItemDisabled, this);
rlm@46 18700 item.un('enable', this.onItemEnabled, this);
rlm@46 18701 item.un('titlechange', this.onItemTitleChanged, this);
rlm@46 18702 item.un('beforeshow', this.onBeforeShowItem, this);
rlm@46 18703 if(item == this.activeTab){
rlm@46 18704 var next = this.stack.next();
rlm@46 18705 if(next){
rlm@46 18706 this.setActiveTab(next);
rlm@46 18707 }else{
rlm@46 18708 this.setActiveTab(0);
rlm@46 18709 }
rlm@46 18710 }
rlm@46 18711 this.delegateUpdates();
rlm@46 18712 },
rlm@46 18713
rlm@46 18714 onBeforeShowItem : function(item){
rlm@46 18715 if(item != this.activeTab){
rlm@46 18716 this.setActiveTab(item);
rlm@46 18717 return false;
rlm@46 18718 }
rlm@46 18719 },
rlm@46 18720
rlm@46 18721 onItemDisabled : function(item){
rlm@46 18722 var el = this.getTabEl(item);
rlm@46 18723 if(el){
rlm@46 18724 Ext.fly(el).addClass('x-item-disabled');
rlm@46 18725 }
rlm@46 18726 this.stack.remove(item);
rlm@46 18727 },
rlm@46 18728
rlm@46 18729 onItemEnabled : function(item){
rlm@46 18730 var el = this.getTabEl(item);
rlm@46 18731 if(el){
rlm@46 18732 Ext.fly(el).removeClass('x-item-disabled');
rlm@46 18733 }
rlm@46 18734 },
rlm@46 18735
rlm@46 18736 onItemTitleChanged : function(item){
rlm@46 18737 var el = this.getTabEl(item);
rlm@46 18738 if(el){
rlm@46 18739 Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;
rlm@46 18740 }
rlm@46 18741 },
rlm@46 18742
rlm@46 18743
rlm@46 18744 getTabEl : function(item){
rlm@46 18745 var itemId = (typeof item === 'number')?this.items.items[item].getItemId() : item.getItemId();
rlm@46 18746 return document.getElementById(this.id+this.idDelimiter+itemId);
rlm@46 18747 },
rlm@46 18748
rlm@46 18749 onResize : function(){
rlm@46 18750 Ext.TabPanel.superclass.onResize.apply(this, arguments);
rlm@46 18751 this.delegateUpdates();
rlm@46 18752 },
rlm@46 18753
rlm@46 18754
rlm@46 18755 beginUpdate : function(){
rlm@46 18756 this.suspendUpdates = true;
rlm@46 18757 },
rlm@46 18758
rlm@46 18759
rlm@46 18760 endUpdate : function(){
rlm@46 18761 this.suspendUpdates = false;
rlm@46 18762 this.delegateUpdates();
rlm@46 18763 },
rlm@46 18764
rlm@46 18765
rlm@46 18766 hideTabStripItem : function(item){
rlm@46 18767 item = this.getComponent(item);
rlm@46 18768 var el = this.getTabEl(item);
rlm@46 18769 if(el){
rlm@46 18770 el.style.display = 'none';
rlm@46 18771 this.delegateUpdates();
rlm@46 18772 }
rlm@46 18773 this.stack.remove(item);
rlm@46 18774 },
rlm@46 18775
rlm@46 18776
rlm@46 18777 unhideTabStripItem : function(item){
rlm@46 18778 item = this.getComponent(item);
rlm@46 18779 var el = this.getTabEl(item);
rlm@46 18780 if(el){
rlm@46 18781 el.style.display = '';
rlm@46 18782 this.delegateUpdates();
rlm@46 18783 }
rlm@46 18784 },
rlm@46 18785
rlm@46 18786 delegateUpdates : function(){
rlm@46 18787 if(this.suspendUpdates){
rlm@46 18788 return;
rlm@46 18789 }
rlm@46 18790 if(this.resizeTabs && this.rendered){
rlm@46 18791 this.autoSizeTabs();
rlm@46 18792 }
rlm@46 18793 if(this.enableTabScroll && this.rendered){
rlm@46 18794 this.autoScrollTabs();
rlm@46 18795 }
rlm@46 18796 },
rlm@46 18797
rlm@46 18798 autoSizeTabs : function(){
rlm@46 18799 var count = this.items.length;
rlm@46 18800 var ce = this.tabPosition != 'bottom' ? 'header' : 'footer';
rlm@46 18801 var ow = this[ce].dom.offsetWidth;
rlm@46 18802 var aw = this[ce].dom.clientWidth;
rlm@46 18803
rlm@46 18804 if(!this.resizeTabs || count < 1 || !aw){ return;
rlm@46 18805 }
rlm@46 18806
rlm@46 18807 var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); this.lastTabWidth = each;
rlm@46 18808 var lis = this.stripWrap.dom.getElementsByTagName('li');
rlm@46 18809 for(var i = 0, len = lis.length-1; i < len; i++) { var li = lis[i];
rlm@46 18810 var inner = li.childNodes[1].firstChild.firstChild;
rlm@46 18811 var tw = li.offsetWidth;
rlm@46 18812 var iw = inner.offsetWidth;
rlm@46 18813 inner.style.width = (each - (tw-iw)) + 'px';
rlm@46 18814 }
rlm@46 18815 },
rlm@46 18816
rlm@46 18817 adjustBodyWidth : function(w){
rlm@46 18818 if(this.header){
rlm@46 18819 this.header.setWidth(w);
rlm@46 18820 }
rlm@46 18821 if(this.footer){
rlm@46 18822 this.footer.setWidth(w);
rlm@46 18823 }
rlm@46 18824 return w;
rlm@46 18825 },
rlm@46 18826
rlm@46 18827
rlm@46 18828 setActiveTab : function(item){
rlm@46 18829 item = this.getComponent(item);
rlm@46 18830 if(!item || this.fireEvent('beforetabchange', this, item, this.activeTab) === false){
rlm@46 18831 return;
rlm@46 18832 }
rlm@46 18833 if(!this.rendered){
rlm@46 18834 this.activeTab = item;
rlm@46 18835 return;
rlm@46 18836 }
rlm@46 18837 if(this.activeTab != item){
rlm@46 18838 if(this.activeTab){
rlm@46 18839 var oldEl = this.getTabEl(this.activeTab);
rlm@46 18840 if(oldEl){
rlm@46 18841 Ext.fly(oldEl).removeClass('x-tab-strip-active');
rlm@46 18842 }
rlm@46 18843 this.activeTab.fireEvent('deactivate', this.activeTab);
rlm@46 18844 }
rlm@46 18845 var el = this.getTabEl(item);
rlm@46 18846 Ext.fly(el).addClass('x-tab-strip-active');
rlm@46 18847 this.activeTab = item;
rlm@46 18848 this.stack.add(item);
rlm@46 18849
rlm@46 18850 this.layout.setActiveItem(item);
rlm@46 18851 if(this.layoutOnTabChange && item.doLayout){
rlm@46 18852 item.doLayout();
rlm@46 18853 }
rlm@46 18854 if(this.scrolling){
rlm@46 18855 this.scrollToTab(item, this.animScroll);
rlm@46 18856 }
rlm@46 18857
rlm@46 18858 item.fireEvent('activate', item);
rlm@46 18859 this.fireEvent('tabchange', this, item);
rlm@46 18860 }
rlm@46 18861 },
rlm@46 18862
rlm@46 18863
rlm@46 18864 getActiveTab : function(){
rlm@46 18865 return this.activeTab || null;
rlm@46 18866 },
rlm@46 18867
rlm@46 18868
rlm@46 18869 getItem : function(item){
rlm@46 18870 return this.getComponent(item);
rlm@46 18871 },
rlm@46 18872
rlm@46 18873 autoScrollTabs : function(){
rlm@46 18874 var count = this.items.length;
rlm@46 18875 var ow = this.header.dom.offsetWidth;
rlm@46 18876 var tw = this.header.dom.clientWidth;
rlm@46 18877
rlm@46 18878 var wrap = this.stripWrap;
rlm@46 18879 var wd = wrap.dom;
rlm@46 18880 var cw = wd.offsetWidth;
rlm@46 18881 var pos = this.getScrollPos();
rlm@46 18882 var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
rlm@46 18883
rlm@46 18884 if(!this.enableTabScroll || count < 1 || cw < 20){ return;
rlm@46 18885 }
rlm@46 18886 if(l <= tw){
rlm@46 18887 wd.scrollLeft = 0;
rlm@46 18888 wrap.setWidth(tw);
rlm@46 18889 if(this.scrolling){
rlm@46 18890 this.scrolling = false;
rlm@46 18891 this.header.removeClass('x-tab-scrolling');
rlm@46 18892 this.scrollLeft.hide();
rlm@46 18893 this.scrollRight.hide();
rlm@46 18894 if(Ext.isAir){
rlm@46 18895 wd.style.marginLeft = '';
rlm@46 18896 wd.style.marginRight = '';
rlm@46 18897 }
rlm@46 18898 }
rlm@46 18899 }else{
rlm@46 18900 if(!this.scrolling){
rlm@46 18901 this.header.addClass('x-tab-scrolling');
rlm@46 18902 if(Ext.isAir){
rlm@46 18903 wd.style.marginLeft = '18px';
rlm@46 18904 wd.style.marginRight = '18px';
rlm@46 18905 }
rlm@46 18906 }
rlm@46 18907 tw -= wrap.getMargins('lr');
rlm@46 18908 wrap.setWidth(tw > 20 ? tw : 20);
rlm@46 18909 if(!this.scrolling){
rlm@46 18910 if(!this.scrollLeft){
rlm@46 18911 this.createScrollers();
rlm@46 18912 }else{
rlm@46 18913 this.scrollLeft.show();
rlm@46 18914 this.scrollRight.show();
rlm@46 18915 }
rlm@46 18916 }
rlm@46 18917 this.scrolling = true;
rlm@46 18918 if(pos > (l-tw)){ wd.scrollLeft = l-tw;
rlm@46 18919 }else{ this.scrollToTab(this.activeTab, false);
rlm@46 18920 }
rlm@46 18921 this.updateScrollButtons();
rlm@46 18922 }
rlm@46 18923 },
rlm@46 18924
rlm@46 18925 createScrollers : function(){
rlm@46 18926 var h = this.stripWrap.dom.offsetHeight;
rlm@46 18927
rlm@46 18928 var sl = this.header.insertFirst({
rlm@46 18929 cls:'x-tab-scroller-left'
rlm@46 18930 });
rlm@46 18931 sl.setHeight(h);
rlm@46 18932 sl.addClassOnOver('x-tab-scroller-left-over');
rlm@46 18933 this.leftRepeater = new Ext.util.ClickRepeater(sl, {
rlm@46 18934 interval : this.scrollRepeatInterval,
rlm@46 18935 handler: this.onScrollLeft,
rlm@46 18936 scope: this
rlm@46 18937 });
rlm@46 18938 this.scrollLeft = sl;
rlm@46 18939
rlm@46 18940 var sr = this.header.insertFirst({
rlm@46 18941 cls:'x-tab-scroller-right'
rlm@46 18942 });
rlm@46 18943 sr.setHeight(h);
rlm@46 18944 sr.addClassOnOver('x-tab-scroller-right-over');
rlm@46 18945 this.rightRepeater = new Ext.util.ClickRepeater(sr, {
rlm@46 18946 interval : this.scrollRepeatInterval,
rlm@46 18947 handler: this.onScrollRight,
rlm@46 18948 scope: this
rlm@46 18949 });
rlm@46 18950 this.scrollRight = sr;
rlm@46 18951 },
rlm@46 18952
rlm@46 18953 getScrollWidth : function(){
rlm@46 18954 return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
rlm@46 18955 },
rlm@46 18956
rlm@46 18957 getScrollPos : function(){
rlm@46 18958 return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
rlm@46 18959 },
rlm@46 18960
rlm@46 18961 getScrollArea : function(){
rlm@46 18962 return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
rlm@46 18963 },
rlm@46 18964
rlm@46 18965 getScrollAnim : function(){
rlm@46 18966 return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};
rlm@46 18967 },
rlm@46 18968
rlm@46 18969 getScrollIncrement : function(){
rlm@46 18970 return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);
rlm@46 18971 },
rlm@46 18972
rlm@46 18973
rlm@46 18974
rlm@46 18975 scrollToTab : function(item, animate){
rlm@46 18976 if(!item){ return; }
rlm@46 18977 var el = this.getTabEl(item);
rlm@46 18978 var pos = this.getScrollPos(), area = this.getScrollArea();
rlm@46 18979 var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
rlm@46 18980 var right = left + el.offsetWidth;
rlm@46 18981 if(left < pos){
rlm@46 18982 this.scrollTo(left, animate);
rlm@46 18983 }else if(right > (pos + area)){
rlm@46 18984 this.scrollTo(right - area, animate);
rlm@46 18985 }
rlm@46 18986 },
rlm@46 18987
rlm@46 18988 scrollTo : function(pos, animate){
rlm@46 18989 this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
rlm@46 18990 if(!animate){
rlm@46 18991 this.updateScrollButtons();
rlm@46 18992 }
rlm@46 18993 },
rlm@46 18994
rlm@46 18995 onWheel : function(e){
rlm@46 18996 var d = e.getWheelDelta()*this.wheelIncrement*-1;
rlm@46 18997 e.stopEvent();
rlm@46 18998
rlm@46 18999 var pos = this.getScrollPos();
rlm@46 19000 var newpos = pos + d;
rlm@46 19001 var sw = this.getScrollWidth()-this.getScrollArea();
rlm@46 19002
rlm@46 19003 var s = Math.max(0, Math.min(sw, newpos));
rlm@46 19004 if(s != pos){
rlm@46 19005 this.scrollTo(s, false);
rlm@46 19006 }
rlm@46 19007 },
rlm@46 19008
rlm@46 19009 onScrollRight : function(){
rlm@46 19010 var sw = this.getScrollWidth()-this.getScrollArea();
rlm@46 19011 var pos = this.getScrollPos();
rlm@46 19012 var s = Math.min(sw, pos + this.getScrollIncrement());
rlm@46 19013 if(s != pos){
rlm@46 19014 this.scrollTo(s, this.animScroll);
rlm@46 19015 }
rlm@46 19016 },
rlm@46 19017
rlm@46 19018 onScrollLeft : function(){
rlm@46 19019 var pos = this.getScrollPos();
rlm@46 19020 var s = Math.max(0, pos - this.getScrollIncrement());
rlm@46 19021 if(s != pos){
rlm@46 19022 this.scrollTo(s, this.animScroll);
rlm@46 19023 }
rlm@46 19024 },
rlm@46 19025
rlm@46 19026 updateScrollButtons : function(){
rlm@46 19027 var pos = this.getScrollPos();
rlm@46 19028 this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');
rlm@46 19029 this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');
rlm@46 19030 }
rlm@46 19031
rlm@46 19032
rlm@46 19033
rlm@46 19034
rlm@46 19035
rlm@46 19036
rlm@46 19037
rlm@46 19038
rlm@46 19039
rlm@46 19040
rlm@46 19041
rlm@46 19042
rlm@46 19043
rlm@46 19044 });
rlm@46 19045 Ext.reg('tabpanel', Ext.TabPanel);
rlm@46 19046
rlm@46 19047
rlm@46 19048 Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
rlm@46 19049
rlm@46 19050 Ext.TabPanel.AccessStack = function(){
rlm@46 19051 var items = [];
rlm@46 19052 return {
rlm@46 19053 add : function(item){
rlm@46 19054 items.push(item);
rlm@46 19055 if(items.length > 10){
rlm@46 19056 items.shift();
rlm@46 19057 }
rlm@46 19058 },
rlm@46 19059
rlm@46 19060 remove : function(item){
rlm@46 19061 var s = [];
rlm@46 19062 for(var i = 0, len = items.length; i < len; i++) {
rlm@46 19063 if(items[i] != item){
rlm@46 19064 s.push(items[i]);
rlm@46 19065 }
rlm@46 19066 }
rlm@46 19067 items = s;
rlm@46 19068 },
rlm@46 19069
rlm@46 19070 next : function(){
rlm@46 19071 return items.pop();
rlm@46 19072 }
rlm@46 19073 };
rlm@46 19074 };
rlm@46 19075
rlm@46 19076
rlm@46 19077
rlm@46 19078
rlm@46 19079 Ext.Button = Ext.extend(Ext.Component, {
rlm@46 19080
rlm@46 19081 hidden : false,
rlm@46 19082
rlm@46 19083 disabled : false,
rlm@46 19084
rlm@46 19085 pressed : false,
rlm@46 19086
rlm@46 19087
rlm@46 19088
rlm@46 19089
rlm@46 19090
rlm@46 19091
rlm@46 19092
rlm@46 19093 enableToggle: false,
rlm@46 19094
rlm@46 19095
rlm@46 19096
rlm@46 19097 menuAlign : "tl-bl?",
rlm@46 19098
rlm@46 19099
rlm@46 19100
rlm@46 19101 type : 'button',
rlm@46 19102
rlm@46 19103 menuClassTarget: 'tr',
rlm@46 19104
rlm@46 19105
rlm@46 19106 clickEvent : 'click',
rlm@46 19107
rlm@46 19108
rlm@46 19109 handleMouseEvents : true,
rlm@46 19110
rlm@46 19111
rlm@46 19112 tooltipType : 'qtip',
rlm@46 19113
rlm@46 19114 buttonSelector : "button:first",
rlm@46 19115
rlm@46 19116
rlm@46 19117
rlm@46 19118
rlm@46 19119 initComponent : function(){
rlm@46 19120 Ext.Button.superclass.initComponent.call(this);
rlm@46 19121
rlm@46 19122 this.addEvents(
rlm@46 19123
rlm@46 19124 "click",
rlm@46 19125
rlm@46 19126 "toggle",
rlm@46 19127
rlm@46 19128 'mouseover',
rlm@46 19129
rlm@46 19130 'mouseout',
rlm@46 19131
rlm@46 19132 'menushow',
rlm@46 19133
rlm@46 19134 'menuhide',
rlm@46 19135
rlm@46 19136 'menutriggerover',
rlm@46 19137
rlm@46 19138 'menutriggerout'
rlm@46 19139 );
rlm@46 19140 if(this.menu){
rlm@46 19141 this.menu = Ext.menu.MenuMgr.get(this.menu);
rlm@46 19142 }
rlm@46 19143 if(typeof this.toggleGroup === 'string'){
rlm@46 19144 this.enableToggle = true;
rlm@46 19145 }
rlm@46 19146 },
rlm@46 19147
rlm@46 19148 onRender : function(ct, position){
rlm@46 19149 if(!this.template){
rlm@46 19150 if(!Ext.Button.buttonTemplate){
rlm@46 19151 Ext.Button.buttonTemplate = new Ext.Template(
rlm@46 19152 '<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>',
rlm@46 19153 '<td class="x-btn-left"><i>&#160;</i></td><td class="x-btn-center"><em unselectable="on"><button class="x-btn-text" type="{1}">{0}</button></em></td><td class="x-btn-right"><i>&#160;</i></td>',
rlm@46 19154 "</tr></tbody></table>");
rlm@46 19155 }
rlm@46 19156 this.template = Ext.Button.buttonTemplate;
rlm@46 19157 }
rlm@46 19158 var btn, targs = [this.text || '&#160;', this.type];
rlm@46 19159
rlm@46 19160 if(position){
rlm@46 19161 btn = this.template.insertBefore(position, targs, true);
rlm@46 19162 }else{
rlm@46 19163 btn = this.template.append(ct, targs, true);
rlm@46 19164 }
rlm@46 19165 var btnEl = btn.child(this.buttonSelector);
rlm@46 19166 btnEl.on('focus', this.onFocus, this);
rlm@46 19167 btnEl.on('blur', this.onBlur, this);
rlm@46 19168
rlm@46 19169 this.initButtonEl(btn, btnEl);
rlm@46 19170
rlm@46 19171 if(this.menu){
rlm@46 19172 this.el.child(this.menuClassTarget).addClass("x-btn-with-menu");
rlm@46 19173 }
rlm@46 19174 Ext.ButtonToggleMgr.register(this);
rlm@46 19175 },
rlm@46 19176
rlm@46 19177 initButtonEl : function(btn, btnEl){
rlm@46 19178
rlm@46 19179 this.el = btn;
rlm@46 19180 btn.addClass("x-btn");
rlm@46 19181
rlm@46 19182 if(this.icon){
rlm@46 19183 btnEl.setStyle('background-image', 'url(' +this.icon +')');
rlm@46 19184 }
rlm@46 19185 if(this.iconCls){
rlm@46 19186 btnEl.addClass(this.iconCls);
rlm@46 19187 if(!this.cls){
rlm@46 19188 btn.addClass(this.text ? 'x-btn-text-icon' : 'x-btn-icon');
rlm@46 19189 }
rlm@46 19190 }
rlm@46 19191 if(this.tabIndex !== undefined){
rlm@46 19192 btnEl.dom.tabIndex = this.tabIndex;
rlm@46 19193 }
rlm@46 19194 if(this.tooltip){
rlm@46 19195 if(typeof this.tooltip == 'object'){
rlm@46 19196 Ext.QuickTips.register(Ext.apply({
rlm@46 19197 target: btnEl.id
rlm@46 19198 }, this.tooltip));
rlm@46 19199 } else {
rlm@46 19200 btnEl.dom[this.tooltipType] = this.tooltip;
rlm@46 19201 }
rlm@46 19202 }
rlm@46 19203
rlm@46 19204 if(this.pressed){
rlm@46 19205 this.el.addClass("x-btn-pressed");
rlm@46 19206 }
rlm@46 19207
rlm@46 19208 if(this.handleMouseEvents){
rlm@46 19209 btn.on("mouseover", this.onMouseOver, this);
rlm@46 19210 btn.on("mousedown", this.onMouseDown, this);
rlm@46 19211 }
rlm@46 19212
rlm@46 19213 if(this.menu){
rlm@46 19214 this.menu.on("show", this.onMenuShow, this);
rlm@46 19215 this.menu.on("hide", this.onMenuHide, this);
rlm@46 19216 }
rlm@46 19217
rlm@46 19218 if(this.id){
rlm@46 19219 this.el.dom.id = this.el.id = this.id;
rlm@46 19220 }
rlm@46 19221
rlm@46 19222 if(this.repeat){
rlm@46 19223 var repeater = new Ext.util.ClickRepeater(btn,
rlm@46 19224 typeof this.repeat == "object" ? this.repeat : {}
rlm@46 19225 );
rlm@46 19226 repeater.on("click", this.onClick, this);
rlm@46 19227 }
rlm@46 19228
rlm@46 19229 btn.on(this.clickEvent, this.onClick, this);
rlm@46 19230 },
rlm@46 19231
rlm@46 19232 afterRender : function(){
rlm@46 19233 Ext.Button.superclass.afterRender.call(this);
rlm@46 19234 if(Ext.isIE6){
rlm@46 19235 this.autoWidth.defer(1, this);
rlm@46 19236 }else{
rlm@46 19237 this.autoWidth();
rlm@46 19238 }
rlm@46 19239 },
rlm@46 19240
rlm@46 19241
rlm@46 19242 setIconClass : function(cls){
rlm@46 19243 if(this.el){
rlm@46 19244 this.el.child(this.buttonSelector).replaceClass(this.iconCls, cls);
rlm@46 19245 }
rlm@46 19246 this.iconCls = cls;
rlm@46 19247 },
rlm@46 19248
rlm@46 19249 beforeDestroy: function(){
rlm@46 19250 if(this.rendered){
rlm@46 19251 var btn = this.el.child(this.buttonSelector);
rlm@46 19252 if(btn){
rlm@46 19253 btn.removeAllListeners();
rlm@46 19254 }
rlm@46 19255 }
rlm@46 19256 if(this.menu){
rlm@46 19257 Ext.destroy(this.menu);
rlm@46 19258 }
rlm@46 19259 },
rlm@46 19260
rlm@46 19261 onDestroy : function(){
rlm@46 19262 if(this.rendered){
rlm@46 19263 Ext.ButtonToggleMgr.unregister(this);
rlm@46 19264 }
rlm@46 19265 },
rlm@46 19266
rlm@46 19267 autoWidth : function(){
rlm@46 19268 if(this.el){
rlm@46 19269 this.el.setWidth("auto");
rlm@46 19270 if(Ext.isIE7 && Ext.isStrict){
rlm@46 19271 var ib = this.el.child(this.buttonSelector);
rlm@46 19272 if(ib && ib.getWidth() > 20){
rlm@46 19273 ib.clip();
rlm@46 19274 ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));
rlm@46 19275 }
rlm@46 19276 }
rlm@46 19277 if(this.minWidth){
rlm@46 19278 if(this.el.getWidth() < this.minWidth){
rlm@46 19279 this.el.setWidth(this.minWidth);
rlm@46 19280 }
rlm@46 19281 }
rlm@46 19282 }
rlm@46 19283 },
rlm@46 19284
rlm@46 19285
rlm@46 19286 setHandler : function(handler, scope){
rlm@46 19287 this.handler = handler;
rlm@46 19288 this.scope = scope;
rlm@46 19289 },
rlm@46 19290
rlm@46 19291
rlm@46 19292 setText : function(text){
rlm@46 19293 this.text = text;
rlm@46 19294 if(this.el){
rlm@46 19295 this.el.child("td.x-btn-center " + this.buttonSelector).update(text);
rlm@46 19296 }
rlm@46 19297 this.autoWidth();
rlm@46 19298 },
rlm@46 19299
rlm@46 19300
rlm@46 19301 getText : function(){
rlm@46 19302 return this.text;
rlm@46 19303 },
rlm@46 19304
rlm@46 19305
rlm@46 19306 toggle : function(state){
rlm@46 19307 state = state === undefined ? !this.pressed : state;
rlm@46 19308 if(state != this.pressed){
rlm@46 19309 if(state){
rlm@46 19310 this.el.addClass("x-btn-pressed");
rlm@46 19311 this.pressed = true;
rlm@46 19312 this.fireEvent("toggle", this, true);
rlm@46 19313 }else{
rlm@46 19314 this.el.removeClass("x-btn-pressed");
rlm@46 19315 this.pressed = false;
rlm@46 19316 this.fireEvent("toggle", this, false);
rlm@46 19317 }
rlm@46 19318 if(this.toggleHandler){
rlm@46 19319 this.toggleHandler.call(this.scope || this, this, state);
rlm@46 19320 }
rlm@46 19321 }
rlm@46 19322 },
rlm@46 19323
rlm@46 19324
rlm@46 19325 focus : function(){
rlm@46 19326 this.el.child(this.buttonSelector).focus();
rlm@46 19327 },
rlm@46 19328
rlm@46 19329 onDisable : function(){
rlm@46 19330 if(this.el){
rlm@46 19331 if(!Ext.isIE6 || !this.text){
rlm@46 19332 this.el.addClass(this.disabledClass);
rlm@46 19333 }
rlm@46 19334 this.el.dom.disabled = true;
rlm@46 19335 }
rlm@46 19336 this.disabled = true;
rlm@46 19337 },
rlm@46 19338
rlm@46 19339 onEnable : function(){
rlm@46 19340 if(this.el){
rlm@46 19341 if(!Ext.isIE6 || !this.text){
rlm@46 19342 this.el.removeClass(this.disabledClass);
rlm@46 19343 }
rlm@46 19344 this.el.dom.disabled = false;
rlm@46 19345 }
rlm@46 19346 this.disabled = false;
rlm@46 19347 },
rlm@46 19348
rlm@46 19349
rlm@46 19350 showMenu : function(){
rlm@46 19351 if(this.menu){
rlm@46 19352 this.menu.show(this.el, this.menuAlign);
rlm@46 19353 }
rlm@46 19354 return this;
rlm@46 19355 },
rlm@46 19356
rlm@46 19357
rlm@46 19358 hideMenu : function(){
rlm@46 19359 if(this.menu){
rlm@46 19360 this.menu.hide();
rlm@46 19361 }
rlm@46 19362 return this;
rlm@46 19363 },
rlm@46 19364
rlm@46 19365
rlm@46 19366 hasVisibleMenu : function(){
rlm@46 19367 return this.menu && this.menu.isVisible();
rlm@46 19368 },
rlm@46 19369
rlm@46 19370 onClick : function(e){
rlm@46 19371 if(e){
rlm@46 19372 e.preventDefault();
rlm@46 19373 }
rlm@46 19374 if(e.button != 0){
rlm@46 19375 return;
rlm@46 19376 }
rlm@46 19377 if(!this.disabled){
rlm@46 19378 if(this.enableToggle && (this.allowDepress !== false || !this.pressed)){
rlm@46 19379 this.toggle();
rlm@46 19380 }
rlm@46 19381 if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){
rlm@46 19382 this.showMenu();
rlm@46 19383 }
rlm@46 19384 this.fireEvent("click", this, e);
rlm@46 19385 if(this.handler){
rlm@46 19386 this.handler.call(this.scope || this, this, e);
rlm@46 19387 }
rlm@46 19388 }
rlm@46 19389 },
rlm@46 19390
rlm@46 19391 isMenuTriggerOver : function(e, internal){
rlm@46 19392 return this.menu && !internal;
rlm@46 19393 },
rlm@46 19394
rlm@46 19395 isMenuTriggerOut : function(e, internal){
rlm@46 19396 return this.menu && !internal;
rlm@46 19397 },
rlm@46 19398
rlm@46 19399 onMouseOver : function(e){
rlm@46 19400 if(!this.disabled){
rlm@46 19401 var internal = e.within(this.el, true);
rlm@46 19402 if(!internal){
rlm@46 19403 this.el.addClass("x-btn-over");
rlm@46 19404 Ext.getDoc().on('mouseover', this.monitorMouseOver, this);
rlm@46 19405 this.fireEvent('mouseover', this, e);
rlm@46 19406 }
rlm@46 19407 if(this.isMenuTriggerOver(e, internal)){
rlm@46 19408 this.fireEvent('menutriggerover', this, this.menu, e);
rlm@46 19409 }
rlm@46 19410 }
rlm@46 19411 },
rlm@46 19412
rlm@46 19413 monitorMouseOver : function(e){
rlm@46 19414 if(e.target != this.el.dom && !e.within(this.el)){
rlm@46 19415 Ext.getDoc().un('mouseover', this.monitorMouseOver, this);
rlm@46 19416 this.onMouseOut(e);
rlm@46 19417 }
rlm@46 19418 },
rlm@46 19419
rlm@46 19420 onMouseOut : function(e){
rlm@46 19421 var internal = e.within(this.el) && e.target != this.el.dom;
rlm@46 19422 this.el.removeClass("x-btn-over");
rlm@46 19423 this.fireEvent('mouseout', this, e);
rlm@46 19424 if(this.isMenuTriggerOut(e, internal)){
rlm@46 19425 this.fireEvent('menutriggerout', this, this.menu, e);
rlm@46 19426 }
rlm@46 19427 },
rlm@46 19428 onFocus : function(e){
rlm@46 19429 if(!this.disabled){
rlm@46 19430 this.el.addClass("x-btn-focus");
rlm@46 19431 }
rlm@46 19432 },
rlm@46 19433 onBlur : function(e){
rlm@46 19434 this.el.removeClass("x-btn-focus");
rlm@46 19435 },
rlm@46 19436
rlm@46 19437 getClickEl : function(e, isUp){
rlm@46 19438 return this.el;
rlm@46 19439 },
rlm@46 19440
rlm@46 19441 onMouseDown : function(e){
rlm@46 19442 if(!this.disabled && e.button == 0){
rlm@46 19443 this.getClickEl(e).addClass("x-btn-click");
rlm@46 19444 Ext.getDoc().on('mouseup', this.onMouseUp, this);
rlm@46 19445 }
rlm@46 19446 },
rlm@46 19447 onMouseUp : function(e){
rlm@46 19448 if(e.button == 0){
rlm@46 19449 this.getClickEl(e, true).removeClass("x-btn-click");
rlm@46 19450 Ext.getDoc().un('mouseup', this.onMouseUp, this);
rlm@46 19451 }
rlm@46 19452 },
rlm@46 19453 onMenuShow : function(e){
rlm@46 19454 this.ignoreNextClick = 0;
rlm@46 19455 this.el.addClass("x-btn-menu-active");
rlm@46 19456 this.fireEvent('menushow', this, this.menu);
rlm@46 19457 },
rlm@46 19458 onMenuHide : function(e){
rlm@46 19459 this.el.removeClass("x-btn-menu-active");
rlm@46 19460 this.ignoreNextClick = this.restoreClick.defer(250, this);
rlm@46 19461 this.fireEvent('menuhide', this, this.menu);
rlm@46 19462 },
rlm@46 19463
rlm@46 19464 restoreClick : function(){
rlm@46 19465 this.ignoreNextClick = 0;
rlm@46 19466 }
rlm@46 19467
rlm@46 19468
rlm@46 19469
rlm@46 19470
rlm@46 19471 });
rlm@46 19472 Ext.reg('button', Ext.Button);
rlm@46 19473
rlm@46 19474 Ext.ButtonToggleMgr = function(){
rlm@46 19475 var groups = {};
rlm@46 19476
rlm@46 19477 function toggleGroup(btn, state){
rlm@46 19478 if(state){
rlm@46 19479 var g = groups[btn.toggleGroup];
rlm@46 19480 for(var i = 0, l = g.length; i < l; i++){
rlm@46 19481 if(g[i] != btn){
rlm@46 19482 g[i].toggle(false);
rlm@46 19483 }
rlm@46 19484 }
rlm@46 19485 }
rlm@46 19486 }
rlm@46 19487
rlm@46 19488 return {
rlm@46 19489 register : function(btn){
rlm@46 19490 if(!btn.toggleGroup){
rlm@46 19491 return;
rlm@46 19492 }
rlm@46 19493 var g = groups[btn.toggleGroup];
rlm@46 19494 if(!g){
rlm@46 19495 g = groups[btn.toggleGroup] = [];
rlm@46 19496 }
rlm@46 19497 g.push(btn);
rlm@46 19498 btn.on("toggle", toggleGroup);
rlm@46 19499 },
rlm@46 19500
rlm@46 19501 unregister : function(btn){
rlm@46 19502 if(!btn.toggleGroup){
rlm@46 19503 return;
rlm@46 19504 }
rlm@46 19505 var g = groups[btn.toggleGroup];
rlm@46 19506 if(g){
rlm@46 19507 g.remove(btn);
rlm@46 19508 btn.un("toggle", toggleGroup);
rlm@46 19509 }
rlm@46 19510 }
rlm@46 19511 };
rlm@46 19512 }();
rlm@46 19513
rlm@46 19514 Ext.SplitButton = Ext.extend(Ext.Button, {
rlm@46 19515
rlm@46 19516 arrowSelector : 'button:last',
rlm@46 19517
rlm@46 19518
rlm@46 19519 initComponent : function(){
rlm@46 19520 Ext.SplitButton.superclass.initComponent.call(this);
rlm@46 19521
rlm@46 19522 this.addEvents("arrowclick");
rlm@46 19523 },
rlm@46 19524
rlm@46 19525
rlm@46 19526 onRender : function(ct, position){
rlm@46 19527
rlm@46 19528 var tpl = new Ext.Template(
rlm@46 19529 '<table cellspacing="0" class="x-btn-menu-wrap x-btn"><tr><td>',
rlm@46 19530 '<table cellspacing="0" class="x-btn-wrap x-btn-menu-text-wrap"><tbody>',
rlm@46 19531 '<tr><td class="x-btn-left"><i>&#160;</i></td><td class="x-btn-center"><button class="x-btn-text" type="{1}">{0}</button></td></tr>',
rlm@46 19532 "</tbody></table></td><td>",
rlm@46 19533 '<table cellspacing="0" class="x-btn-wrap x-btn-menu-arrow-wrap"><tbody>',
rlm@46 19534 '<tr><td class="x-btn-center"><button class="x-btn-menu-arrow-el" type="button">&#160;</button></td><td class="x-btn-right"><i>&#160;</i></td></tr>',
rlm@46 19535 "</tbody></table></td></tr></table>"
rlm@46 19536 );
rlm@46 19537 var btn, targs = [this.text || '&#160;', this.type];
rlm@46 19538 if(position){
rlm@46 19539 btn = tpl.insertBefore(position, targs, true);
rlm@46 19540 }else{
rlm@46 19541 btn = tpl.append(ct, targs, true);
rlm@46 19542 }
rlm@46 19543 var btnEl = btn.child(this.buttonSelector);
rlm@46 19544
rlm@46 19545 this.initButtonEl(btn, btnEl);
rlm@46 19546 this.arrowBtnTable = btn.child("table:last");
rlm@46 19547 if(this.arrowTooltip){
rlm@46 19548 btn.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip;
rlm@46 19549 }
rlm@46 19550 },
rlm@46 19551
rlm@46 19552
rlm@46 19553 autoWidth : function(){
rlm@46 19554 if(this.el){
rlm@46 19555 var tbl = this.el.child("table:first");
rlm@46 19556 var tbl2 = this.el.child("table:last");
rlm@46 19557 this.el.setWidth("auto");
rlm@46 19558 tbl.setWidth("auto");
rlm@46 19559 if(Ext.isIE7 && Ext.isStrict){
rlm@46 19560 var ib = this.el.child(this.buttonSelector);
rlm@46 19561 if(ib && ib.getWidth() > 20){
rlm@46 19562 ib.clip();
rlm@46 19563 ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));
rlm@46 19564 }
rlm@46 19565 }
rlm@46 19566 if(this.minWidth){
rlm@46 19567 if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){
rlm@46 19568 tbl.setWidth(this.minWidth-tbl2.getWidth());
rlm@46 19569 }
rlm@46 19570 }
rlm@46 19571 this.el.setWidth(tbl.getWidth()+tbl2.getWidth());
rlm@46 19572 }
rlm@46 19573 },
rlm@46 19574
rlm@46 19575
rlm@46 19576 setArrowHandler : function(handler, scope){
rlm@46 19577 this.arrowHandler = handler;
rlm@46 19578 this.scope = scope;
rlm@46 19579 },
rlm@46 19580
rlm@46 19581
rlm@46 19582 onClick : function(e){
rlm@46 19583 e.preventDefault();
rlm@46 19584 if(!this.disabled){
rlm@46 19585 if(e.getTarget(".x-btn-menu-arrow-wrap")){
rlm@46 19586 if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){
rlm@46 19587 this.showMenu();
rlm@46 19588 }
rlm@46 19589 this.fireEvent("arrowclick", this, e);
rlm@46 19590 if(this.arrowHandler){
rlm@46 19591 this.arrowHandler.call(this.scope || this, this, e);
rlm@46 19592 }
rlm@46 19593 }else{
rlm@46 19594 if(this.enableToggle){
rlm@46 19595 this.toggle();
rlm@46 19596 }
rlm@46 19597 this.fireEvent("click", this, e);
rlm@46 19598 if(this.handler){
rlm@46 19599 this.handler.call(this.scope || this, this, e);
rlm@46 19600 }
rlm@46 19601 }
rlm@46 19602 }
rlm@46 19603 },
rlm@46 19604
rlm@46 19605
rlm@46 19606 getClickEl : function(e, isUp){
rlm@46 19607 if(!isUp){
rlm@46 19608 return (this.lastClickEl = e.getTarget("table", 10, true));
rlm@46 19609 }
rlm@46 19610 return this.lastClickEl;
rlm@46 19611 },
rlm@46 19612
rlm@46 19613
rlm@46 19614 onDisable : function(){
rlm@46 19615 if(this.el){
rlm@46 19616 if(!Ext.isIE6){
rlm@46 19617 this.el.addClass("x-item-disabled");
rlm@46 19618 }
rlm@46 19619 this.el.child(this.buttonSelector).dom.disabled = true;
rlm@46 19620 this.el.child(this.arrowSelector).dom.disabled = true;
rlm@46 19621 }
rlm@46 19622 this.disabled = true;
rlm@46 19623 },
rlm@46 19624
rlm@46 19625
rlm@46 19626 onEnable : function(){
rlm@46 19627 if(this.el){
rlm@46 19628 if(!Ext.isIE6){
rlm@46 19629 this.el.removeClass("x-item-disabled");
rlm@46 19630 }
rlm@46 19631 this.el.child(this.buttonSelector).dom.disabled = false;
rlm@46 19632 this.el.child(this.arrowSelector).dom.disabled = false;
rlm@46 19633 }
rlm@46 19634 this.disabled = false;
rlm@46 19635 },
rlm@46 19636
rlm@46 19637
rlm@46 19638 isMenuTriggerOver : function(e){
rlm@46 19639 return this.menu && e.within(this.arrowBtnTable) && !e.within(this.arrowBtnTable, true);
rlm@46 19640 },
rlm@46 19641
rlm@46 19642
rlm@46 19643 isMenuTriggerOut : function(e, internal){
rlm@46 19644 return this.menu && !e.within(this.arrowBtnTable);
rlm@46 19645 },
rlm@46 19646
rlm@46 19647
rlm@46 19648 onDestroy : function(){
rlm@46 19649 Ext.destroy(this.arrowBtnTable);
rlm@46 19650 Ext.SplitButton.superclass.onDestroy.call(this);
rlm@46 19651 }
rlm@46 19652 });
rlm@46 19653
rlm@46 19654
rlm@46 19655 Ext.MenuButton = Ext.SplitButton;
rlm@46 19656
rlm@46 19657
rlm@46 19658 Ext.reg('splitbutton', Ext.SplitButton);
rlm@46 19659
rlm@46 19660 Ext.CycleButton = Ext.extend(Ext.SplitButton, {
rlm@46 19661
rlm@46 19662
rlm@46 19663
rlm@46 19664
rlm@46 19665
rlm@46 19666
rlm@46 19667
rlm@46 19668 getItemText : function(item){
rlm@46 19669 if(item && this.showText === true){
rlm@46 19670 var text = '';
rlm@46 19671 if(this.prependText){
rlm@46 19672 text += this.prependText;
rlm@46 19673 }
rlm@46 19674 text += item.text;
rlm@46 19675 return text;
rlm@46 19676 }
rlm@46 19677 return undefined;
rlm@46 19678 },
rlm@46 19679
rlm@46 19680
rlm@46 19681 setActiveItem : function(item, suppressEvent){
rlm@46 19682 if(typeof item != 'object'){
rlm@46 19683 item = this.menu.items.get(item);
rlm@46 19684 }
rlm@46 19685 if(item){
rlm@46 19686 if(!this.rendered){
rlm@46 19687 this.text = this.getItemText(item);
rlm@46 19688 this.iconCls = item.iconCls;
rlm@46 19689 }else{
rlm@46 19690 var t = this.getItemText(item);
rlm@46 19691 if(t){
rlm@46 19692 this.setText(t);
rlm@46 19693 }
rlm@46 19694 this.setIconClass(item.iconCls);
rlm@46 19695 }
rlm@46 19696 this.activeItem = item;
rlm@46 19697 if(!item.checked){
rlm@46 19698 item.setChecked(true, true);
rlm@46 19699 }
rlm@46 19700 if(this.forceIcon){
rlm@46 19701 this.setIconClass(this.forceIcon);
rlm@46 19702 }
rlm@46 19703 if(!suppressEvent){
rlm@46 19704 this.fireEvent('change', this, item);
rlm@46 19705 }
rlm@46 19706 }
rlm@46 19707 },
rlm@46 19708
rlm@46 19709
rlm@46 19710 getActiveItem : function(){
rlm@46 19711 return this.activeItem;
rlm@46 19712 },
rlm@46 19713
rlm@46 19714
rlm@46 19715 initComponent : function(){
rlm@46 19716 this.addEvents(
rlm@46 19717
rlm@46 19718 "change"
rlm@46 19719 );
rlm@46 19720
rlm@46 19721 if(this.changeHandler){
rlm@46 19722 this.on('change', this.changeHandler, this.scope||this);
rlm@46 19723 delete this.changeHandler;
rlm@46 19724 }
rlm@46 19725
rlm@46 19726 this.itemCount = this.items.length;
rlm@46 19727
rlm@46 19728 this.menu = {cls:'x-cycle-menu', items:[]};
rlm@46 19729 var checked;
rlm@46 19730 for(var i = 0, len = this.itemCount; i < len; i++){
rlm@46 19731 var item = this.items[i];
rlm@46 19732 item.group = item.group || this.id;
rlm@46 19733 item.itemIndex = i;
rlm@46 19734 item.checkHandler = this.checkHandler;
rlm@46 19735 item.scope = this;
rlm@46 19736 item.checked = item.checked || false;
rlm@46 19737 this.menu.items.push(item);
rlm@46 19738 if(item.checked){
rlm@46 19739 checked = item;
rlm@46 19740 }
rlm@46 19741 }
rlm@46 19742 this.setActiveItem(checked, true);
rlm@46 19743 Ext.CycleButton.superclass.initComponent.call(this);
rlm@46 19744
rlm@46 19745 this.on('click', this.toggleSelected, this);
rlm@46 19746 },
rlm@46 19747
rlm@46 19748
rlm@46 19749 checkHandler : function(item, pressed){
rlm@46 19750 if(pressed){
rlm@46 19751 this.setActiveItem(item);
rlm@46 19752 }
rlm@46 19753 },
rlm@46 19754
rlm@46 19755
rlm@46 19756 toggleSelected : function(){
rlm@46 19757 this.menu.render();
rlm@46 19758
rlm@46 19759 var nextIdx, checkItem;
rlm@46 19760 for (var i = 1; i < this.itemCount; i++) {
rlm@46 19761 nextIdx = (this.activeItem.itemIndex + i) % this.itemCount;
rlm@46 19762
rlm@46 19763 checkItem = this.menu.items.itemAt(nextIdx);
rlm@46 19764
rlm@46 19765 if (!checkItem.disabled) {
rlm@46 19766 checkItem.setChecked(true);
rlm@46 19767 break;
rlm@46 19768 }
rlm@46 19769 }
rlm@46 19770 }
rlm@46 19771 });
rlm@46 19772 Ext.reg('cycle', Ext.CycleButton);
rlm@46 19773
rlm@46 19774 Ext.Toolbar = function(config){
rlm@46 19775 if(Ext.isArray(config)){
rlm@46 19776 config = {buttons:config};
rlm@46 19777 }
rlm@46 19778 Ext.Toolbar.superclass.constructor.call(this, config);
rlm@46 19779 };
rlm@46 19780
rlm@46 19781 (function(){
rlm@46 19782
rlm@46 19783 var T = Ext.Toolbar;
rlm@46 19784
rlm@46 19785 Ext.extend(T, Ext.BoxComponent, {
rlm@46 19786
rlm@46 19787 trackMenus : true,
rlm@46 19788
rlm@46 19789
rlm@46 19790 initComponent : function(){
rlm@46 19791 T.superclass.initComponent.call(this);
rlm@46 19792
rlm@46 19793 if(this.items){
rlm@46 19794 this.buttons = this.items;
rlm@46 19795 }
rlm@46 19796
rlm@46 19797 this.items = new Ext.util.MixedCollection(false, function(o){
rlm@46 19798 return o.itemId || o.id || Ext.id();
rlm@46 19799 });
rlm@46 19800 },
rlm@46 19801
rlm@46 19802
rlm@46 19803 autoCreate: {
rlm@46 19804 cls:'x-toolbar x-small-editor',
rlm@46 19805 html:'<table cellspacing="0"><tr></tr></table>'
rlm@46 19806 },
rlm@46 19807
rlm@46 19808
rlm@46 19809 onRender : function(ct, position){
rlm@46 19810 this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position);
rlm@46 19811 this.tr = this.el.child("tr", true);
rlm@46 19812 },
rlm@46 19813
rlm@46 19814
rlm@46 19815 afterRender : function(){
rlm@46 19816 T.superclass.afterRender.call(this);
rlm@46 19817 if(this.buttons){
rlm@46 19818 this.add.apply(this, this.buttons);
rlm@46 19819 delete this.buttons;
rlm@46 19820 }
rlm@46 19821 },
rlm@46 19822
rlm@46 19823
rlm@46 19824 add : function(){
rlm@46 19825 var a = arguments, l = a.length;
rlm@46 19826 for(var i = 0; i < l; i++){
rlm@46 19827 var el = a[i];
rlm@46 19828 if(el.isFormField){
rlm@46 19829 this.addField(el);
rlm@46 19830 }else if(el.render){
rlm@46 19831 this.addItem(el);
rlm@46 19832 }else if(typeof el == "string"){
rlm@46 19833 if(el == "separator" || el == "-"){
rlm@46 19834 this.addSeparator();
rlm@46 19835 }else if(el == " "){
rlm@46 19836 this.addSpacer();
rlm@46 19837 }else if(el == "->"){
rlm@46 19838 this.addFill();
rlm@46 19839 }else{
rlm@46 19840 this.addText(el);
rlm@46 19841 }
rlm@46 19842 }else if(el.tagName){
rlm@46 19843 this.addElement(el);
rlm@46 19844 }else if(typeof el == "object"){
rlm@46 19845 if(el.xtype){
rlm@46 19846 this.addField(Ext.ComponentMgr.create(el, 'button'));
rlm@46 19847 }else{
rlm@46 19848 this.addButton(el);
rlm@46 19849 }
rlm@46 19850 }
rlm@46 19851 }
rlm@46 19852 },
rlm@46 19853
rlm@46 19854
rlm@46 19855 addSeparator : function(){
rlm@46 19856 return this.addItem(new T.Separator());
rlm@46 19857 },
rlm@46 19858
rlm@46 19859
rlm@46 19860 addSpacer : function(){
rlm@46 19861 return this.addItem(new T.Spacer());
rlm@46 19862 },
rlm@46 19863
rlm@46 19864
rlm@46 19865 addFill : function(){
rlm@46 19866 return this.addItem(new T.Fill());
rlm@46 19867 },
rlm@46 19868
rlm@46 19869
rlm@46 19870 addElement : function(el){
rlm@46 19871 return this.addItem(new T.Item(el));
rlm@46 19872 },
rlm@46 19873
rlm@46 19874
rlm@46 19875 addItem : function(item){
rlm@46 19876 var td = this.nextBlock();
rlm@46 19877 this.initMenuTracking(item);
rlm@46 19878 item.render(td);
rlm@46 19879 this.items.add(item);
rlm@46 19880 return item;
rlm@46 19881 },
rlm@46 19882
rlm@46 19883
rlm@46 19884 addButton : function(config){
rlm@46 19885 if(Ext.isArray(config)){
rlm@46 19886 var buttons = [];
rlm@46 19887 for(var i = 0, len = config.length; i < len; i++) {
rlm@46 19888 buttons.push(this.addButton(config[i]));
rlm@46 19889 }
rlm@46 19890 return buttons;
rlm@46 19891 }
rlm@46 19892 var b = config;
rlm@46 19893 if(!(config instanceof T.Button)){
rlm@46 19894 b = config.split ?
rlm@46 19895 new T.SplitButton(config) :
rlm@46 19896 new T.Button(config);
rlm@46 19897 }
rlm@46 19898 var td = this.nextBlock();
rlm@46 19899 this.initMenuTracking(b);
rlm@46 19900 b.render(td);
rlm@46 19901 this.items.add(b);
rlm@46 19902 return b;
rlm@46 19903 },
rlm@46 19904
rlm@46 19905
rlm@46 19906 initMenuTracking : function(item){
rlm@46 19907 if(this.trackMenus && item.menu){
rlm@46 19908 item.on({
rlm@46 19909 'menutriggerover' : this.onButtonTriggerOver,
rlm@46 19910 'menushow' : this.onButtonMenuShow,
rlm@46 19911 'menuhide' : this.onButtonMenuHide,
rlm@46 19912 scope: this
rlm@46 19913 })
rlm@46 19914 }
rlm@46 19915 },
rlm@46 19916
rlm@46 19917
rlm@46 19918 addText : function(text){
rlm@46 19919 return this.addItem(new T.TextItem(text));
rlm@46 19920 },
rlm@46 19921
rlm@46 19922
rlm@46 19923 insertButton : function(index, item){
rlm@46 19924 if(Ext.isArray(item)){
rlm@46 19925 var buttons = [];
rlm@46 19926 for(var i = 0, len = item.length; i < len; i++) {
rlm@46 19927 buttons.push(this.insertButton(index + i, item[i]));
rlm@46 19928 }
rlm@46 19929 return buttons;
rlm@46 19930 }
rlm@46 19931 if (!(item instanceof T.Button)){
rlm@46 19932 item = new T.Button(item);
rlm@46 19933 }
rlm@46 19934 var td = document.createElement("td");
rlm@46 19935 this.tr.insertBefore(td, this.tr.childNodes[index]);
rlm@46 19936 this.initMenuTracking(item);
rlm@46 19937 item.render(td);
rlm@46 19938 this.items.insert(index, item);
rlm@46 19939 return item;
rlm@46 19940 },
rlm@46 19941
rlm@46 19942
rlm@46 19943 addDom : function(config, returnEl){
rlm@46 19944 var td = this.nextBlock();
rlm@46 19945 Ext.DomHelper.overwrite(td, config);
rlm@46 19946 var ti = new T.Item(td.firstChild);
rlm@46 19947 ti.render(td);
rlm@46 19948 this.items.add(ti);
rlm@46 19949 return ti;
rlm@46 19950 },
rlm@46 19951
rlm@46 19952
rlm@46 19953 addField : function(field){
rlm@46 19954 var td = this.nextBlock();
rlm@46 19955 field.render(td);
rlm@46 19956 var ti = new T.Item(td.firstChild);
rlm@46 19957 ti.render(td);
rlm@46 19958 this.items.add(ti);
rlm@46 19959 return ti;
rlm@46 19960 },
rlm@46 19961
rlm@46 19962
rlm@46 19963 nextBlock : function(){
rlm@46 19964 var td = document.createElement("td");
rlm@46 19965 this.tr.appendChild(td);
rlm@46 19966 return td;
rlm@46 19967 },
rlm@46 19968
rlm@46 19969
rlm@46 19970 onDestroy : function(){
rlm@46 19971 Ext.Toolbar.superclass.onDestroy.call(this);
rlm@46 19972 if(this.rendered){
rlm@46 19973 if(this.items){
rlm@46 19974 Ext.destroy.apply(Ext, this.items.items);
rlm@46 19975 }
rlm@46 19976 Ext.Element.uncache(this.tr);
rlm@46 19977 }
rlm@46 19978 },
rlm@46 19979
rlm@46 19980
rlm@46 19981 onDisable : function(){
rlm@46 19982 this.items.each(function(item){
rlm@46 19983 if(item.disable){
rlm@46 19984 item.disable();
rlm@46 19985 }
rlm@46 19986 });
rlm@46 19987 },
rlm@46 19988
rlm@46 19989
rlm@46 19990 onEnable : function(){
rlm@46 19991 this.items.each(function(item){
rlm@46 19992 if(item.enable){
rlm@46 19993 item.enable();
rlm@46 19994 }
rlm@46 19995 });
rlm@46 19996 },
rlm@46 19997
rlm@46 19998
rlm@46 19999 onButtonTriggerOver : function(btn){
rlm@46 20000 if(this.activeMenuBtn && this.activeMenuBtn != btn){
rlm@46 20001 this.activeMenuBtn.hideMenu();
rlm@46 20002 btn.showMenu();
rlm@46 20003 this.activeMenuBtn = btn;
rlm@46 20004 }
rlm@46 20005 },
rlm@46 20006
rlm@46 20007
rlm@46 20008 onButtonMenuShow : function(btn){
rlm@46 20009 this.activeMenuBtn = btn;
rlm@46 20010 },
rlm@46 20011
rlm@46 20012
rlm@46 20013 onButtonMenuHide : function(btn){
rlm@46 20014 delete this.activeMenuBtn;
rlm@46 20015 }
rlm@46 20016
rlm@46 20017
rlm@46 20018 });
rlm@46 20019 Ext.reg('toolbar', Ext.Toolbar);
rlm@46 20020
rlm@46 20021
rlm@46 20022 T.Item = function(el){
rlm@46 20023 this.el = Ext.getDom(el);
rlm@46 20024 this.id = Ext.id(this.el);
rlm@46 20025 this.hidden = false;
rlm@46 20026 };
rlm@46 20027
rlm@46 20028 T.Item.prototype = {
rlm@46 20029
rlm@46 20030
rlm@46 20031 getEl : function(){
rlm@46 20032 return this.el;
rlm@46 20033 },
rlm@46 20034
rlm@46 20035
rlm@46 20036 render : function(td){
rlm@46 20037 this.td = td;
rlm@46 20038 td.appendChild(this.el);
rlm@46 20039 },
rlm@46 20040
rlm@46 20041
rlm@46 20042 destroy : function(){
rlm@46 20043 if(this.td && this.td.parentNode){
rlm@46 20044 this.td.parentNode.removeChild(this.td);
rlm@46 20045 }
rlm@46 20046 },
rlm@46 20047
rlm@46 20048
rlm@46 20049 show: function(){
rlm@46 20050 this.hidden = false;
rlm@46 20051 this.td.style.display = "";
rlm@46 20052 },
rlm@46 20053
rlm@46 20054
rlm@46 20055 hide: function(){
rlm@46 20056 this.hidden = true;
rlm@46 20057 this.td.style.display = "none";
rlm@46 20058 },
rlm@46 20059
rlm@46 20060
rlm@46 20061 setVisible: function(visible){
rlm@46 20062 if(visible) {
rlm@46 20063 this.show();
rlm@46 20064 }else{
rlm@46 20065 this.hide();
rlm@46 20066 }
rlm@46 20067 },
rlm@46 20068
rlm@46 20069
rlm@46 20070 focus : function(){
rlm@46 20071 Ext.fly(this.el).focus();
rlm@46 20072 },
rlm@46 20073
rlm@46 20074
rlm@46 20075 disable : function(){
rlm@46 20076 Ext.fly(this.td).addClass("x-item-disabled");
rlm@46 20077 this.disabled = true;
rlm@46 20078 this.el.disabled = true;
rlm@46 20079 },
rlm@46 20080
rlm@46 20081
rlm@46 20082 enable : function(){
rlm@46 20083 Ext.fly(this.td).removeClass("x-item-disabled");
rlm@46 20084 this.disabled = false;
rlm@46 20085 this.el.disabled = false;
rlm@46 20086 }
rlm@46 20087 };
rlm@46 20088 Ext.reg('tbitem', T.Item);
rlm@46 20089
rlm@46 20090
rlm@46 20091
rlm@46 20092 T.Separator = function(){
rlm@46 20093 var s = document.createElement("span");
rlm@46 20094 s.className = "ytb-sep";
rlm@46 20095 T.Separator.superclass.constructor.call(this, s);
rlm@46 20096 };
rlm@46 20097 Ext.extend(T.Separator, T.Item, {
rlm@46 20098 enable:Ext.emptyFn,
rlm@46 20099 disable:Ext.emptyFn,
rlm@46 20100 focus:Ext.emptyFn
rlm@46 20101 });
rlm@46 20102 Ext.reg('tbseparator', T.Separator);
rlm@46 20103
rlm@46 20104
rlm@46 20105 T.Spacer = function(){
rlm@46 20106 var s = document.createElement("div");
rlm@46 20107 s.className = "ytb-spacer";
rlm@46 20108 T.Spacer.superclass.constructor.call(this, s);
rlm@46 20109 };
rlm@46 20110 Ext.extend(T.Spacer, T.Item, {
rlm@46 20111 enable:Ext.emptyFn,
rlm@46 20112 disable:Ext.emptyFn,
rlm@46 20113 focus:Ext.emptyFn
rlm@46 20114 });
rlm@46 20115
rlm@46 20116 Ext.reg('tbspacer', T.Spacer);
rlm@46 20117
rlm@46 20118
rlm@46 20119 T.Fill = Ext.extend(T.Spacer, {
rlm@46 20120
rlm@46 20121 render : function(td){
rlm@46 20122 td.style.width = '100%';
rlm@46 20123 T.Fill.superclass.render.call(this, td);
rlm@46 20124 }
rlm@46 20125 });
rlm@46 20126 Ext.reg('tbfill', T.Fill);
rlm@46 20127
rlm@46 20128
rlm@46 20129 T.TextItem = function(t){
rlm@46 20130 var s = document.createElement("span");
rlm@46 20131 s.className = "ytb-text";
rlm@46 20132 s.innerHTML = t.text ? t.text : t;
rlm@46 20133 T.TextItem.superclass.constructor.call(this, s);
rlm@46 20134 };
rlm@46 20135 Ext.extend(T.TextItem, T.Item, {
rlm@46 20136 enable:Ext.emptyFn,
rlm@46 20137 disable:Ext.emptyFn,
rlm@46 20138 focus:Ext.emptyFn
rlm@46 20139 });
rlm@46 20140 Ext.reg('tbtext', T.TextItem);
rlm@46 20141
rlm@46 20142
rlm@46 20143
rlm@46 20144 T.Button = Ext.extend(Ext.Button, {
rlm@46 20145 hideParent : true,
rlm@46 20146
rlm@46 20147 onDestroy : function(){
rlm@46 20148 T.Button.superclass.onDestroy.call(this);
rlm@46 20149 if(this.container){
rlm@46 20150 this.container.remove();
rlm@46 20151 }
rlm@46 20152 }
rlm@46 20153 });
rlm@46 20154 Ext.reg('tbbutton', T.Button);
rlm@46 20155
rlm@46 20156
rlm@46 20157 T.SplitButton = Ext.extend(Ext.SplitButton, {
rlm@46 20158 hideParent : true,
rlm@46 20159
rlm@46 20160 onDestroy : function(){
rlm@46 20161 T.SplitButton.superclass.onDestroy.call(this);
rlm@46 20162 if(this.container){
rlm@46 20163 this.container.remove();
rlm@46 20164 }
rlm@46 20165 }
rlm@46 20166 });
rlm@46 20167
rlm@46 20168 Ext.reg('tbsplit', T.SplitButton);
rlm@46 20169
rlm@46 20170 T.MenuButton = T.SplitButton;
rlm@46 20171
rlm@46 20172 })();
rlm@46 20173
rlm@46 20174
rlm@46 20175 Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {
rlm@46 20176
rlm@46 20177
rlm@46 20178
rlm@46 20179 pageSize: 20,
rlm@46 20180
rlm@46 20181 displayMsg : 'Displaying {0} - {1} of {2}',
rlm@46 20182
rlm@46 20183 emptyMsg : 'No data to display',
rlm@46 20184
rlm@46 20185 beforePageText : "Page",
rlm@46 20186
rlm@46 20187 afterPageText : "of {0}",
rlm@46 20188
rlm@46 20189 firstText : "First Page",
rlm@46 20190
rlm@46 20191 prevText : "Previous Page",
rlm@46 20192
rlm@46 20193 nextText : "Next Page",
rlm@46 20194
rlm@46 20195 lastText : "Last Page",
rlm@46 20196
rlm@46 20197 refreshText : "Refresh",
rlm@46 20198
rlm@46 20199
rlm@46 20200 paramNames : {start: 'start', limit: 'limit'},
rlm@46 20201
rlm@46 20202 initComponent : function(){
rlm@46 20203 Ext.PagingToolbar.superclass.initComponent.call(this);
rlm@46 20204 this.cursor = 0;
rlm@46 20205 this.bind(this.store);
rlm@46 20206 },
rlm@46 20207
rlm@46 20208 onRender : function(ct, position){
rlm@46 20209 Ext.PagingToolbar.superclass.onRender.call(this, ct, position);
rlm@46 20210 this.first = this.addButton({
rlm@46 20211 tooltip: this.firstText,
rlm@46 20212 iconCls: "x-tbar-page-first",
rlm@46 20213 disabled: true,
rlm@46 20214 handler: this.onClick.createDelegate(this, ["first"])
rlm@46 20215 });
rlm@46 20216 this.prev = this.addButton({
rlm@46 20217 tooltip: this.prevText,
rlm@46 20218 iconCls: "x-tbar-page-prev",
rlm@46 20219 disabled: true,
rlm@46 20220 handler: this.onClick.createDelegate(this, ["prev"])
rlm@46 20221 });
rlm@46 20222 this.addSeparator();
rlm@46 20223 this.add(this.beforePageText);
rlm@46 20224 this.field = Ext.get(this.addDom({
rlm@46 20225 tag: "input",
rlm@46 20226 type: "text",
rlm@46 20227 size: "3",
rlm@46 20228 value: "1",
rlm@46 20229 cls: "x-tbar-page-number"
rlm@46 20230 }).el);
rlm@46 20231 this.field.on("keydown", this.onPagingKeydown, this);
rlm@46 20232 this.field.on("focus", function(){this.dom.select();});
rlm@46 20233 this.afterTextEl = this.addText(String.format(this.afterPageText, 1));
rlm@46 20234 this.field.setHeight(18);
rlm@46 20235 this.addSeparator();
rlm@46 20236 this.next = this.addButton({
rlm@46 20237 tooltip: this.nextText,
rlm@46 20238 iconCls: "x-tbar-page-next",
rlm@46 20239 disabled: true,
rlm@46 20240 handler: this.onClick.createDelegate(this, ["next"])
rlm@46 20241 });
rlm@46 20242 this.last = this.addButton({
rlm@46 20243 tooltip: this.lastText,
rlm@46 20244 iconCls: "x-tbar-page-last",
rlm@46 20245 disabled: true,
rlm@46 20246 handler: this.onClick.createDelegate(this, ["last"])
rlm@46 20247 });
rlm@46 20248 this.addSeparator();
rlm@46 20249 this.loading = this.addButton({
rlm@46 20250 tooltip: this.refreshText,
rlm@46 20251 iconCls: "x-tbar-loading",
rlm@46 20252 handler: this.onClick.createDelegate(this, ["refresh"])
rlm@46 20253 });
rlm@46 20254
rlm@46 20255 if(this.displayInfo){
rlm@46 20256 this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'});
rlm@46 20257 }
rlm@46 20258 if(this.dsLoaded){
rlm@46 20259 this.onLoad.apply(this, this.dsLoaded);
rlm@46 20260 }
rlm@46 20261 },
rlm@46 20262
rlm@46 20263 updateInfo : function(){
rlm@46 20264 if(this.displayEl){
rlm@46 20265 var count = this.store.getCount();
rlm@46 20266 var msg = count == 0 ?
rlm@46 20267 this.emptyMsg :
rlm@46 20268 String.format(
rlm@46 20269 this.displayMsg,
rlm@46 20270 this.cursor+1, this.cursor+count, this.store.getTotalCount()
rlm@46 20271 );
rlm@46 20272 this.displayEl.update(msg);
rlm@46 20273 }
rlm@46 20274 },
rlm@46 20275
rlm@46 20276 onLoad : function(store, r, o){
rlm@46 20277 if(!this.rendered){
rlm@46 20278 this.dsLoaded = [store, r, o];
rlm@46 20279 return;
rlm@46 20280 }
rlm@46 20281 this.cursor = o.params ? o.params[this.paramNames.start] : 0;
rlm@46 20282 var d = this.getPageData(), ap = d.activePage, ps = d.pages;
rlm@46 20283
rlm@46 20284 this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages);
rlm@46 20285 this.field.dom.value = ap;
rlm@46 20286 this.first.setDisabled(ap == 1);
rlm@46 20287 this.prev.setDisabled(ap == 1);
rlm@46 20288 this.next.setDisabled(ap == ps);
rlm@46 20289 this.last.setDisabled(ap == ps);
rlm@46 20290 this.loading.enable();
rlm@46 20291 this.updateInfo();
rlm@46 20292 },
rlm@46 20293
rlm@46 20294 getPageData : function(){
rlm@46 20295 var total = this.store.getTotalCount();
rlm@46 20296 return {
rlm@46 20297 total : total,
rlm@46 20298 activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),
rlm@46 20299 pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)
rlm@46 20300 };
rlm@46 20301 },
rlm@46 20302
rlm@46 20303 onLoadError : function(){
rlm@46 20304 if(!this.rendered){
rlm@46 20305 return;
rlm@46 20306 }
rlm@46 20307 this.loading.enable();
rlm@46 20308 },
rlm@46 20309
rlm@46 20310 readPage : function(d){
rlm@46 20311 var v = this.field.dom.value, pageNum;
rlm@46 20312 if (!v || isNaN(pageNum = parseInt(v, 10))) {
rlm@46 20313 this.field.dom.value = d.activePage;
rlm@46 20314 return false;
rlm@46 20315 }
rlm@46 20316 return pageNum;
rlm@46 20317 },
rlm@46 20318
rlm@46 20319 onPagingKeydown : function(e){
rlm@46 20320 var k = e.getKey(), d = this.getPageData(), pageNum;
rlm@46 20321 if (k == e.RETURN) {
rlm@46 20322 e.stopEvent();
rlm@46 20323 if(pageNum = this.readPage(d)){
rlm@46 20324 pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;
rlm@46 20325 this.doLoad(pageNum * this.pageSize);
rlm@46 20326 }
rlm@46 20327 }else if (k == e.HOME || k == e.END){
rlm@46 20328 e.stopEvent();
rlm@46 20329 pageNum = k == e.HOME ? 1 : d.pages;
rlm@46 20330 this.field.dom.value = pageNum;
rlm@46 20331 }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){
rlm@46 20332 e.stopEvent();
rlm@46 20333 if(pageNum = this.readPage(d)){
rlm@46 20334 var increment = e.shiftKey ? 10 : 1;
rlm@46 20335 if(k == e.DOWN || k == e.PAGEDOWN){
rlm@46 20336 increment *= -1;
rlm@46 20337 }
rlm@46 20338 pageNum += increment;
rlm@46 20339 if(pageNum >= 1 & pageNum <= d.pages){
rlm@46 20340 this.field.dom.value = pageNum;
rlm@46 20341 }
rlm@46 20342 }
rlm@46 20343 }
rlm@46 20344 },
rlm@46 20345
rlm@46 20346 beforeLoad : function(){
rlm@46 20347 if(this.rendered && this.loading){
rlm@46 20348 this.loading.disable();
rlm@46 20349 }
rlm@46 20350 },
rlm@46 20351
rlm@46 20352 doLoad : function(start){
rlm@46 20353 var o = {}, pn = this.paramNames;
rlm@46 20354 o[pn.start] = start;
rlm@46 20355 o[pn.limit] = this.pageSize;
rlm@46 20356 this.store.load({params:o});
rlm@46 20357 },
rlm@46 20358
rlm@46 20359 onClick : function(which){
rlm@46 20360 var store = this.store;
rlm@46 20361 switch(which){
rlm@46 20362 case "first":
rlm@46 20363 this.doLoad(0);
rlm@46 20364 break;
rlm@46 20365 case "prev":
rlm@46 20366 this.doLoad(Math.max(0, this.cursor-this.pageSize));
rlm@46 20367 break;
rlm@46 20368 case "next":
rlm@46 20369 this.doLoad(this.cursor+this.pageSize);
rlm@46 20370 break;
rlm@46 20371 case "last":
rlm@46 20372 var total = store.getTotalCount();
rlm@46 20373 var extra = total % this.pageSize;
rlm@46 20374 var lastStart = extra ? (total - extra) : total-this.pageSize;
rlm@46 20375 this.doLoad(lastStart);
rlm@46 20376 break;
rlm@46 20377 case "refresh":
rlm@46 20378 this.doLoad(this.cursor);
rlm@46 20379 break;
rlm@46 20380 }
rlm@46 20381 },
rlm@46 20382
rlm@46 20383
rlm@46 20384 unbind : function(store){
rlm@46 20385 store = Ext.StoreMgr.lookup(store);
rlm@46 20386 store.un("beforeload", this.beforeLoad, this);
rlm@46 20387 store.un("load", this.onLoad, this);
rlm@46 20388 store.un("loadexception", this.onLoadError, this);
rlm@46 20389 this.store = undefined;
rlm@46 20390 },
rlm@46 20391
rlm@46 20392
rlm@46 20393 bind : function(store){
rlm@46 20394 store = Ext.StoreMgr.lookup(store);
rlm@46 20395 store.on("beforeload", this.beforeLoad, this);
rlm@46 20396 store.on("load", this.onLoad, this);
rlm@46 20397 store.on("loadexception", this.onLoadError, this);
rlm@46 20398 this.store = store;
rlm@46 20399 }
rlm@46 20400 });
rlm@46 20401 Ext.reg('paging', Ext.PagingToolbar);
rlm@46 20402
rlm@46 20403 Ext.Resizable = function(el, config){
rlm@46 20404 this.el = Ext.get(el);
rlm@46 20405
rlm@46 20406 if(config && config.wrap){
rlm@46 20407 config.resizeChild = this.el;
rlm@46 20408 this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"});
rlm@46 20409 this.el.id = this.el.dom.id = config.resizeChild.id + "-rzwrap";
rlm@46 20410 this.el.setStyle("overflow", "hidden");
rlm@46 20411 this.el.setPositioning(config.resizeChild.getPositioning());
rlm@46 20412 config.resizeChild.clearPositioning();
rlm@46 20413 if(!config.width || !config.height){
rlm@46 20414 var csize = config.resizeChild.getSize();
rlm@46 20415 this.el.setSize(csize.width, csize.height);
rlm@46 20416 }
rlm@46 20417 if(config.pinned && !config.adjustments){
rlm@46 20418 config.adjustments = "auto";
rlm@46 20419 }
rlm@46 20420 }
rlm@46 20421
rlm@46 20422
rlm@46 20423 this.proxy = this.el.createProxy({tag: "div", cls: "x-resizable-proxy", id: this.el.id + "-rzproxy"});
rlm@46 20424 this.proxy.unselectable();
rlm@46 20425 this.proxy.enableDisplayMode('block');
rlm@46 20426
rlm@46 20427 Ext.apply(this, config);
rlm@46 20428
rlm@46 20429 if(this.pinned){
rlm@46 20430 this.disableTrackOver = true;
rlm@46 20431 this.el.addClass("x-resizable-pinned");
rlm@46 20432 }
rlm@46 20433
rlm@46 20434 var position = this.el.getStyle("position");
rlm@46 20435 if(position != "absolute" && position != "fixed"){
rlm@46 20436 this.el.setStyle("position", "relative");
rlm@46 20437 }
rlm@46 20438 if(!this.handles){
rlm@46 20439 this.handles = 's,e,se';
rlm@46 20440 if(this.multiDirectional){
rlm@46 20441 this.handles += ',n,w';
rlm@46 20442 }
rlm@46 20443 }
rlm@46 20444 if(this.handles == "all"){
rlm@46 20445 this.handles = "n s e w ne nw se sw";
rlm@46 20446 }
rlm@46 20447 var hs = this.handles.split(/\s*?[,;]\s*?| /);
rlm@46 20448 var ps = Ext.Resizable.positions;
rlm@46 20449 for(var i = 0, len = hs.length; i < len; i++){
rlm@46 20450 if(hs[i] && ps[hs[i]]){
rlm@46 20451 var pos = ps[hs[i]];
rlm@46 20452 this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent);
rlm@46 20453 }
rlm@46 20454 }
rlm@46 20455
rlm@46 20456 this.corner = this.southeast;
rlm@46 20457
rlm@46 20458 if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){
rlm@46 20459 this.updateBox = true;
rlm@46 20460 }
rlm@46 20461
rlm@46 20462 this.activeHandle = null;
rlm@46 20463
rlm@46 20464 if(this.resizeChild){
rlm@46 20465 if(typeof this.resizeChild == "boolean"){
rlm@46 20466 this.resizeChild = Ext.get(this.el.dom.firstChild, true);
rlm@46 20467 }else{
rlm@46 20468 this.resizeChild = Ext.get(this.resizeChild, true);
rlm@46 20469 }
rlm@46 20470 }
rlm@46 20471
rlm@46 20472 if(this.adjustments == "auto"){
rlm@46 20473 var rc = this.resizeChild;
rlm@46 20474 var hw = this.west, he = this.east, hn = this.north, hs = this.south;
rlm@46 20475 if(rc && (hw || hn)){
rlm@46 20476 rc.position("relative");
rlm@46 20477 rc.setLeft(hw ? hw.el.getWidth() : 0);
rlm@46 20478 rc.setTop(hn ? hn.el.getHeight() : 0);
rlm@46 20479 }
rlm@46 20480 this.adjustments = [
rlm@46 20481 (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),
rlm@46 20482 (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1
rlm@46 20483 ];
rlm@46 20484 }
rlm@46 20485
rlm@46 20486 if(this.draggable){
rlm@46 20487 this.dd = this.dynamic ?
rlm@46 20488 this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});
rlm@46 20489 this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);
rlm@46 20490 }
rlm@46 20491
rlm@46 20492
rlm@46 20493 this.addEvents(
rlm@46 20494 "beforeresize",
rlm@46 20495 "resize"
rlm@46 20496 );
rlm@46 20497
rlm@46 20498 if(this.width !== null && this.height !== null){
rlm@46 20499 this.resizeTo(this.width, this.height);
rlm@46 20500 }else{
rlm@46 20501 this.updateChildSize();
rlm@46 20502 }
rlm@46 20503 if(Ext.isIE){
rlm@46 20504 this.el.dom.style.zoom = 1;
rlm@46 20505 }
rlm@46 20506 Ext.Resizable.superclass.constructor.call(this);
rlm@46 20507 };
rlm@46 20508
rlm@46 20509 Ext.extend(Ext.Resizable, Ext.util.Observable, {
rlm@46 20510 resizeChild : false,
rlm@46 20511 adjustments : [0, 0],
rlm@46 20512 minWidth : 5,
rlm@46 20513 minHeight : 5,
rlm@46 20514 maxWidth : 10000,
rlm@46 20515 maxHeight : 10000,
rlm@46 20516 enabled : true,
rlm@46 20517 animate : false,
rlm@46 20518 duration : .35,
rlm@46 20519 dynamic : false,
rlm@46 20520 handles : false,
rlm@46 20521 multiDirectional : false,
rlm@46 20522 disableTrackOver : false,
rlm@46 20523 easing : 'easeOutStrong',
rlm@46 20524 widthIncrement : 0,
rlm@46 20525 heightIncrement : 0,
rlm@46 20526 pinned : false,
rlm@46 20527 width : null,
rlm@46 20528 height : null,
rlm@46 20529 preserveRatio : false,
rlm@46 20530 transparent: false,
rlm@46 20531 minX: 0,
rlm@46 20532 minY: 0,
rlm@46 20533 draggable: false,
rlm@46 20534
rlm@46 20535
rlm@46 20536
rlm@46 20537
rlm@46 20538
rlm@46 20539
rlm@46 20540
rlm@46 20541
rlm@46 20542 resizeTo : function(width, height){
rlm@46 20543 this.el.setSize(width, height);
rlm@46 20544 this.updateChildSize();
rlm@46 20545 this.fireEvent("resize", this, width, height, null);
rlm@46 20546 },
rlm@46 20547
rlm@46 20548
rlm@46 20549 startSizing : function(e, handle){
rlm@46 20550 this.fireEvent("beforeresize", this, e);
rlm@46 20551 if(this.enabled){
rlm@46 20552
rlm@46 20553 if(!this.overlay){
rlm@46 20554 this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: "&#160;"}, Ext.getBody());
rlm@46 20555 this.overlay.unselectable();
rlm@46 20556 this.overlay.enableDisplayMode("block");
rlm@46 20557 this.overlay.on("mousemove", this.onMouseMove, this);
rlm@46 20558 this.overlay.on("mouseup", this.onMouseUp, this);
rlm@46 20559 }
rlm@46 20560 this.overlay.setStyle("cursor", handle.el.getStyle("cursor"));
rlm@46 20561
rlm@46 20562 this.resizing = true;
rlm@46 20563 this.startBox = this.el.getBox();
rlm@46 20564 this.startPoint = e.getXY();
rlm@46 20565 this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],
rlm@46 20566 (this.startBox.y + this.startBox.height) - this.startPoint[1]];
rlm@46 20567
rlm@46 20568 this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
rlm@46 20569 this.overlay.show();
rlm@46 20570
rlm@46 20571 if(this.constrainTo) {
rlm@46 20572 var ct = Ext.get(this.constrainTo);
rlm@46 20573 this.resizeRegion = ct.getRegion().adjust(
rlm@46 20574 ct.getFrameWidth('t'),
rlm@46 20575 ct.getFrameWidth('l'),
rlm@46 20576 -ct.getFrameWidth('b'),
rlm@46 20577 -ct.getFrameWidth('r')
rlm@46 20578 );
rlm@46 20579 }
rlm@46 20580
rlm@46 20581 this.proxy.setStyle('visibility', 'hidden');
rlm@46 20582 this.proxy.show();
rlm@46 20583 this.proxy.setBox(this.startBox);
rlm@46 20584 if(!this.dynamic){
rlm@46 20585 this.proxy.setStyle('visibility', 'visible');
rlm@46 20586 }
rlm@46 20587 }
rlm@46 20588 },
rlm@46 20589
rlm@46 20590
rlm@46 20591 onMouseDown : function(handle, e){
rlm@46 20592 if(this.enabled){
rlm@46 20593 e.stopEvent();
rlm@46 20594 this.activeHandle = handle;
rlm@46 20595 this.startSizing(e, handle);
rlm@46 20596 }
rlm@46 20597 },
rlm@46 20598
rlm@46 20599
rlm@46 20600 onMouseUp : function(e){
rlm@46 20601 var size = this.resizeElement();
rlm@46 20602 this.resizing = false;
rlm@46 20603 this.handleOut();
rlm@46 20604 this.overlay.hide();
rlm@46 20605 this.proxy.hide();
rlm@46 20606 this.fireEvent("resize", this, size.width, size.height, e);
rlm@46 20607 },
rlm@46 20608
rlm@46 20609
rlm@46 20610 updateChildSize : function(){
rlm@46 20611 if(this.resizeChild){
rlm@46 20612 var el = this.el;
rlm@46 20613 var child = this.resizeChild;
rlm@46 20614 var adj = this.adjustments;
rlm@46 20615 if(el.dom.offsetWidth){
rlm@46 20616 var b = el.getSize(true);
rlm@46 20617 child.setSize(b.width+adj[0], b.height+adj[1]);
rlm@46 20618 }
rlm@46 20619
rlm@46 20620
rlm@46 20621
rlm@46 20622
rlm@46 20623 if(Ext.isIE){
rlm@46 20624 setTimeout(function(){
rlm@46 20625 if(el.dom.offsetWidth){
rlm@46 20626 var b = el.getSize(true);
rlm@46 20627 child.setSize(b.width+adj[0], b.height+adj[1]);
rlm@46 20628 }
rlm@46 20629 }, 10);
rlm@46 20630 }
rlm@46 20631 }
rlm@46 20632 },
rlm@46 20633
rlm@46 20634
rlm@46 20635 snap : function(value, inc, min){
rlm@46 20636 if(!inc || !value) return value;
rlm@46 20637 var newValue = value;
rlm@46 20638 var m = value % inc;
rlm@46 20639 if(m > 0){
rlm@46 20640 if(m > (inc/2)){
rlm@46 20641 newValue = value + (inc-m);
rlm@46 20642 }else{
rlm@46 20643 newValue = value - m;
rlm@46 20644 }
rlm@46 20645 }
rlm@46 20646 return Math.max(min, newValue);
rlm@46 20647 },
rlm@46 20648
rlm@46 20649
rlm@46 20650 resizeElement : function(){
rlm@46 20651 var box = this.proxy.getBox();
rlm@46 20652 if(this.updateBox){
rlm@46 20653 this.el.setBox(box, false, this.animate, this.duration, null, this.easing);
rlm@46 20654 }else{
rlm@46 20655 this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);
rlm@46 20656 }
rlm@46 20657 this.updateChildSize();
rlm@46 20658 if(!this.dynamic){
rlm@46 20659 this.proxy.hide();
rlm@46 20660 }
rlm@46 20661 return box;
rlm@46 20662 },
rlm@46 20663
rlm@46 20664
rlm@46 20665 constrain : function(v, diff, m, mx){
rlm@46 20666 if(v - diff < m){
rlm@46 20667 diff = v - m;
rlm@46 20668 }else if(v - diff > mx){
rlm@46 20669 diff = mx - v;
rlm@46 20670 }
rlm@46 20671 return diff;
rlm@46 20672 },
rlm@46 20673
rlm@46 20674
rlm@46 20675 onMouseMove : function(e){
rlm@46 20676 if(this.enabled){
rlm@46 20677 try{
rlm@46 20678
rlm@46 20679 if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) {
rlm@46 20680 return;
rlm@46 20681 }
rlm@46 20682
rlm@46 20683
rlm@46 20684 var curSize = this.curSize || this.startBox;
rlm@46 20685 var x = this.startBox.x, y = this.startBox.y;
rlm@46 20686 var ox = x, oy = y;
rlm@46 20687 var w = curSize.width, h = curSize.height;
rlm@46 20688 var ow = w, oh = h;
rlm@46 20689 var mw = this.minWidth, mh = this.minHeight;
rlm@46 20690 var mxw = this.maxWidth, mxh = this.maxHeight;
rlm@46 20691 var wi = this.widthIncrement;
rlm@46 20692 var hi = this.heightIncrement;
rlm@46 20693
rlm@46 20694 var eventXY = e.getXY();
rlm@46 20695 var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0]));
rlm@46 20696 var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1]));
rlm@46 20697
rlm@46 20698 var pos = this.activeHandle.position;
rlm@46 20699
rlm@46 20700 switch(pos){
rlm@46 20701 case "east":
rlm@46 20702 w += diffX;
rlm@46 20703 w = Math.min(Math.max(mw, w), mxw);
rlm@46 20704 break;
rlm@46 20705 case "south":
rlm@46 20706 h += diffY;
rlm@46 20707 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20708 break;
rlm@46 20709 case "southeast":
rlm@46 20710 w += diffX;
rlm@46 20711 h += diffY;
rlm@46 20712 w = Math.min(Math.max(mw, w), mxw);
rlm@46 20713 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20714 break;
rlm@46 20715 case "north":
rlm@46 20716 diffY = this.constrain(h, diffY, mh, mxh);
rlm@46 20717 y += diffY;
rlm@46 20718 h -= diffY;
rlm@46 20719 break;
rlm@46 20720 case "west":
rlm@46 20721 diffX = this.constrain(w, diffX, mw, mxw);
rlm@46 20722 x += diffX;
rlm@46 20723 w -= diffX;
rlm@46 20724 break;
rlm@46 20725 case "northeast":
rlm@46 20726 w += diffX;
rlm@46 20727 w = Math.min(Math.max(mw, w), mxw);
rlm@46 20728 diffY = this.constrain(h, diffY, mh, mxh);
rlm@46 20729 y += diffY;
rlm@46 20730 h -= diffY;
rlm@46 20731 break;
rlm@46 20732 case "northwest":
rlm@46 20733 diffX = this.constrain(w, diffX, mw, mxw);
rlm@46 20734 diffY = this.constrain(h, diffY, mh, mxh);
rlm@46 20735 y += diffY;
rlm@46 20736 h -= diffY;
rlm@46 20737 x += diffX;
rlm@46 20738 w -= diffX;
rlm@46 20739 break;
rlm@46 20740 case "southwest":
rlm@46 20741 diffX = this.constrain(w, diffX, mw, mxw);
rlm@46 20742 h += diffY;
rlm@46 20743 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20744 x += diffX;
rlm@46 20745 w -= diffX;
rlm@46 20746 break;
rlm@46 20747 }
rlm@46 20748
rlm@46 20749 var sw = this.snap(w, wi, mw);
rlm@46 20750 var sh = this.snap(h, hi, mh);
rlm@46 20751 if(sw != w || sh != h){
rlm@46 20752 switch(pos){
rlm@46 20753 case "northeast":
rlm@46 20754 y -= sh - h;
rlm@46 20755 break;
rlm@46 20756 case "north":
rlm@46 20757 y -= sh - h;
rlm@46 20758 break;
rlm@46 20759 case "southwest":
rlm@46 20760 x -= sw - w;
rlm@46 20761 break;
rlm@46 20762 case "west":
rlm@46 20763 x -= sw - w;
rlm@46 20764 break;
rlm@46 20765 case "northwest":
rlm@46 20766 x -= sw - w;
rlm@46 20767 y -= sh - h;
rlm@46 20768 break;
rlm@46 20769 }
rlm@46 20770 w = sw;
rlm@46 20771 h = sh;
rlm@46 20772 }
rlm@46 20773
rlm@46 20774 if(this.preserveRatio){
rlm@46 20775 switch(pos){
rlm@46 20776 case "southeast":
rlm@46 20777 case "east":
rlm@46 20778 h = oh * (w/ow);
rlm@46 20779 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20780 w = ow * (h/oh);
rlm@46 20781 break;
rlm@46 20782 case "south":
rlm@46 20783 w = ow * (h/oh);
rlm@46 20784 w = Math.min(Math.max(mw, w), mxw);
rlm@46 20785 h = oh * (w/ow);
rlm@46 20786 break;
rlm@46 20787 case "northeast":
rlm@46 20788 w = ow * (h/oh);
rlm@46 20789 w = Math.min(Math.max(mw, w), mxw);
rlm@46 20790 h = oh * (w/ow);
rlm@46 20791 break;
rlm@46 20792 case "north":
rlm@46 20793 var tw = w;
rlm@46 20794 w = ow * (h/oh);
rlm@46 20795 w = Math.min(Math.max(mw, w), mxw);
rlm@46 20796 h = oh * (w/ow);
rlm@46 20797 x += (tw - w) / 2;
rlm@46 20798 break;
rlm@46 20799 case "southwest":
rlm@46 20800 h = oh * (w/ow);
rlm@46 20801 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20802 var tw = w;
rlm@46 20803 w = ow * (h/oh);
rlm@46 20804 x += tw - w;
rlm@46 20805 break;
rlm@46 20806 case "west":
rlm@46 20807 var th = h;
rlm@46 20808 h = oh * (w/ow);
rlm@46 20809 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20810 y += (th - h) / 2;
rlm@46 20811 var tw = w;
rlm@46 20812 w = ow * (h/oh);
rlm@46 20813 x += tw - w;
rlm@46 20814 break;
rlm@46 20815 case "northwest":
rlm@46 20816 var tw = w;
rlm@46 20817 var th = h;
rlm@46 20818 h = oh * (w/ow);
rlm@46 20819 h = Math.min(Math.max(mh, h), mxh);
rlm@46 20820 w = ow * (h/oh);
rlm@46 20821 y += th - h;
rlm@46 20822 x += tw - w;
rlm@46 20823 break;
rlm@46 20824
rlm@46 20825 }
rlm@46 20826 }
rlm@46 20827 this.proxy.setBounds(x, y, w, h);
rlm@46 20828 if(this.dynamic){
rlm@46 20829 this.resizeElement();
rlm@46 20830 }
rlm@46 20831 }catch(e){}
rlm@46 20832 }
rlm@46 20833 },
rlm@46 20834
rlm@46 20835
rlm@46 20836 handleOver : function(){
rlm@46 20837 if(this.enabled){
rlm@46 20838 this.el.addClass("x-resizable-over");
rlm@46 20839 }
rlm@46 20840 },
rlm@46 20841
rlm@46 20842
rlm@46 20843 handleOut : function(){
rlm@46 20844 if(!this.resizing){
rlm@46 20845 this.el.removeClass("x-resizable-over");
rlm@46 20846 }
rlm@46 20847 },
rlm@46 20848
rlm@46 20849
rlm@46 20850 getEl : function(){
rlm@46 20851 return this.el;
rlm@46 20852 },
rlm@46 20853
rlm@46 20854
rlm@46 20855 getResizeChild : function(){
rlm@46 20856 return this.resizeChild;
rlm@46 20857 },
rlm@46 20858
rlm@46 20859
rlm@46 20860 destroy : function(removeEl){
rlm@46 20861 this.proxy.remove();
rlm@46 20862 if(this.overlay){
rlm@46 20863 this.overlay.removeAllListeners();
rlm@46 20864 this.overlay.remove();
rlm@46 20865 }
rlm@46 20866 var ps = Ext.Resizable.positions;
rlm@46 20867 for(var k in ps){
rlm@46 20868 if(typeof ps[k] != "function" && this[ps[k]]){
rlm@46 20869 var h = this[ps[k]];
rlm@46 20870 h.el.removeAllListeners();
rlm@46 20871 h.el.remove();
rlm@46 20872 }
rlm@46 20873 }
rlm@46 20874 if(removeEl){
rlm@46 20875 this.el.update("");
rlm@46 20876 this.el.remove();
rlm@46 20877 }
rlm@46 20878 },
rlm@46 20879
rlm@46 20880 syncHandleHeight : function(){
rlm@46 20881 var h = this.el.getHeight(true);
rlm@46 20882 if(this.west){
rlm@46 20883 this.west.el.setHeight(h);
rlm@46 20884 }
rlm@46 20885 if(this.east){
rlm@46 20886 this.east.el.setHeight(h);
rlm@46 20887 }
rlm@46 20888 }
rlm@46 20889 });
rlm@46 20890
rlm@46 20891
rlm@46 20892
rlm@46 20893 Ext.Resizable.positions = {
rlm@46 20894 n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast"
rlm@46 20895 };
rlm@46 20896
rlm@46 20897
rlm@46 20898 Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){
rlm@46 20899 if(!this.tpl){
rlm@46 20900
rlm@46 20901 var tpl = Ext.DomHelper.createTemplate(
rlm@46 20902 {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"}
rlm@46 20903 );
rlm@46 20904 tpl.compile();
rlm@46 20905 Ext.Resizable.Handle.prototype.tpl = tpl;
rlm@46 20906 }
rlm@46 20907 this.position = pos;
rlm@46 20908 this.rz = rz;
rlm@46 20909 this.el = this.tpl.append(rz.el.dom, [this.position], true);
rlm@46 20910 this.el.unselectable();
rlm@46 20911 if(transparent){
rlm@46 20912 this.el.setOpacity(0);
rlm@46 20913 }
rlm@46 20914 this.el.on("mousedown", this.onMouseDown, this);
rlm@46 20915 if(!disableTrackOver){
rlm@46 20916 this.el.on("mouseover", this.onMouseOver, this);
rlm@46 20917 this.el.on("mouseout", this.onMouseOut, this);
rlm@46 20918 }
rlm@46 20919 };
rlm@46 20920
rlm@46 20921
rlm@46 20922 Ext.Resizable.Handle.prototype = {
rlm@46 20923 afterResize : function(rz){
rlm@46 20924
rlm@46 20925 },
rlm@46 20926
rlm@46 20927 onMouseDown : function(e){
rlm@46 20928 this.rz.onMouseDown(this, e);
rlm@46 20929 },
rlm@46 20930
rlm@46 20931 onMouseOver : function(e){
rlm@46 20932 this.rz.handleOver(this, e);
rlm@46 20933 },
rlm@46 20934
rlm@46 20935 onMouseOut : function(e){
rlm@46 20936 this.rz.handleOut(this, e);
rlm@46 20937 }
rlm@46 20938 };
rlm@46 20939
rlm@46 20940
rlm@46 20941
rlm@46 20942
rlm@46 20943
rlm@46 20944 Ext.Editor = function(field, config){
rlm@46 20945 this.field = field;
rlm@46 20946 Ext.Editor.superclass.constructor.call(this, config);
rlm@46 20947 };
rlm@46 20948
rlm@46 20949 Ext.extend(Ext.Editor, Ext.Component, {
rlm@46 20950
rlm@46 20951
rlm@46 20952
rlm@46 20953
rlm@46 20954
rlm@46 20955 value : "",
rlm@46 20956
rlm@46 20957 alignment: "c-c?",
rlm@46 20958
rlm@46 20959 shadow : "frame",
rlm@46 20960
rlm@46 20961 constrain : false,
rlm@46 20962
rlm@46 20963 swallowKeys : true,
rlm@46 20964
rlm@46 20965 completeOnEnter : false,
rlm@46 20966
rlm@46 20967 cancelOnEsc : false,
rlm@46 20968
rlm@46 20969 updateEl : false,
rlm@46 20970
rlm@46 20971 initComponent : function(){
rlm@46 20972 Ext.Editor.superclass.initComponent.call(this);
rlm@46 20973 this.addEvents(
rlm@46 20974
rlm@46 20975 "beforestartedit",
rlm@46 20976
rlm@46 20977 "startedit",
rlm@46 20978
rlm@46 20979 "beforecomplete",
rlm@46 20980
rlm@46 20981 "complete",
rlm@46 20982
rlm@46 20983 "specialkey"
rlm@46 20984 );
rlm@46 20985 },
rlm@46 20986
rlm@46 20987 onRender : function(ct, position){
rlm@46 20988 this.el = new Ext.Layer({
rlm@46 20989 shadow: this.shadow,
rlm@46 20990 cls: "x-editor",
rlm@46 20991 parentEl : ct,
rlm@46 20992 shim : this.shim,
rlm@46 20993 shadowOffset:4,
rlm@46 20994 id: this.id,
rlm@46 20995 constrain: this.constrain
rlm@46 20996 });
rlm@46 20997 this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");
rlm@46 20998 if(this.field.msgTarget != 'title'){
rlm@46 20999 this.field.msgTarget = 'qtip';
rlm@46 21000 }
rlm@46 21001 this.field.inEditor = true;
rlm@46 21002 this.field.render(this.el);
rlm@46 21003 if(Ext.isGecko){
rlm@46 21004 this.field.el.dom.setAttribute('autocomplete', 'off');
rlm@46 21005 }
rlm@46 21006 this.field.on("specialkey", this.onSpecialKey, this);
rlm@46 21007 if(this.swallowKeys){
rlm@46 21008 this.field.el.swallowEvent(['keydown','keypress']);
rlm@46 21009 }
rlm@46 21010 this.field.show();
rlm@46 21011 this.field.on("blur", this.onBlur, this);
rlm@46 21012 if(this.field.grow){
rlm@46 21013 this.field.on("autosize", this.el.sync, this.el, {delay:1});
rlm@46 21014 }
rlm@46 21015 },
rlm@46 21016
rlm@46 21017 onSpecialKey : function(field, e){
rlm@46 21018 if(this.completeOnEnter && e.getKey() == e.ENTER){
rlm@46 21019 e.stopEvent();
rlm@46 21020 this.completeEdit();
rlm@46 21021 }else if(this.cancelOnEsc && e.getKey() == e.ESC){
rlm@46 21022 this.cancelEdit();
rlm@46 21023 }else{
rlm@46 21024 this.fireEvent('specialkey', field, e);
rlm@46 21025 }
rlm@46 21026 },
rlm@46 21027
rlm@46 21028
rlm@46 21029 startEdit : function(el, value){
rlm@46 21030 if(this.editing){
rlm@46 21031 this.completeEdit();
rlm@46 21032 }
rlm@46 21033 this.boundEl = Ext.get(el);
rlm@46 21034 var v = value !== undefined ? value : this.boundEl.dom.innerHTML;
rlm@46 21035 if(!this.rendered){
rlm@46 21036 this.render(this.parentEl || document.body);
rlm@46 21037 }
rlm@46 21038 if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){
rlm@46 21039 return;
rlm@46 21040 }
rlm@46 21041 this.startValue = v;
rlm@46 21042 this.field.setValue(v);
rlm@46 21043 this.doAutoSize();
rlm@46 21044 this.el.alignTo(this.boundEl, this.alignment);
rlm@46 21045 this.editing = true;
rlm@46 21046 this.show();
rlm@46 21047 },
rlm@46 21048
rlm@46 21049 doAutoSize : function(){
rlm@46 21050 if(this.autoSize){
rlm@46 21051 var sz = this.boundEl.getSize();
rlm@46 21052 switch(this.autoSize){
rlm@46 21053 case "width":
rlm@46 21054 this.setSize(sz.width, "");
rlm@46 21055 break;
rlm@46 21056 case "height":
rlm@46 21057 this.setSize("", sz.height);
rlm@46 21058 break;
rlm@46 21059 default:
rlm@46 21060 this.setSize(sz.width, sz.height);
rlm@46 21061 }
rlm@46 21062 }
rlm@46 21063 },
rlm@46 21064
rlm@46 21065
rlm@46 21066 setSize : function(w, h){
rlm@46 21067 delete this.field.lastSize;
rlm@46 21068 this.field.setSize(w, h);
rlm@46 21069 if(this.el){
rlm@46 21070 this.el.sync();
rlm@46 21071 }
rlm@46 21072 },
rlm@46 21073
rlm@46 21074
rlm@46 21075 realign : function(){
rlm@46 21076 this.el.alignTo(this.boundEl, this.alignment);
rlm@46 21077 },
rlm@46 21078
rlm@46 21079
rlm@46 21080 completeEdit : function(remainVisible){
rlm@46 21081 if(!this.editing){
rlm@46 21082 return;
rlm@46 21083 }
rlm@46 21084 var v = this.getValue();
rlm@46 21085 if(this.revertInvalid !== false && !this.field.isValid()){
rlm@46 21086 v = this.startValue;
rlm@46 21087 this.cancelEdit(true);
rlm@46 21088 }
rlm@46 21089 if(String(v) === String(this.startValue) && this.ignoreNoChange){
rlm@46 21090 this.editing = false;
rlm@46 21091 this.hide();
rlm@46 21092 return;
rlm@46 21093 }
rlm@46 21094 if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){
rlm@46 21095 this.editing = false;
rlm@46 21096 if(this.updateEl && this.boundEl){
rlm@46 21097 this.boundEl.update(v);
rlm@46 21098 }
rlm@46 21099 if(remainVisible !== true){
rlm@46 21100 this.hide();
rlm@46 21101 }
rlm@46 21102 this.fireEvent("complete", this, v, this.startValue);
rlm@46 21103 }
rlm@46 21104 },
rlm@46 21105
rlm@46 21106 onShow : function(){
rlm@46 21107 this.el.show();
rlm@46 21108 if(this.hideEl !== false){
rlm@46 21109 this.boundEl.hide();
rlm@46 21110 }
rlm@46 21111 this.field.show();
rlm@46 21112 if(Ext.isIE && !this.fixIEFocus){ this.fixIEFocus = true;
rlm@46 21113 this.deferredFocus.defer(50, this);
rlm@46 21114 }else{
rlm@46 21115 this.field.focus();
rlm@46 21116 }
rlm@46 21117 this.fireEvent("startedit", this.boundEl, this.startValue);
rlm@46 21118 },
rlm@46 21119
rlm@46 21120 deferredFocus : function(){
rlm@46 21121 if(this.editing){
rlm@46 21122 this.field.focus();
rlm@46 21123 }
rlm@46 21124 },
rlm@46 21125
rlm@46 21126
rlm@46 21127 cancelEdit : function(remainVisible){
rlm@46 21128 if(this.editing){
rlm@46 21129 this.setValue(this.startValue);
rlm@46 21130 if(remainVisible !== true){
rlm@46 21131 this.hide();
rlm@46 21132 }
rlm@46 21133 }
rlm@46 21134 },
rlm@46 21135
rlm@46 21136 onBlur : function(){
rlm@46 21137 if(this.allowBlur !== true && this.editing){
rlm@46 21138 this.completeEdit();
rlm@46 21139 }
rlm@46 21140 },
rlm@46 21141
rlm@46 21142 onHide : function(){
rlm@46 21143 if(this.editing){
rlm@46 21144 this.completeEdit();
rlm@46 21145 return;
rlm@46 21146 }
rlm@46 21147 this.field.blur();
rlm@46 21148 if(this.field.collapse){
rlm@46 21149 this.field.collapse();
rlm@46 21150 }
rlm@46 21151 this.el.hide();
rlm@46 21152 if(this.hideEl !== false){
rlm@46 21153 this.boundEl.show();
rlm@46 21154 }
rlm@46 21155 },
rlm@46 21156
rlm@46 21157
rlm@46 21158 setValue : function(v){
rlm@46 21159 this.field.setValue(v);
rlm@46 21160 },
rlm@46 21161
rlm@46 21162
rlm@46 21163 getValue : function(){
rlm@46 21164 return this.field.getValue();
rlm@46 21165 },
rlm@46 21166
rlm@46 21167 beforeDestroy : function(){
rlm@46 21168 this.field.destroy();
rlm@46 21169 this.field = null;
rlm@46 21170 }
rlm@46 21171 });
rlm@46 21172 Ext.reg('editor', Ext.Editor);
rlm@46 21173
rlm@46 21174 Ext.MessageBox = function(){
rlm@46 21175 var dlg, opt, mask, waitTimer;
rlm@46 21176 var bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl;
rlm@46 21177 var buttons, activeTextEl, bwidth, iconCls = '';
rlm@46 21178
rlm@46 21179
rlm@46 21180 var handleButton = function(button){
rlm@46 21181 if(dlg.isVisible()){
rlm@46 21182 dlg.hide();
rlm@46 21183 Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value], 1);
rlm@46 21184 }
rlm@46 21185 };
rlm@46 21186
rlm@46 21187
rlm@46 21188 var handleHide = function(){
rlm@46 21189 if(opt && opt.cls){
rlm@46 21190 dlg.el.removeClass(opt.cls);
rlm@46 21191 }
rlm@46 21192 progressBar.reset();
rlm@46 21193 };
rlm@46 21194
rlm@46 21195
rlm@46 21196 var handleEsc = function(d, k, e){
rlm@46 21197 if(opt && opt.closable !== false){
rlm@46 21198 dlg.hide();
rlm@46 21199 }
rlm@46 21200 if(e){
rlm@46 21201 e.stopEvent();
rlm@46 21202 }
rlm@46 21203 };
rlm@46 21204
rlm@46 21205
rlm@46 21206 var updateButtons = function(b){
rlm@46 21207 var width = 0;
rlm@46 21208 if(!b){
rlm@46 21209 buttons["ok"].hide();
rlm@46 21210 buttons["cancel"].hide();
rlm@46 21211 buttons["yes"].hide();
rlm@46 21212 buttons["no"].hide();
rlm@46 21213 return width;
rlm@46 21214 }
rlm@46 21215 dlg.footer.dom.style.display = '';
rlm@46 21216 for(var k in buttons){
rlm@46 21217 if(typeof buttons[k] != "function"){
rlm@46 21218 if(b[k]){
rlm@46 21219 buttons[k].show();
rlm@46 21220 buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]);
rlm@46 21221 width += buttons[k].el.getWidth()+15;
rlm@46 21222 }else{
rlm@46 21223 buttons[k].hide();
rlm@46 21224 }
rlm@46 21225 }
rlm@46 21226 }
rlm@46 21227 return width;
rlm@46 21228 };
rlm@46 21229
rlm@46 21230 return {
rlm@46 21231
rlm@46 21232 getDialog : function(titleText){
rlm@46 21233 if(!dlg){
rlm@46 21234 dlg = new Ext.Window({
rlm@46 21235 autoCreate : true,
rlm@46 21236 title:titleText,
rlm@46 21237 resizable:false,
rlm@46 21238 constrain:true,
rlm@46 21239 constrainHeader:true,
rlm@46 21240 minimizable : false,
rlm@46 21241 maximizable : false,
rlm@46 21242 stateful: false,
rlm@46 21243 modal: true,
rlm@46 21244 shim:true,
rlm@46 21245 buttonAlign:"center",
rlm@46 21246 width:400,
rlm@46 21247 height:100,
rlm@46 21248 minHeight: 80,
rlm@46 21249 plain:true,
rlm@46 21250 footer:true,
rlm@46 21251 closable:true,
rlm@46 21252 close : function(){
rlm@46 21253 if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){
rlm@46 21254 handleButton("no");
rlm@46 21255 }else{
rlm@46 21256 handleButton("cancel");
rlm@46 21257 }
rlm@46 21258 }
rlm@46 21259 });
rlm@46 21260 buttons = {};
rlm@46 21261 var bt = this.buttonText;
rlm@46 21262
rlm@46 21263 buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok"));
rlm@46 21264 buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes"));
rlm@46 21265 buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no"));
rlm@46 21266 buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel"));
rlm@46 21267 buttons["ok"].hideMode = buttons["yes"].hideMode = buttons["no"].hideMode = buttons["cancel"].hideMode = 'offsets';
rlm@46 21268 dlg.render(document.body);
rlm@46 21269 dlg.getEl().addClass('x-window-dlg');
rlm@46 21270 mask = dlg.mask;
rlm@46 21271 bodyEl = dlg.body.createChild({
rlm@46 21272 html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'
rlm@46 21273 });
rlm@46 21274 iconEl = Ext.get(bodyEl.dom.firstChild);
rlm@46 21275 var contentEl = bodyEl.dom.childNodes[1];
rlm@46 21276 msgEl = Ext.get(contentEl.firstChild);
rlm@46 21277 textboxEl = Ext.get(contentEl.childNodes[2].firstChild);
rlm@46 21278 textboxEl.enableDisplayMode();
rlm@46 21279 textboxEl.addKeyListener([10,13], function(){
rlm@46 21280 if(dlg.isVisible() && opt && opt.buttons){
rlm@46 21281 if(opt.buttons.ok){
rlm@46 21282 handleButton("ok");
rlm@46 21283 }else if(opt.buttons.yes){
rlm@46 21284 handleButton("yes");
rlm@46 21285 }
rlm@46 21286 }
rlm@46 21287 });
rlm@46 21288 textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]);
rlm@46 21289 textareaEl.enableDisplayMode();
rlm@46 21290 progressBar = new Ext.ProgressBar({
rlm@46 21291 renderTo:bodyEl
rlm@46 21292 });
rlm@46 21293 bodyEl.createChild({cls:'x-clear'});
rlm@46 21294 }
rlm@46 21295 return dlg;
rlm@46 21296 },
rlm@46 21297
rlm@46 21298
rlm@46 21299 updateText : function(text){
rlm@46 21300 if(!dlg.isVisible() && !opt.width){
rlm@46 21301 dlg.setSize(this.maxWidth, 100);
rlm@46 21302 }
rlm@46 21303 msgEl.update(text || '&#160;');
rlm@46 21304
rlm@46 21305 var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0;
rlm@46 21306 var mw = msgEl.getWidth() + msgEl.getMargins('lr');
rlm@46 21307 var fw = dlg.getFrameWidth('lr');
rlm@46 21308 var bw = dlg.body.getFrameWidth('lr');
rlm@46 21309 if (Ext.isIE && iw > 0){
rlm@46 21310
rlm@46 21311
rlm@46 21312 iw += 3;
rlm@46 21313 }
rlm@46 21314 var w = Math.max(Math.min(opt.width || iw+mw+fw+bw, this.maxWidth),
rlm@46 21315 Math.max(opt.minWidth || this.minWidth, bwidth || 0));
rlm@46 21316
rlm@46 21317 if(opt.prompt === true){
rlm@46 21318 activeTextEl.setWidth(w-iw-fw-bw);
rlm@46 21319 }
rlm@46 21320 if(opt.progress === true || opt.wait === true){
rlm@46 21321 progressBar.setSize(w-iw-fw-bw);
rlm@46 21322 }
rlm@46 21323 dlg.setSize(w, 'auto').center();
rlm@46 21324 return this;
rlm@46 21325 },
rlm@46 21326
rlm@46 21327
rlm@46 21328 updateProgress : function(value, progressText, msg){
rlm@46 21329 progressBar.updateProgress(value, progressText);
rlm@46 21330 if(msg){
rlm@46 21331 this.updateText(msg);
rlm@46 21332 }
rlm@46 21333 return this;
rlm@46 21334 },
rlm@46 21335
rlm@46 21336
rlm@46 21337 isVisible : function(){
rlm@46 21338 return dlg && dlg.isVisible();
rlm@46 21339 },
rlm@46 21340
rlm@46 21341
rlm@46 21342 hide : function(){
rlm@46 21343 if(this.isVisible()){
rlm@46 21344 dlg.hide();
rlm@46 21345 handleHide();
rlm@46 21346 }
rlm@46 21347 return this;
rlm@46 21348 },
rlm@46 21349
rlm@46 21350
rlm@46 21351 show : function(options){
rlm@46 21352 if(this.isVisible()){
rlm@46 21353 this.hide();
rlm@46 21354 }
rlm@46 21355 opt = options;
rlm@46 21356 var d = this.getDialog(opt.title || "&#160;");
rlm@46 21357
rlm@46 21358 d.setTitle(opt.title || "&#160;");
rlm@46 21359 var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true);
rlm@46 21360 d.tools.close.setDisplayed(allowClose);
rlm@46 21361 activeTextEl = textboxEl;
rlm@46 21362 opt.prompt = opt.prompt || (opt.multiline ? true : false);
rlm@46 21363 if(opt.prompt){
rlm@46 21364 if(opt.multiline){
rlm@46 21365 textboxEl.hide();
rlm@46 21366 textareaEl.show();
rlm@46 21367 textareaEl.setHeight(typeof opt.multiline == "number" ?
rlm@46 21368 opt.multiline : this.defaultTextHeight);
rlm@46 21369 activeTextEl = textareaEl;
rlm@46 21370 }else{
rlm@46 21371 textboxEl.show();
rlm@46 21372 textareaEl.hide();
rlm@46 21373 }
rlm@46 21374 }else{
rlm@46 21375 textboxEl.hide();
rlm@46 21376 textareaEl.hide();
rlm@46 21377 }
rlm@46 21378 activeTextEl.dom.value = opt.value || "";
rlm@46 21379 if(opt.prompt){
rlm@46 21380 d.focusEl = activeTextEl;
rlm@46 21381 }else{
rlm@46 21382 var bs = opt.buttons;
rlm@46 21383 var db = null;
rlm@46 21384 if(bs && bs.ok){
rlm@46 21385 db = buttons["ok"];
rlm@46 21386 }else if(bs && bs.yes){
rlm@46 21387 db = buttons["yes"];
rlm@46 21388 }
rlm@46 21389 if (db){
rlm@46 21390 d.focusEl = db;
rlm@46 21391 }
rlm@46 21392 }
rlm@46 21393 if(opt.iconCls){
rlm@46 21394 d.setIconClass(opt.iconCls);
rlm@46 21395 }
rlm@46 21396 this.setIcon(opt.icon);
rlm@46 21397 bwidth = updateButtons(opt.buttons);
rlm@46 21398 progressBar.setVisible(opt.progress === true || opt.wait === true);
rlm@46 21399 this.updateProgress(0, opt.progressText);
rlm@46 21400 this.updateText(opt.msg);
rlm@46 21401 if(opt.cls){
rlm@46 21402 d.el.addClass(opt.cls);
rlm@46 21403 }
rlm@46 21404 d.proxyDrag = opt.proxyDrag === true;
rlm@46 21405 d.modal = opt.modal !== false;
rlm@46 21406 d.mask = opt.modal !== false ? mask : false;
rlm@46 21407 if(!d.isVisible()){
rlm@46 21408
rlm@46 21409 document.body.appendChild(dlg.el.dom);
rlm@46 21410 d.setAnimateTarget(opt.animEl);
rlm@46 21411 d.show(opt.animEl);
rlm@46 21412 }
rlm@46 21413
rlm@46 21414
rlm@46 21415 d.on('show', function(){
rlm@46 21416 if(allowClose === true){
rlm@46 21417 d.keyMap.enable();
rlm@46 21418 }else{
rlm@46 21419 d.keyMap.disable();
rlm@46 21420 }
rlm@46 21421 }, this, {single:true});
rlm@46 21422
rlm@46 21423 if(opt.wait === true){
rlm@46 21424 progressBar.wait(opt.waitConfig);
rlm@46 21425 }
rlm@46 21426 return this;
rlm@46 21427 },
rlm@46 21428
rlm@46 21429
rlm@46 21430 setIcon : function(icon){
rlm@46 21431 if(icon && icon != ''){
rlm@46 21432 iconEl.removeClass('x-hidden');
rlm@46 21433 iconEl.replaceClass(iconCls, icon);
rlm@46 21434 iconCls = icon;
rlm@46 21435 }else{
rlm@46 21436 iconEl.replaceClass(iconCls, 'x-hidden');
rlm@46 21437 iconCls = '';
rlm@46 21438 }
rlm@46 21439 return this;
rlm@46 21440 },
rlm@46 21441
rlm@46 21442
rlm@46 21443 progress : function(title, msg, progressText){
rlm@46 21444 this.show({
rlm@46 21445 title : title,
rlm@46 21446 msg : msg,
rlm@46 21447 buttons: false,
rlm@46 21448 progress:true,
rlm@46 21449 closable:false,
rlm@46 21450 minWidth: this.minProgressWidth,
rlm@46 21451 progressText: progressText
rlm@46 21452 });
rlm@46 21453 return this;
rlm@46 21454 },
rlm@46 21455
rlm@46 21456
rlm@46 21457 wait : function(msg, title, config){
rlm@46 21458 this.show({
rlm@46 21459 title : title,
rlm@46 21460 msg : msg,
rlm@46 21461 buttons: false,
rlm@46 21462 closable:false,
rlm@46 21463 wait:true,
rlm@46 21464 modal:true,
rlm@46 21465 minWidth: this.minProgressWidth,
rlm@46 21466 waitConfig: config
rlm@46 21467 });
rlm@46 21468 return this;
rlm@46 21469 },
rlm@46 21470
rlm@46 21471
rlm@46 21472 alert : function(title, msg, fn, scope){
rlm@46 21473 this.show({
rlm@46 21474 title : title,
rlm@46 21475 msg : msg,
rlm@46 21476 buttons: this.OK,
rlm@46 21477 fn: fn,
rlm@46 21478 scope : scope
rlm@46 21479 });
rlm@46 21480 return this;
rlm@46 21481 },
rlm@46 21482
rlm@46 21483
rlm@46 21484 confirm : function(title, msg, fn, scope){
rlm@46 21485 this.show({
rlm@46 21486 title : title,
rlm@46 21487 msg : msg,
rlm@46 21488 buttons: this.YESNO,
rlm@46 21489 fn: fn,
rlm@46 21490 scope : scope,
rlm@46 21491 icon: this.QUESTION
rlm@46 21492 });
rlm@46 21493 return this;
rlm@46 21494 },
rlm@46 21495
rlm@46 21496
rlm@46 21497 prompt : function(title, msg, fn, scope, multiline, value){
rlm@46 21498 this.show({
rlm@46 21499 title : title,
rlm@46 21500 msg : msg,
rlm@46 21501 buttons: this.OKCANCEL,
rlm@46 21502 fn: fn,
rlm@46 21503 minWidth:250,
rlm@46 21504 scope : scope,
rlm@46 21505 prompt:true,
rlm@46 21506 multiline: multiline,
rlm@46 21507 value: value
rlm@46 21508 });
rlm@46 21509 return this;
rlm@46 21510 },
rlm@46 21511
rlm@46 21512
rlm@46 21513 OK : {ok:true},
rlm@46 21514
rlm@46 21515 CANCEL : {cancel:true},
rlm@46 21516
rlm@46 21517 OKCANCEL : {ok:true, cancel:true},
rlm@46 21518
rlm@46 21519 YESNO : {yes:true, no:true},
rlm@46 21520
rlm@46 21521 YESNOCANCEL : {yes:true, no:true, cancel:true},
rlm@46 21522
rlm@46 21523 INFO : 'ext-mb-info',
rlm@46 21524
rlm@46 21525 WARNING : 'ext-mb-warning',
rlm@46 21526
rlm@46 21527 QUESTION : 'ext-mb-question',
rlm@46 21528
rlm@46 21529 ERROR : 'ext-mb-error',
rlm@46 21530
rlm@46 21531
rlm@46 21532 defaultTextHeight : 75,
rlm@46 21533
rlm@46 21534 maxWidth : 600,
rlm@46 21535
rlm@46 21536 minWidth : 100,
rlm@46 21537
rlm@46 21538 minProgressWidth : 250,
rlm@46 21539
rlm@46 21540 buttonText : {
rlm@46 21541 ok : "OK",
rlm@46 21542 cancel : "Cancel",
rlm@46 21543 yes : "Yes",
rlm@46 21544 no : "No"
rlm@46 21545 }
rlm@46 21546 };
rlm@46 21547 }();
rlm@46 21548
rlm@46 21549
rlm@46 21550 Ext.Msg = Ext.MessageBox;
rlm@46 21551
rlm@46 21552 Ext.Tip = Ext.extend(Ext.Panel, {
rlm@46 21553
rlm@46 21554
rlm@46 21555
rlm@46 21556 minWidth : 40,
rlm@46 21557
rlm@46 21558 maxWidth : 300,
rlm@46 21559
rlm@46 21560 shadow : "sides",
rlm@46 21561
rlm@46 21562 defaultAlign : "tl-bl?",
rlm@46 21563 autoRender: true,
rlm@46 21564 quickShowInterval : 250,
rlm@46 21565
rlm@46 21566
rlm@46 21567 frame:true,
rlm@46 21568 hidden:true,
rlm@46 21569 baseCls: 'x-tip',
rlm@46 21570 floating:{shadow:true,shim:true,useDisplay:true,constrain:false},
rlm@46 21571 autoHeight:true,
rlm@46 21572
rlm@46 21573
rlm@46 21574 initComponent : function(){
rlm@46 21575 Ext.Tip.superclass.initComponent.call(this);
rlm@46 21576 if(this.closable && !this.title){
rlm@46 21577 this.elements += ',header';
rlm@46 21578 }
rlm@46 21579 },
rlm@46 21580
rlm@46 21581
rlm@46 21582 afterRender : function(){
rlm@46 21583 Ext.Tip.superclass.afterRender.call(this);
rlm@46 21584 if(this.closable){
rlm@46 21585 this.addTool({
rlm@46 21586 id: 'close',
rlm@46 21587 handler: this.hide,
rlm@46 21588 scope: this
rlm@46 21589 });
rlm@46 21590 }
rlm@46 21591 },
rlm@46 21592
rlm@46 21593
rlm@46 21594 showAt : function(xy){
rlm@46 21595 Ext.Tip.superclass.show.call(this);
rlm@46 21596 if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){
rlm@46 21597 this.doAutoWidth();
rlm@46 21598 }
rlm@46 21599 if(this.constrainPosition){
rlm@46 21600 xy = this.el.adjustForConstraints(xy);
rlm@46 21601 }
rlm@46 21602 this.setPagePosition(xy[0], xy[1]);
rlm@46 21603 },
rlm@46 21604
rlm@46 21605
rlm@46 21606 doAutoWidth : function(){
rlm@46 21607 var bw = this.body.getTextWidth();
rlm@46 21608 if(this.title){
rlm@46 21609 bw = Math.max(bw, this.header.child('span').getTextWidth(this.title));
rlm@46 21610 }
rlm@46 21611 bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr");
rlm@46 21612 this.setWidth(bw.constrain(this.minWidth, this.maxWidth));
rlm@46 21613 },
rlm@46 21614
rlm@46 21615
rlm@46 21616 showBy : function(el, pos){
rlm@46 21617 if(!this.rendered){
rlm@46 21618 this.render(Ext.getBody());
rlm@46 21619 }
rlm@46 21620 this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));
rlm@46 21621 },
rlm@46 21622
rlm@46 21623 initDraggable : function(){
rlm@46 21624 this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);
rlm@46 21625 this.header.addClass('x-tip-draggable');
rlm@46 21626 }
rlm@46 21627 });
rlm@46 21628
rlm@46 21629
rlm@46 21630 Ext.Tip.DD = function(tip, config){
rlm@46 21631 Ext.apply(this, config);
rlm@46 21632 this.tip = tip;
rlm@46 21633 Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id);
rlm@46 21634 this.setHandleElId(tip.header.id);
rlm@46 21635 this.scroll = false;
rlm@46 21636 };
rlm@46 21637
rlm@46 21638 Ext.extend(Ext.Tip.DD, Ext.dd.DD, {
rlm@46 21639 moveOnly:true,
rlm@46 21640 scroll:false,
rlm@46 21641 headerOffsets:[100, 25],
rlm@46 21642 startDrag : function(){
rlm@46 21643 this.tip.el.disableShadow();
rlm@46 21644 },
rlm@46 21645 endDrag : function(e){
rlm@46 21646 this.tip.el.enableShadow(true);
rlm@46 21647 }
rlm@46 21648 });
rlm@46 21649
rlm@46 21650 Ext.ToolTip = Ext.extend(Ext.Tip, {
rlm@46 21651
rlm@46 21652
rlm@46 21653
rlm@46 21654 showDelay: 500,
rlm@46 21655
rlm@46 21656 hideDelay: 200,
rlm@46 21657
rlm@46 21658 dismissDelay: 5000,
rlm@46 21659
rlm@46 21660 mouseOffset: [15,18],
rlm@46 21661
rlm@46 21662 trackMouse : false,
rlm@46 21663 constrainPosition: true,
rlm@46 21664
rlm@46 21665
rlm@46 21666 initComponent: function(){
rlm@46 21667 Ext.ToolTip.superclass.initComponent.call(this);
rlm@46 21668 this.lastActive = new Date();
rlm@46 21669 this.initTarget();
rlm@46 21670 },
rlm@46 21671
rlm@46 21672
rlm@46 21673 initTarget : function(){
rlm@46 21674 if(this.target){
rlm@46 21675 this.target = Ext.get(this.target);
rlm@46 21676 this.target.on('mouseover', this.onTargetOver, this);
rlm@46 21677 this.target.on('mouseout', this.onTargetOut, this);
rlm@46 21678 this.target.on('mousemove', this.onMouseMove, this);
rlm@46 21679 }
rlm@46 21680 },
rlm@46 21681
rlm@46 21682
rlm@46 21683 onMouseMove : function(e){
rlm@46 21684 this.targetXY = e.getXY();
rlm@46 21685 if(!this.hidden && this.trackMouse){
rlm@46 21686 this.setPagePosition(this.getTargetXY());
rlm@46 21687 }
rlm@46 21688 },
rlm@46 21689
rlm@46 21690
rlm@46 21691 getTargetXY : function(){
rlm@46 21692 return [this.targetXY[0]+this.mouseOffset[0], this.targetXY[1]+this.mouseOffset[1]];
rlm@46 21693 },
rlm@46 21694
rlm@46 21695
rlm@46 21696 onTargetOver : function(e){
rlm@46 21697 if(this.disabled || e.within(this.target.dom, true)){
rlm@46 21698 return;
rlm@46 21699 }
rlm@46 21700 this.clearTimer('hide');
rlm@46 21701 this.targetXY = e.getXY();
rlm@46 21702 this.delayShow();
rlm@46 21703 },
rlm@46 21704
rlm@46 21705
rlm@46 21706 delayShow : function(){
rlm@46 21707 if(this.hidden && !this.showTimer){
rlm@46 21708 if(this.lastActive.getElapsed() < this.quickShowInterval){
rlm@46 21709 this.show();
rlm@46 21710 }else{
rlm@46 21711 this.showTimer = this.show.defer(this.showDelay, this);
rlm@46 21712 }
rlm@46 21713 }else if(!this.hidden && this.autoHide !== false){
rlm@46 21714 this.show();
rlm@46 21715 }
rlm@46 21716 },
rlm@46 21717
rlm@46 21718
rlm@46 21719 onTargetOut : function(e){
rlm@46 21720 if(this.disabled || e.within(this.target.dom, true)){
rlm@46 21721 return;
rlm@46 21722 }
rlm@46 21723 this.clearTimer('show');
rlm@46 21724 if(this.autoHide !== false){
rlm@46 21725 this.delayHide();
rlm@46 21726 }
rlm@46 21727 },
rlm@46 21728
rlm@46 21729
rlm@46 21730 delayHide : function(){
rlm@46 21731 if(!this.hidden && !this.hideTimer){
rlm@46 21732 this.hideTimer = this.hide.defer(this.hideDelay, this);
rlm@46 21733 }
rlm@46 21734 },
rlm@46 21735
rlm@46 21736
rlm@46 21737 hide: function(){
rlm@46 21738 this.clearTimer('dismiss');
rlm@46 21739 this.lastActive = new Date();
rlm@46 21740 Ext.ToolTip.superclass.hide.call(this);
rlm@46 21741 },
rlm@46 21742
rlm@46 21743
rlm@46 21744 show : function(){
rlm@46 21745 this.showAt(this.getTargetXY());
rlm@46 21746 },
rlm@46 21747
rlm@46 21748
rlm@46 21749 showAt : function(xy){
rlm@46 21750 this.lastActive = new Date();
rlm@46 21751 this.clearTimers();
rlm@46 21752 Ext.ToolTip.superclass.showAt.call(this, xy);
rlm@46 21753 if(this.dismissDelay && this.autoHide !== false){
rlm@46 21754 this.dismissTimer = this.hide.defer(this.dismissDelay, this);
rlm@46 21755 }
rlm@46 21756 },
rlm@46 21757
rlm@46 21758
rlm@46 21759 clearTimer : function(name){
rlm@46 21760 name = name + 'Timer';
rlm@46 21761 clearTimeout(this[name]);
rlm@46 21762 delete this[name];
rlm@46 21763 },
rlm@46 21764
rlm@46 21765
rlm@46 21766 clearTimers : function(){
rlm@46 21767 this.clearTimer('show');
rlm@46 21768 this.clearTimer('dismiss');
rlm@46 21769 this.clearTimer('hide');
rlm@46 21770 },
rlm@46 21771
rlm@46 21772
rlm@46 21773 onShow : function(){
rlm@46 21774 Ext.ToolTip.superclass.onShow.call(this);
rlm@46 21775 Ext.getDoc().on('mousedown', this.onDocMouseDown, this);
rlm@46 21776 },
rlm@46 21777
rlm@46 21778
rlm@46 21779 onHide : function(){
rlm@46 21780 Ext.ToolTip.superclass.onHide.call(this);
rlm@46 21781 Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
rlm@46 21782 },
rlm@46 21783
rlm@46 21784
rlm@46 21785 onDocMouseDown : function(e){
rlm@46 21786 if(this.autoHide !== false && !e.within(this.el.dom)){
rlm@46 21787 this.disable();
rlm@46 21788 this.enable.defer(100, this);
rlm@46 21789 }
rlm@46 21790 },
rlm@46 21791
rlm@46 21792
rlm@46 21793 onDisable : function(){
rlm@46 21794 this.clearTimers();
rlm@46 21795 this.hide();
rlm@46 21796 },
rlm@46 21797
rlm@46 21798
rlm@46 21799 adjustPosition : function(x, y){
rlm@46 21800
rlm@46 21801 var ay = this.targetXY[1], h = this.getSize().height;
rlm@46 21802 if(this.constrainPosition && y <= ay && (y+h) >= ay){
rlm@46 21803 y = ay-h-5;
rlm@46 21804 }
rlm@46 21805 return {x : x, y: y};
rlm@46 21806 },
rlm@46 21807
rlm@46 21808
rlm@46 21809 onDestroy : function(){
rlm@46 21810 Ext.ToolTip.superclass.onDestroy.call(this);
rlm@46 21811 if(this.target){
rlm@46 21812 this.target.un('mouseover', this.onTargetOver, this);
rlm@46 21813 this.target.un('mouseout', this.onTargetOut, this);
rlm@46 21814 this.target.un('mousemove', this.onMouseMove, this);
rlm@46 21815 }
rlm@46 21816 }
rlm@46 21817 });
rlm@46 21818
rlm@46 21819 Ext.QuickTip = Ext.extend(Ext.ToolTip, {
rlm@46 21820
rlm@46 21821
rlm@46 21822 interceptTitles : false,
rlm@46 21823
rlm@46 21824
rlm@46 21825 tagConfig : {
rlm@46 21826 namespace : "ext",
rlm@46 21827 attribute : "qtip",
rlm@46 21828 width : "qwidth",
rlm@46 21829 target : "target",
rlm@46 21830 title : "qtitle",
rlm@46 21831 hide : "hide",
rlm@46 21832 cls : "qclass",
rlm@46 21833 align : "qalign"
rlm@46 21834 },
rlm@46 21835
rlm@46 21836
rlm@46 21837 initComponent : function(){
rlm@46 21838 this.target = this.target || Ext.getDoc();
rlm@46 21839 this.targets = this.targets || {};
rlm@46 21840 Ext.QuickTip.superclass.initComponent.call(this);
rlm@46 21841 },
rlm@46 21842
rlm@46 21843
rlm@46 21844 register : function(config){
rlm@46 21845 var cs = Ext.isArray(config) ? config : arguments;
rlm@46 21846 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 21847 var c = cs[i];
rlm@46 21848 var target = c.target;
rlm@46 21849 if(target){
rlm@46 21850 if(Ext.isArray(target)){
rlm@46 21851 for(var j = 0, jlen = target.length; j < jlen; j++){
rlm@46 21852 this.targets[Ext.id(target[j])] = c;
rlm@46 21853 }
rlm@46 21854 } else{
rlm@46 21855 this.targets[Ext.id(target)] = c;
rlm@46 21856 }
rlm@46 21857 }
rlm@46 21858 }
rlm@46 21859 },
rlm@46 21860
rlm@46 21861
rlm@46 21862 unregister : function(el){
rlm@46 21863 delete this.targets[Ext.id(el)];
rlm@46 21864 },
rlm@46 21865
rlm@46 21866
rlm@46 21867 onTargetOver : function(e){
rlm@46 21868 if(this.disabled){
rlm@46 21869 return;
rlm@46 21870 }
rlm@46 21871 this.targetXY = e.getXY();
rlm@46 21872 var t = e.getTarget();
rlm@46 21873 if(!t || t.nodeType !== 1 || t == document || t == document.body){
rlm@46 21874 return;
rlm@46 21875 }
rlm@46 21876 if(this.activeTarget && t == this.activeTarget.el){
rlm@46 21877 this.clearTimer('hide');
rlm@46 21878 this.show();
rlm@46 21879 return;
rlm@46 21880 }
rlm@46 21881 if(t && this.targets[t.id]){
rlm@46 21882 this.activeTarget = this.targets[t.id];
rlm@46 21883 this.activeTarget.el = t;
rlm@46 21884 this.delayShow();
rlm@46 21885 return;
rlm@46 21886 }
rlm@46 21887 var ttp, et = Ext.fly(t), cfg = this.tagConfig;
rlm@46 21888 var ns = cfg.namespace;
rlm@46 21889 if(this.interceptTitles && t.title){
rlm@46 21890 ttp = t.title;
rlm@46 21891 t.qtip = ttp;
rlm@46 21892 t.removeAttribute("title");
rlm@46 21893 e.preventDefault();
rlm@46 21894 } else{
rlm@46 21895 ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute);
rlm@46 21896 }
rlm@46 21897 if(ttp){
rlm@46 21898 var autoHide = et.getAttributeNS(ns, cfg.hide);
rlm@46 21899 this.activeTarget = {
rlm@46 21900 el: t,
rlm@46 21901 text: ttp,
rlm@46 21902 width: et.getAttributeNS(ns, cfg.width),
rlm@46 21903 autoHide: autoHide != "user" && autoHide !== 'false',
rlm@46 21904 title: et.getAttributeNS(ns, cfg.title),
rlm@46 21905 cls: et.getAttributeNS(ns, cfg.cls),
rlm@46 21906 align: et.getAttributeNS(ns, cfg.align)
rlm@46 21907 };
rlm@46 21908 this.delayShow();
rlm@46 21909 }
rlm@46 21910 },
rlm@46 21911
rlm@46 21912
rlm@46 21913 onTargetOut : function(e){
rlm@46 21914 this.clearTimer('show');
rlm@46 21915 if(this.autoHide !== false){
rlm@46 21916 this.delayHide();
rlm@46 21917 }
rlm@46 21918 },
rlm@46 21919
rlm@46 21920
rlm@46 21921 showAt : function(xy){
rlm@46 21922 var t = this.activeTarget;
rlm@46 21923 if(t){
rlm@46 21924 if(!this.rendered){
rlm@46 21925 this.render(Ext.getBody());
rlm@46 21926 this.activeTarget = t;
rlm@46 21927 }
rlm@46 21928 if(t.width){
rlm@46 21929 this.setWidth(t.width);
rlm@46 21930 this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth()));
rlm@46 21931 this.measureWidth = false;
rlm@46 21932 } else{
rlm@46 21933 this.measureWidth = true;
rlm@46 21934 }
rlm@46 21935 this.setTitle(t.title || '');
rlm@46 21936 this.body.update(t.text);
rlm@46 21937 this.autoHide = t.autoHide;
rlm@46 21938 this.dismissDelay = t.dismissDelay || this.dismissDelay;
rlm@46 21939 if(this.lastCls){
rlm@46 21940 this.el.removeClass(this.lastCls);
rlm@46 21941 delete this.lastCls;
rlm@46 21942 }
rlm@46 21943 if(t.cls){
rlm@46 21944 this.el.addClass(t.cls);
rlm@46 21945 this.lastCls = t.cls;
rlm@46 21946 }
rlm@46 21947 if(t.align){
rlm@46 21948 xy = this.el.getAlignToXY(t.el, t.align);
rlm@46 21949 this.constrainPosition = false;
rlm@46 21950 } else{
rlm@46 21951 this.constrainPosition = true;
rlm@46 21952 }
rlm@46 21953 }
rlm@46 21954 Ext.QuickTip.superclass.showAt.call(this, xy);
rlm@46 21955 },
rlm@46 21956
rlm@46 21957
rlm@46 21958 hide: function(){
rlm@46 21959 delete this.activeTarget;
rlm@46 21960 Ext.QuickTip.superclass.hide.call(this);
rlm@46 21961 }
rlm@46 21962 });
rlm@46 21963
rlm@46 21964 Ext.QuickTips = function(){
rlm@46 21965 var tip, locks = [];
rlm@46 21966 return {
rlm@46 21967
rlm@46 21968 init : function(){
rlm@46 21969 if(!tip){
rlm@46 21970 tip = new Ext.QuickTip({elements:'header,body'});
rlm@46 21971 }
rlm@46 21972 },
rlm@46 21973
rlm@46 21974
rlm@46 21975 enable : function(){
rlm@46 21976 if(tip){
rlm@46 21977 locks.pop();
rlm@46 21978 if(locks.length < 1){
rlm@46 21979 tip.enable();
rlm@46 21980 }
rlm@46 21981 }
rlm@46 21982 },
rlm@46 21983
rlm@46 21984
rlm@46 21985 disable : function(){
rlm@46 21986 if(tip){
rlm@46 21987 tip.disable();
rlm@46 21988 }
rlm@46 21989 locks.push(1);
rlm@46 21990 },
rlm@46 21991
rlm@46 21992
rlm@46 21993 isEnabled : function(){
rlm@46 21994 return tip !== undefined && !tip.disabled;
rlm@46 21995 },
rlm@46 21996
rlm@46 21997
rlm@46 21998 getQuickTip : function(){
rlm@46 21999 return tip;
rlm@46 22000 },
rlm@46 22001
rlm@46 22002
rlm@46 22003 register : function(){
rlm@46 22004 tip.register.apply(tip, arguments);
rlm@46 22005 },
rlm@46 22006
rlm@46 22007
rlm@46 22008 unregister : function(){
rlm@46 22009 tip.unregister.apply(tip, arguments);
rlm@46 22010 },
rlm@46 22011
rlm@46 22012
rlm@46 22013 tips :function(){
rlm@46 22014 tip.register.apply(tip, arguments);
rlm@46 22015 }
rlm@46 22016 }
rlm@46 22017 }();
rlm@46 22018
rlm@46 22019 Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
rlm@46 22020 rootVisible : true,
rlm@46 22021 animate: Ext.enableFx,
rlm@46 22022 lines : true,
rlm@46 22023 enableDD : false,
rlm@46 22024 hlDrop : Ext.enableFx,
rlm@46 22025 pathSeparator: "/",
rlm@46 22026
rlm@46 22027 initComponent : function(){
rlm@46 22028 Ext.tree.TreePanel.superclass.initComponent.call(this);
rlm@46 22029
rlm@46 22030 if(!this.eventModel){
rlm@46 22031 this.eventModel = new Ext.tree.TreeEventModel(this);
rlm@46 22032 }
rlm@46 22033
rlm@46 22034 this.nodeHash = {};
rlm@46 22035
rlm@46 22036
rlm@46 22037 if(this.root){
rlm@46 22038 this.setRootNode(this.root);
rlm@46 22039 }
rlm@46 22040
rlm@46 22041 this.addEvents(
rlm@46 22042
rlm@46 22043
rlm@46 22044 "append",
rlm@46 22045
rlm@46 22046 "remove",
rlm@46 22047
rlm@46 22048 "movenode",
rlm@46 22049
rlm@46 22050 "insert",
rlm@46 22051
rlm@46 22052 "beforeappend",
rlm@46 22053
rlm@46 22054 "beforeremove",
rlm@46 22055
rlm@46 22056 "beforemovenode",
rlm@46 22057
rlm@46 22058 "beforeinsert",
rlm@46 22059
rlm@46 22060
rlm@46 22061 "beforeload",
rlm@46 22062
rlm@46 22063 "load",
rlm@46 22064
rlm@46 22065 "textchange",
rlm@46 22066
rlm@46 22067 "beforeexpandnode",
rlm@46 22068
rlm@46 22069 "beforecollapsenode",
rlm@46 22070
rlm@46 22071 "expandnode",
rlm@46 22072
rlm@46 22073 "disabledchange",
rlm@46 22074
rlm@46 22075 "collapsenode",
rlm@46 22076
rlm@46 22077 "beforeclick",
rlm@46 22078
rlm@46 22079 "click",
rlm@46 22080
rlm@46 22081 "checkchange",
rlm@46 22082
rlm@46 22083 "dblclick",
rlm@46 22084
rlm@46 22085 "contextmenu",
rlm@46 22086
rlm@46 22087 "beforechildrenrendered",
rlm@46 22088
rlm@46 22089 "startdrag",
rlm@46 22090
rlm@46 22091 "enddrag",
rlm@46 22092
rlm@46 22093 "dragdrop",
rlm@46 22094
rlm@46 22095 "beforenodedrop",
rlm@46 22096
rlm@46 22097 "nodedrop",
rlm@46 22098
rlm@46 22099 "nodedragover"
rlm@46 22100 );
rlm@46 22101 if(this.singleExpand){
rlm@46 22102 this.on("beforeexpandnode", this.restrictExpand, this);
rlm@46 22103 }
rlm@46 22104 },
rlm@46 22105
rlm@46 22106
rlm@46 22107 proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){
rlm@46 22108 if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){
rlm@46 22109 ename = ename+'node';
rlm@46 22110 }
rlm@46 22111
rlm@46 22112 return this.fireEvent(ename, a1, a2, a3, a4, a5, a6);
rlm@46 22113 },
rlm@46 22114
rlm@46 22115
rlm@46 22116
rlm@46 22117 getRootNode : function(){
rlm@46 22118 return this.root;
rlm@46 22119 },
rlm@46 22120
rlm@46 22121
rlm@46 22122 setRootNode : function(node){
rlm@46 22123 this.root = node;
rlm@46 22124 node.ownerTree = this;
rlm@46 22125 node.isRoot = true;
rlm@46 22126 this.registerNode(node);
rlm@46 22127 if(!this.rootVisible){
rlm@46 22128 var uiP = node.attributes.uiProvider;
rlm@46 22129 node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node);
rlm@46 22130 }
rlm@46 22131 return node;
rlm@46 22132 },
rlm@46 22133
rlm@46 22134
rlm@46 22135 getNodeById : function(id){
rlm@46 22136 return this.nodeHash[id];
rlm@46 22137 },
rlm@46 22138
rlm@46 22139
rlm@46 22140 registerNode : function(node){
rlm@46 22141 this.nodeHash[node.id] = node;
rlm@46 22142 },
rlm@46 22143
rlm@46 22144
rlm@46 22145 unregisterNode : function(node){
rlm@46 22146 delete this.nodeHash[node.id];
rlm@46 22147 },
rlm@46 22148
rlm@46 22149
rlm@46 22150 toString : function(){
rlm@46 22151 return "[Tree"+(this.id?" "+this.id:"")+"]";
rlm@46 22152 },
rlm@46 22153
rlm@46 22154
rlm@46 22155 restrictExpand : function(node){
rlm@46 22156 var p = node.parentNode;
rlm@46 22157 if(p){
rlm@46 22158 if(p.expandedChild && p.expandedChild.parentNode == p){
rlm@46 22159 p.expandedChild.collapse();
rlm@46 22160 }
rlm@46 22161 p.expandedChild = node;
rlm@46 22162 }
rlm@46 22163 },
rlm@46 22164
rlm@46 22165
rlm@46 22166 getChecked : function(a, startNode){
rlm@46 22167 startNode = startNode || this.root;
rlm@46 22168 var r = [];
rlm@46 22169 var f = function(){
rlm@46 22170 if(this.attributes.checked){
rlm@46 22171 r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a]));
rlm@46 22172 }
rlm@46 22173 }
rlm@46 22174 startNode.cascade(f);
rlm@46 22175 return r;
rlm@46 22176 },
rlm@46 22177
rlm@46 22178
rlm@46 22179 getEl : function(){
rlm@46 22180 return this.el;
rlm@46 22181 },
rlm@46 22182
rlm@46 22183
rlm@46 22184 getLoader : function(){
rlm@46 22185 return this.loader;
rlm@46 22186 },
rlm@46 22187
rlm@46 22188
rlm@46 22189 expandAll : function(){
rlm@46 22190 this.root.expand(true);
rlm@46 22191 },
rlm@46 22192
rlm@46 22193
rlm@46 22194 collapseAll : function(){
rlm@46 22195 this.root.collapse(true);
rlm@46 22196 },
rlm@46 22197
rlm@46 22198
rlm@46 22199 getSelectionModel : function(){
rlm@46 22200 if(!this.selModel){
rlm@46 22201 this.selModel = new Ext.tree.DefaultSelectionModel();
rlm@46 22202 }
rlm@46 22203 return this.selModel;
rlm@46 22204 },
rlm@46 22205
rlm@46 22206
rlm@46 22207 expandPath : function(path, attr, callback){
rlm@46 22208 attr = attr || "id";
rlm@46 22209 var keys = path.split(this.pathSeparator);
rlm@46 22210 var curNode = this.root;
rlm@46 22211 if(curNode.attributes[attr] != keys[1]){
rlm@46 22212 if(callback){
rlm@46 22213 callback(false, null);
rlm@46 22214 }
rlm@46 22215 return;
rlm@46 22216 }
rlm@46 22217 var index = 1;
rlm@46 22218 var f = function(){
rlm@46 22219 if(++index == keys.length){
rlm@46 22220 if(callback){
rlm@46 22221 callback(true, curNode);
rlm@46 22222 }
rlm@46 22223 return;
rlm@46 22224 }
rlm@46 22225 var c = curNode.findChild(attr, keys[index]);
rlm@46 22226 if(!c){
rlm@46 22227 if(callback){
rlm@46 22228 callback(false, curNode);
rlm@46 22229 }
rlm@46 22230 return;
rlm@46 22231 }
rlm@46 22232 curNode = c;
rlm@46 22233 c.expand(false, false, f);
rlm@46 22234 };
rlm@46 22235 curNode.expand(false, false, f);
rlm@46 22236 },
rlm@46 22237
rlm@46 22238
rlm@46 22239 selectPath : function(path, attr, callback){
rlm@46 22240 attr = attr || "id";
rlm@46 22241 var keys = path.split(this.pathSeparator);
rlm@46 22242 var v = keys.pop();
rlm@46 22243 if(keys.length > 0){
rlm@46 22244 var f = function(success, node){
rlm@46 22245 if(success && node){
rlm@46 22246 var n = node.findChild(attr, v);
rlm@46 22247 if(n){
rlm@46 22248 n.select();
rlm@46 22249 if(callback){
rlm@46 22250 callback(true, n);
rlm@46 22251 }
rlm@46 22252 }else if(callback){
rlm@46 22253 callback(false, n);
rlm@46 22254 }
rlm@46 22255 }else{
rlm@46 22256 if(callback){
rlm@46 22257 callback(false, n);
rlm@46 22258 }
rlm@46 22259 }
rlm@46 22260 };
rlm@46 22261 this.expandPath(keys.join(this.pathSeparator), attr, f);
rlm@46 22262 }else{
rlm@46 22263 this.root.select();
rlm@46 22264 if(callback){
rlm@46 22265 callback(true, this.root);
rlm@46 22266 }
rlm@46 22267 }
rlm@46 22268 },
rlm@46 22269
rlm@46 22270
rlm@46 22271 getTreeEl : function(){
rlm@46 22272 return this.body;
rlm@46 22273 },
rlm@46 22274
rlm@46 22275
rlm@46 22276 onRender : function(ct, position){
rlm@46 22277 Ext.tree.TreePanel.superclass.onRender.call(this, ct, position);
rlm@46 22278 this.el.addClass('x-tree');
rlm@46 22279 this.innerCt = this.body.createChild({tag:"ul",
rlm@46 22280 cls:"x-tree-root-ct " +
rlm@46 22281 (this.useArrows ? 'x-tree-arrows' : this.lines ? "x-tree-lines" : "x-tree-no-lines")});
rlm@46 22282 },
rlm@46 22283
rlm@46 22284
rlm@46 22285 initEvents : function(){
rlm@46 22286 Ext.tree.TreePanel.superclass.initEvents.call(this);
rlm@46 22287
rlm@46 22288 if(this.containerScroll){
rlm@46 22289 Ext.dd.ScrollManager.register(this.body);
rlm@46 22290 }
rlm@46 22291 if((this.enableDD || this.enableDrop) && !this.dropZone){
rlm@46 22292
rlm@46 22293 this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
rlm@46 22294 ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true
rlm@46 22295 });
rlm@46 22296 }
rlm@46 22297 if((this.enableDD || this.enableDrag) && !this.dragZone){
rlm@46 22298
rlm@46 22299 this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
rlm@46 22300 ddGroup: this.ddGroup || "TreeDD",
rlm@46 22301 scroll: this.ddScroll
rlm@46 22302 });
rlm@46 22303 }
rlm@46 22304 this.getSelectionModel().init(this);
rlm@46 22305 },
rlm@46 22306
rlm@46 22307
rlm@46 22308 afterRender : function(){
rlm@46 22309 Ext.tree.TreePanel.superclass.afterRender.call(this);
rlm@46 22310 this.root.render();
rlm@46 22311 if(!this.rootVisible){
rlm@46 22312 this.root.renderChildren();
rlm@46 22313 }
rlm@46 22314 },
rlm@46 22315
rlm@46 22316 onDestroy : function(){
rlm@46 22317 if(this.rendered){
rlm@46 22318 this.body.removeAllListeners();
rlm@46 22319 Ext.dd.ScrollManager.unregister(this.body);
rlm@46 22320 if(this.dropZone){
rlm@46 22321 this.dropZone.unreg();
rlm@46 22322 }
rlm@46 22323 if(this.dragZone){
rlm@46 22324 this.dragZone.unreg();
rlm@46 22325 }
rlm@46 22326 }
rlm@46 22327 this.root.destroy();
rlm@46 22328 this.nodeHash = null;
rlm@46 22329 Ext.tree.TreePanel.superclass.onDestroy.call(this);
rlm@46 22330 }
rlm@46 22331
rlm@46 22332
rlm@46 22333
rlm@46 22334
rlm@46 22335
rlm@46 22336
rlm@46 22337
rlm@46 22338
rlm@46 22339
rlm@46 22340
rlm@46 22341
rlm@46 22342
rlm@46 22343
rlm@46 22344
rlm@46 22345
rlm@46 22346
rlm@46 22347
rlm@46 22348
rlm@46 22349
rlm@46 22350
rlm@46 22351
rlm@46 22352
rlm@46 22353
rlm@46 22354
rlm@46 22355
rlm@46 22356
rlm@46 22357
rlm@46 22358
rlm@46 22359
rlm@46 22360
rlm@46 22361
rlm@46 22362
rlm@46 22363
rlm@46 22364
rlm@46 22365
rlm@46 22366
rlm@46 22367
rlm@46 22368
rlm@46 22369
rlm@46 22370
rlm@46 22371
rlm@46 22372
rlm@46 22373
rlm@46 22374
rlm@46 22375
rlm@46 22376
rlm@46 22377
rlm@46 22378 });
rlm@46 22379 Ext.reg('treepanel', Ext.tree.TreePanel);
rlm@46 22380 Ext.tree.TreeEventModel = function(tree){
rlm@46 22381 this.tree = tree;
rlm@46 22382 this.tree.on('render', this.initEvents, this);
rlm@46 22383 }
rlm@46 22384
rlm@46 22385 Ext.tree.TreeEventModel.prototype = {
rlm@46 22386 initEvents : function(){
rlm@46 22387 var el = this.tree.getTreeEl();
rlm@46 22388 el.on('click', this.delegateClick, this);
rlm@46 22389 if(this.tree.trackMouseOver !== false){
rlm@46 22390 el.on('mouseover', this.delegateOver, this);
rlm@46 22391 el.on('mouseout', this.delegateOut, this);
rlm@46 22392 }
rlm@46 22393 el.on('dblclick', this.delegateDblClick, this);
rlm@46 22394 el.on('contextmenu', this.delegateContextMenu, this);
rlm@46 22395 },
rlm@46 22396
rlm@46 22397 getNode : function(e){
rlm@46 22398 var t;
rlm@46 22399 if(t = e.getTarget('.x-tree-node-el', 10)){
rlm@46 22400 var id = Ext.fly(t, '_treeEvents').getAttributeNS('ext', 'tree-node-id');
rlm@46 22401 if(id){
rlm@46 22402 return this.tree.getNodeById(id);
rlm@46 22403 }
rlm@46 22404 }
rlm@46 22405 return null;
rlm@46 22406 },
rlm@46 22407
rlm@46 22408 getNodeTarget : function(e){
rlm@46 22409 var t = e.getTarget('.x-tree-node-icon', 1);
rlm@46 22410 if(!t){
rlm@46 22411 t = e.getTarget('.x-tree-node-el', 6);
rlm@46 22412 }
rlm@46 22413 return t;
rlm@46 22414 },
rlm@46 22415
rlm@46 22416 delegateOut : function(e, t){
rlm@46 22417 if(!this.beforeEvent(e)){
rlm@46 22418 return;
rlm@46 22419 }
rlm@46 22420 if(e.getTarget('.x-tree-ec-icon', 1)){
rlm@46 22421 var n = this.getNode(e);
rlm@46 22422 this.onIconOut(e, n);
rlm@46 22423 if(n == this.lastEcOver){
rlm@46 22424 delete this.lastEcOver;
rlm@46 22425 }
rlm@46 22426 }
rlm@46 22427 if((t = this.getNodeTarget(e)) && !e.within(t, true)){
rlm@46 22428 this.onNodeOut(e, this.getNode(e));
rlm@46 22429 }
rlm@46 22430 },
rlm@46 22431
rlm@46 22432 delegateOver : function(e, t){
rlm@46 22433 if(!this.beforeEvent(e)){
rlm@46 22434 return;
rlm@46 22435 }
rlm@46 22436 if(this.lastEcOver){
rlm@46 22437 this.onIconOut(e, this.lastEcOver);
rlm@46 22438 delete this.lastEcOver;
rlm@46 22439 }
rlm@46 22440 if(e.getTarget('.x-tree-ec-icon', 1)){
rlm@46 22441 this.lastEcOver = this.getNode(e);
rlm@46 22442 this.onIconOver(e, this.lastEcOver);
rlm@46 22443 }
rlm@46 22444 if(t = this.getNodeTarget(e)){
rlm@46 22445 this.onNodeOver(e, this.getNode(e));
rlm@46 22446 }
rlm@46 22447 },
rlm@46 22448
rlm@46 22449 delegateClick : function(e, t){
rlm@46 22450 if(!this.beforeEvent(e)){
rlm@46 22451 return;
rlm@46 22452 }
rlm@46 22453
rlm@46 22454 if(e.getTarget('input[type=checkbox]', 1)){
rlm@46 22455 this.onCheckboxClick(e, this.getNode(e));
rlm@46 22456 }
rlm@46 22457 else if(e.getTarget('.x-tree-ec-icon', 1)){
rlm@46 22458 this.onIconClick(e, this.getNode(e));
rlm@46 22459 }
rlm@46 22460 else if(this.getNodeTarget(e)){
rlm@46 22461 this.onNodeClick(e, this.getNode(e));
rlm@46 22462 }
rlm@46 22463 },
rlm@46 22464
rlm@46 22465 delegateDblClick : function(e, t){
rlm@46 22466 if(this.beforeEvent(e) && this.getNodeTarget(e)){
rlm@46 22467 this.onNodeDblClick(e, this.getNode(e));
rlm@46 22468 }
rlm@46 22469 },
rlm@46 22470
rlm@46 22471 delegateContextMenu : function(e, t){
rlm@46 22472 if(this.beforeEvent(e) && this.getNodeTarget(e)){
rlm@46 22473 this.onNodeContextMenu(e, this.getNode(e));
rlm@46 22474 }
rlm@46 22475 },
rlm@46 22476
rlm@46 22477 onNodeClick : function(e, node){
rlm@46 22478 node.ui.onClick(e);
rlm@46 22479 },
rlm@46 22480
rlm@46 22481 onNodeOver : function(e, node){
rlm@46 22482 node.ui.onOver(e);
rlm@46 22483 },
rlm@46 22484
rlm@46 22485 onNodeOut : function(e, node){
rlm@46 22486 node.ui.onOut(e);
rlm@46 22487 },
rlm@46 22488
rlm@46 22489 onIconOver : function(e, node){
rlm@46 22490 node.ui.addClass('x-tree-ec-over');
rlm@46 22491 },
rlm@46 22492
rlm@46 22493 onIconOut : function(e, node){
rlm@46 22494 node.ui.removeClass('x-tree-ec-over');
rlm@46 22495 },
rlm@46 22496
rlm@46 22497 onIconClick : function(e, node){
rlm@46 22498 node.ui.ecClick(e);
rlm@46 22499 },
rlm@46 22500
rlm@46 22501 onCheckboxClick : function(e, node){
rlm@46 22502 node.ui.onCheckChange(e);
rlm@46 22503 },
rlm@46 22504
rlm@46 22505 onNodeDblClick : function(e, node){
rlm@46 22506 node.ui.onDblClick(e);
rlm@46 22507 },
rlm@46 22508
rlm@46 22509 onNodeContextMenu : function(e, node){
rlm@46 22510 node.ui.onContextMenu(e);
rlm@46 22511 },
rlm@46 22512
rlm@46 22513 beforeEvent : function(e){
rlm@46 22514 if(this.disabled){
rlm@46 22515 e.stopEvent();
rlm@46 22516 return false;
rlm@46 22517 }
rlm@46 22518 return true;
rlm@46 22519 },
rlm@46 22520
rlm@46 22521 disable: function(){
rlm@46 22522 this.disabled = true;
rlm@46 22523 },
rlm@46 22524
rlm@46 22525 enable: function(){
rlm@46 22526 this.disabled = false;
rlm@46 22527 }
rlm@46 22528 };
rlm@46 22529
rlm@46 22530 Ext.tree.DefaultSelectionModel = function(config){
rlm@46 22531 this.selNode = null;
rlm@46 22532
rlm@46 22533 this.addEvents(
rlm@46 22534
rlm@46 22535 "selectionchange",
rlm@46 22536
rlm@46 22537
rlm@46 22538 "beforeselect"
rlm@46 22539 );
rlm@46 22540
rlm@46 22541 Ext.apply(this, config);
rlm@46 22542 Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);
rlm@46 22543 };
rlm@46 22544
rlm@46 22545 Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {
rlm@46 22546 init : function(tree){
rlm@46 22547 this.tree = tree;
rlm@46 22548 tree.getTreeEl().on("keydown", this.onKeyDown, this);
rlm@46 22549 tree.on("click", this.onNodeClick, this);
rlm@46 22550 },
rlm@46 22551
rlm@46 22552 onNodeClick : function(node, e){
rlm@46 22553 this.select(node);
rlm@46 22554 },
rlm@46 22555
rlm@46 22556
rlm@46 22557 select : function(node){
rlm@46 22558 var last = this.selNode;
rlm@46 22559 if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){
rlm@46 22560 if(last){
rlm@46 22561 last.ui.onSelectedChange(false);
rlm@46 22562 }
rlm@46 22563 this.selNode = node;
rlm@46 22564 node.ui.onSelectedChange(true);
rlm@46 22565 this.fireEvent("selectionchange", this, node, last);
rlm@46 22566 }
rlm@46 22567 return node;
rlm@46 22568 },
rlm@46 22569
rlm@46 22570
rlm@46 22571 unselect : function(node){
rlm@46 22572 if(this.selNode == node){
rlm@46 22573 this.clearSelections();
rlm@46 22574 }
rlm@46 22575 },
rlm@46 22576
rlm@46 22577
rlm@46 22578 clearSelections : function(){
rlm@46 22579 var n = this.selNode;
rlm@46 22580 if(n){
rlm@46 22581 n.ui.onSelectedChange(false);
rlm@46 22582 this.selNode = null;
rlm@46 22583 this.fireEvent("selectionchange", this, null);
rlm@46 22584 }
rlm@46 22585 return n;
rlm@46 22586 },
rlm@46 22587
rlm@46 22588
rlm@46 22589 getSelectedNode : function(){
rlm@46 22590 return this.selNode;
rlm@46 22591 },
rlm@46 22592
rlm@46 22593
rlm@46 22594 isSelected : function(node){
rlm@46 22595 return this.selNode == node;
rlm@46 22596 },
rlm@46 22597
rlm@46 22598
rlm@46 22599 selectPrevious : function(){
rlm@46 22600 var s = this.selNode || this.lastSelNode;
rlm@46 22601 if(!s){
rlm@46 22602 return null;
rlm@46 22603 }
rlm@46 22604 var ps = s.previousSibling;
rlm@46 22605 if(ps){
rlm@46 22606 if(!ps.isExpanded() || ps.childNodes.length < 1){
rlm@46 22607 return this.select(ps);
rlm@46 22608 } else{
rlm@46 22609 var lc = ps.lastChild;
rlm@46 22610 while(lc && lc.isExpanded() && lc.childNodes.length > 0){
rlm@46 22611 lc = lc.lastChild;
rlm@46 22612 }
rlm@46 22613 return this.select(lc);
rlm@46 22614 }
rlm@46 22615 } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
rlm@46 22616 return this.select(s.parentNode);
rlm@46 22617 }
rlm@46 22618 return null;
rlm@46 22619 },
rlm@46 22620
rlm@46 22621
rlm@46 22622 selectNext : function(){
rlm@46 22623 var s = this.selNode || this.lastSelNode;
rlm@46 22624 if(!s){
rlm@46 22625 return null;
rlm@46 22626 }
rlm@46 22627 if(s.firstChild && s.isExpanded()){
rlm@46 22628 return this.select(s.firstChild);
rlm@46 22629 }else if(s.nextSibling){
rlm@46 22630 return this.select(s.nextSibling);
rlm@46 22631 }else if(s.parentNode){
rlm@46 22632 var newS = null;
rlm@46 22633 s.parentNode.bubble(function(){
rlm@46 22634 if(this.nextSibling){
rlm@46 22635 newS = this.getOwnerTree().selModel.select(this.nextSibling);
rlm@46 22636 return false;
rlm@46 22637 }
rlm@46 22638 });
rlm@46 22639 return newS;
rlm@46 22640 }
rlm@46 22641 return null;
rlm@46 22642 },
rlm@46 22643
rlm@46 22644 onKeyDown : function(e){
rlm@46 22645 var s = this.selNode || this.lastSelNode;
rlm@46 22646
rlm@46 22647 var sm = this;
rlm@46 22648 if(!s){
rlm@46 22649 return;
rlm@46 22650 }
rlm@46 22651 var k = e.getKey();
rlm@46 22652 switch(k){
rlm@46 22653 case e.DOWN:
rlm@46 22654 e.stopEvent();
rlm@46 22655 this.selectNext();
rlm@46 22656 break;
rlm@46 22657 case e.UP:
rlm@46 22658 e.stopEvent();
rlm@46 22659 this.selectPrevious();
rlm@46 22660 break;
rlm@46 22661 case e.RIGHT:
rlm@46 22662 e.preventDefault();
rlm@46 22663 if(s.hasChildNodes()){
rlm@46 22664 if(!s.isExpanded()){
rlm@46 22665 s.expand();
rlm@46 22666 }else if(s.firstChild){
rlm@46 22667 this.select(s.firstChild, e);
rlm@46 22668 }
rlm@46 22669 }
rlm@46 22670 break;
rlm@46 22671 case e.LEFT:
rlm@46 22672 e.preventDefault();
rlm@46 22673 if(s.hasChildNodes() && s.isExpanded()){
rlm@46 22674 s.collapse();
rlm@46 22675 }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
rlm@46 22676 this.select(s.parentNode, e);
rlm@46 22677 }
rlm@46 22678 break;
rlm@46 22679 };
rlm@46 22680 }
rlm@46 22681 });
rlm@46 22682
rlm@46 22683
rlm@46 22684 Ext.tree.MultiSelectionModel = function(config){
rlm@46 22685 this.selNodes = [];
rlm@46 22686 this.selMap = {};
rlm@46 22687 this.addEvents(
rlm@46 22688
rlm@46 22689 "selectionchange"
rlm@46 22690 );
rlm@46 22691 Ext.apply(this, config);
rlm@46 22692 Ext.tree.MultiSelectionModel.superclass.constructor.call(this);
rlm@46 22693 };
rlm@46 22694
rlm@46 22695 Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {
rlm@46 22696 init : function(tree){
rlm@46 22697 this.tree = tree;
rlm@46 22698 tree.getTreeEl().on("keydown", this.onKeyDown, this);
rlm@46 22699 tree.on("click", this.onNodeClick, this);
rlm@46 22700 },
rlm@46 22701
rlm@46 22702 onNodeClick : function(node, e){
rlm@46 22703 this.select(node, e, e.ctrlKey);
rlm@46 22704 },
rlm@46 22705
rlm@46 22706
rlm@46 22707 select : function(node, e, keepExisting){
rlm@46 22708 if(keepExisting !== true){
rlm@46 22709 this.clearSelections(true);
rlm@46 22710 }
rlm@46 22711 if(this.isSelected(node)){
rlm@46 22712 this.lastSelNode = node;
rlm@46 22713 return node;
rlm@46 22714 }
rlm@46 22715 this.selNodes.push(node);
rlm@46 22716 this.selMap[node.id] = node;
rlm@46 22717 this.lastSelNode = node;
rlm@46 22718 node.ui.onSelectedChange(true);
rlm@46 22719 this.fireEvent("selectionchange", this, this.selNodes);
rlm@46 22720 return node;
rlm@46 22721 },
rlm@46 22722
rlm@46 22723
rlm@46 22724 unselect : function(node){
rlm@46 22725 if(this.selMap[node.id]){
rlm@46 22726 node.ui.onSelectedChange(false);
rlm@46 22727 var sn = this.selNodes;
rlm@46 22728 var index = sn.indexOf(node);
rlm@46 22729 if(index != -1){
rlm@46 22730 this.selNodes.splice(index, 1);
rlm@46 22731 }
rlm@46 22732 delete this.selMap[node.id];
rlm@46 22733 this.fireEvent("selectionchange", this, this.selNodes);
rlm@46 22734 }
rlm@46 22735 },
rlm@46 22736
rlm@46 22737
rlm@46 22738 clearSelections : function(suppressEvent){
rlm@46 22739 var sn = this.selNodes;
rlm@46 22740 if(sn.length > 0){
rlm@46 22741 for(var i = 0, len = sn.length; i < len; i++){
rlm@46 22742 sn[i].ui.onSelectedChange(false);
rlm@46 22743 }
rlm@46 22744 this.selNodes = [];
rlm@46 22745 this.selMap = {};
rlm@46 22746 if(suppressEvent !== true){
rlm@46 22747 this.fireEvent("selectionchange", this, this.selNodes);
rlm@46 22748 }
rlm@46 22749 }
rlm@46 22750 },
rlm@46 22751
rlm@46 22752
rlm@46 22753 isSelected : function(node){
rlm@46 22754 return this.selMap[node.id] ? true : false;
rlm@46 22755 },
rlm@46 22756
rlm@46 22757
rlm@46 22758 getSelectedNodes : function(){
rlm@46 22759 return this.selNodes;
rlm@46 22760 },
rlm@46 22761
rlm@46 22762 onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
rlm@46 22763
rlm@46 22764 selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
rlm@46 22765
rlm@46 22766 selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
rlm@46 22767 });
rlm@46 22768
rlm@46 22769 Ext.tree.TreeNode = function(attributes){
rlm@46 22770 attributes = attributes || {};
rlm@46 22771 if(typeof attributes == "string"){
rlm@46 22772 attributes = {text: attributes};
rlm@46 22773 }
rlm@46 22774 this.childrenRendered = false;
rlm@46 22775 this.rendered = false;
rlm@46 22776 Ext.tree.TreeNode.superclass.constructor.call(this, attributes);
rlm@46 22777 this.expanded = attributes.expanded === true;
rlm@46 22778 this.isTarget = attributes.isTarget !== false;
rlm@46 22779 this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;
rlm@46 22780 this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;
rlm@46 22781
rlm@46 22782
rlm@46 22783 this.text = attributes.text;
rlm@46 22784
rlm@46 22785 this.disabled = attributes.disabled === true;
rlm@46 22786
rlm@46 22787 this.addEvents(
rlm@46 22788
rlm@46 22789 "textchange",
rlm@46 22790
rlm@46 22791 "beforeexpand",
rlm@46 22792
rlm@46 22793 "beforecollapse",
rlm@46 22794
rlm@46 22795 "expand",
rlm@46 22796
rlm@46 22797 "disabledchange",
rlm@46 22798
rlm@46 22799 "collapse",
rlm@46 22800
rlm@46 22801 "beforeclick",
rlm@46 22802
rlm@46 22803 "click",
rlm@46 22804
rlm@46 22805 "checkchange",
rlm@46 22806
rlm@46 22807 "dblclick",
rlm@46 22808
rlm@46 22809 "contextmenu",
rlm@46 22810
rlm@46 22811 "beforechildrenrendered"
rlm@46 22812 );
rlm@46 22813
rlm@46 22814 var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
rlm@46 22815
rlm@46 22816
rlm@46 22817 this.ui = new uiClass(this);
rlm@46 22818 };
rlm@46 22819 Ext.extend(Ext.tree.TreeNode, Ext.data.Node, {
rlm@46 22820 preventHScroll: true,
rlm@46 22821
rlm@46 22822 isExpanded : function(){
rlm@46 22823 return this.expanded;
rlm@46 22824 },
rlm@46 22825
rlm@46 22826
rlm@46 22827 getUI : function(){
rlm@46 22828 return this.ui;
rlm@46 22829 },
rlm@46 22830
rlm@46 22831
rlm@46 22832 setFirstChild : function(node){
rlm@46 22833 var of = this.firstChild;
rlm@46 22834 Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);
rlm@46 22835 if(this.childrenRendered && of && node != of){
rlm@46 22836 of.renderIndent(true, true);
rlm@46 22837 }
rlm@46 22838 if(this.rendered){
rlm@46 22839 this.renderIndent(true, true);
rlm@46 22840 }
rlm@46 22841 },
rlm@46 22842
rlm@46 22843
rlm@46 22844 setLastChild : function(node){
rlm@46 22845 var ol = this.lastChild;
rlm@46 22846 Ext.tree.TreeNode.superclass.setLastChild.call(this, node);
rlm@46 22847 if(this.childrenRendered && ol && node != ol){
rlm@46 22848 ol.renderIndent(true, true);
rlm@46 22849 }
rlm@46 22850 if(this.rendered){
rlm@46 22851 this.renderIndent(true, true);
rlm@46 22852 }
rlm@46 22853 },
rlm@46 22854
rlm@46 22855
rlm@46 22856
rlm@46 22857 appendChild : function(){
rlm@46 22858 var node = Ext.tree.TreeNode.superclass.appendChild.apply(this, arguments);
rlm@46 22859 if(node && this.childrenRendered){
rlm@46 22860 node.render();
rlm@46 22861 }
rlm@46 22862 this.ui.updateExpandIcon();
rlm@46 22863 return node;
rlm@46 22864 },
rlm@46 22865
rlm@46 22866
rlm@46 22867 removeChild : function(node){
rlm@46 22868 this.ownerTree.getSelectionModel().unselect(node);
rlm@46 22869 Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
rlm@46 22870
rlm@46 22871 if(this.childrenRendered){
rlm@46 22872 node.ui.remove();
rlm@46 22873 }
rlm@46 22874 if(this.childNodes.length < 1){
rlm@46 22875 this.collapse(false, false);
rlm@46 22876 }else{
rlm@46 22877 this.ui.updateExpandIcon();
rlm@46 22878 }
rlm@46 22879 if(!this.firstChild && !this.isHiddenRoot()) {
rlm@46 22880 this.childrenRendered = false;
rlm@46 22881 }
rlm@46 22882 return node;
rlm@46 22883 },
rlm@46 22884
rlm@46 22885
rlm@46 22886 insertBefore : function(node, refNode){
rlm@46 22887 var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments);
rlm@46 22888 if(newNode && refNode && this.childrenRendered){
rlm@46 22889 node.render();
rlm@46 22890 }
rlm@46 22891 this.ui.updateExpandIcon();
rlm@46 22892 return newNode;
rlm@46 22893 },
rlm@46 22894
rlm@46 22895
rlm@46 22896 setText : function(text){
rlm@46 22897 var oldText = this.text;
rlm@46 22898 this.text = text;
rlm@46 22899 this.attributes.text = text;
rlm@46 22900 if(this.rendered){
rlm@46 22901 this.ui.onTextChange(this, text, oldText);
rlm@46 22902 }
rlm@46 22903 this.fireEvent("textchange", this, text, oldText);
rlm@46 22904 },
rlm@46 22905
rlm@46 22906
rlm@46 22907 select : function(){
rlm@46 22908 this.getOwnerTree().getSelectionModel().select(this);
rlm@46 22909 },
rlm@46 22910
rlm@46 22911
rlm@46 22912 unselect : function(){
rlm@46 22913 this.getOwnerTree().getSelectionModel().unselect(this);
rlm@46 22914 },
rlm@46 22915
rlm@46 22916
rlm@46 22917 isSelected : function(){
rlm@46 22918 return this.getOwnerTree().getSelectionModel().isSelected(this);
rlm@46 22919 },
rlm@46 22920
rlm@46 22921
rlm@46 22922 expand : function(deep, anim, callback){
rlm@46 22923 if(!this.expanded){
rlm@46 22924 if(this.fireEvent("beforeexpand", this, deep, anim) === false){
rlm@46 22925 return;
rlm@46 22926 }
rlm@46 22927 if(!this.childrenRendered){
rlm@46 22928 this.renderChildren();
rlm@46 22929 }
rlm@46 22930 this.expanded = true;
rlm@46 22931 if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){
rlm@46 22932 this.ui.animExpand(function(){
rlm@46 22933 this.fireEvent("expand", this);
rlm@46 22934 if(typeof callback == "function"){
rlm@46 22935 callback(this);
rlm@46 22936 }
rlm@46 22937 if(deep === true){
rlm@46 22938 this.expandChildNodes(true);
rlm@46 22939 }
rlm@46 22940 }.createDelegate(this));
rlm@46 22941 return;
rlm@46 22942 }else{
rlm@46 22943 this.ui.expand();
rlm@46 22944 this.fireEvent("expand", this);
rlm@46 22945 if(typeof callback == "function"){
rlm@46 22946 callback(this);
rlm@46 22947 }
rlm@46 22948 }
rlm@46 22949 }else{
rlm@46 22950 if(typeof callback == "function"){
rlm@46 22951 callback(this);
rlm@46 22952 }
rlm@46 22953 }
rlm@46 22954 if(deep === true){
rlm@46 22955 this.expandChildNodes(true);
rlm@46 22956 }
rlm@46 22957 },
rlm@46 22958
rlm@46 22959 isHiddenRoot : function(){
rlm@46 22960 return this.isRoot && !this.getOwnerTree().rootVisible;
rlm@46 22961 },
rlm@46 22962
rlm@46 22963
rlm@46 22964 collapse : function(deep, anim){
rlm@46 22965 if(this.expanded && !this.isHiddenRoot()){
rlm@46 22966 if(this.fireEvent("beforecollapse", this, deep, anim) === false){
rlm@46 22967 return;
rlm@46 22968 }
rlm@46 22969 this.expanded = false;
rlm@46 22970 if((this.getOwnerTree().animate && anim !== false) || anim){
rlm@46 22971 this.ui.animCollapse(function(){
rlm@46 22972 this.fireEvent("collapse", this);
rlm@46 22973 if(deep === true){
rlm@46 22974 this.collapseChildNodes(true);
rlm@46 22975 }
rlm@46 22976 }.createDelegate(this));
rlm@46 22977 return;
rlm@46 22978 }else{
rlm@46 22979 this.ui.collapse();
rlm@46 22980 this.fireEvent("collapse", this);
rlm@46 22981 }
rlm@46 22982 }
rlm@46 22983 if(deep === true){
rlm@46 22984 var cs = this.childNodes;
rlm@46 22985 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 22986 cs[i].collapse(true, false);
rlm@46 22987 }
rlm@46 22988 }
rlm@46 22989 },
rlm@46 22990
rlm@46 22991
rlm@46 22992 delayedExpand : function(delay){
rlm@46 22993 if(!this.expandProcId){
rlm@46 22994 this.expandProcId = this.expand.defer(delay, this);
rlm@46 22995 }
rlm@46 22996 },
rlm@46 22997
rlm@46 22998
rlm@46 22999 cancelExpand : function(){
rlm@46 23000 if(this.expandProcId){
rlm@46 23001 clearTimeout(this.expandProcId);
rlm@46 23002 }
rlm@46 23003 this.expandProcId = false;
rlm@46 23004 },
rlm@46 23005
rlm@46 23006
rlm@46 23007 toggle : function(){
rlm@46 23008 if(this.expanded){
rlm@46 23009 this.collapse();
rlm@46 23010 }else{
rlm@46 23011 this.expand();
rlm@46 23012 }
rlm@46 23013 },
rlm@46 23014
rlm@46 23015
rlm@46 23016 ensureVisible : function(callback){
rlm@46 23017 var tree = this.getOwnerTree();
rlm@46 23018 tree.expandPath(this.parentNode.getPath(), false, function(){
rlm@46 23019 var node = tree.getNodeById(this.id);
rlm@46 23020 tree.getTreeEl().scrollChildIntoView(node.ui.anchor);
rlm@46 23021 Ext.callback(callback);
rlm@46 23022 }.createDelegate(this));
rlm@46 23023 },
rlm@46 23024
rlm@46 23025
rlm@46 23026 expandChildNodes : function(deep){
rlm@46 23027 var cs = this.childNodes;
rlm@46 23028 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 23029 cs[i].expand(deep);
rlm@46 23030 }
rlm@46 23031 },
rlm@46 23032
rlm@46 23033
rlm@46 23034 collapseChildNodes : function(deep){
rlm@46 23035 var cs = this.childNodes;
rlm@46 23036 for(var i = 0, len = cs.length; i < len; i++) {
rlm@46 23037 cs[i].collapse(deep);
rlm@46 23038 }
rlm@46 23039 },
rlm@46 23040
rlm@46 23041
rlm@46 23042 disable : function(){
rlm@46 23043 this.disabled = true;
rlm@46 23044 this.unselect();
rlm@46 23045 if(this.rendered && this.ui.onDisableChange){
rlm@46 23046 this.ui.onDisableChange(this, true);
rlm@46 23047 }
rlm@46 23048 this.fireEvent("disabledchange", this, true);
rlm@46 23049 },
rlm@46 23050
rlm@46 23051
rlm@46 23052 enable : function(){
rlm@46 23053 this.disabled = false;
rlm@46 23054 if(this.rendered && this.ui.onDisableChange){
rlm@46 23055 this.ui.onDisableChange(this, false);
rlm@46 23056 }
rlm@46 23057 this.fireEvent("disabledchange", this, false);
rlm@46 23058 },
rlm@46 23059
rlm@46 23060
rlm@46 23061 renderChildren : function(suppressEvent){
rlm@46 23062 if(suppressEvent !== false){
rlm@46 23063 this.fireEvent("beforechildrenrendered", this);
rlm@46 23064 }
rlm@46 23065 var cs = this.childNodes;
rlm@46 23066 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 23067 cs[i].render(true);
rlm@46 23068 }
rlm@46 23069 this.childrenRendered = true;
rlm@46 23070 },
rlm@46 23071
rlm@46 23072
rlm@46 23073 sort : function(fn, scope){
rlm@46 23074 Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
rlm@46 23075 if(this.childrenRendered){
rlm@46 23076 var cs = this.childNodes;
rlm@46 23077 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 23078 cs[i].render(true);
rlm@46 23079 }
rlm@46 23080 }
rlm@46 23081 },
rlm@46 23082
rlm@46 23083
rlm@46 23084 render : function(bulkRender){
rlm@46 23085 this.ui.render(bulkRender);
rlm@46 23086 if(!this.rendered){
rlm@46 23087
rlm@46 23088 this.getOwnerTree().registerNode(this);
rlm@46 23089 this.rendered = true;
rlm@46 23090 if(this.expanded){
rlm@46 23091 this.expanded = false;
rlm@46 23092 this.expand(false, false);
rlm@46 23093 }
rlm@46 23094 }
rlm@46 23095 },
rlm@46 23096
rlm@46 23097
rlm@46 23098 renderIndent : function(deep, refresh){
rlm@46 23099 if(refresh){
rlm@46 23100 this.ui.childIndent = null;
rlm@46 23101 }
rlm@46 23102 this.ui.renderIndent();
rlm@46 23103 if(deep === true && this.childrenRendered){
rlm@46 23104 var cs = this.childNodes;
rlm@46 23105 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 23106 cs[i].renderIndent(true, refresh);
rlm@46 23107 }
rlm@46 23108 }
rlm@46 23109 },
rlm@46 23110
rlm@46 23111 beginUpdate : function(){
rlm@46 23112 this.childrenRendered = false;
rlm@46 23113 },
rlm@46 23114
rlm@46 23115 endUpdate : function(){
rlm@46 23116 if(this.expanded && this.rendered){
rlm@46 23117 this.renderChildren();
rlm@46 23118 }
rlm@46 23119 },
rlm@46 23120
rlm@46 23121 destroy : function(){
rlm@46 23122 for(var i = 0,l = this.childNodes.length; i < l; i++){
rlm@46 23123 this.childNodes[i].destroy();
rlm@46 23124 }
rlm@46 23125 this.childNodes = null;
rlm@46 23126 if(this.ui.destroy){
rlm@46 23127 this.ui.destroy();
rlm@46 23128 }
rlm@46 23129 }
rlm@46 23130 });
rlm@46 23131
rlm@46 23132 Ext.tree.AsyncTreeNode = function(config){
rlm@46 23133 this.loaded = false;
rlm@46 23134 this.loading = false;
rlm@46 23135 Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
rlm@46 23136
rlm@46 23137 this.addEvents('beforeload', 'load');
rlm@46 23138
rlm@46 23139
rlm@46 23140 };
rlm@46 23141 Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
rlm@46 23142 expand : function(deep, anim, callback){
rlm@46 23143 if(this.loading){
rlm@46 23144 var timer;
rlm@46 23145 var f = function(){
rlm@46 23146 if(!this.loading){
rlm@46 23147 clearInterval(timer);
rlm@46 23148 this.expand(deep, anim, callback);
rlm@46 23149 }
rlm@46 23150 }.createDelegate(this);
rlm@46 23151 timer = setInterval(f, 200);
rlm@46 23152 return;
rlm@46 23153 }
rlm@46 23154 if(!this.loaded){
rlm@46 23155 if(this.fireEvent("beforeload", this) === false){
rlm@46 23156 return;
rlm@46 23157 }
rlm@46 23158 this.loading = true;
rlm@46 23159 this.ui.beforeLoad(this);
rlm@46 23160 var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
rlm@46 23161 if(loader){
rlm@46 23162 loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback]));
rlm@46 23163 return;
rlm@46 23164 }
rlm@46 23165 }
rlm@46 23166 Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback);
rlm@46 23167 },
rlm@46 23168
rlm@46 23169
rlm@46 23170 isLoading : function(){
rlm@46 23171 return this.loading;
rlm@46 23172 },
rlm@46 23173
rlm@46 23174 loadComplete : function(deep, anim, callback){
rlm@46 23175 this.loading = false;
rlm@46 23176 this.loaded = true;
rlm@46 23177 this.ui.afterLoad(this);
rlm@46 23178 this.fireEvent("load", this);
rlm@46 23179 this.expand(deep, anim, callback);
rlm@46 23180 },
rlm@46 23181
rlm@46 23182
rlm@46 23183 isLoaded : function(){
rlm@46 23184 return this.loaded;
rlm@46 23185 },
rlm@46 23186
rlm@46 23187 hasChildNodes : function(){
rlm@46 23188 if(!this.isLeaf() && !this.loaded){
rlm@46 23189 return true;
rlm@46 23190 }else{
rlm@46 23191 return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);
rlm@46 23192 }
rlm@46 23193 },
rlm@46 23194
rlm@46 23195
rlm@46 23196 reload : function(callback){
rlm@46 23197 this.collapse(false, false);
rlm@46 23198 while(this.firstChild){
rlm@46 23199 this.removeChild(this.firstChild);
rlm@46 23200 }
rlm@46 23201 this.childrenRendered = false;
rlm@46 23202 this.loaded = false;
rlm@46 23203 if(this.isHiddenRoot()){
rlm@46 23204 this.expanded = false;
rlm@46 23205 }
rlm@46 23206 this.expand(false, false, callback);
rlm@46 23207 }
rlm@46 23208 });
rlm@46 23209
rlm@46 23210 Ext.tree.TreeNodeUI = function(node){
rlm@46 23211 this.node = node;
rlm@46 23212 this.rendered = false;
rlm@46 23213 this.animating = false;
rlm@46 23214 this.wasLeaf = true;
rlm@46 23215 this.ecc = 'x-tree-ec-icon x-tree-elbow';
rlm@46 23216 this.emptyIcon = Ext.BLANK_IMAGE_URL;
rlm@46 23217 };
rlm@46 23218
rlm@46 23219 Ext.tree.TreeNodeUI.prototype = {
rlm@46 23220
rlm@46 23221 removeChild : function(node){
rlm@46 23222 if(this.rendered){
rlm@46 23223 this.ctNode.removeChild(node.ui.getEl());
rlm@46 23224 }
rlm@46 23225 },
rlm@46 23226
rlm@46 23227
rlm@46 23228 beforeLoad : function(){
rlm@46 23229 this.addClass("x-tree-node-loading");
rlm@46 23230 },
rlm@46 23231
rlm@46 23232
rlm@46 23233 afterLoad : function(){
rlm@46 23234 this.removeClass("x-tree-node-loading");
rlm@46 23235 },
rlm@46 23236
rlm@46 23237
rlm@46 23238 onTextChange : function(node, text, oldText){
rlm@46 23239 if(this.rendered){
rlm@46 23240 this.textNode.innerHTML = text;
rlm@46 23241 }
rlm@46 23242 },
rlm@46 23243
rlm@46 23244
rlm@46 23245 onDisableChange : function(node, state){
rlm@46 23246 this.disabled = state;
rlm@46 23247 if (this.checkbox) {
rlm@46 23248 this.checkbox.disabled = state;
rlm@46 23249 }
rlm@46 23250 if(state){
rlm@46 23251 this.addClass("x-tree-node-disabled");
rlm@46 23252 }else{
rlm@46 23253 this.removeClass("x-tree-node-disabled");
rlm@46 23254 }
rlm@46 23255 },
rlm@46 23256
rlm@46 23257
rlm@46 23258 onSelectedChange : function(state){
rlm@46 23259 if(state){
rlm@46 23260 this.focus();
rlm@46 23261 this.addClass("x-tree-selected");
rlm@46 23262 }else{
rlm@46 23263
rlm@46 23264 this.removeClass("x-tree-selected");
rlm@46 23265 }
rlm@46 23266 },
rlm@46 23267
rlm@46 23268
rlm@46 23269 onMove : function(tree, node, oldParent, newParent, index, refNode){
rlm@46 23270 this.childIndent = null;
rlm@46 23271 if(this.rendered){
rlm@46 23272 var targetNode = newParent.ui.getContainer();
rlm@46 23273 if(!targetNode){
rlm@46 23274 this.holder = document.createElement("div");
rlm@46 23275 this.holder.appendChild(this.wrap);
rlm@46 23276 return;
rlm@46 23277 }
rlm@46 23278 var insertBefore = refNode ? refNode.ui.getEl() : null;
rlm@46 23279 if(insertBefore){
rlm@46 23280 targetNode.insertBefore(this.wrap, insertBefore);
rlm@46 23281 }else{
rlm@46 23282 targetNode.appendChild(this.wrap);
rlm@46 23283 }
rlm@46 23284 this.node.renderIndent(true);
rlm@46 23285 }
rlm@46 23286 },
rlm@46 23287
rlm@46 23288
rlm@46 23289 addClass : function(cls){
rlm@46 23290 if(this.elNode){
rlm@46 23291 Ext.fly(this.elNode).addClass(cls);
rlm@46 23292 }
rlm@46 23293 },
rlm@46 23294
rlm@46 23295
rlm@46 23296 removeClass : function(cls){
rlm@46 23297 if(this.elNode){
rlm@46 23298 Ext.fly(this.elNode).removeClass(cls);
rlm@46 23299 }
rlm@46 23300 },
rlm@46 23301
rlm@46 23302
rlm@46 23303 remove : function(){
rlm@46 23304 if(this.rendered){
rlm@46 23305 this.holder = document.createElement("div");
rlm@46 23306 this.holder.appendChild(this.wrap);
rlm@46 23307 }
rlm@46 23308 },
rlm@46 23309
rlm@46 23310
rlm@46 23311 fireEvent : function(){
rlm@46 23312 return this.node.fireEvent.apply(this.node, arguments);
rlm@46 23313 },
rlm@46 23314
rlm@46 23315
rlm@46 23316 initEvents : function(){
rlm@46 23317 this.node.on("move", this.onMove, this);
rlm@46 23318
rlm@46 23319 if(this.node.disabled){
rlm@46 23320 this.addClass("x-tree-node-disabled");
rlm@46 23321 if (this.checkbox) {
rlm@46 23322 this.checkbox.disabled = true;
rlm@46 23323 }
rlm@46 23324 }
rlm@46 23325 if(this.node.hidden){
rlm@46 23326 this.hide();
rlm@46 23327 }
rlm@46 23328 var ot = this.node.getOwnerTree();
rlm@46 23329 var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;
rlm@46 23330 if(dd && (!this.node.isRoot || ot.rootVisible)){
rlm@46 23331 Ext.dd.Registry.register(this.elNode, {
rlm@46 23332 node: this.node,
rlm@46 23333 handles: this.getDDHandles(),
rlm@46 23334 isHandle: false
rlm@46 23335 });
rlm@46 23336 }
rlm@46 23337 },
rlm@46 23338
rlm@46 23339
rlm@46 23340 getDDHandles : function(){
rlm@46 23341 return [this.iconNode, this.textNode, this.elNode];
rlm@46 23342 },
rlm@46 23343
rlm@46 23344
rlm@46 23345 hide : function(){
rlm@46 23346 this.node.hidden = true;
rlm@46 23347 if(this.wrap){
rlm@46 23348 this.wrap.style.display = "none";
rlm@46 23349 }
rlm@46 23350 },
rlm@46 23351
rlm@46 23352
rlm@46 23353 show : function(){
rlm@46 23354 this.node.hidden = false;
rlm@46 23355 if(this.wrap){
rlm@46 23356 this.wrap.style.display = "";
rlm@46 23357 }
rlm@46 23358 },
rlm@46 23359
rlm@46 23360
rlm@46 23361 onContextMenu : function(e){
rlm@46 23362 if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {
rlm@46 23363 e.preventDefault();
rlm@46 23364 this.focus();
rlm@46 23365 this.fireEvent("contextmenu", this.node, e);
rlm@46 23366 }
rlm@46 23367 },
rlm@46 23368
rlm@46 23369
rlm@46 23370 onClick : function(e){
rlm@46 23371 if(this.dropping){
rlm@46 23372 e.stopEvent();
rlm@46 23373 return;
rlm@46 23374 }
rlm@46 23375 if(this.fireEvent("beforeclick", this.node, e) !== false){
rlm@46 23376 var a = e.getTarget('a');
rlm@46 23377 if(!this.disabled && this.node.attributes.href && a){
rlm@46 23378 this.fireEvent("click", this.node, e);
rlm@46 23379 return;
rlm@46 23380 }else if(a && e.ctrlKey){
rlm@46 23381 e.stopEvent();
rlm@46 23382 }
rlm@46 23383 e.preventDefault();
rlm@46 23384 if(this.disabled){
rlm@46 23385 return;
rlm@46 23386 }
rlm@46 23387
rlm@46 23388 if(this.node.attributes.singleClickExpand && !this.animating && this.node.hasChildNodes()){
rlm@46 23389 this.node.toggle();
rlm@46 23390 }
rlm@46 23391
rlm@46 23392 this.fireEvent("click", this.node, e);
rlm@46 23393 }else{
rlm@46 23394 e.stopEvent();
rlm@46 23395 }
rlm@46 23396 },
rlm@46 23397
rlm@46 23398
rlm@46 23399 onDblClick : function(e){
rlm@46 23400 e.preventDefault();
rlm@46 23401 if(this.disabled){
rlm@46 23402 return;
rlm@46 23403 }
rlm@46 23404 if(this.checkbox){
rlm@46 23405 this.toggleCheck();
rlm@46 23406 }
rlm@46 23407 if(!this.animating && this.node.hasChildNodes()){
rlm@46 23408 this.node.toggle();
rlm@46 23409 }
rlm@46 23410 this.fireEvent("dblclick", this.node, e);
rlm@46 23411 },
rlm@46 23412
rlm@46 23413 onOver : function(e){
rlm@46 23414 this.addClass('x-tree-node-over');
rlm@46 23415 },
rlm@46 23416
rlm@46 23417 onOut : function(e){
rlm@46 23418 this.removeClass('x-tree-node-over');
rlm@46 23419 },
rlm@46 23420
rlm@46 23421
rlm@46 23422 onCheckChange : function(){
rlm@46 23423 var checked = this.checkbox.checked;
rlm@46 23424
rlm@46 23425 this.checkbox.defaultChecked = checked;
rlm@46 23426 this.node.attributes.checked = checked;
rlm@46 23427 this.fireEvent('checkchange', this.node, checked);
rlm@46 23428 },
rlm@46 23429
rlm@46 23430
rlm@46 23431 ecClick : function(e){
rlm@46 23432 if(!this.animating && (this.node.hasChildNodes() || this.node.attributes.expandable)){
rlm@46 23433 this.node.toggle();
rlm@46 23434 }
rlm@46 23435 },
rlm@46 23436
rlm@46 23437
rlm@46 23438 startDrop : function(){
rlm@46 23439 this.dropping = true;
rlm@46 23440 },
rlm@46 23441
rlm@46 23442
rlm@46 23443 endDrop : function(){
rlm@46 23444 setTimeout(function(){
rlm@46 23445 this.dropping = false;
rlm@46 23446 }.createDelegate(this), 50);
rlm@46 23447 },
rlm@46 23448
rlm@46 23449
rlm@46 23450 expand : function(){
rlm@46 23451 this.updateExpandIcon();
rlm@46 23452 this.ctNode.style.display = "";
rlm@46 23453 },
rlm@46 23454
rlm@46 23455
rlm@46 23456 focus : function(){
rlm@46 23457 if(!this.node.preventHScroll){
rlm@46 23458 try{this.anchor.focus();
rlm@46 23459 }catch(e){}
rlm@46 23460 }else if(!Ext.isIE){
rlm@46 23461 try{
rlm@46 23462 var noscroll = this.node.getOwnerTree().getTreeEl().dom;
rlm@46 23463 var l = noscroll.scrollLeft;
rlm@46 23464 this.anchor.focus();
rlm@46 23465 noscroll.scrollLeft = l;
rlm@46 23466 }catch(e){}
rlm@46 23467 }
rlm@46 23468 },
rlm@46 23469
rlm@46 23470
rlm@46 23471 toggleCheck : function(value){
rlm@46 23472 var cb = this.checkbox;
rlm@46 23473 if(cb){
rlm@46 23474 cb.checked = (value === undefined ? !cb.checked : value);
rlm@46 23475 this.onCheckChange();
rlm@46 23476 }
rlm@46 23477 },
rlm@46 23478
rlm@46 23479
rlm@46 23480 blur : function(){
rlm@46 23481 try{
rlm@46 23482 this.anchor.blur();
rlm@46 23483 }catch(e){}
rlm@46 23484 },
rlm@46 23485
rlm@46 23486
rlm@46 23487 animExpand : function(callback){
rlm@46 23488 var ct = Ext.get(this.ctNode);
rlm@46 23489 ct.stopFx();
rlm@46 23490 if(!this.node.hasChildNodes()){
rlm@46 23491 this.updateExpandIcon();
rlm@46 23492 this.ctNode.style.display = "";
rlm@46 23493 Ext.callback(callback);
rlm@46 23494 return;
rlm@46 23495 }
rlm@46 23496 this.animating = true;
rlm@46 23497 this.updateExpandIcon();
rlm@46 23498
rlm@46 23499 ct.slideIn('t', {
rlm@46 23500 callback : function(){
rlm@46 23501 this.animating = false;
rlm@46 23502 Ext.callback(callback);
rlm@46 23503 },
rlm@46 23504 scope: this,
rlm@46 23505 duration: this.node.ownerTree.duration || .25
rlm@46 23506 });
rlm@46 23507 },
rlm@46 23508
rlm@46 23509
rlm@46 23510 highlight : function(){
rlm@46 23511 var tree = this.node.getOwnerTree();
rlm@46 23512 Ext.fly(this.wrap).highlight(
rlm@46 23513 tree.hlColor || "C3DAF9",
rlm@46 23514 {endColor: tree.hlBaseColor}
rlm@46 23515 );
rlm@46 23516 },
rlm@46 23517
rlm@46 23518
rlm@46 23519 collapse : function(){
rlm@46 23520 this.updateExpandIcon();
rlm@46 23521 this.ctNode.style.display = "none";
rlm@46 23522 },
rlm@46 23523
rlm@46 23524
rlm@46 23525 animCollapse : function(callback){
rlm@46 23526 var ct = Ext.get(this.ctNode);
rlm@46 23527 ct.enableDisplayMode('block');
rlm@46 23528 ct.stopFx();
rlm@46 23529
rlm@46 23530 this.animating = true;
rlm@46 23531 this.updateExpandIcon();
rlm@46 23532
rlm@46 23533 ct.slideOut('t', {
rlm@46 23534 callback : function(){
rlm@46 23535 this.animating = false;
rlm@46 23536 Ext.callback(callback);
rlm@46 23537 },
rlm@46 23538 scope: this,
rlm@46 23539 duration: this.node.ownerTree.duration || .25
rlm@46 23540 });
rlm@46 23541 },
rlm@46 23542
rlm@46 23543
rlm@46 23544 getContainer : function(){
rlm@46 23545 return this.ctNode;
rlm@46 23546 },
rlm@46 23547
rlm@46 23548
rlm@46 23549 getEl : function(){
rlm@46 23550 return this.wrap;
rlm@46 23551 },
rlm@46 23552
rlm@46 23553
rlm@46 23554 appendDDGhost : function(ghostNode){
rlm@46 23555 ghostNode.appendChild(this.elNode.cloneNode(true));
rlm@46 23556 },
rlm@46 23557
rlm@46 23558
rlm@46 23559 getDDRepairXY : function(){
rlm@46 23560 return Ext.lib.Dom.getXY(this.iconNode);
rlm@46 23561 },
rlm@46 23562
rlm@46 23563
rlm@46 23564 onRender : function(){
rlm@46 23565 this.render();
rlm@46 23566 },
rlm@46 23567
rlm@46 23568
rlm@46 23569 render : function(bulkRender){
rlm@46 23570 var n = this.node, a = n.attributes;
rlm@46 23571 var targetNode = n.parentNode ?
rlm@46 23572 n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom;
rlm@46 23573
rlm@46 23574 if(!this.rendered){
rlm@46 23575 this.rendered = true;
rlm@46 23576
rlm@46 23577 this.renderElements(n, a, targetNode, bulkRender);
rlm@46 23578
rlm@46 23579 if(a.qtip){
rlm@46 23580 if(this.textNode.setAttributeNS){
rlm@46 23581 this.textNode.setAttributeNS("ext", "qtip", a.qtip);
rlm@46 23582 if(a.qtipTitle){
rlm@46 23583 this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle);
rlm@46 23584 }
rlm@46 23585 }else{
rlm@46 23586 this.textNode.setAttribute("ext:qtip", a.qtip);
rlm@46 23587 if(a.qtipTitle){
rlm@46 23588 this.textNode.setAttribute("ext:qtitle", a.qtipTitle);
rlm@46 23589 }
rlm@46 23590 }
rlm@46 23591 }else if(a.qtipCfg){
rlm@46 23592 a.qtipCfg.target = Ext.id(this.textNode);
rlm@46 23593 Ext.QuickTips.register(a.qtipCfg);
rlm@46 23594 }
rlm@46 23595 this.initEvents();
rlm@46 23596 if(!this.node.expanded){
rlm@46 23597 this.updateExpandIcon(true);
rlm@46 23598 }
rlm@46 23599 }else{
rlm@46 23600 if(bulkRender === true) {
rlm@46 23601 targetNode.appendChild(this.wrap);
rlm@46 23602 }
rlm@46 23603 }
rlm@46 23604 },
rlm@46 23605
rlm@46 23606
rlm@46 23607 renderElements : function(n, a, targetNode, bulkRender){
rlm@46 23608
rlm@46 23609 this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';
rlm@46 23610
rlm@46 23611 var cb = typeof a.checked == 'boolean';
rlm@46 23612
rlm@46 23613 var href = a.href ? a.href : Ext.isGecko ? "" : "#";
rlm@46 23614 var buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',
rlm@46 23615 '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
rlm@46 23616 '<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />',
rlm@46 23617 '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />',
rlm@46 23618 cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',
rlm@46 23619 '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',
rlm@46 23620 a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",
rlm@46 23621 '<ul class="x-tree-node-ct" style="display:none;"></ul>',
rlm@46 23622 "</li>"].join('');
rlm@46 23623
rlm@46 23624 var nel;
rlm@46 23625 if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){
rlm@46 23626 this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);
rlm@46 23627 }else{
rlm@46 23628 this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);
rlm@46 23629 }
rlm@46 23630
rlm@46 23631 this.elNode = this.wrap.childNodes[0];
rlm@46 23632 this.ctNode = this.wrap.childNodes[1];
rlm@46 23633 var cs = this.elNode.childNodes;
rlm@46 23634 this.indentNode = cs[0];
rlm@46 23635 this.ecNode = cs[1];
rlm@46 23636 this.iconNode = cs[2];
rlm@46 23637 var index = 3;
rlm@46 23638 if(cb){
rlm@46 23639 this.checkbox = cs[3];
rlm@46 23640
rlm@46 23641 this.checkbox.defaultChecked = this.checkbox.checked;
rlm@46 23642 index++;
rlm@46 23643 }
rlm@46 23644 this.anchor = cs[index];
rlm@46 23645 this.textNode = cs[index].firstChild;
rlm@46 23646 },
rlm@46 23647
rlm@46 23648
rlm@46 23649 getAnchor : function(){
rlm@46 23650 return this.anchor;
rlm@46 23651 },
rlm@46 23652
rlm@46 23653
rlm@46 23654 getTextEl : function(){
rlm@46 23655 return this.textNode;
rlm@46 23656 },
rlm@46 23657
rlm@46 23658
rlm@46 23659 getIconEl : function(){
rlm@46 23660 return this.iconNode;
rlm@46 23661 },
rlm@46 23662
rlm@46 23663
rlm@46 23664 isChecked : function(){
rlm@46 23665 return this.checkbox ? this.checkbox.checked : false;
rlm@46 23666 },
rlm@46 23667
rlm@46 23668
rlm@46 23669 updateExpandIcon : function(){
rlm@46 23670 if(this.rendered){
rlm@46 23671 var n = this.node, c1, c2;
rlm@46 23672 var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow";
rlm@46 23673 var hasChild = n.hasChildNodes();
rlm@46 23674 if(hasChild || n.attributes.expandable){
rlm@46 23675 if(n.expanded){
rlm@46 23676 cls += "-minus";
rlm@46 23677 c1 = "x-tree-node-collapsed";
rlm@46 23678 c2 = "x-tree-node-expanded";
rlm@46 23679 }else{
rlm@46 23680 cls += "-plus";
rlm@46 23681 c1 = "x-tree-node-expanded";
rlm@46 23682 c2 = "x-tree-node-collapsed";
rlm@46 23683 }
rlm@46 23684 if(this.wasLeaf){
rlm@46 23685 this.removeClass("x-tree-node-leaf");
rlm@46 23686 this.wasLeaf = false;
rlm@46 23687 }
rlm@46 23688 if(this.c1 != c1 || this.c2 != c2){
rlm@46 23689 Ext.fly(this.elNode).replaceClass(c1, c2);
rlm@46 23690 this.c1 = c1; this.c2 = c2;
rlm@46 23691 }
rlm@46 23692 }else{
rlm@46 23693 if(!this.wasLeaf){
rlm@46 23694 Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf");
rlm@46 23695 delete this.c1;
rlm@46 23696 delete this.c2;
rlm@46 23697 this.wasLeaf = true;
rlm@46 23698 }
rlm@46 23699 }
rlm@46 23700 var ecc = "x-tree-ec-icon "+cls;
rlm@46 23701 if(this.ecc != ecc){
rlm@46 23702 this.ecNode.className = ecc;
rlm@46 23703 this.ecc = ecc;
rlm@46 23704 }
rlm@46 23705 }
rlm@46 23706 },
rlm@46 23707
rlm@46 23708
rlm@46 23709 getChildIndent : function(){
rlm@46 23710 if(!this.childIndent){
rlm@46 23711 var buf = [];
rlm@46 23712 var p = this.node;
rlm@46 23713 while(p){
rlm@46 23714 if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){
rlm@46 23715 if(!p.isLast()) {
rlm@46 23716 buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-elbow-line" />');
rlm@46 23717 } else {
rlm@46 23718 buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-icon" />');
rlm@46 23719 }
rlm@46 23720 }
rlm@46 23721 p = p.parentNode;
rlm@46 23722 }
rlm@46 23723 this.childIndent = buf.join("");
rlm@46 23724 }
rlm@46 23725 return this.childIndent;
rlm@46 23726 },
rlm@46 23727
rlm@46 23728
rlm@46 23729 renderIndent : function(){
rlm@46 23730 if(this.rendered){
rlm@46 23731 var indent = "";
rlm@46 23732 var p = this.node.parentNode;
rlm@46 23733 if(p){
rlm@46 23734 indent = p.ui.getChildIndent();
rlm@46 23735 }
rlm@46 23736 if(this.indentMarkup != indent){
rlm@46 23737 this.indentNode.innerHTML = indent;
rlm@46 23738 this.indentMarkup = indent;
rlm@46 23739 }
rlm@46 23740 this.updateExpandIcon();
rlm@46 23741 }
rlm@46 23742 },
rlm@46 23743
rlm@46 23744 destroy : function(){
rlm@46 23745 if(this.elNode){
rlm@46 23746 Ext.dd.Registry.unregister(this.elNode.id);
rlm@46 23747 }
rlm@46 23748 delete this.elNode;
rlm@46 23749 delete this.ctNode;
rlm@46 23750 delete this.indentNode;
rlm@46 23751 delete this.ecNode;
rlm@46 23752 delete this.iconNode;
rlm@46 23753 delete this.checkbox;
rlm@46 23754 delete this.anchor;
rlm@46 23755 delete this.textNode;
rlm@46 23756 Ext.removeNode(this.ctNode);
rlm@46 23757 }
rlm@46 23758 };
rlm@46 23759
rlm@46 23760
rlm@46 23761 Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
rlm@46 23762
rlm@46 23763 render : function(){
rlm@46 23764 if(!this.rendered){
rlm@46 23765 var targetNode = this.node.ownerTree.innerCt.dom;
rlm@46 23766 this.node.expanded = true;
rlm@46 23767 targetNode.innerHTML = '<div class="x-tree-root-node"></div>';
rlm@46 23768 this.wrap = this.ctNode = targetNode.firstChild;
rlm@46 23769 }
rlm@46 23770 },
rlm@46 23771 collapse : Ext.emptyFn,
rlm@46 23772 expand : Ext.emptyFn
rlm@46 23773 });
rlm@46 23774
rlm@46 23775 Ext.tree.TreeLoader = function(config){
rlm@46 23776 this.baseParams = {};
rlm@46 23777 Ext.apply(this, config);
rlm@46 23778
rlm@46 23779 this.addEvents(
rlm@46 23780
rlm@46 23781 "beforeload",
rlm@46 23782
rlm@46 23783 "load",
rlm@46 23784
rlm@46 23785 "loadexception"
rlm@46 23786 );
rlm@46 23787
rlm@46 23788 Ext.tree.TreeLoader.superclass.constructor.call(this);
rlm@46 23789 };
rlm@46 23790
rlm@46 23791 Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
rlm@46 23792
rlm@46 23793
rlm@46 23794
rlm@46 23795
rlm@46 23796
rlm@46 23797
rlm@46 23798
rlm@46 23799 uiProviders : {},
rlm@46 23800
rlm@46 23801
rlm@46 23802 clearOnLoad : true,
rlm@46 23803
rlm@46 23804
rlm@46 23805 load : function(node, callback){
rlm@46 23806 if(this.clearOnLoad){
rlm@46 23807 while(node.firstChild){
rlm@46 23808 node.removeChild(node.firstChild);
rlm@46 23809 }
rlm@46 23810 }
rlm@46 23811 if(this.doPreload(node)){
rlm@46 23812 if(typeof callback == "function"){
rlm@46 23813 callback();
rlm@46 23814 }
rlm@46 23815 }else if(this.dataUrl||this.url){
rlm@46 23816 this.requestData(node, callback);
rlm@46 23817 }
rlm@46 23818 },
rlm@46 23819
rlm@46 23820 doPreload : function(node){
rlm@46 23821 if(node.attributes.children){
rlm@46 23822 if(node.childNodes.length < 1){
rlm@46 23823 var cs = node.attributes.children;
rlm@46 23824 node.beginUpdate();
rlm@46 23825 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 23826 var cn = node.appendChild(this.createNode(cs[i]));
rlm@46 23827 if(this.preloadChildren){
rlm@46 23828 this.doPreload(cn);
rlm@46 23829 }
rlm@46 23830 }
rlm@46 23831 node.endUpdate();
rlm@46 23832 }
rlm@46 23833 return true;
rlm@46 23834 }else {
rlm@46 23835 return false;
rlm@46 23836 }
rlm@46 23837 },
rlm@46 23838
rlm@46 23839 getParams: function(node){
rlm@46 23840 var buf = [], bp = this.baseParams;
rlm@46 23841 for(var key in bp){
rlm@46 23842 if(typeof bp[key] != "function"){
rlm@46 23843 buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&");
rlm@46 23844 }
rlm@46 23845 }
rlm@46 23846 buf.push("node=", encodeURIComponent(node.id));
rlm@46 23847 return buf.join("");
rlm@46 23848 },
rlm@46 23849
rlm@46 23850 requestData : function(node, callback){
rlm@46 23851 if(this.fireEvent("beforeload", this, node, callback) !== false){
rlm@46 23852 this.transId = Ext.Ajax.request({
rlm@46 23853 method:this.requestMethod,
rlm@46 23854 url: this.dataUrl||this.url,
rlm@46 23855 success: this.handleResponse,
rlm@46 23856 failure: this.handleFailure,
rlm@46 23857 scope: this,
rlm@46 23858 argument: {callback: callback, node: node},
rlm@46 23859 params: this.getParams(node)
rlm@46 23860 });
rlm@46 23861 }else{
rlm@46 23862
rlm@46 23863
rlm@46 23864 if(typeof callback == "function"){
rlm@46 23865 callback();
rlm@46 23866 }
rlm@46 23867 }
rlm@46 23868 },
rlm@46 23869
rlm@46 23870 isLoading : function(){
rlm@46 23871 return this.transId ? true : false;
rlm@46 23872 },
rlm@46 23873
rlm@46 23874 abort : function(){
rlm@46 23875 if(this.isLoading()){
rlm@46 23876 Ext.Ajax.abort(this.transId);
rlm@46 23877 }
rlm@46 23878 },
rlm@46 23879
rlm@46 23880
rlm@46 23881 createNode : function(attr){
rlm@46 23882
rlm@46 23883 if(this.baseAttrs){
rlm@46 23884 Ext.applyIf(attr, this.baseAttrs);
rlm@46 23885 }
rlm@46 23886 if(this.applyLoader !== false){
rlm@46 23887 attr.loader = this;
rlm@46 23888 }
rlm@46 23889 if(typeof attr.uiProvider == 'string'){
rlm@46 23890 attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
rlm@46 23891 }
rlm@46 23892 return(attr.leaf ?
rlm@46 23893 new Ext.tree.TreeNode(attr) :
rlm@46 23894 new Ext.tree.AsyncTreeNode(attr));
rlm@46 23895 },
rlm@46 23896
rlm@46 23897 processResponse : function(response, node, callback){
rlm@46 23898 var json = response.responseText;
rlm@46 23899 try {
rlm@46 23900 var o = eval("("+json+")");
rlm@46 23901 node.beginUpdate();
rlm@46 23902 for(var i = 0, len = o.length; i < len; i++){
rlm@46 23903 var n = this.createNode(o[i]);
rlm@46 23904 if(n){
rlm@46 23905 node.appendChild(n);
rlm@46 23906 }
rlm@46 23907 }
rlm@46 23908 node.endUpdate();
rlm@46 23909 if(typeof callback == "function"){
rlm@46 23910 callback(this, node);
rlm@46 23911 }
rlm@46 23912 }catch(e){
rlm@46 23913 this.handleFailure(response);
rlm@46 23914 }
rlm@46 23915 },
rlm@46 23916
rlm@46 23917 handleResponse : function(response){
rlm@46 23918 this.transId = false;
rlm@46 23919 var a = response.argument;
rlm@46 23920 this.processResponse(response, a.node, a.callback);
rlm@46 23921 this.fireEvent("load", this, a.node, response);
rlm@46 23922 },
rlm@46 23923
rlm@46 23924 handleFailure : function(response){
rlm@46 23925 this.transId = false;
rlm@46 23926 var a = response.argument;
rlm@46 23927 this.fireEvent("loadexception", this, a.node, response);
rlm@46 23928 if(typeof a.callback == "function"){
rlm@46 23929 a.callback(this, a.node);
rlm@46 23930 }
rlm@46 23931 }
rlm@46 23932 });
rlm@46 23933
rlm@46 23934 Ext.tree.TreeFilter = function(tree, config){
rlm@46 23935 this.tree = tree;
rlm@46 23936 this.filtered = {};
rlm@46 23937 Ext.apply(this, config);
rlm@46 23938 };
rlm@46 23939
rlm@46 23940 Ext.tree.TreeFilter.prototype = {
rlm@46 23941 clearBlank:false,
rlm@46 23942 reverse:false,
rlm@46 23943 autoClear:false,
rlm@46 23944 remove:false,
rlm@46 23945
rlm@46 23946
rlm@46 23947 filter : function(value, attr, startNode){
rlm@46 23948 attr = attr || "text";
rlm@46 23949 var f;
rlm@46 23950 if(typeof value == "string"){
rlm@46 23951 var vlen = value.length;
rlm@46 23952
rlm@46 23953 if(vlen == 0 && this.clearBlank){
rlm@46 23954 this.clear();
rlm@46 23955 return;
rlm@46 23956 }
rlm@46 23957 value = value.toLowerCase();
rlm@46 23958 f = function(n){
rlm@46 23959 return n.attributes[attr].substr(0, vlen).toLowerCase() == value;
rlm@46 23960 };
rlm@46 23961 }else if(value.exec){
rlm@46 23962 f = function(n){
rlm@46 23963 return value.test(n.attributes[attr]);
rlm@46 23964 };
rlm@46 23965 }else{
rlm@46 23966 throw 'Illegal filter type, must be string or regex';
rlm@46 23967 }
rlm@46 23968 this.filterBy(f, null, startNode);
rlm@46 23969 },
rlm@46 23970
rlm@46 23971
rlm@46 23972 filterBy : function(fn, scope, startNode){
rlm@46 23973 startNode = startNode || this.tree.root;
rlm@46 23974 if(this.autoClear){
rlm@46 23975 this.clear();
rlm@46 23976 }
rlm@46 23977 var af = this.filtered, rv = this.reverse;
rlm@46 23978 var f = function(n){
rlm@46 23979 if(n == startNode){
rlm@46 23980 return true;
rlm@46 23981 }
rlm@46 23982 if(af[n.id]){
rlm@46 23983 return false;
rlm@46 23984 }
rlm@46 23985 var m = fn.call(scope || n, n);
rlm@46 23986 if(!m || rv){
rlm@46 23987 af[n.id] = n;
rlm@46 23988 n.ui.hide();
rlm@46 23989 return false;
rlm@46 23990 }
rlm@46 23991 return true;
rlm@46 23992 };
rlm@46 23993 startNode.cascade(f);
rlm@46 23994 if(this.remove){
rlm@46 23995 for(var id in af){
rlm@46 23996 if(typeof id != "function"){
rlm@46 23997 var n = af[id];
rlm@46 23998 if(n && n.parentNode){
rlm@46 23999 n.parentNode.removeChild(n);
rlm@46 24000 }
rlm@46 24001 }
rlm@46 24002 }
rlm@46 24003 }
rlm@46 24004 },
rlm@46 24005
rlm@46 24006
rlm@46 24007 clear : function(){
rlm@46 24008 var t = this.tree;
rlm@46 24009 var af = this.filtered;
rlm@46 24010 for(var id in af){
rlm@46 24011 if(typeof id != "function"){
rlm@46 24012 var n = af[id];
rlm@46 24013 if(n){
rlm@46 24014 n.ui.show();
rlm@46 24015 }
rlm@46 24016 }
rlm@46 24017 }
rlm@46 24018 this.filtered = {};
rlm@46 24019 }
rlm@46 24020 };
rlm@46 24021
rlm@46 24022
rlm@46 24023 Ext.tree.TreeSorter = function(tree, config){
rlm@46 24024
rlm@46 24025
rlm@46 24026
rlm@46 24027
rlm@46 24028
rlm@46 24029
rlm@46 24030
rlm@46 24031 Ext.apply(this, config);
rlm@46 24032 tree.on("beforechildrenrendered", this.doSort, this);
rlm@46 24033 tree.on("append", this.updateSort, this);
rlm@46 24034 tree.on("insert", this.updateSort, this);
rlm@46 24035 tree.on("textchange", this.updateSortParent, this);
rlm@46 24036
rlm@46 24037 var dsc = this.dir && this.dir.toLowerCase() == "desc";
rlm@46 24038 var p = this.property || "text";
rlm@46 24039 var sortType = this.sortType;
rlm@46 24040 var fs = this.folderSort;
rlm@46 24041 var cs = this.caseSensitive === true;
rlm@46 24042 var leafAttr = this.leafAttr || 'leaf';
rlm@46 24043
rlm@46 24044 this.sortFn = function(n1, n2){
rlm@46 24045 if(fs){
rlm@46 24046 if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){
rlm@46 24047 return 1;
rlm@46 24048 }
rlm@46 24049 if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){
rlm@46 24050 return -1;
rlm@46 24051 }
rlm@46 24052 }
rlm@46 24053 var v1 = sortType ? sortType(n1) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());
rlm@46 24054 var v2 = sortType ? sortType(n2) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());
rlm@46 24055 if(v1 < v2){
rlm@46 24056 return dsc ? +1 : -1;
rlm@46 24057 }else if(v1 > v2){
rlm@46 24058 return dsc ? -1 : +1;
rlm@46 24059 }else{
rlm@46 24060 return 0;
rlm@46 24061 }
rlm@46 24062 };
rlm@46 24063 };
rlm@46 24064
rlm@46 24065 Ext.tree.TreeSorter.prototype = {
rlm@46 24066 doSort : function(node){
rlm@46 24067 node.sort(this.sortFn);
rlm@46 24068 },
rlm@46 24069
rlm@46 24070 compareNodes : function(n1, n2){
rlm@46 24071 return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1);
rlm@46 24072 },
rlm@46 24073
rlm@46 24074 updateSort : function(tree, node){
rlm@46 24075 if(node.childrenRendered){
rlm@46 24076 this.doSort.defer(1, this, [node]);
rlm@46 24077 }
rlm@46 24078 },
rlm@46 24079
rlm@46 24080 updateSortParent : function(node){
rlm@46 24081 var p = node.parentNode;
rlm@46 24082 if(p && p.childrenRendered){
rlm@46 24083 this.doSort.defer(1, this, [p]);
rlm@46 24084 }
rlm@46 24085 }
rlm@46 24086 };
rlm@46 24087
rlm@46 24088 if(Ext.dd.DropZone){
rlm@46 24089
rlm@46 24090 Ext.tree.TreeDropZone = function(tree, config){
rlm@46 24091
rlm@46 24092 this.allowParentInsert = false;
rlm@46 24093
rlm@46 24094 this.allowContainerDrop = false;
rlm@46 24095
rlm@46 24096 this.appendOnly = false;
rlm@46 24097 Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.innerCt, config);
rlm@46 24098
rlm@46 24099 this.tree = tree;
rlm@46 24100
rlm@46 24101 this.dragOverData = {};
rlm@46 24102
rlm@46 24103 this.lastInsertClass = "x-tree-no-status";
rlm@46 24104 };
rlm@46 24105
rlm@46 24106 Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
rlm@46 24107
rlm@46 24108 ddGroup : "TreeDD",
rlm@46 24109
rlm@46 24110
rlm@46 24111 expandDelay : 1000,
rlm@46 24112
rlm@46 24113
rlm@46 24114 expandNode : function(node){
rlm@46 24115 if(node.hasChildNodes() && !node.isExpanded()){
rlm@46 24116 node.expand(false, null, this.triggerCacheRefresh.createDelegate(this));
rlm@46 24117 }
rlm@46 24118 },
rlm@46 24119
rlm@46 24120
rlm@46 24121 queueExpand : function(node){
rlm@46 24122 this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]);
rlm@46 24123 },
rlm@46 24124
rlm@46 24125
rlm@46 24126 cancelExpand : function(){
rlm@46 24127 if(this.expandProcId){
rlm@46 24128 clearTimeout(this.expandProcId);
rlm@46 24129 this.expandProcId = false;
rlm@46 24130 }
rlm@46 24131 },
rlm@46 24132
rlm@46 24133
rlm@46 24134 isValidDropPoint : function(n, pt, dd, e, data){
rlm@46 24135 if(!n || !data){ return false; }
rlm@46 24136 var targetNode = n.node;
rlm@46 24137 var dropNode = data.node;
rlm@46 24138
rlm@46 24139 if(!(targetNode && targetNode.isTarget && pt)){
rlm@46 24140 return false;
rlm@46 24141 }
rlm@46 24142 if(pt == "append" && targetNode.allowChildren === false){
rlm@46 24143 return false;
rlm@46 24144 }
rlm@46 24145 if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){
rlm@46 24146 return false;
rlm@46 24147 }
rlm@46 24148 if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){
rlm@46 24149 return false;
rlm@46 24150 }
rlm@46 24151
rlm@46 24152 var overEvent = this.dragOverData;
rlm@46 24153 overEvent.tree = this.tree;
rlm@46 24154 overEvent.target = targetNode;
rlm@46 24155 overEvent.data = data;
rlm@46 24156 overEvent.point = pt;
rlm@46 24157 overEvent.source = dd;
rlm@46 24158 overEvent.rawEvent = e;
rlm@46 24159 overEvent.dropNode = dropNode;
rlm@46 24160 overEvent.cancel = false;
rlm@46 24161 var result = this.tree.fireEvent("nodedragover", overEvent);
rlm@46 24162 return overEvent.cancel === false && result !== false;
rlm@46 24163 },
rlm@46 24164
rlm@46 24165
rlm@46 24166 getDropPoint : function(e, n, dd){
rlm@46 24167 var tn = n.node;
rlm@46 24168 if(tn.isRoot){
rlm@46 24169 return tn.allowChildren !== false ? "append" : false;
rlm@46 24170 }
rlm@46 24171 var dragEl = n.ddel;
rlm@46 24172 var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight;
rlm@46 24173 var y = Ext.lib.Event.getPageY(e);
rlm@46 24174 var noAppend = tn.allowChildren === false || tn.isLeaf();
rlm@46 24175 if(this.appendOnly || tn.parentNode.allowChildren === false){
rlm@46 24176 return noAppend ? false : "append";
rlm@46 24177 }
rlm@46 24178 var noBelow = false;
rlm@46 24179 if(!this.allowParentInsert){
rlm@46 24180 noBelow = tn.hasChildNodes() && tn.isExpanded();
rlm@46 24181 }
rlm@46 24182 var q = (b - t) / (noAppend ? 2 : 3);
rlm@46 24183 if(y >= t && y < (t + q)){
rlm@46 24184 return "above";
rlm@46 24185 }else if(!noBelow && (noAppend || y >= b-q && y <= b)){
rlm@46 24186 return "below";
rlm@46 24187 }else{
rlm@46 24188 return "append";
rlm@46 24189 }
rlm@46 24190 },
rlm@46 24191
rlm@46 24192
rlm@46 24193 onNodeEnter : function(n, dd, e, data){
rlm@46 24194 this.cancelExpand();
rlm@46 24195 },
rlm@46 24196
rlm@46 24197
rlm@46 24198 onNodeOver : function(n, dd, e, data){
rlm@46 24199 var pt = this.getDropPoint(e, n, dd);
rlm@46 24200 var node = n.node;
rlm@46 24201
rlm@46 24202
rlm@46 24203 if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){
rlm@46 24204 this.queueExpand(node);
rlm@46 24205 }else if(pt != "append"){
rlm@46 24206 this.cancelExpand();
rlm@46 24207 }
rlm@46 24208
rlm@46 24209
rlm@46 24210 var returnCls = this.dropNotAllowed;
rlm@46 24211 if(this.isValidDropPoint(n, pt, dd, e, data)){
rlm@46 24212 if(pt){
rlm@46 24213 var el = n.ddel;
rlm@46 24214 var cls;
rlm@46 24215 if(pt == "above"){
rlm@46 24216 returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";
rlm@46 24217 cls = "x-tree-drag-insert-above";
rlm@46 24218 }else if(pt == "below"){
rlm@46 24219 returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";
rlm@46 24220 cls = "x-tree-drag-insert-below";
rlm@46 24221 }else{
rlm@46 24222 returnCls = "x-tree-drop-ok-append";
rlm@46 24223 cls = "x-tree-drag-append";
rlm@46 24224 }
rlm@46 24225 if(this.lastInsertClass != cls){
rlm@46 24226 Ext.fly(el).replaceClass(this.lastInsertClass, cls);
rlm@46 24227 this.lastInsertClass = cls;
rlm@46 24228 }
rlm@46 24229 }
rlm@46 24230 }
rlm@46 24231 return returnCls;
rlm@46 24232 },
rlm@46 24233
rlm@46 24234
rlm@46 24235 onNodeOut : function(n, dd, e, data){
rlm@46 24236 this.cancelExpand();
rlm@46 24237 this.removeDropIndicators(n);
rlm@46 24238 },
rlm@46 24239
rlm@46 24240
rlm@46 24241 onNodeDrop : function(n, dd, e, data){
rlm@46 24242 var point = this.getDropPoint(e, n, dd);
rlm@46 24243 var targetNode = n.node;
rlm@46 24244 targetNode.ui.startDrop();
rlm@46 24245 if(!this.isValidDropPoint(n, point, dd, e, data)){
rlm@46 24246 targetNode.ui.endDrop();
rlm@46 24247 return false;
rlm@46 24248 }
rlm@46 24249
rlm@46 24250 var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null);
rlm@46 24251 var dropEvent = {
rlm@46 24252 tree : this.tree,
rlm@46 24253 target: targetNode,
rlm@46 24254 data: data,
rlm@46 24255 point: point,
rlm@46 24256 source: dd,
rlm@46 24257 rawEvent: e,
rlm@46 24258 dropNode: dropNode,
rlm@46 24259 cancel: !dropNode,
rlm@46 24260 dropStatus: false
rlm@46 24261 };
rlm@46 24262 var retval = this.tree.fireEvent("beforenodedrop", dropEvent);
rlm@46 24263 if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){
rlm@46 24264 targetNode.ui.endDrop();
rlm@46 24265 return dropEvent.dropStatus;
rlm@46 24266 }
rlm@46 24267
rlm@46 24268 targetNode = dropEvent.target;
rlm@46 24269 if(point == "append" && !targetNode.isExpanded()){
rlm@46 24270 targetNode.expand(false, null, function(){
rlm@46 24271 this.completeDrop(dropEvent);
rlm@46 24272 }.createDelegate(this));
rlm@46 24273 }else{
rlm@46 24274 this.completeDrop(dropEvent);
rlm@46 24275 }
rlm@46 24276 return true;
rlm@46 24277 },
rlm@46 24278
rlm@46 24279
rlm@46 24280 completeDrop : function(de){
rlm@46 24281 var ns = de.dropNode, p = de.point, t = de.target;
rlm@46 24282 if(!Ext.isArray(ns)){
rlm@46 24283 ns = [ns];
rlm@46 24284 }
rlm@46 24285 var n;
rlm@46 24286 for(var i = 0, len = ns.length; i < len; i++){
rlm@46 24287 n = ns[i];
rlm@46 24288 if(p == "above"){
rlm@46 24289 t.parentNode.insertBefore(n, t);
rlm@46 24290 }else if(p == "below"){
rlm@46 24291 t.parentNode.insertBefore(n, t.nextSibling);
rlm@46 24292 }else{
rlm@46 24293 t.appendChild(n);
rlm@46 24294 }
rlm@46 24295 }
rlm@46 24296 n.ui.focus();
rlm@46 24297 if(this.tree.hlDrop){
rlm@46 24298 n.ui.highlight();
rlm@46 24299 }
rlm@46 24300 t.ui.endDrop();
rlm@46 24301 this.tree.fireEvent("nodedrop", de);
rlm@46 24302 },
rlm@46 24303
rlm@46 24304
rlm@46 24305 afterNodeMoved : function(dd, data, e, targetNode, dropNode){
rlm@46 24306 if(this.tree.hlDrop){
rlm@46 24307 dropNode.ui.focus();
rlm@46 24308 dropNode.ui.highlight();
rlm@46 24309 }
rlm@46 24310 this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e);
rlm@46 24311 },
rlm@46 24312
rlm@46 24313
rlm@46 24314 getTree : function(){
rlm@46 24315 return this.tree;
rlm@46 24316 },
rlm@46 24317
rlm@46 24318
rlm@46 24319 removeDropIndicators : function(n){
rlm@46 24320 if(n && n.ddel){
rlm@46 24321 var el = n.ddel;
rlm@46 24322 Ext.fly(el).removeClass([
rlm@46 24323 "x-tree-drag-insert-above",
rlm@46 24324 "x-tree-drag-insert-below",
rlm@46 24325 "x-tree-drag-append"]);
rlm@46 24326 this.lastInsertClass = "_noclass";
rlm@46 24327 }
rlm@46 24328 },
rlm@46 24329
rlm@46 24330
rlm@46 24331 beforeDragDrop : function(target, e, id){
rlm@46 24332 this.cancelExpand();
rlm@46 24333 return true;
rlm@46 24334 },
rlm@46 24335
rlm@46 24336
rlm@46 24337 afterRepair : function(data){
rlm@46 24338 if(data && Ext.enableFx){
rlm@46 24339 data.node.ui.highlight();
rlm@46 24340 }
rlm@46 24341 this.hideProxy();
rlm@46 24342 }
rlm@46 24343 });
rlm@46 24344
rlm@46 24345 }
rlm@46 24346
rlm@46 24347 if(Ext.dd.DragZone){
rlm@46 24348 Ext.tree.TreeDragZone = function(tree, config){
rlm@46 24349 Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getTreeEl(), config);
rlm@46 24350
rlm@46 24351 this.tree = tree;
rlm@46 24352 };
rlm@46 24353
rlm@46 24354 Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {
rlm@46 24355
rlm@46 24356 ddGroup : "TreeDD",
rlm@46 24357
rlm@46 24358
rlm@46 24359 onBeforeDrag : function(data, e){
rlm@46 24360 var n = data.node;
rlm@46 24361 return n && n.draggable && !n.disabled;
rlm@46 24362 },
rlm@46 24363
rlm@46 24364
rlm@46 24365 onInitDrag : function(e){
rlm@46 24366 var data = this.dragData;
rlm@46 24367 this.tree.getSelectionModel().select(data.node);
rlm@46 24368 this.tree.eventModel.disable();
rlm@46 24369 this.proxy.update("");
rlm@46 24370 data.node.ui.appendDDGhost(this.proxy.ghost.dom);
rlm@46 24371 this.tree.fireEvent("startdrag", this.tree, data.node, e);
rlm@46 24372 },
rlm@46 24373
rlm@46 24374
rlm@46 24375 getRepairXY : function(e, data){
rlm@46 24376 return data.node.ui.getDDRepairXY();
rlm@46 24377 },
rlm@46 24378
rlm@46 24379
rlm@46 24380 onEndDrag : function(data, e){
rlm@46 24381 this.tree.eventModel.enable.defer(100, this.tree.eventModel);
rlm@46 24382 this.tree.fireEvent("enddrag", this.tree, data.node, e);
rlm@46 24383 },
rlm@46 24384
rlm@46 24385
rlm@46 24386 onValidDrop : function(dd, e, id){
rlm@46 24387 this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e);
rlm@46 24388 this.hideProxy();
rlm@46 24389 },
rlm@46 24390
rlm@46 24391
rlm@46 24392 beforeInvalidDrop : function(e, id){
rlm@46 24393
rlm@46 24394 var sm = this.tree.getSelectionModel();
rlm@46 24395 sm.clearSelections();
rlm@46 24396 sm.select(this.dragData.node);
rlm@46 24397 }
rlm@46 24398 });
rlm@46 24399 }
rlm@46 24400
rlm@46 24401 Ext.tree.TreeEditor = function(tree, fc, config){
rlm@46 24402 fc = fc || {};
rlm@46 24403 var field = fc.events ? fc : new Ext.form.TextField(fc);
rlm@46 24404 Ext.tree.TreeEditor.superclass.constructor.call(this, field, config);
rlm@46 24405
rlm@46 24406 this.tree = tree;
rlm@46 24407
rlm@46 24408 if(!tree.rendered){
rlm@46 24409 tree.on('render', this.initEditor, this);
rlm@46 24410 }else{
rlm@46 24411 this.initEditor(tree);
rlm@46 24412 }
rlm@46 24413 };
rlm@46 24414
rlm@46 24415 Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
rlm@46 24416
rlm@46 24417 alignment: "l-l",
rlm@46 24418 autoSize: false,
rlm@46 24419
rlm@46 24420 hideEl : false,
rlm@46 24421
rlm@46 24422 cls: "x-small-editor x-tree-editor",
rlm@46 24423
rlm@46 24424 shim:false,
rlm@46 24425 shadow:"frame",
rlm@46 24426
rlm@46 24427 maxWidth: 250,
rlm@46 24428
rlm@46 24429 editDelay : 350,
rlm@46 24430
rlm@46 24431 initEditor : function(tree){
rlm@46 24432 tree.on('beforeclick', this.beforeNodeClick, this);
rlm@46 24433 tree.on('dblclick', this.onNodeDblClick, this);
rlm@46 24434 this.on('complete', this.updateNode, this);
rlm@46 24435 this.on('beforestartedit', this.fitToTree, this);
rlm@46 24436 this.on('startedit', this.bindScroll, this, {delay:10});
rlm@46 24437 this.on('specialkey', this.onSpecialKey, this);
rlm@46 24438 },
rlm@46 24439
rlm@46 24440 fitToTree : function(ed, el){
rlm@46 24441 var td = this.tree.getTreeEl().dom, nd = el.dom;
rlm@46 24442 if(td.scrollLeft > nd.offsetLeft){ td.scrollLeft = nd.offsetLeft;
rlm@46 24443 }
rlm@46 24444 var w = Math.min(
rlm@46 24445 this.maxWidth,
rlm@46 24446 (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5);
rlm@46 24447 this.setSize(w, '');
rlm@46 24448 },
rlm@46 24449
rlm@46 24450 triggerEdit : function(node, defer){
rlm@46 24451 this.completeEdit();
rlm@46 24452 if(node.attributes.editable !== false){
rlm@46 24453 this.editNode = node;
rlm@46 24454 this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, node.text]);
rlm@46 24455 return false;
rlm@46 24456 }
rlm@46 24457 },
rlm@46 24458
rlm@46 24459 bindScroll : function(){
rlm@46 24460 this.tree.getTreeEl().on('scroll', this.cancelEdit, this);
rlm@46 24461 },
rlm@46 24462
rlm@46 24463 beforeNodeClick : function(node, e){
rlm@46 24464 clearTimeout(this.autoEditTimer);
rlm@46 24465 if(this.tree.getSelectionModel().isSelected(node)){
rlm@46 24466 e.stopEvent();
rlm@46 24467 return this.triggerEdit(node);
rlm@46 24468 }
rlm@46 24469 },
rlm@46 24470
rlm@46 24471 onNodeDblClick : function(node, e){
rlm@46 24472 clearTimeout(this.autoEditTimer);
rlm@46 24473 },
rlm@46 24474
rlm@46 24475 updateNode : function(ed, value){
rlm@46 24476 this.tree.getTreeEl().un('scroll', this.cancelEdit, this);
rlm@46 24477 this.editNode.setText(value);
rlm@46 24478 },
rlm@46 24479
rlm@46 24480 onHide : function(){
rlm@46 24481 Ext.tree.TreeEditor.superclass.onHide.call(this);
rlm@46 24482 if(this.editNode){
rlm@46 24483 this.editNode.ui.focus.defer(50, this.editNode.ui);
rlm@46 24484 }
rlm@46 24485 },
rlm@46 24486
rlm@46 24487 onSpecialKey : function(field, e){
rlm@46 24488 var k = e.getKey();
rlm@46 24489 if(k == e.ESC){
rlm@46 24490 e.stopEvent();
rlm@46 24491 this.cancelEdit();
rlm@46 24492 }else if(k == e.ENTER && !e.hasModifier()){
rlm@46 24493 e.stopEvent();
rlm@46 24494 this.completeEdit();
rlm@46 24495 }
rlm@46 24496 }
rlm@46 24497 });
rlm@46 24498
rlm@46 24499 Ext.menu.Menu = function(config){
rlm@46 24500 if(Ext.isArray(config)){
rlm@46 24501 config = {items:config};
rlm@46 24502 }
rlm@46 24503 Ext.apply(this, config);
rlm@46 24504 this.id = this.id || Ext.id();
rlm@46 24505 this.addEvents(
rlm@46 24506
rlm@46 24507 'beforeshow',
rlm@46 24508
rlm@46 24509 'beforehide',
rlm@46 24510
rlm@46 24511 'show',
rlm@46 24512
rlm@46 24513 'hide',
rlm@46 24514
rlm@46 24515 'click',
rlm@46 24516
rlm@46 24517 'mouseover',
rlm@46 24518
rlm@46 24519 'mouseout',
rlm@46 24520
rlm@46 24521 'itemclick'
rlm@46 24522 );
rlm@46 24523 Ext.menu.MenuMgr.register(this);
rlm@46 24524 Ext.menu.Menu.superclass.constructor.call(this);
rlm@46 24525 var mis = this.items;
rlm@46 24526
rlm@46 24527
rlm@46 24528 this.items = new Ext.util.MixedCollection();
rlm@46 24529 if(mis){
rlm@46 24530 this.add.apply(this, mis);
rlm@46 24531 }
rlm@46 24532 };
rlm@46 24533
rlm@46 24534 Ext.extend(Ext.menu.Menu, Ext.util.Observable, {
rlm@46 24535
rlm@46 24536
rlm@46 24537
rlm@46 24538 minWidth : 120,
rlm@46 24539
rlm@46 24540 shadow : "sides",
rlm@46 24541
rlm@46 24542 subMenuAlign : "tl-tr?",
rlm@46 24543
rlm@46 24544 defaultAlign : "tl-bl?",
rlm@46 24545
rlm@46 24546 allowOtherMenus : false,
rlm@46 24547
rlm@46 24548 hidden:true,
rlm@46 24549
rlm@46 24550 createEl : function(){
rlm@46 24551 return new Ext.Layer({
rlm@46 24552 cls: "x-menu",
rlm@46 24553 shadow:this.shadow,
rlm@46 24554 constrain: false,
rlm@46 24555 parentEl: this.parentEl || document.body,
rlm@46 24556 zindex:15000
rlm@46 24557 });
rlm@46 24558 },
rlm@46 24559
rlm@46 24560 render : function(){
rlm@46 24561 if(this.el){
rlm@46 24562 return;
rlm@46 24563 }
rlm@46 24564 var el = this.el = this.createEl();
rlm@46 24565
rlm@46 24566 if(!this.keyNav){
rlm@46 24567 this.keyNav = new Ext.menu.MenuNav(this);
rlm@46 24568 }
rlm@46 24569 if(this.plain){
rlm@46 24570 el.addClass("x-menu-plain");
rlm@46 24571 }
rlm@46 24572 if(this.cls){
rlm@46 24573 el.addClass(this.cls);
rlm@46 24574 }
rlm@46 24575 this.focusEl = el.createChild({
rlm@46 24576 tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1"
rlm@46 24577 });
rlm@46 24578 var ul = el.createChild({tag: "ul", cls: "x-menu-list"});
rlm@46 24579 ul.on("click", this.onClick, this);
rlm@46 24580 ul.on("mouseover", this.onMouseOver, this);
rlm@46 24581 ul.on("mouseout", this.onMouseOut, this);
rlm@46 24582 this.items.each(function(item){
rlm@46 24583 var li = document.createElement("li");
rlm@46 24584 li.className = "x-menu-list-item";
rlm@46 24585 ul.dom.appendChild(li);
rlm@46 24586 item.render(li, this);
rlm@46 24587 }, this);
rlm@46 24588 this.ul = ul;
rlm@46 24589 this.autoWidth();
rlm@46 24590 },
rlm@46 24591
rlm@46 24592 autoWidth : function(){
rlm@46 24593 var el = this.el, ul = this.ul;
rlm@46 24594 if(!el){
rlm@46 24595 return;
rlm@46 24596 }
rlm@46 24597 var w = this.width;
rlm@46 24598 if(w){
rlm@46 24599 el.setWidth(w);
rlm@46 24600 }else if(Ext.isIE){
rlm@46 24601 el.setWidth(this.minWidth);
rlm@46 24602 var t = el.dom.offsetWidth; el.setWidth(ul.getWidth()+el.getFrameWidth("lr"));
rlm@46 24603 }
rlm@46 24604 },
rlm@46 24605
rlm@46 24606 delayAutoWidth : function(){
rlm@46 24607 if(this.el){
rlm@46 24608 if(!this.awTask){
rlm@46 24609 this.awTask = new Ext.util.DelayedTask(this.autoWidth, this);
rlm@46 24610 }
rlm@46 24611 this.awTask.delay(20);
rlm@46 24612 }
rlm@46 24613 },
rlm@46 24614
rlm@46 24615 findTargetItem : function(e){
rlm@46 24616 var t = e.getTarget(".x-menu-list-item", this.ul, true);
rlm@46 24617 if(t && t.menuItemId){
rlm@46 24618 return this.items.get(t.menuItemId);
rlm@46 24619 }
rlm@46 24620 },
rlm@46 24621
rlm@46 24622 onClick : function(e){
rlm@46 24623 var t;
rlm@46 24624 if(t = this.findTargetItem(e)){
rlm@46 24625 t.onClick(e);
rlm@46 24626 this.fireEvent("click", this, t, e);
rlm@46 24627 }
rlm@46 24628 },
rlm@46 24629
rlm@46 24630 setActiveItem : function(item, autoExpand){
rlm@46 24631 if(item != this.activeItem){
rlm@46 24632 if(this.activeItem){
rlm@46 24633 this.activeItem.deactivate();
rlm@46 24634 }
rlm@46 24635 this.activeItem = item;
rlm@46 24636 item.activate(autoExpand);
rlm@46 24637 }else if(autoExpand){
rlm@46 24638 item.expandMenu();
rlm@46 24639 }
rlm@46 24640 },
rlm@46 24641
rlm@46 24642 tryActivate : function(start, step){
rlm@46 24643 var items = this.items;
rlm@46 24644 for(var i = start, len = items.length; i >= 0 && i < len; i+= step){
rlm@46 24645 var item = items.get(i);
rlm@46 24646 if(!item.disabled && item.canActivate){
rlm@46 24647 this.setActiveItem(item, false);
rlm@46 24648 return item;
rlm@46 24649 }
rlm@46 24650 }
rlm@46 24651 return false;
rlm@46 24652 },
rlm@46 24653
rlm@46 24654 onMouseOver : function(e){
rlm@46 24655 var t;
rlm@46 24656 if(t = this.findTargetItem(e)){
rlm@46 24657 if(t.canActivate && !t.disabled){
rlm@46 24658 this.setActiveItem(t, true);
rlm@46 24659 }
rlm@46 24660 }
rlm@46 24661 this.fireEvent("mouseover", this, e, t);
rlm@46 24662 },
rlm@46 24663
rlm@46 24664 onMouseOut : function(e){
rlm@46 24665 var t;
rlm@46 24666 if(t = this.findTargetItem(e)){
rlm@46 24667 if(t == this.activeItem && t.shouldDeactivate(e)){
rlm@46 24668 this.activeItem.deactivate();
rlm@46 24669 delete this.activeItem;
rlm@46 24670 }
rlm@46 24671 }
rlm@46 24672 this.fireEvent("mouseout", this, e, t);
rlm@46 24673 },
rlm@46 24674
rlm@46 24675
rlm@46 24676 isVisible : function(){
rlm@46 24677 return this.el && !this.hidden;
rlm@46 24678 },
rlm@46 24679
rlm@46 24680
rlm@46 24681 show : function(el, pos, parentMenu){
rlm@46 24682 this.parentMenu = parentMenu;
rlm@46 24683 if(!this.el){
rlm@46 24684 this.render();
rlm@46 24685 }
rlm@46 24686 this.fireEvent("beforeshow", this);
rlm@46 24687 this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);
rlm@46 24688 },
rlm@46 24689
rlm@46 24690
rlm@46 24691 showAt : function(xy, parentMenu, _e){
rlm@46 24692 this.parentMenu = parentMenu;
rlm@46 24693 if(!this.el){
rlm@46 24694 this.render();
rlm@46 24695 }
rlm@46 24696 if(_e !== false){
rlm@46 24697 this.fireEvent("beforeshow", this);
rlm@46 24698 xy = this.el.adjustForConstraints(xy);
rlm@46 24699 }
rlm@46 24700 this.el.setXY(xy);
rlm@46 24701 this.el.show();
rlm@46 24702 this.hidden = false;
rlm@46 24703 this.focus();
rlm@46 24704 this.fireEvent("show", this);
rlm@46 24705 },
rlm@46 24706
rlm@46 24707
rlm@46 24708
rlm@46 24709 focus : function(){
rlm@46 24710 if(!this.hidden){
rlm@46 24711 this.doFocus.defer(50, this);
rlm@46 24712 }
rlm@46 24713 },
rlm@46 24714
rlm@46 24715 doFocus : function(){
rlm@46 24716 if(!this.hidden){
rlm@46 24717 this.focusEl.focus();
rlm@46 24718 }
rlm@46 24719 },
rlm@46 24720
rlm@46 24721
rlm@46 24722 hide : function(deep){
rlm@46 24723 if(this.el && this.isVisible()){
rlm@46 24724 this.fireEvent("beforehide", this);
rlm@46 24725 if(this.activeItem){
rlm@46 24726 this.activeItem.deactivate();
rlm@46 24727 this.activeItem = null;
rlm@46 24728 }
rlm@46 24729 this.el.hide();
rlm@46 24730 this.hidden = true;
rlm@46 24731 this.fireEvent("hide", this);
rlm@46 24732 }
rlm@46 24733 if(deep === true && this.parentMenu){
rlm@46 24734 this.parentMenu.hide(true);
rlm@46 24735 }
rlm@46 24736 },
rlm@46 24737
rlm@46 24738
rlm@46 24739 add : function(){
rlm@46 24740 var a = arguments, l = a.length, item;
rlm@46 24741 for(var i = 0; i < l; i++){
rlm@46 24742 var el = a[i];
rlm@46 24743 if(el.render){ item = this.addItem(el);
rlm@46 24744 }else if(typeof el == "string"){ if(el == "separator" || el == "-"){
rlm@46 24745 item = this.addSeparator();
rlm@46 24746 }else{
rlm@46 24747 item = this.addText(el);
rlm@46 24748 }
rlm@46 24749 }else if(el.tagName || el.el){ item = this.addElement(el);
rlm@46 24750 }else if(typeof el == "object"){ Ext.applyIf(el, this.defaults);
rlm@46 24751 item = this.addMenuItem(el);
rlm@46 24752 }
rlm@46 24753 }
rlm@46 24754 return item;
rlm@46 24755 },
rlm@46 24756
rlm@46 24757
rlm@46 24758 getEl : function(){
rlm@46 24759 if(!this.el){
rlm@46 24760 this.render();
rlm@46 24761 }
rlm@46 24762 return this.el;
rlm@46 24763 },
rlm@46 24764
rlm@46 24765
rlm@46 24766 addSeparator : function(){
rlm@46 24767 return this.addItem(new Ext.menu.Separator());
rlm@46 24768 },
rlm@46 24769
rlm@46 24770
rlm@46 24771 addElement : function(el){
rlm@46 24772 return this.addItem(new Ext.menu.BaseItem(el));
rlm@46 24773 },
rlm@46 24774
rlm@46 24775
rlm@46 24776 addItem : function(item){
rlm@46 24777 this.items.add(item);
rlm@46 24778 if(this.ul){
rlm@46 24779 var li = document.createElement("li");
rlm@46 24780 li.className = "x-menu-list-item";
rlm@46 24781 this.ul.dom.appendChild(li);
rlm@46 24782 item.render(li, this);
rlm@46 24783 this.delayAutoWidth();
rlm@46 24784 }
rlm@46 24785 return item;
rlm@46 24786 },
rlm@46 24787
rlm@46 24788
rlm@46 24789 addMenuItem : function(config){
rlm@46 24790 if(!(config instanceof Ext.menu.Item)){
rlm@46 24791 if(typeof config.checked == "boolean"){ config = new Ext.menu.CheckItem(config);
rlm@46 24792 }else{
rlm@46 24793 config = new Ext.menu.Item(config);
rlm@46 24794 }
rlm@46 24795 }
rlm@46 24796 return this.addItem(config);
rlm@46 24797 },
rlm@46 24798
rlm@46 24799
rlm@46 24800 addText : function(text){
rlm@46 24801 return this.addItem(new Ext.menu.TextItem(text));
rlm@46 24802 },
rlm@46 24803
rlm@46 24804
rlm@46 24805 insert : function(index, item){
rlm@46 24806 this.items.insert(index, item);
rlm@46 24807 if(this.ul){
rlm@46 24808 var li = document.createElement("li");
rlm@46 24809 li.className = "x-menu-list-item";
rlm@46 24810 this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]);
rlm@46 24811 item.render(li, this);
rlm@46 24812 this.delayAutoWidth();
rlm@46 24813 }
rlm@46 24814 return item;
rlm@46 24815 },
rlm@46 24816
rlm@46 24817
rlm@46 24818 remove : function(item){
rlm@46 24819 this.items.removeKey(item.id);
rlm@46 24820 item.destroy();
rlm@46 24821 },
rlm@46 24822
rlm@46 24823
rlm@46 24824 removeAll : function(){
rlm@46 24825 if(this.items){
rlm@46 24826 var f;
rlm@46 24827 while(f = this.items.first()){
rlm@46 24828 this.remove(f);
rlm@46 24829 }
rlm@46 24830 }
rlm@46 24831 },
rlm@46 24832
rlm@46 24833
rlm@46 24834 destroy : function(){
rlm@46 24835 this.beforeDestroy();
rlm@46 24836 Ext.menu.MenuMgr.unregister(this);
rlm@46 24837 if (this.keyNav) {
rlm@46 24838 this.keyNav.disable();
rlm@46 24839 }
rlm@46 24840 this.removeAll();
rlm@46 24841 if (this.ul) {
rlm@46 24842 this.ul.removeAllListeners();
rlm@46 24843 }
rlm@46 24844 if (this.el) {
rlm@46 24845 this.el.destroy();
rlm@46 24846 }
rlm@46 24847 },
rlm@46 24848
rlm@46 24849 beforeDestroy : Ext.emptyFn
rlm@46 24850
rlm@46 24851 });
rlm@46 24852
rlm@46 24853 Ext.menu.MenuNav = function(menu){
rlm@46 24854 Ext.menu.MenuNav.superclass.constructor.call(this, menu.el);
rlm@46 24855 this.scope = this.menu = menu;
rlm@46 24856 };
rlm@46 24857
rlm@46 24858 Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, {
rlm@46 24859 doRelay : function(e, h){
rlm@46 24860 var k = e.getKey();
rlm@46 24861 if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){
rlm@46 24862 this.menu.tryActivate(0, 1);
rlm@46 24863 return false;
rlm@46 24864 }
rlm@46 24865 return h.call(this.scope || this, e, this.menu);
rlm@46 24866 },
rlm@46 24867
rlm@46 24868 up : function(e, m){
rlm@46 24869 if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){
rlm@46 24870 m.tryActivate(m.items.length-1, -1);
rlm@46 24871 }
rlm@46 24872 },
rlm@46 24873
rlm@46 24874 down : function(e, m){
rlm@46 24875 if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){
rlm@46 24876 m.tryActivate(0, 1);
rlm@46 24877 }
rlm@46 24878 },
rlm@46 24879
rlm@46 24880 right : function(e, m){
rlm@46 24881 if(m.activeItem){
rlm@46 24882 m.activeItem.expandMenu(true);
rlm@46 24883 }
rlm@46 24884 },
rlm@46 24885
rlm@46 24886 left : function(e, m){
rlm@46 24887 m.hide();
rlm@46 24888 if(m.parentMenu && m.parentMenu.activeItem){
rlm@46 24889 m.parentMenu.activeItem.activate();
rlm@46 24890 }
rlm@46 24891 },
rlm@46 24892
rlm@46 24893 enter : function(e, m){
rlm@46 24894 if(m.activeItem){
rlm@46 24895 e.stopPropagation();
rlm@46 24896 m.activeItem.onClick(e);
rlm@46 24897 m.fireEvent("click", this, m.activeItem);
rlm@46 24898 return true;
rlm@46 24899 }
rlm@46 24900 }
rlm@46 24901 });
rlm@46 24902
rlm@46 24903 Ext.menu.MenuMgr = function(){
rlm@46 24904 var menus, active, groups = {}, attached = false, lastShow = new Date();
rlm@46 24905
rlm@46 24906 function init(){
rlm@46 24907 menus = {};
rlm@46 24908 active = new Ext.util.MixedCollection();
rlm@46 24909 Ext.getDoc().addKeyListener(27, function(){
rlm@46 24910 if(active.length > 0){
rlm@46 24911 hideAll();
rlm@46 24912 }
rlm@46 24913 });
rlm@46 24914 }
rlm@46 24915
rlm@46 24916 function hideAll(){
rlm@46 24917 if(active && active.length > 0){
rlm@46 24918 var c = active.clone();
rlm@46 24919 c.each(function(m){
rlm@46 24920 m.hide();
rlm@46 24921 });
rlm@46 24922 }
rlm@46 24923 }
rlm@46 24924
rlm@46 24925 function onHide(m){
rlm@46 24926 active.remove(m);
rlm@46 24927 if(active.length < 1){
rlm@46 24928 Ext.getDoc().un("mousedown", onMouseDown);
rlm@46 24929 attached = false;
rlm@46 24930 }
rlm@46 24931 }
rlm@46 24932
rlm@46 24933 function onShow(m){
rlm@46 24934 var last = active.last();
rlm@46 24935 lastShow = new Date();
rlm@46 24936 active.add(m);
rlm@46 24937 if(!attached){
rlm@46 24938 Ext.getDoc().on("mousedown", onMouseDown);
rlm@46 24939 attached = true;
rlm@46 24940 }
rlm@46 24941 if(m.parentMenu){
rlm@46 24942 m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
rlm@46 24943 m.parentMenu.activeChild = m;
rlm@46 24944 }else if(last && last.isVisible()){
rlm@46 24945 m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
rlm@46 24946 }
rlm@46 24947 }
rlm@46 24948
rlm@46 24949 function onBeforeHide(m){
rlm@46 24950 if(m.activeChild){
rlm@46 24951 m.activeChild.hide();
rlm@46 24952 }
rlm@46 24953 if(m.autoHideTimer){
rlm@46 24954 clearTimeout(m.autoHideTimer);
rlm@46 24955 delete m.autoHideTimer;
rlm@46 24956 }
rlm@46 24957 }
rlm@46 24958
rlm@46 24959 function onBeforeShow(m){
rlm@46 24960 var pm = m.parentMenu;
rlm@46 24961 if(!pm && !m.allowOtherMenus){
rlm@46 24962 hideAll();
rlm@46 24963 }else if(pm && pm.activeChild){
rlm@46 24964 pm.activeChild.hide();
rlm@46 24965 }
rlm@46 24966 }
rlm@46 24967
rlm@46 24968 function onMouseDown(e){
rlm@46 24969 if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
rlm@46 24970 hideAll();
rlm@46 24971 }
rlm@46 24972 }
rlm@46 24973
rlm@46 24974 function onBeforeCheck(mi, state){
rlm@46 24975 if(state){
rlm@46 24976 var g = groups[mi.group];
rlm@46 24977 for(var i = 0, l = g.length; i < l; i++){
rlm@46 24978 if(g[i] != mi){
rlm@46 24979 g[i].setChecked(false);
rlm@46 24980 }
rlm@46 24981 }
rlm@46 24982 }
rlm@46 24983 }
rlm@46 24984
rlm@46 24985 return {
rlm@46 24986
rlm@46 24987
rlm@46 24988 hideAll : function(){
rlm@46 24989 hideAll();
rlm@46 24990 },
rlm@46 24991
rlm@46 24992 register : function(menu){
rlm@46 24993 if(!menus){
rlm@46 24994 init();
rlm@46 24995 }
rlm@46 24996 menus[menu.id] = menu;
rlm@46 24997 menu.on("beforehide", onBeforeHide);
rlm@46 24998 menu.on("hide", onHide);
rlm@46 24999 menu.on("beforeshow", onBeforeShow);
rlm@46 25000 menu.on("show", onShow);
rlm@46 25001 var g = menu.group;
rlm@46 25002 if(g && menu.events["checkchange"]){
rlm@46 25003 if(!groups[g]){
rlm@46 25004 groups[g] = [];
rlm@46 25005 }
rlm@46 25006 groups[g].push(menu);
rlm@46 25007 menu.on("checkchange", onCheck);
rlm@46 25008 }
rlm@46 25009 },
rlm@46 25010
rlm@46 25011
rlm@46 25012 get : function(menu){
rlm@46 25013 if(typeof menu == "string"){ if(!menus){ return null;
rlm@46 25014 }
rlm@46 25015 return menus[menu];
rlm@46 25016 }else if(menu.events){ return menu;
rlm@46 25017 }else if(typeof menu.length == 'number'){ return new Ext.menu.Menu({items:menu});
rlm@46 25018 }else{ return new Ext.menu.Menu(menu);
rlm@46 25019 }
rlm@46 25020 },
rlm@46 25021
rlm@46 25022 unregister : function(menu){
rlm@46 25023 delete menus[menu.id];
rlm@46 25024 menu.un("beforehide", onBeforeHide);
rlm@46 25025 menu.un("hide", onHide);
rlm@46 25026 menu.un("beforeshow", onBeforeShow);
rlm@46 25027 menu.un("show", onShow);
rlm@46 25028 var g = menu.group;
rlm@46 25029 if(g && menu.events["checkchange"]){
rlm@46 25030 groups[g].remove(menu);
rlm@46 25031 menu.un("checkchange", onCheck);
rlm@46 25032 }
rlm@46 25033 },
rlm@46 25034
rlm@46 25035 registerCheckable : function(menuItem){
rlm@46 25036 var g = menuItem.group;
rlm@46 25037 if(g){
rlm@46 25038 if(!groups[g]){
rlm@46 25039 groups[g] = [];
rlm@46 25040 }
rlm@46 25041 groups[g].push(menuItem);
rlm@46 25042 menuItem.on("beforecheckchange", onBeforeCheck);
rlm@46 25043 }
rlm@46 25044 },
rlm@46 25045
rlm@46 25046 unregisterCheckable : function(menuItem){
rlm@46 25047 var g = menuItem.group;
rlm@46 25048 if(g){
rlm@46 25049 groups[g].remove(menuItem);
rlm@46 25050 menuItem.un("beforecheckchange", onBeforeCheck);
rlm@46 25051 }
rlm@46 25052 },
rlm@46 25053
rlm@46 25054 getCheckedItem : function(groupId){
rlm@46 25055 var g = groups[groupId];
rlm@46 25056 if(g){
rlm@46 25057 for(var i = 0, l = g.length; i < l; i++){
rlm@46 25058 if(g[i].checked){
rlm@46 25059 return g[i];
rlm@46 25060 }
rlm@46 25061 }
rlm@46 25062 }
rlm@46 25063 return null;
rlm@46 25064 },
rlm@46 25065
rlm@46 25066 setCheckedItem : function(groupId, itemId){
rlm@46 25067 var g = groups[groupId];
rlm@46 25068 if(g){
rlm@46 25069 for(var i = 0, l = g.length; i < l; i++){
rlm@46 25070 if(g[i].id == itemId){
rlm@46 25071 g[i].setChecked(true);
rlm@46 25072 }
rlm@46 25073 }
rlm@46 25074 }
rlm@46 25075 return null;
rlm@46 25076 }
rlm@46 25077 };
rlm@46 25078 }();
rlm@46 25079
rlm@46 25080
rlm@46 25081 Ext.menu.BaseItem = function(config){
rlm@46 25082 Ext.menu.BaseItem.superclass.constructor.call(this, config);
rlm@46 25083
rlm@46 25084 this.addEvents(
rlm@46 25085
rlm@46 25086 'click',
rlm@46 25087
rlm@46 25088 'activate',
rlm@46 25089
rlm@46 25090 'deactivate'
rlm@46 25091 );
rlm@46 25092
rlm@46 25093 if(this.handler){
rlm@46 25094 this.on("click", this.handler, this.scope);
rlm@46 25095 }
rlm@46 25096 };
rlm@46 25097
rlm@46 25098 Ext.extend(Ext.menu.BaseItem, Ext.Component, {
rlm@46 25099
rlm@46 25100
rlm@46 25101
rlm@46 25102 canActivate : false,
rlm@46 25103
rlm@46 25104 activeClass : "x-menu-item-active",
rlm@46 25105
rlm@46 25106 hideOnClick : true,
rlm@46 25107
rlm@46 25108 hideDelay : 100,
rlm@46 25109
rlm@46 25110 ctype: "Ext.menu.BaseItem",
rlm@46 25111
rlm@46 25112 actionMode : "container",
rlm@46 25113
rlm@46 25114 render : function(container, parentMenu){
rlm@46 25115 this.parentMenu = parentMenu;
rlm@46 25116 Ext.menu.BaseItem.superclass.render.call(this, container);
rlm@46 25117 this.container.menuItemId = this.id;
rlm@46 25118 },
rlm@46 25119
rlm@46 25120 onRender : function(container, position){
rlm@46 25121 this.el = Ext.get(this.el);
rlm@46 25122 container.dom.appendChild(this.el.dom);
rlm@46 25123 },
rlm@46 25124
rlm@46 25125
rlm@46 25126 setHandler : function(handler, scope){
rlm@46 25127 if(this.handler){
rlm@46 25128 this.un("click", this.handler, this.scope);
rlm@46 25129 }
rlm@46 25130 this.on("click", this.handler = handler, this.scope = scope);
rlm@46 25131 },
rlm@46 25132
rlm@46 25133 onClick : function(e){
rlm@46 25134 if(!this.disabled && this.fireEvent("click", this, e) !== false
rlm@46 25135 && this.parentMenu.fireEvent("itemclick", this, e) !== false){
rlm@46 25136 this.handleClick(e);
rlm@46 25137 }else{
rlm@46 25138 e.stopEvent();
rlm@46 25139 }
rlm@46 25140 },
rlm@46 25141
rlm@46 25142 activate : function(){
rlm@46 25143 if(this.disabled){
rlm@46 25144 return false;
rlm@46 25145 }
rlm@46 25146 var li = this.container;
rlm@46 25147 li.addClass(this.activeClass);
rlm@46 25148 this.region = li.getRegion().adjust(2, 2, -2, -2);
rlm@46 25149 this.fireEvent("activate", this);
rlm@46 25150 return true;
rlm@46 25151 },
rlm@46 25152
rlm@46 25153 deactivate : function(){
rlm@46 25154 this.container.removeClass(this.activeClass);
rlm@46 25155 this.fireEvent("deactivate", this);
rlm@46 25156 },
rlm@46 25157
rlm@46 25158 shouldDeactivate : function(e){
rlm@46 25159 return !this.region || !this.region.contains(e.getPoint());
rlm@46 25160 },
rlm@46 25161
rlm@46 25162 handleClick : function(e){
rlm@46 25163 if(this.hideOnClick){
rlm@46 25164 this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]);
rlm@46 25165 }
rlm@46 25166 },
rlm@46 25167
rlm@46 25168 expandMenu : function(autoActivate){
rlm@46 25169 },
rlm@46 25170
rlm@46 25171 hideMenu : function(){
rlm@46 25172 }
rlm@46 25173 });
rlm@46 25174
rlm@46 25175 Ext.menu.TextItem = function(text){
rlm@46 25176 this.text = text;
rlm@46 25177 Ext.menu.TextItem.superclass.constructor.call(this);
rlm@46 25178 };
rlm@46 25179
rlm@46 25180 Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, {
rlm@46 25181
rlm@46 25182
rlm@46 25183 hideOnClick : false,
rlm@46 25184
rlm@46 25185 itemCls : "x-menu-text",
rlm@46 25186
rlm@46 25187 onRender : function(){
rlm@46 25188 var s = document.createElement("span");
rlm@46 25189 s.className = this.itemCls;
rlm@46 25190 s.innerHTML = this.text;
rlm@46 25191 this.el = s;
rlm@46 25192 Ext.menu.TextItem.superclass.onRender.apply(this, arguments);
rlm@46 25193 }
rlm@46 25194 });
rlm@46 25195
rlm@46 25196 Ext.menu.Separator = function(config){
rlm@46 25197 Ext.menu.Separator.superclass.constructor.call(this, config);
rlm@46 25198 };
rlm@46 25199
rlm@46 25200 Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, {
rlm@46 25201
rlm@46 25202 itemCls : "x-menu-sep",
rlm@46 25203
rlm@46 25204 hideOnClick : false,
rlm@46 25205
rlm@46 25206 onRender : function(li){
rlm@46 25207 var s = document.createElement("span");
rlm@46 25208 s.className = this.itemCls;
rlm@46 25209 s.innerHTML = "&#160;";
rlm@46 25210 this.el = s;
rlm@46 25211 li.addClass("x-menu-sep-li");
rlm@46 25212 Ext.menu.Separator.superclass.onRender.apply(this, arguments);
rlm@46 25213 }
rlm@46 25214 });
rlm@46 25215
rlm@46 25216 Ext.menu.Item = function(config){
rlm@46 25217 Ext.menu.Item.superclass.constructor.call(this, config);
rlm@46 25218 if(this.menu){
rlm@46 25219 this.menu = Ext.menu.MenuMgr.get(this.menu);
rlm@46 25220 }
rlm@46 25221 };
rlm@46 25222 Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, {
rlm@46 25223
rlm@46 25224
rlm@46 25225
rlm@46 25226
rlm@46 25227
rlm@46 25228
rlm@46 25229
rlm@46 25230 itemCls : "x-menu-item",
rlm@46 25231
rlm@46 25232 canActivate : true,
rlm@46 25233
rlm@46 25234 showDelay: 200,
rlm@46 25235 hideDelay: 200,
rlm@46 25236
rlm@46 25237 ctype: "Ext.menu.Item",
rlm@46 25238
rlm@46 25239 onRender : function(container, position){
rlm@46 25240 var el = document.createElement("a");
rlm@46 25241 el.hideFocus = true;
rlm@46 25242 el.unselectable = "on";
rlm@46 25243 el.href = this.href || "#";
rlm@46 25244 if(this.hrefTarget){
rlm@46 25245 el.target = this.hrefTarget;
rlm@46 25246 }
rlm@46 25247 el.className = this.itemCls + (this.menu ? " x-menu-item-arrow" : "") + (this.cls ? " " + this.cls : "");
rlm@46 25248 el.innerHTML = String.format(
rlm@46 25249 '<img src="{0}" class="x-menu-item-icon {2}" />{1}',
rlm@46 25250 this.icon || Ext.BLANK_IMAGE_URL, this.itemText||this.text, this.iconCls || '');
rlm@46 25251 this.el = el;
rlm@46 25252 Ext.menu.Item.superclass.onRender.call(this, container, position);
rlm@46 25253 },
rlm@46 25254
rlm@46 25255
rlm@46 25256 setText : function(text){
rlm@46 25257 this.text = text;
rlm@46 25258 if(this.rendered){
rlm@46 25259 this.el.update(String.format(
rlm@46 25260 '<img src="{0}" class="x-menu-item-icon {2}">{1}',
rlm@46 25261 this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || ''));
rlm@46 25262 this.parentMenu.autoWidth();
rlm@46 25263 }
rlm@46 25264 },
rlm@46 25265
rlm@46 25266
rlm@46 25267 setIconClass : function(cls){
rlm@46 25268 var oldCls = this.iconCls;
rlm@46 25269 this.iconCls = cls;
rlm@46 25270 if(this.rendered){
rlm@46 25271 this.el.child('img.x-menu-item-icon').replaceClass(oldCls, this.iconCls);
rlm@46 25272 }
rlm@46 25273 },
rlm@46 25274
rlm@46 25275 handleClick : function(e){
rlm@46 25276 if(!this.href){ e.stopEvent();
rlm@46 25277 }
rlm@46 25278 Ext.menu.Item.superclass.handleClick.apply(this, arguments);
rlm@46 25279 },
rlm@46 25280
rlm@46 25281 activate : function(autoExpand){
rlm@46 25282 if(Ext.menu.Item.superclass.activate.apply(this, arguments)){
rlm@46 25283 this.focus();
rlm@46 25284 if(autoExpand){
rlm@46 25285 this.expandMenu();
rlm@46 25286 }
rlm@46 25287 }
rlm@46 25288 return true;
rlm@46 25289 },
rlm@46 25290
rlm@46 25291 shouldDeactivate : function(e){
rlm@46 25292 if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){
rlm@46 25293 if(this.menu && this.menu.isVisible()){
rlm@46 25294 return !this.menu.getEl().getRegion().contains(e.getPoint());
rlm@46 25295 }
rlm@46 25296 return true;
rlm@46 25297 }
rlm@46 25298 return false;
rlm@46 25299 },
rlm@46 25300
rlm@46 25301 deactivate : function(){
rlm@46 25302 Ext.menu.Item.superclass.deactivate.apply(this, arguments);
rlm@46 25303 this.hideMenu();
rlm@46 25304 },
rlm@46 25305
rlm@46 25306 expandMenu : function(autoActivate){
rlm@46 25307 if(!this.disabled && this.menu){
rlm@46 25308 clearTimeout(this.hideTimer);
rlm@46 25309 delete this.hideTimer;
rlm@46 25310 if(!this.menu.isVisible() && !this.showTimer){
rlm@46 25311 this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]);
rlm@46 25312 }else if (this.menu.isVisible() && autoActivate){
rlm@46 25313 this.menu.tryActivate(0, 1);
rlm@46 25314 }
rlm@46 25315 }
rlm@46 25316 },
rlm@46 25317
rlm@46 25318 deferExpand : function(autoActivate){
rlm@46 25319 delete this.showTimer;
rlm@46 25320 this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);
rlm@46 25321 if(autoActivate){
rlm@46 25322 this.menu.tryActivate(0, 1);
rlm@46 25323 }
rlm@46 25324 },
rlm@46 25325
rlm@46 25326 hideMenu : function(){
rlm@46 25327 clearTimeout(this.showTimer);
rlm@46 25328 delete this.showTimer;
rlm@46 25329 if(!this.hideTimer && this.menu && this.menu.isVisible()){
rlm@46 25330 this.hideTimer = this.deferHide.defer(this.hideDelay, this);
rlm@46 25331 }
rlm@46 25332 },
rlm@46 25333
rlm@46 25334 deferHide : function(){
rlm@46 25335 delete this.hideTimer;
rlm@46 25336 this.menu.hide();
rlm@46 25337 }
rlm@46 25338 });
rlm@46 25339
rlm@46 25340 Ext.menu.CheckItem = function(config){
rlm@46 25341 Ext.menu.CheckItem.superclass.constructor.call(this, config);
rlm@46 25342 this.addEvents(
rlm@46 25343
rlm@46 25344 "beforecheckchange" ,
rlm@46 25345
rlm@46 25346 "checkchange"
rlm@46 25347 );
rlm@46 25348
rlm@46 25349 if(this.checkHandler){
rlm@46 25350 this.on('checkchange', this.checkHandler, this.scope);
rlm@46 25351 }
rlm@46 25352 Ext.menu.MenuMgr.registerCheckable(this);
rlm@46 25353 };
rlm@46 25354 Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, {
rlm@46 25355
rlm@46 25356
rlm@46 25357 itemCls : "x-menu-item x-menu-check-item",
rlm@46 25358
rlm@46 25359 groupClass : "x-menu-group-item",
rlm@46 25360
rlm@46 25361
rlm@46 25362 checked: false,
rlm@46 25363
rlm@46 25364 ctype: "Ext.menu.CheckItem",
rlm@46 25365
rlm@46 25366 onRender : function(c){
rlm@46 25367 Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
rlm@46 25368 if(this.group){
rlm@46 25369 this.el.addClass(this.groupClass);
rlm@46 25370 }
rlm@46 25371 if(this.checked){
rlm@46 25372 this.checked = false;
rlm@46 25373 this.setChecked(true, true);
rlm@46 25374 }
rlm@46 25375 },
rlm@46 25376
rlm@46 25377 destroy : function(){
rlm@46 25378 Ext.menu.MenuMgr.unregisterCheckable(this);
rlm@46 25379 Ext.menu.CheckItem.superclass.destroy.apply(this, arguments);
rlm@46 25380 },
rlm@46 25381
rlm@46 25382
rlm@46 25383 setChecked : function(state, suppressEvent){
rlm@46 25384 if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){
rlm@46 25385 if(this.container){
rlm@46 25386 this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked");
rlm@46 25387 }
rlm@46 25388 this.checked = state;
rlm@46 25389 if(suppressEvent !== true){
rlm@46 25390 this.fireEvent("checkchange", this, state);
rlm@46 25391 }
rlm@46 25392 }
rlm@46 25393 },
rlm@46 25394
rlm@46 25395 handleClick : function(e){
rlm@46 25396 if(!this.disabled && !(this.checked && this.group)){ this.setChecked(!this.checked);
rlm@46 25397 }
rlm@46 25398 Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments);
rlm@46 25399 }
rlm@46 25400 });
rlm@46 25401
rlm@46 25402 Ext.menu.Adapter = function(component, config){
rlm@46 25403 Ext.menu.Adapter.superclass.constructor.call(this, config);
rlm@46 25404 this.component = component;
rlm@46 25405 };
rlm@46 25406 Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, {
rlm@46 25407 canActivate : true,
rlm@46 25408
rlm@46 25409 onRender : function(container, position){
rlm@46 25410 this.component.render(container);
rlm@46 25411 this.el = this.component.getEl();
rlm@46 25412 },
rlm@46 25413
rlm@46 25414 activate : function(){
rlm@46 25415 if(this.disabled){
rlm@46 25416 return false;
rlm@46 25417 }
rlm@46 25418 this.component.focus();
rlm@46 25419 this.fireEvent("activate", this);
rlm@46 25420 return true;
rlm@46 25421 },
rlm@46 25422
rlm@46 25423 deactivate : function(){
rlm@46 25424 this.fireEvent("deactivate", this);
rlm@46 25425 },
rlm@46 25426
rlm@46 25427 disable : function(){
rlm@46 25428 this.component.disable();
rlm@46 25429 Ext.menu.Adapter.superclass.disable.call(this);
rlm@46 25430 },
rlm@46 25431
rlm@46 25432 enable : function(){
rlm@46 25433 this.component.enable();
rlm@46 25434 Ext.menu.Adapter.superclass.enable.call(this);
rlm@46 25435 }
rlm@46 25436 });
rlm@46 25437
rlm@46 25438 Ext.menu.DateItem = function(config){
rlm@46 25439 Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config);
rlm@46 25440
rlm@46 25441 this.picker = this.component;
rlm@46 25442 this.addEvents('select');
rlm@46 25443
rlm@46 25444 this.picker.on("render", function(picker){
rlm@46 25445 picker.getEl().swallowEvent("click");
rlm@46 25446 picker.container.addClass("x-menu-date-item");
rlm@46 25447 });
rlm@46 25448
rlm@46 25449 this.picker.on("select", this.onSelect, this);
rlm@46 25450 };
rlm@46 25451
rlm@46 25452 Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, {
rlm@46 25453 onSelect : function(picker, date){
rlm@46 25454 this.fireEvent("select", this, date, picker);
rlm@46 25455 Ext.menu.DateItem.superclass.handleClick.call(this);
rlm@46 25456 }
rlm@46 25457 });
rlm@46 25458
rlm@46 25459 Ext.menu.ColorItem = function(config){
rlm@46 25460 Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config);
rlm@46 25461
rlm@46 25462 this.palette = this.component;
rlm@46 25463 this.relayEvents(this.palette, ["select"]);
rlm@46 25464 if(this.selectHandler){
rlm@46 25465 this.on('select', this.selectHandler, this.scope);
rlm@46 25466 }
rlm@46 25467 };
rlm@46 25468 Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter);
rlm@46 25469
rlm@46 25470 Ext.menu.DateMenu = function(config){
rlm@46 25471 Ext.menu.DateMenu.superclass.constructor.call(this, config);
rlm@46 25472 this.plain = true;
rlm@46 25473 var di = new Ext.menu.DateItem(config);
rlm@46 25474 this.add(di);
rlm@46 25475
rlm@46 25476 this.picker = di.picker;
rlm@46 25477
rlm@46 25478 this.relayEvents(di, ["select"]);
rlm@46 25479
rlm@46 25480 this.on('beforeshow', function(){
rlm@46 25481 if(this.picker){
rlm@46 25482 this.picker.hideMonthPicker(true);
rlm@46 25483 }
rlm@46 25484 }, this);
rlm@46 25485 };
rlm@46 25486 Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu, {
rlm@46 25487 cls:'x-date-menu',
rlm@46 25488
rlm@46 25489 beforeDestroy : function() {
rlm@46 25490 this.picker.destroy();
rlm@46 25491 }
rlm@46 25492 });
rlm@46 25493
rlm@46 25494 Ext.menu.ColorMenu = function(config){
rlm@46 25495 Ext.menu.ColorMenu.superclass.constructor.call(this, config);
rlm@46 25496 this.plain = true;
rlm@46 25497 var ci = new Ext.menu.ColorItem(config);
rlm@46 25498 this.add(ci);
rlm@46 25499
rlm@46 25500 this.palette = ci.palette;
rlm@46 25501
rlm@46 25502 this.relayEvents(ci, ["select"]);
rlm@46 25503 };
rlm@46 25504 Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu);
rlm@46 25505
rlm@46 25506 Ext.form.Field = Ext.extend(Ext.BoxComponent, {
rlm@46 25507
rlm@46 25508
rlm@46 25509
rlm@46 25510
rlm@46 25511
rlm@46 25512
rlm@46 25513
rlm@46 25514
rlm@46 25515
rlm@46 25516
rlm@46 25517
rlm@46 25518
rlm@46 25519
rlm@46 25520 invalidClass : "x-form-invalid",
rlm@46 25521
rlm@46 25522 invalidText : "The value in this field is invalid",
rlm@46 25523
rlm@46 25524 focusClass : "x-form-focus",
rlm@46 25525
rlm@46 25526 validationEvent : "keyup",
rlm@46 25527
rlm@46 25528 validateOnBlur : true,
rlm@46 25529
rlm@46 25530 validationDelay : 250,
rlm@46 25531
rlm@46 25532 defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"},
rlm@46 25533
rlm@46 25534 fieldClass : "x-form-field",
rlm@46 25535
rlm@46 25536 msgTarget : 'qtip',
rlm@46 25537
rlm@46 25538 msgFx : 'normal',
rlm@46 25539
rlm@46 25540 readOnly : false,
rlm@46 25541
rlm@46 25542 disabled : false,
rlm@46 25543
rlm@46 25544 isFormField : true,
rlm@46 25545
rlm@46 25546 hasFocus : false,
rlm@46 25547
rlm@46 25548 initComponent : function(){
rlm@46 25549 Ext.form.Field.superclass.initComponent.call(this);
rlm@46 25550 this.addEvents(
rlm@46 25551
rlm@46 25552 'focus',
rlm@46 25553
rlm@46 25554 'blur',
rlm@46 25555
rlm@46 25556 'specialkey',
rlm@46 25557
rlm@46 25558 'change',
rlm@46 25559
rlm@46 25560 'invalid',
rlm@46 25561
rlm@46 25562 'valid'
rlm@46 25563 );
rlm@46 25564 },
rlm@46 25565
rlm@46 25566
rlm@46 25567 getName: function(){
rlm@46 25568 return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || '');
rlm@46 25569 },
rlm@46 25570
rlm@46 25571 onRender : function(ct, position){
rlm@46 25572 Ext.form.Field.superclass.onRender.call(this, ct, position);
rlm@46 25573 if(!this.el){
rlm@46 25574 var cfg = this.getAutoCreate();
rlm@46 25575 if(!cfg.name){
rlm@46 25576 cfg.name = this.name || this.id;
rlm@46 25577 }
rlm@46 25578 if(this.inputType){
rlm@46 25579 cfg.type = this.inputType;
rlm@46 25580 }
rlm@46 25581 this.el = ct.createChild(cfg, position);
rlm@46 25582 }
rlm@46 25583 var type = this.el.dom.type;
rlm@46 25584 if(type){
rlm@46 25585 if(type == 'password'){
rlm@46 25586 type = 'text';
rlm@46 25587 }
rlm@46 25588 this.el.addClass('x-form-'+type);
rlm@46 25589 }
rlm@46 25590 if(this.readOnly){
rlm@46 25591 this.el.dom.readOnly = true;
rlm@46 25592 }
rlm@46 25593 if(this.tabIndex !== undefined){
rlm@46 25594 this.el.dom.setAttribute('tabIndex', this.tabIndex);
rlm@46 25595 }
rlm@46 25596
rlm@46 25597 this.el.addClass([this.fieldClass, this.cls]);
rlm@46 25598 this.initValue();
rlm@46 25599 },
rlm@46 25600
rlm@46 25601 initValue : function(){
rlm@46 25602 if(this.value !== undefined){
rlm@46 25603 this.setValue(this.value);
rlm@46 25604 }else if(this.el.dom.value.length > 0){
rlm@46 25605 this.setValue(this.el.dom.value);
rlm@46 25606 }
rlm@46 25607 },
rlm@46 25608
rlm@46 25609
rlm@46 25610 isDirty : function() {
rlm@46 25611 if(this.disabled) {
rlm@46 25612 return false;
rlm@46 25613 }
rlm@46 25614 return String(this.getValue()) !== String(this.originalValue);
rlm@46 25615 },
rlm@46 25616
rlm@46 25617 afterRender : function(){
rlm@46 25618 Ext.form.Field.superclass.afterRender.call(this);
rlm@46 25619 this.initEvents();
rlm@46 25620 },
rlm@46 25621
rlm@46 25622 fireKey : function(e){
rlm@46 25623 if(e.isSpecialKey()){
rlm@46 25624 this.fireEvent("specialkey", this, e);
rlm@46 25625 }
rlm@46 25626 },
rlm@46 25627
rlm@46 25628
rlm@46 25629 reset : function(){
rlm@46 25630 this.setValue(this.originalValue);
rlm@46 25631 this.clearInvalid();
rlm@46 25632 },
rlm@46 25633
rlm@46 25634 initEvents : function(){
rlm@46 25635 this.el.on(Ext.isIE || Ext.isSafari3 ? "keydown" : "keypress", this.fireKey, this);
rlm@46 25636 this.el.on("focus", this.onFocus, this);
rlm@46 25637 this.el.on("blur", this.onBlur, this);
rlm@46 25638
rlm@46 25639 this.originalValue = this.getValue();
rlm@46 25640 },
rlm@46 25641
rlm@46 25642 onFocus : function(){
rlm@46 25643 if(!Ext.isOpera && this.focusClass){ this.el.addClass(this.focusClass);
rlm@46 25644 }
rlm@46 25645 if(!this.hasFocus){
rlm@46 25646 this.hasFocus = true;
rlm@46 25647 this.startValue = this.getValue();
rlm@46 25648 this.fireEvent("focus", this);
rlm@46 25649 }
rlm@46 25650 },
rlm@46 25651
rlm@46 25652 beforeBlur : Ext.emptyFn,
rlm@46 25653
rlm@46 25654 onBlur : function(){
rlm@46 25655 this.beforeBlur();
rlm@46 25656 if(!Ext.isOpera && this.focusClass){ this.el.removeClass(this.focusClass);
rlm@46 25657 }
rlm@46 25658 this.hasFocus = false;
rlm@46 25659 if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){
rlm@46 25660 this.validate();
rlm@46 25661 }
rlm@46 25662 var v = this.getValue();
rlm@46 25663 if(String(v) !== String(this.startValue)){
rlm@46 25664 this.fireEvent('change', this, v, this.startValue);
rlm@46 25665 }
rlm@46 25666 this.fireEvent("blur", this);
rlm@46 25667 },
rlm@46 25668
rlm@46 25669
rlm@46 25670 isValid : function(preventMark){
rlm@46 25671 if(this.disabled){
rlm@46 25672 return true;
rlm@46 25673 }
rlm@46 25674 var restore = this.preventMark;
rlm@46 25675 this.preventMark = preventMark === true;
rlm@46 25676 var v = this.validateValue(this.processValue(this.getRawValue()));
rlm@46 25677 this.preventMark = restore;
rlm@46 25678 return v;
rlm@46 25679 },
rlm@46 25680
rlm@46 25681
rlm@46 25682 validate : function(){
rlm@46 25683 if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){
rlm@46 25684 this.clearInvalid();
rlm@46 25685 return true;
rlm@46 25686 }
rlm@46 25687 return false;
rlm@46 25688 },
rlm@46 25689
rlm@46 25690 processValue : function(value){
rlm@46 25691 return value;
rlm@46 25692 },
rlm@46 25693
rlm@46 25694 validateValue : function(value){
rlm@46 25695 return true;
rlm@46 25696 },
rlm@46 25697
rlm@46 25698
rlm@46 25699 markInvalid : function(msg){
rlm@46 25700 if(!this.rendered || this.preventMark){ return;
rlm@46 25701 }
rlm@46 25702 this.el.addClass(this.invalidClass);
rlm@46 25703 msg = msg || this.invalidText;
rlm@46 25704 switch(this.msgTarget){
rlm@46 25705 case 'qtip':
rlm@46 25706 this.el.dom.qtip = msg;
rlm@46 25707 this.el.dom.qclass = 'x-form-invalid-tip';
rlm@46 25708 if(Ext.QuickTips){ Ext.QuickTips.enable();
rlm@46 25709 }
rlm@46 25710 break;
rlm@46 25711 case 'title':
rlm@46 25712 this.el.dom.title = msg;
rlm@46 25713 break;
rlm@46 25714 case 'under':
rlm@46 25715 if(!this.errorEl){
rlm@46 25716 var elp = this.getErrorCt();
rlm@46 25717 this.errorEl = elp.createChild({cls:'x-form-invalid-msg'});
rlm@46 25718 this.errorEl.setWidth(elp.getWidth(true)-20);
rlm@46 25719 }
rlm@46 25720 this.errorEl.update(msg);
rlm@46 25721 Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);
rlm@46 25722 break;
rlm@46 25723 case 'side':
rlm@46 25724 if(!this.errorIcon){
rlm@46 25725 var elp = this.getErrorCt();
rlm@46 25726 this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});
rlm@46 25727 }
rlm@46 25728 this.alignErrorIcon();
rlm@46 25729 this.errorIcon.dom.qtip = msg;
rlm@46 25730 this.errorIcon.dom.qclass = 'x-form-invalid-tip';
rlm@46 25731 this.errorIcon.show();
rlm@46 25732 this.on('resize', this.alignErrorIcon, this);
rlm@46 25733 break;
rlm@46 25734 default:
rlm@46 25735 var t = Ext.getDom(this.msgTarget);
rlm@46 25736 t.innerHTML = msg;
rlm@46 25737 t.style.display = this.msgDisplay;
rlm@46 25738 break;
rlm@46 25739 }
rlm@46 25740 this.fireEvent('invalid', this, msg);
rlm@46 25741 },
rlm@46 25742
rlm@46 25743 getErrorCt : function(){
rlm@46 25744 return this.el.findParent('.x-form-element', 5, true) || this.el.findParent('.x-form-field-wrap', 5, true); },
rlm@46 25745
rlm@46 25746 alignErrorIcon : function(){
rlm@46 25747 this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);
rlm@46 25748 },
rlm@46 25749
rlm@46 25750
rlm@46 25751 clearInvalid : function(){
rlm@46 25752 if(!this.rendered || this.preventMark){ return;
rlm@46 25753 }
rlm@46 25754 this.el.removeClass(this.invalidClass);
rlm@46 25755 switch(this.msgTarget){
rlm@46 25756 case 'qtip':
rlm@46 25757 this.el.dom.qtip = '';
rlm@46 25758 break;
rlm@46 25759 case 'title':
rlm@46 25760 this.el.dom.title = '';
rlm@46 25761 break;
rlm@46 25762 case 'under':
rlm@46 25763 if(this.errorEl){
rlm@46 25764 Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);
rlm@46 25765 }
rlm@46 25766 break;
rlm@46 25767 case 'side':
rlm@46 25768 if(this.errorIcon){
rlm@46 25769 this.errorIcon.dom.qtip = '';
rlm@46 25770 this.errorIcon.hide();
rlm@46 25771 this.un('resize', this.alignErrorIcon, this);
rlm@46 25772 }
rlm@46 25773 break;
rlm@46 25774 default:
rlm@46 25775 var t = Ext.getDom(this.msgTarget);
rlm@46 25776 t.innerHTML = '';
rlm@46 25777 t.style.display = 'none';
rlm@46 25778 break;
rlm@46 25779 }
rlm@46 25780 this.fireEvent('valid', this);
rlm@46 25781 },
rlm@46 25782
rlm@46 25783
rlm@46 25784 getRawValue : function(){
rlm@46 25785 var v = this.rendered ? this.el.getValue() : Ext.value(this.value, '');
rlm@46 25786 if(v === this.emptyText){
rlm@46 25787 v = '';
rlm@46 25788 }
rlm@46 25789 return v;
rlm@46 25790 },
rlm@46 25791
rlm@46 25792
rlm@46 25793 getValue : function(){
rlm@46 25794 if(!this.rendered) {
rlm@46 25795 return this.value;
rlm@46 25796 }
rlm@46 25797 var v = this.el.getValue();
rlm@46 25798 if(v === this.emptyText || v === undefined){
rlm@46 25799 v = '';
rlm@46 25800 }
rlm@46 25801 return v;
rlm@46 25802 },
rlm@46 25803
rlm@46 25804
rlm@46 25805 setRawValue : function(v){
rlm@46 25806 return this.el.dom.value = (v === null || v === undefined ? '' : v);
rlm@46 25807 },
rlm@46 25808
rlm@46 25809
rlm@46 25810 setValue : function(v){
rlm@46 25811 this.value = v;
rlm@46 25812 if(this.rendered){
rlm@46 25813 this.el.dom.value = (v === null || v === undefined ? '' : v);
rlm@46 25814 this.validate();
rlm@46 25815 }
rlm@46 25816 },
rlm@46 25817
rlm@46 25818 adjustSize : function(w, h){
rlm@46 25819 var s = Ext.form.Field.superclass.adjustSize.call(this, w, h);
rlm@46 25820 s.width = this.adjustWidth(this.el.dom.tagName, s.width);
rlm@46 25821 return s;
rlm@46 25822 },
rlm@46 25823
rlm@46 25824 adjustWidth : function(tag, w){
rlm@46 25825 tag = tag.toLowerCase();
rlm@46 25826 if(typeof w == 'number' && !Ext.isSafari){
rlm@46 25827 if(Ext.isIE && (tag == 'input' || tag == 'textarea')){
rlm@46 25828 if(tag == 'input' && !Ext.isStrict){
rlm@46 25829 return this.inEditor ? w : w - 3;
rlm@46 25830 }
rlm@46 25831 if(tag == 'input' && Ext.isStrict){
rlm@46 25832 return w - (Ext.isIE6 ? 4 : 1);
rlm@46 25833 }
rlm@46 25834 if(tag == 'textarea' && Ext.isStrict){
rlm@46 25835 return w-2;
rlm@46 25836 }
rlm@46 25837 }else if(Ext.isOpera && Ext.isStrict){
rlm@46 25838 if(tag == 'input'){
rlm@46 25839 return w + 2;
rlm@46 25840 }
rlm@46 25841 if(tag == 'textarea'){
rlm@46 25842 return w-2;
rlm@46 25843 }
rlm@46 25844 }
rlm@46 25845 }
rlm@46 25846 return w;
rlm@46 25847 }
rlm@46 25848
rlm@46 25849
rlm@46 25850
rlm@46 25851
rlm@46 25852
rlm@46 25853 });
rlm@46 25854
rlm@46 25855
rlm@46 25856 Ext.form.Field.msgFx = {
rlm@46 25857 normal : {
rlm@46 25858 show: function(msgEl, f){
rlm@46 25859 msgEl.setDisplayed('block');
rlm@46 25860 },
rlm@46 25861
rlm@46 25862 hide : function(msgEl, f){
rlm@46 25863 msgEl.setDisplayed(false).update('');
rlm@46 25864 }
rlm@46 25865 },
rlm@46 25866
rlm@46 25867 slide : {
rlm@46 25868 show: function(msgEl, f){
rlm@46 25869 msgEl.slideIn('t', {stopFx:true});
rlm@46 25870 },
rlm@46 25871
rlm@46 25872 hide : function(msgEl, f){
rlm@46 25873 msgEl.slideOut('t', {stopFx:true,useDisplay:true});
rlm@46 25874 }
rlm@46 25875 },
rlm@46 25876
rlm@46 25877 slideRight : {
rlm@46 25878 show: function(msgEl, f){
rlm@46 25879 msgEl.fixDisplay();
rlm@46 25880 msgEl.alignTo(f.el, 'tl-tr');
rlm@46 25881 msgEl.slideIn('l', {stopFx:true});
rlm@46 25882 },
rlm@46 25883
rlm@46 25884 hide : function(msgEl, f){
rlm@46 25885 msgEl.slideOut('l', {stopFx:true,useDisplay:true});
rlm@46 25886 }
rlm@46 25887 }
rlm@46 25888 };
rlm@46 25889 Ext.reg('field', Ext.form.Field);
rlm@46 25890
rlm@46 25891
rlm@46 25892 Ext.form.TextField = Ext.extend(Ext.form.Field, {
rlm@46 25893
rlm@46 25894
rlm@46 25895 grow : false,
rlm@46 25896
rlm@46 25897 growMin : 30,
rlm@46 25898
rlm@46 25899 growMax : 800,
rlm@46 25900
rlm@46 25901 vtype : null,
rlm@46 25902
rlm@46 25903 maskRe : null,
rlm@46 25904
rlm@46 25905 disableKeyFilter : false,
rlm@46 25906
rlm@46 25907 allowBlank : true,
rlm@46 25908
rlm@46 25909 minLength : 0,
rlm@46 25910
rlm@46 25911 maxLength : Number.MAX_VALUE,
rlm@46 25912
rlm@46 25913 minLengthText : "The minimum length for this field is {0}",
rlm@46 25914
rlm@46 25915 maxLengthText : "The maximum length for this field is {0}",
rlm@46 25916
rlm@46 25917 selectOnFocus : false,
rlm@46 25918
rlm@46 25919 blankText : "This field is required",
rlm@46 25920
rlm@46 25921 validator : null,
rlm@46 25922
rlm@46 25923 regex : null,
rlm@46 25924
rlm@46 25925 regexText : "",
rlm@46 25926
rlm@46 25927 emptyText : null,
rlm@46 25928
rlm@46 25929 emptyClass : 'x-form-empty-field',
rlm@46 25930
rlm@46 25931
rlm@46 25932
rlm@46 25933 initComponent : function(){
rlm@46 25934 Ext.form.TextField.superclass.initComponent.call(this);
rlm@46 25935 this.addEvents(
rlm@46 25936
rlm@46 25937 'autosize',
rlm@46 25938
rlm@46 25939
rlm@46 25940 'keydown',
rlm@46 25941
rlm@46 25942 'keyup',
rlm@46 25943
rlm@46 25944 'keypress'
rlm@46 25945 );
rlm@46 25946 },
rlm@46 25947
rlm@46 25948 initEvents : function(){
rlm@46 25949 Ext.form.TextField.superclass.initEvents.call(this);
rlm@46 25950 if(this.validationEvent == 'keyup'){
rlm@46 25951 this.validationTask = new Ext.util.DelayedTask(this.validate, this);
rlm@46 25952 this.el.on('keyup', this.filterValidation, this);
rlm@46 25953 }
rlm@46 25954 else if(this.validationEvent !== false){
rlm@46 25955 this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay});
rlm@46 25956 }
rlm@46 25957 if(this.selectOnFocus || this.emptyText){
rlm@46 25958 this.on("focus", this.preFocus, this);
rlm@46 25959 if(this.emptyText){
rlm@46 25960 this.on('blur', this.postBlur, this);
rlm@46 25961 this.applyEmptyText();
rlm@46 25962 }
rlm@46 25963 }
rlm@46 25964 if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){
rlm@46 25965 this.el.on("keypress", this.filterKeys, this);
rlm@46 25966 }
rlm@46 25967 if(this.grow){
rlm@46 25968 this.el.on("keyup", this.onKeyUpBuffered, this, {buffer:50});
rlm@46 25969 this.el.on("click", this.autoSize, this);
rlm@46 25970 }
rlm@46 25971
rlm@46 25972 if(this.enableKeyEvents){
rlm@46 25973 this.el.on("keyup", this.onKeyUp, this);
rlm@46 25974 this.el.on("keydown", this.onKeyDown, this);
rlm@46 25975 this.el.on("keypress", this.onKeyPress, this);
rlm@46 25976 }
rlm@46 25977 },
rlm@46 25978
rlm@46 25979 processValue : function(value){
rlm@46 25980 if(this.stripCharsRe){
rlm@46 25981 var newValue = value.replace(this.stripCharsRe, '');
rlm@46 25982 if(newValue !== value){
rlm@46 25983 this.setRawValue(newValue);
rlm@46 25984 return newValue;
rlm@46 25985 }
rlm@46 25986 }
rlm@46 25987 return value;
rlm@46 25988 },
rlm@46 25989
rlm@46 25990 filterValidation : function(e){
rlm@46 25991 if(!e.isNavKeyPress()){
rlm@46 25992 this.validationTask.delay(this.validationDelay);
rlm@46 25993 }
rlm@46 25994 },
rlm@46 25995
rlm@46 25996 onKeyUpBuffered : function(e){
rlm@46 25997 if(!e.isNavKeyPress()){
rlm@46 25998 this.autoSize();
rlm@46 25999 }
rlm@46 26000 },
rlm@46 26001
rlm@46 26002 onKeyUp : function(e){
rlm@46 26003 this.fireEvent('keyup', this, e);
rlm@46 26004 },
rlm@46 26005
rlm@46 26006 onKeyDown : function(e){
rlm@46 26007 this.fireEvent('keydown', this, e);
rlm@46 26008 },
rlm@46 26009
rlm@46 26010 onKeyPress : function(e){
rlm@46 26011 this.fireEvent('keypress', this, e);
rlm@46 26012 },
rlm@46 26013
rlm@46 26014
rlm@46 26015 reset : function(){
rlm@46 26016 Ext.form.TextField.superclass.reset.call(this);
rlm@46 26017 this.applyEmptyText();
rlm@46 26018 },
rlm@46 26019
rlm@46 26020 applyEmptyText : function(){
rlm@46 26021 if(this.rendered && this.emptyText && this.getRawValue().length < 1){
rlm@46 26022 this.setRawValue(this.emptyText);
rlm@46 26023 this.el.addClass(this.emptyClass);
rlm@46 26024 }
rlm@46 26025 },
rlm@46 26026
rlm@46 26027 preFocus : function(){
rlm@46 26028 if(this.emptyText){
rlm@46 26029 if(this.el.dom.value == this.emptyText){
rlm@46 26030 this.setRawValue('');
rlm@46 26031 }
rlm@46 26032 this.el.removeClass(this.emptyClass);
rlm@46 26033 }
rlm@46 26034 if(this.selectOnFocus){
rlm@46 26035 this.el.dom.select();
rlm@46 26036 }
rlm@46 26037 },
rlm@46 26038
rlm@46 26039 postBlur : function(){
rlm@46 26040 this.applyEmptyText();
rlm@46 26041 },
rlm@46 26042
rlm@46 26043 filterKeys : function(e){
rlm@46 26044 var k = e.getKey();
rlm@46 26045 if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){
rlm@46 26046 return;
rlm@46 26047 }
rlm@46 26048 var c = e.getCharCode(), cc = String.fromCharCode(c);
rlm@46 26049 if(Ext.isIE && (e.isSpecialKey() || !cc)){
rlm@46 26050 return;
rlm@46 26051 }
rlm@46 26052 if(!this.maskRe.test(cc)){
rlm@46 26053 e.stopEvent();
rlm@46 26054 }
rlm@46 26055 },
rlm@46 26056
rlm@46 26057 setValue : function(v){
rlm@46 26058 if(this.emptyText && this.el && v !== undefined && v !== null && v !== ''){
rlm@46 26059 this.el.removeClass(this.emptyClass);
rlm@46 26060 }
rlm@46 26061 Ext.form.TextField.superclass.setValue.apply(this, arguments);
rlm@46 26062 this.applyEmptyText();
rlm@46 26063 this.autoSize();
rlm@46 26064 },
rlm@46 26065
rlm@46 26066
rlm@46 26067 validateValue : function(value){
rlm@46 26068 if(value.length < 1 || value === this.emptyText){ if(this.allowBlank){
rlm@46 26069 this.clearInvalid();
rlm@46 26070 return true;
rlm@46 26071 }else{
rlm@46 26072 this.markInvalid(this.blankText);
rlm@46 26073 return false;
rlm@46 26074 }
rlm@46 26075 }
rlm@46 26076 if(value.length < this.minLength){
rlm@46 26077 this.markInvalid(String.format(this.minLengthText, this.minLength));
rlm@46 26078 return false;
rlm@46 26079 }
rlm@46 26080 if(value.length > this.maxLength){
rlm@46 26081 this.markInvalid(String.format(this.maxLengthText, this.maxLength));
rlm@46 26082 return false;
rlm@46 26083 }
rlm@46 26084 if(this.vtype){
rlm@46 26085 var vt = Ext.form.VTypes;
rlm@46 26086 if(!vt[this.vtype](value, this)){
rlm@46 26087 this.markInvalid(this.vtypeText || vt[this.vtype +'Text']);
rlm@46 26088 return false;
rlm@46 26089 }
rlm@46 26090 }
rlm@46 26091 if(typeof this.validator == "function"){
rlm@46 26092 var msg = this.validator(value);
rlm@46 26093 if(msg !== true){
rlm@46 26094 this.markInvalid(msg);
rlm@46 26095 return false;
rlm@46 26096 }
rlm@46 26097 }
rlm@46 26098 if(this.regex && !this.regex.test(value)){
rlm@46 26099 this.markInvalid(this.regexText);
rlm@46 26100 return false;
rlm@46 26101 }
rlm@46 26102 return true;
rlm@46 26103 },
rlm@46 26104
rlm@46 26105
rlm@46 26106 selectText : function(start, end){
rlm@46 26107 var v = this.getRawValue();
rlm@46 26108 if(v.length > 0){
rlm@46 26109 start = start === undefined ? 0 : start;
rlm@46 26110 end = end === undefined ? v.length : end;
rlm@46 26111 var d = this.el.dom;
rlm@46 26112 if(d.setSelectionRange){
rlm@46 26113 d.setSelectionRange(start, end);
rlm@46 26114 }else if(d.createTextRange){
rlm@46 26115 var range = d.createTextRange();
rlm@46 26116 range.moveStart("character", start);
rlm@46 26117 range.moveEnd("character", end-v.length);
rlm@46 26118 range.select();
rlm@46 26119 }
rlm@46 26120 }
rlm@46 26121 },
rlm@46 26122
rlm@46 26123
rlm@46 26124 autoSize : function(){
rlm@46 26125 if(!this.grow || !this.rendered){
rlm@46 26126 return;
rlm@46 26127 }
rlm@46 26128 if(!this.metrics){
rlm@46 26129 this.metrics = Ext.util.TextMetrics.createInstance(this.el);
rlm@46 26130 }
rlm@46 26131 var el = this.el;
rlm@46 26132 var v = el.dom.value;
rlm@46 26133 var d = document.createElement('div');
rlm@46 26134 d.appendChild(document.createTextNode(v));
rlm@46 26135 v = d.innerHTML;
rlm@46 26136 d = null;
rlm@46 26137 v += "&#160;";
rlm@46 26138 var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + 10, this.growMin));
rlm@46 26139 this.el.setWidth(w);
rlm@46 26140 this.fireEvent("autosize", this, w);
rlm@46 26141 }
rlm@46 26142 });
rlm@46 26143 Ext.reg('textfield', Ext.form.TextField);
rlm@46 26144
rlm@46 26145
rlm@46 26146 Ext.form.TriggerField = Ext.extend(Ext.form.TextField, {
rlm@46 26147
rlm@46 26148
rlm@46 26149 defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"},
rlm@46 26150
rlm@46 26151 hideTrigger:false,
rlm@46 26152
rlm@46 26153
rlm@46 26154 autoSize: Ext.emptyFn,
rlm@46 26155 monitorTab : true,
rlm@46 26156 deferHeight : true,
rlm@46 26157 mimicing : false,
rlm@46 26158
rlm@46 26159 onResize : function(w, h){
rlm@46 26160 Ext.form.TriggerField.superclass.onResize.call(this, w, h);
rlm@46 26161 if(typeof w == 'number'){
rlm@46 26162 this.el.setWidth(this.adjustWidth('input', w - this.trigger.getWidth()));
rlm@46 26163 }
rlm@46 26164 this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());
rlm@46 26165 },
rlm@46 26166
rlm@46 26167 adjustSize : Ext.BoxComponent.prototype.adjustSize,
rlm@46 26168
rlm@46 26169 getResizeEl : function(){
rlm@46 26170 return this.wrap;
rlm@46 26171 },
rlm@46 26172
rlm@46 26173 getPositionEl : function(){
rlm@46 26174 return this.wrap;
rlm@46 26175 },
rlm@46 26176
rlm@46 26177 alignErrorIcon : function(){
rlm@46 26178 this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
rlm@46 26179 },
rlm@46 26180
rlm@46 26181 onRender : function(ct, position){
rlm@46 26182 Ext.form.TriggerField.superclass.onRender.call(this, ct, position);
rlm@46 26183 this.wrap = this.el.wrap({cls: "x-form-field-wrap"});
rlm@46 26184 this.trigger = this.wrap.createChild(this.triggerConfig ||
rlm@46 26185 {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.triggerClass});
rlm@46 26186 if(this.hideTrigger){
rlm@46 26187 this.trigger.setDisplayed(false);
rlm@46 26188 }
rlm@46 26189 this.initTrigger();
rlm@46 26190 if(!this.width){
rlm@46 26191 this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());
rlm@46 26192 }
rlm@46 26193 },
rlm@46 26194
rlm@46 26195 initTrigger : function(){
rlm@46 26196 this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true});
rlm@46 26197 this.trigger.addClassOnOver('x-form-trigger-over');
rlm@46 26198 this.trigger.addClassOnClick('x-form-trigger-click');
rlm@46 26199 },
rlm@46 26200
rlm@46 26201 onDestroy : function(){
rlm@46 26202 if(this.trigger){
rlm@46 26203 this.trigger.removeAllListeners();
rlm@46 26204 this.trigger.remove();
rlm@46 26205 }
rlm@46 26206 if(this.wrap){
rlm@46 26207 this.wrap.remove();
rlm@46 26208 }
rlm@46 26209 Ext.form.TriggerField.superclass.onDestroy.call(this);
rlm@46 26210 },
rlm@46 26211
rlm@46 26212 onFocus : function(){
rlm@46 26213 Ext.form.TriggerField.superclass.onFocus.call(this);
rlm@46 26214 if(!this.mimicing){
rlm@46 26215 this.wrap.addClass('x-trigger-wrap-focus');
rlm@46 26216 this.mimicing = true;
rlm@46 26217 Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this, {delay: 10});
rlm@46 26218 if(this.monitorTab){
rlm@46 26219 this.el.on("keydown", this.checkTab, this);
rlm@46 26220 }
rlm@46 26221 }
rlm@46 26222 },
rlm@46 26223
rlm@46 26224 checkTab : function(e){
rlm@46 26225 if(e.getKey() == e.TAB){
rlm@46 26226 this.triggerBlur();
rlm@46 26227 }
rlm@46 26228 },
rlm@46 26229
rlm@46 26230 onBlur : function(){
rlm@46 26231 },
rlm@46 26232
rlm@46 26233 mimicBlur : function(e){
rlm@46 26234 if(!this.wrap.contains(e.target) && this.validateBlur(e)){
rlm@46 26235 this.triggerBlur();
rlm@46 26236 }
rlm@46 26237 },
rlm@46 26238
rlm@46 26239 triggerBlur : function(){
rlm@46 26240 this.mimicing = false;
rlm@46 26241 Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur);
rlm@46 26242 if(this.monitorTab){
rlm@46 26243 this.el.un("keydown", this.checkTab, this);
rlm@46 26244 }
rlm@46 26245 this.beforeBlur();
rlm@46 26246 this.wrap.removeClass('x-trigger-wrap-focus');
rlm@46 26247 Ext.form.TriggerField.superclass.onBlur.call(this);
rlm@46 26248 },
rlm@46 26249
rlm@46 26250 beforeBlur : Ext.emptyFn,
rlm@46 26251
rlm@46 26252 validateBlur : function(e){
rlm@46 26253 return true;
rlm@46 26254 },
rlm@46 26255
rlm@46 26256 onDisable : function(){
rlm@46 26257 Ext.form.TriggerField.superclass.onDisable.call(this);
rlm@46 26258 if(this.wrap){
rlm@46 26259 this.wrap.addClass('x-item-disabled');
rlm@46 26260 }
rlm@46 26261 },
rlm@46 26262
rlm@46 26263 onEnable : function(){
rlm@46 26264 Ext.form.TriggerField.superclass.onEnable.call(this);
rlm@46 26265 if(this.wrap){
rlm@46 26266 this.wrap.removeClass('x-item-disabled');
rlm@46 26267 }
rlm@46 26268 },
rlm@46 26269
rlm@46 26270
rlm@46 26271 onShow : function(){
rlm@46 26272 if(this.wrap){
rlm@46 26273 this.wrap.dom.style.display = '';
rlm@46 26274 this.wrap.dom.style.visibility = 'visible';
rlm@46 26275 }
rlm@46 26276 },
rlm@46 26277
rlm@46 26278 onHide : function(){
rlm@46 26279 this.wrap.dom.style.display = 'none';
rlm@46 26280 },
rlm@46 26281
rlm@46 26282
rlm@46 26283 onTriggerClick : Ext.emptyFn
rlm@46 26284
rlm@46 26285
rlm@46 26286
rlm@46 26287
rlm@46 26288 });
rlm@46 26289
rlm@46 26290 Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {
rlm@46 26291 initComponent : function(){
rlm@46 26292 Ext.form.TwinTriggerField.superclass.initComponent.call(this);
rlm@46 26293
rlm@46 26294 this.triggerConfig = {
rlm@46 26295 tag:'span', cls:'x-form-twin-triggers', cn:[
rlm@46 26296 {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.trigger1Class},
rlm@46 26297 {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.trigger2Class}
rlm@46 26298 ]};
rlm@46 26299 },
rlm@46 26300
rlm@46 26301 getTrigger : function(index){
rlm@46 26302 return this.triggers[index];
rlm@46 26303 },
rlm@46 26304
rlm@46 26305 initTrigger : function(){
rlm@46 26306 var ts = this.trigger.select('.x-form-trigger', true);
rlm@46 26307 this.wrap.setStyle('overflow', 'hidden');
rlm@46 26308 var triggerField = this;
rlm@46 26309 ts.each(function(t, all, index){
rlm@46 26310 t.hide = function(){
rlm@46 26311 var w = triggerField.wrap.getWidth();
rlm@46 26312 this.dom.style.display = 'none';
rlm@46 26313 triggerField.el.setWidth(w-triggerField.trigger.getWidth());
rlm@46 26314 };
rlm@46 26315 t.show = function(){
rlm@46 26316 var w = triggerField.wrap.getWidth();
rlm@46 26317 this.dom.style.display = '';
rlm@46 26318 triggerField.el.setWidth(w-triggerField.trigger.getWidth());
rlm@46 26319 };
rlm@46 26320 var triggerIndex = 'Trigger'+(index+1);
rlm@46 26321
rlm@46 26322 if(this['hide'+triggerIndex]){
rlm@46 26323 t.dom.style.display = 'none';
rlm@46 26324 }
rlm@46 26325 t.on("click", this['on'+triggerIndex+'Click'], this, {preventDefault:true});
rlm@46 26326 t.addClassOnOver('x-form-trigger-over');
rlm@46 26327 t.addClassOnClick('x-form-trigger-click');
rlm@46 26328 }, this);
rlm@46 26329 this.triggers = ts.elements;
rlm@46 26330 },
rlm@46 26331
rlm@46 26332 onTrigger1Click : Ext.emptyFn,
rlm@46 26333 onTrigger2Click : Ext.emptyFn
rlm@46 26334 });
rlm@46 26335 Ext.reg('trigger', Ext.form.TriggerField);
rlm@46 26336
rlm@46 26337 Ext.form.TextArea = Ext.extend(Ext.form.TextField, {
rlm@46 26338
rlm@46 26339 growMin : 60,
rlm@46 26340
rlm@46 26341 growMax: 1000,
rlm@46 26342 growAppend : '&#160;\n&#160;',
rlm@46 26343 growPad : 0,
rlm@46 26344
rlm@46 26345 enterIsSpecial : false,
rlm@46 26346
rlm@46 26347
rlm@46 26348 preventScrollbars: false,
rlm@46 26349
rlm@46 26350
rlm@46 26351 onRender : function(ct, position){
rlm@46 26352 if(!this.el){
rlm@46 26353 this.defaultAutoCreate = {
rlm@46 26354 tag: "textarea",
rlm@46 26355 style:"width:100px;height:60px;",
rlm@46 26356 autocomplete: "off"
rlm@46 26357 };
rlm@46 26358 }
rlm@46 26359 Ext.form.TextArea.superclass.onRender.call(this, ct, position);
rlm@46 26360 if(this.grow){
rlm@46 26361 this.textSizeEl = Ext.DomHelper.append(document.body, {
rlm@46 26362 tag: "pre", cls: "x-form-grow-sizer"
rlm@46 26363 });
rlm@46 26364 if(this.preventScrollbars){
rlm@46 26365 this.el.setStyle("overflow", "hidden");
rlm@46 26366 }
rlm@46 26367 this.el.setHeight(this.growMin);
rlm@46 26368 }
rlm@46 26369 },
rlm@46 26370
rlm@46 26371 onDestroy : function(){
rlm@46 26372 if(this.textSizeEl){
rlm@46 26373 Ext.removeNode(this.textSizeEl);
rlm@46 26374 }
rlm@46 26375 Ext.form.TextArea.superclass.onDestroy.call(this);
rlm@46 26376 },
rlm@46 26377
rlm@46 26378 fireKey : function(e){
rlm@46 26379 if(e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() != e.ENTER || e.hasModifier()))){
rlm@46 26380 this.fireEvent("specialkey", this, e);
rlm@46 26381 }
rlm@46 26382 },
rlm@46 26383
rlm@46 26384 onKeyUp : function(e){
rlm@46 26385 if(!e.isNavKeyPress() || e.getKey() == e.ENTER){
rlm@46 26386 this.autoSize();
rlm@46 26387 }
rlm@46 26388 },
rlm@46 26389
rlm@46 26390
rlm@46 26391 autoSize : function(){
rlm@46 26392 if(!this.grow || !this.textSizeEl){
rlm@46 26393 return;
rlm@46 26394 }
rlm@46 26395 var el = this.el;
rlm@46 26396 var v = el.dom.value;
rlm@46 26397 var ts = this.textSizeEl;
rlm@46 26398 ts.innerHTML = '';
rlm@46 26399 ts.appendChild(document.createTextNode(v));
rlm@46 26400 v = ts.innerHTML;
rlm@46 26401
rlm@46 26402 Ext.fly(ts).setWidth(this.el.getWidth());
rlm@46 26403 if(v.length < 1){
rlm@46 26404 v = "&#160;&#160;";
rlm@46 26405 }else{
rlm@46 26406 if(Ext.isIE){
rlm@46 26407 v = v.replace(/\n/g, '<p>&#160;</p>');
rlm@46 26408 }
rlm@46 26409 v += this.growAppend;
rlm@46 26410 }
rlm@46 26411 ts.innerHTML = v;
rlm@46 26412 var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)+this.growPad);
rlm@46 26413 if(h != this.lastHeight){
rlm@46 26414 this.lastHeight = h;
rlm@46 26415 this.el.setHeight(h);
rlm@46 26416 this.fireEvent("autosize", this, h);
rlm@46 26417 }
rlm@46 26418 }
rlm@46 26419 });
rlm@46 26420 Ext.reg('textarea', Ext.form.TextArea);
rlm@46 26421
rlm@46 26422 Ext.form.NumberField = Ext.extend(Ext.form.TextField, {
rlm@46 26423
rlm@46 26424 fieldClass: "x-form-field x-form-num-field",
rlm@46 26425
rlm@46 26426 allowDecimals : true,
rlm@46 26427
rlm@46 26428 decimalSeparator : ".",
rlm@46 26429
rlm@46 26430 decimalPrecision : 2,
rlm@46 26431
rlm@46 26432 allowNegative : true,
rlm@46 26433
rlm@46 26434 minValue : Number.NEGATIVE_INFINITY,
rlm@46 26435
rlm@46 26436 maxValue : Number.MAX_VALUE,
rlm@46 26437
rlm@46 26438 minText : "The minimum value for this field is {0}",
rlm@46 26439
rlm@46 26440 maxText : "The maximum value for this field is {0}",
rlm@46 26441
rlm@46 26442 nanText : "{0} is not a valid number",
rlm@46 26443
rlm@46 26444 baseChars : "0123456789",
rlm@46 26445
rlm@46 26446 initEvents : function(){
rlm@46 26447 Ext.form.NumberField.superclass.initEvents.call(this);
rlm@46 26448 var allowed = this.baseChars+'';
rlm@46 26449 if(this.allowDecimals){
rlm@46 26450 allowed += this.decimalSeparator;
rlm@46 26451 }
rlm@46 26452 if(this.allowNegative){
rlm@46 26453 allowed += "-";
rlm@46 26454 }
rlm@46 26455 this.stripCharsRe = new RegExp('[^'+allowed+']', 'gi');
rlm@46 26456 var keyPress = function(e){
rlm@46 26457 var k = e.getKey();
rlm@46 26458 if(!Ext.isIE && (e.isSpecialKey() || k == e.BACKSPACE || k == e.DELETE)){
rlm@46 26459 return;
rlm@46 26460 }
rlm@46 26461 var c = e.getCharCode();
rlm@46 26462 if(allowed.indexOf(String.fromCharCode(c)) === -1){
rlm@46 26463 e.stopEvent();
rlm@46 26464 }
rlm@46 26465 };
rlm@46 26466 this.el.on("keypress", keyPress, this);
rlm@46 26467 },
rlm@46 26468
rlm@46 26469 validateValue : function(value){
rlm@46 26470 if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){
rlm@46 26471 return false;
rlm@46 26472 }
rlm@46 26473 if(value.length < 1){ return true;
rlm@46 26474 }
rlm@46 26475 value = String(value).replace(this.decimalSeparator, ".");
rlm@46 26476 if(isNaN(value)){
rlm@46 26477 this.markInvalid(String.format(this.nanText, value));
rlm@46 26478 return false;
rlm@46 26479 }
rlm@46 26480 var num = this.parseValue(value);
rlm@46 26481 if(num < this.minValue){
rlm@46 26482 this.markInvalid(String.format(this.minText, this.minValue));
rlm@46 26483 return false;
rlm@46 26484 }
rlm@46 26485 if(num > this.maxValue){
rlm@46 26486 this.markInvalid(String.format(this.maxText, this.maxValue));
rlm@46 26487 return false;
rlm@46 26488 }
rlm@46 26489 return true;
rlm@46 26490 },
rlm@46 26491
rlm@46 26492 getValue : function(){
rlm@46 26493 return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)));
rlm@46 26494 },
rlm@46 26495
rlm@46 26496 setValue : function(v){
rlm@46 26497 v = typeof v == 'number' ? v : parseFloat(String(v).replace(this.decimalSeparator, "."));
rlm@46 26498 v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);
rlm@46 26499 Ext.form.NumberField.superclass.setValue.call(this, v);
rlm@46 26500 },
rlm@46 26501
rlm@46 26502 parseValue : function(value){
rlm@46 26503 value = parseFloat(String(value).replace(this.decimalSeparator, "."));
rlm@46 26504 return isNaN(value) ? '' : value;
rlm@46 26505 },
rlm@46 26506
rlm@46 26507 fixPrecision : function(value){
rlm@46 26508 var nan = isNaN(value);
rlm@46 26509 if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){
rlm@46 26510 return nan ? '' : value;
rlm@46 26511 }
rlm@46 26512 return parseFloat(parseFloat(value).toFixed(this.decimalPrecision));
rlm@46 26513 },
rlm@46 26514
rlm@46 26515 beforeBlur : function(){
rlm@46 26516 var v = this.parseValue(this.getRawValue());
rlm@46 26517 if(v){
rlm@46 26518 this.setValue(this.fixPrecision(v));
rlm@46 26519 }
rlm@46 26520 }
rlm@46 26521 });
rlm@46 26522 Ext.reg('numberfield', Ext.form.NumberField);
rlm@46 26523
rlm@46 26524 Ext.form.DateField = Ext.extend(Ext.form.TriggerField, {
rlm@46 26525
rlm@46 26526 format : "m/d/Y",
rlm@46 26527
rlm@46 26528 altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",
rlm@46 26529
rlm@46 26530 disabledDays : null,
rlm@46 26531
rlm@46 26532 disabledDaysText : "Disabled",
rlm@46 26533
rlm@46 26534 disabledDates : null,
rlm@46 26535
rlm@46 26536 disabledDatesText : "Disabled",
rlm@46 26537
rlm@46 26538 minValue : null,
rlm@46 26539
rlm@46 26540 maxValue : null,
rlm@46 26541
rlm@46 26542 minText : "The date in this field must be equal to or after {0}",
rlm@46 26543
rlm@46 26544 maxText : "The date in this field must be equal to or before {0}",
rlm@46 26545
rlm@46 26546 invalidText : "{0} is not a valid date - it must be in the format {1}",
rlm@46 26547
rlm@46 26548 triggerClass : 'x-form-date-trigger',
rlm@46 26549
rlm@46 26550
rlm@46 26551 defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"},
rlm@46 26552
rlm@46 26553 initComponent : function(){
rlm@46 26554 Ext.form.DateField.superclass.initComponent.call(this);
rlm@46 26555 if(typeof this.minValue == "string"){
rlm@46 26556 this.minValue = this.parseDate(this.minValue);
rlm@46 26557 }
rlm@46 26558 if(typeof this.maxValue == "string"){
rlm@46 26559 this.maxValue = this.parseDate(this.maxValue);
rlm@46 26560 }
rlm@46 26561 this.ddMatch = null;
rlm@46 26562 if(this.disabledDates){
rlm@46 26563 var dd = this.disabledDates;
rlm@46 26564 var re = "(?:";
rlm@46 26565 for(var i = 0; i < dd.length; i++){
rlm@46 26566 re += dd[i];
rlm@46 26567 if(i != dd.length-1) re += "|";
rlm@46 26568 }
rlm@46 26569 this.ddMatch = new RegExp(re + ")");
rlm@46 26570 }
rlm@46 26571 },
rlm@46 26572
rlm@46 26573 validateValue : function(value){
rlm@46 26574 value = this.formatDate(value);
rlm@46 26575 if(!Ext.form.DateField.superclass.validateValue.call(this, value)){
rlm@46 26576 return false;
rlm@46 26577 }
rlm@46 26578 if(value.length < 1){ return true;
rlm@46 26579 }
rlm@46 26580 var svalue = value;
rlm@46 26581 value = this.parseDate(value);
rlm@46 26582 if(!value){
rlm@46 26583 this.markInvalid(String.format(this.invalidText, svalue, this.format));
rlm@46 26584 return false;
rlm@46 26585 }
rlm@46 26586 var time = value.getTime();
rlm@46 26587 if(this.minValue && time < this.minValue.getTime()){
rlm@46 26588 this.markInvalid(String.format(this.minText, this.formatDate(this.minValue)));
rlm@46 26589 return false;
rlm@46 26590 }
rlm@46 26591 if(this.maxValue && time > this.maxValue.getTime()){
rlm@46 26592 this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue)));
rlm@46 26593 return false;
rlm@46 26594 }
rlm@46 26595 if(this.disabledDays){
rlm@46 26596 var day = value.getDay();
rlm@46 26597 for(var i = 0; i < this.disabledDays.length; i++) {
rlm@46 26598 if(day === this.disabledDays[i]){
rlm@46 26599 this.markInvalid(this.disabledDaysText);
rlm@46 26600 return false;
rlm@46 26601 }
rlm@46 26602 }
rlm@46 26603 }
rlm@46 26604 var fvalue = this.formatDate(value);
rlm@46 26605 if(this.ddMatch && this.ddMatch.test(fvalue)){
rlm@46 26606 this.markInvalid(String.format(this.disabledDatesText, fvalue));
rlm@46 26607 return false;
rlm@46 26608 }
rlm@46 26609 return true;
rlm@46 26610 },
rlm@46 26611
rlm@46 26612 validateBlur : function(){
rlm@46 26613 return !this.menu || !this.menu.isVisible();
rlm@46 26614 },
rlm@46 26615
rlm@46 26616
rlm@46 26617 getValue : function(){
rlm@46 26618 return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || "";
rlm@46 26619 },
rlm@46 26620
rlm@46 26621
rlm@46 26622 setValue : function(date){
rlm@46 26623 Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date)));
rlm@46 26624 },
rlm@46 26625
rlm@46 26626 parseDate : function(value){
rlm@46 26627 if(!value || Ext.isDate(value)){
rlm@46 26628 return value;
rlm@46 26629 }
rlm@46 26630 var v = Date.parseDate(value, this.format);
rlm@46 26631 if(!v && this.altFormats){
rlm@46 26632 if(!this.altFormatsArray){
rlm@46 26633 this.altFormatsArray = this.altFormats.split("|");
rlm@46 26634 }
rlm@46 26635 for(var i = 0, len = this.altFormatsArray.length; i < len && !v; i++){
rlm@46 26636 v = Date.parseDate(value, this.altFormatsArray[i]);
rlm@46 26637 }
rlm@46 26638 }
rlm@46 26639 return v;
rlm@46 26640 },
rlm@46 26641
rlm@46 26642 onDestroy : function(){
rlm@46 26643 if(this.menu) {
rlm@46 26644 this.menu.destroy();
rlm@46 26645 }
rlm@46 26646 if(this.wrap){
rlm@46 26647 this.wrap.remove();
rlm@46 26648 }
rlm@46 26649 Ext.form.DateField.superclass.onDestroy.call(this);
rlm@46 26650 },
rlm@46 26651
rlm@46 26652 formatDate : function(date){
rlm@46 26653 return Ext.isDate(date) ? date.dateFormat(this.format) : date;
rlm@46 26654 },
rlm@46 26655
rlm@46 26656 menuListeners : {
rlm@46 26657 select: function(m, d){
rlm@46 26658 this.setValue(d);
rlm@46 26659 },
rlm@46 26660 show : function(){ this.onFocus();
rlm@46 26661 },
rlm@46 26662 hide : function(){
rlm@46 26663 this.focus.defer(10, this);
rlm@46 26664 var ml = this.menuListeners;
rlm@46 26665 this.menu.un("select", ml.select, this);
rlm@46 26666 this.menu.un("show", ml.show, this);
rlm@46 26667 this.menu.un("hide", ml.hide, this);
rlm@46 26668 }
rlm@46 26669 },
rlm@46 26670
rlm@46 26671 onTriggerClick : function(){
rlm@46 26672 if(this.disabled){
rlm@46 26673 return;
rlm@46 26674 }
rlm@46 26675 if(this.menu == null){
rlm@46 26676 this.menu = new Ext.menu.DateMenu();
rlm@46 26677 }
rlm@46 26678 Ext.apply(this.menu.picker, {
rlm@46 26679 minDate : this.minValue,
rlm@46 26680 maxDate : this.maxValue,
rlm@46 26681 disabledDatesRE : this.ddMatch,
rlm@46 26682 disabledDatesText : this.disabledDatesText,
rlm@46 26683 disabledDays : this.disabledDays,
rlm@46 26684 disabledDaysText : this.disabledDaysText,
rlm@46 26685 format : this.format,
rlm@46 26686 minText : String.format(this.minText, this.formatDate(this.minValue)),
rlm@46 26687 maxText : String.format(this.maxText, this.formatDate(this.maxValue))
rlm@46 26688 });
rlm@46 26689 this.menu.on(Ext.apply({}, this.menuListeners, {
rlm@46 26690 scope:this
rlm@46 26691 }));
rlm@46 26692 this.menu.picker.setValue(this.getValue() || new Date());
rlm@46 26693 this.menu.show(this.el, "tl-bl?");
rlm@46 26694 },
rlm@46 26695
rlm@46 26696 beforeBlur : function(){
rlm@46 26697 var v = this.parseDate(this.getRawValue());
rlm@46 26698 if(v){
rlm@46 26699 this.setValue(v);
rlm@46 26700 }
rlm@46 26701 }
rlm@46 26702
rlm@46 26703
rlm@46 26704
rlm@46 26705
rlm@46 26706
rlm@46 26707 });
rlm@46 26708 Ext.reg('datefield', Ext.form.DateField);
rlm@46 26709
rlm@46 26710 Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, {
rlm@46 26711
rlm@46 26712
rlm@46 26713
rlm@46 26714
rlm@46 26715
rlm@46 26716
rlm@46 26717 defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},
rlm@46 26718
rlm@46 26719
rlm@46 26720
rlm@46 26721
rlm@46 26722
rlm@46 26723
rlm@46 26724 listClass: '',
rlm@46 26725
rlm@46 26726 selectedClass: 'x-combo-selected',
rlm@46 26727
rlm@46 26728 triggerClass : 'x-form-arrow-trigger',
rlm@46 26729
rlm@46 26730 shadow:'sides',
rlm@46 26731
rlm@46 26732 listAlign: 'tl-bl?',
rlm@46 26733
rlm@46 26734 maxHeight: 300,
rlm@46 26735
rlm@46 26736 minHeight: 90,
rlm@46 26737
rlm@46 26738 triggerAction: 'query',
rlm@46 26739
rlm@46 26740 minChars : 4,
rlm@46 26741
rlm@46 26742 typeAhead: false,
rlm@46 26743
rlm@46 26744 queryDelay: 500,
rlm@46 26745
rlm@46 26746 pageSize: 0,
rlm@46 26747
rlm@46 26748 selectOnFocus:false,
rlm@46 26749
rlm@46 26750 queryParam: 'query',
rlm@46 26751
rlm@46 26752 loadingText: 'Loading...',
rlm@46 26753
rlm@46 26754 resizable: false,
rlm@46 26755
rlm@46 26756 handleHeight : 8,
rlm@46 26757
rlm@46 26758 editable: true,
rlm@46 26759
rlm@46 26760 allQuery: '',
rlm@46 26761
rlm@46 26762 mode: 'remote',
rlm@46 26763
rlm@46 26764 minListWidth : 70,
rlm@46 26765
rlm@46 26766 forceSelection:false,
rlm@46 26767
rlm@46 26768 typeAheadDelay : 250,
rlm@46 26769
rlm@46 26770
rlm@46 26771
rlm@46 26772 lazyInit : true,
rlm@46 26773
rlm@46 26774 initComponent : function(){
rlm@46 26775 Ext.form.ComboBox.superclass.initComponent.call(this);
rlm@46 26776 this.addEvents(
rlm@46 26777
rlm@46 26778 'expand',
rlm@46 26779
rlm@46 26780 'collapse',
rlm@46 26781
rlm@46 26782 'beforeselect',
rlm@46 26783
rlm@46 26784 'select',
rlm@46 26785
rlm@46 26786 'beforequery'
rlm@46 26787 );
rlm@46 26788 if(this.transform){
rlm@46 26789 this.allowDomMove = false;
rlm@46 26790 var s = Ext.getDom(this.transform);
rlm@46 26791 if(!this.hiddenName){
rlm@46 26792 this.hiddenName = s.name;
rlm@46 26793 }
rlm@46 26794 if(!this.store){
rlm@46 26795 this.mode = 'local';
rlm@46 26796 var d = [], opts = s.options;
rlm@46 26797 for(var i = 0, len = opts.length;i < len; i++){
rlm@46 26798 var o = opts[i];
rlm@46 26799 var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text;
rlm@46 26800 if(o.selected) {
rlm@46 26801 this.value = value;
rlm@46 26802 }
rlm@46 26803 d.push([value, o.text]);
rlm@46 26804 }
rlm@46 26805 this.store = new Ext.data.SimpleStore({
rlm@46 26806 'id': 0,
rlm@46 26807 fields: ['value', 'text'],
rlm@46 26808 data : d
rlm@46 26809 });
rlm@46 26810 this.valueField = 'value';
rlm@46 26811 this.displayField = 'text';
rlm@46 26812 }
rlm@46 26813 s.name = Ext.id(); if(!this.lazyRender){
rlm@46 26814 this.target = true;
rlm@46 26815 this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);
rlm@46 26816 Ext.removeNode(s); this.render(this.el.parentNode);
rlm@46 26817 }else{
rlm@46 26818 Ext.removeNode(s); }
rlm@46 26819 }
rlm@46 26820 else if(Ext.isArray(this.store)){
rlm@46 26821 if (Ext.isArray(this.store[0])){
rlm@46 26822 this.store = new Ext.data.SimpleStore({
rlm@46 26823 fields: ['value','text'],
rlm@46 26824 data: this.store
rlm@46 26825 });
rlm@46 26826 this.valueField = 'value';
rlm@46 26827 }else{
rlm@46 26828 this.store = new Ext.data.SimpleStore({
rlm@46 26829 fields: ['text'],
rlm@46 26830 data: this.store,
rlm@46 26831 expandData: true
rlm@46 26832 });
rlm@46 26833 this.valueField = 'text';
rlm@46 26834 }
rlm@46 26835 this.displayField = 'text';
rlm@46 26836 this.mode = 'local';
rlm@46 26837 }
rlm@46 26838
rlm@46 26839 this.selectedIndex = -1;
rlm@46 26840 if(this.mode == 'local'){
rlm@46 26841 if(this.initialConfig.queryDelay === undefined){
rlm@46 26842 this.queryDelay = 10;
rlm@46 26843 }
rlm@46 26844 if(this.initialConfig.minChars === undefined){
rlm@46 26845 this.minChars = 0;
rlm@46 26846 }
rlm@46 26847 }
rlm@46 26848 },
rlm@46 26849
rlm@46 26850 onRender : function(ct, position){
rlm@46 26851 Ext.form.ComboBox.superclass.onRender.call(this, ct, position);
rlm@46 26852 if(this.hiddenName){
rlm@46 26853 this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)},
rlm@46 26854 'before', true);
rlm@46 26855 this.hiddenField.value =
rlm@46 26856 this.hiddenValue !== undefined ? this.hiddenValue :
rlm@46 26857 this.value !== undefined ? this.value : '';
rlm@46 26858
rlm@46 26859 this.el.dom.removeAttribute('name');
rlm@46 26860 }
rlm@46 26861 if(Ext.isGecko){
rlm@46 26862 this.el.dom.setAttribute('autocomplete', 'off');
rlm@46 26863 }
rlm@46 26864
rlm@46 26865 if(!this.lazyInit){
rlm@46 26866 this.initList();
rlm@46 26867 }else{
rlm@46 26868 this.on('focus', this.initList, this, {single: true});
rlm@46 26869 }
rlm@46 26870
rlm@46 26871 if(!this.editable){
rlm@46 26872 this.editable = true;
rlm@46 26873 this.setEditable(false);
rlm@46 26874 }
rlm@46 26875 },
rlm@46 26876
rlm@46 26877 initList : function(){
rlm@46 26878 if(!this.list){
rlm@46 26879 var cls = 'x-combo-list';
rlm@46 26880
rlm@46 26881 this.list = new Ext.Layer({
rlm@46 26882 shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false
rlm@46 26883 });
rlm@46 26884
rlm@46 26885 var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);
rlm@46 26886 this.list.setWidth(lw);
rlm@46 26887 this.list.swallowEvent('mousewheel');
rlm@46 26888 this.assetHeight = 0;
rlm@46 26889
rlm@46 26890 if(this.title){
rlm@46 26891 this.header = this.list.createChild({cls:cls+'-hd', html: this.title});
rlm@46 26892 this.assetHeight += this.header.getHeight();
rlm@46 26893 }
rlm@46 26894
rlm@46 26895 this.innerList = this.list.createChild({cls:cls+'-inner'});
rlm@46 26896 this.innerList.on('mouseover', this.onViewOver, this);
rlm@46 26897 this.innerList.on('mousemove', this.onViewMove, this);
rlm@46 26898 this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
rlm@46 26899
rlm@46 26900 if(this.pageSize){
rlm@46 26901 this.footer = this.list.createChild({cls:cls+'-ft'});
rlm@46 26902 this.pageTb = new Ext.PagingToolbar({
rlm@46 26903 store:this.store,
rlm@46 26904 pageSize: this.pageSize,
rlm@46 26905 renderTo:this.footer
rlm@46 26906 });
rlm@46 26907 this.assetHeight += this.footer.getHeight();
rlm@46 26908 }
rlm@46 26909
rlm@46 26910 if(!this.tpl){
rlm@46 26911
rlm@46 26912 this.tpl = '<tpl for="."><div class="'+cls+'-item">{' + this.displayField + '}</div></tpl>';
rlm@46 26913
rlm@46 26914 }
rlm@46 26915
rlm@46 26916
rlm@46 26917 this.view = new Ext.DataView({
rlm@46 26918 applyTo: this.innerList,
rlm@46 26919 tpl: this.tpl,
rlm@46 26920 singleSelect: true,
rlm@46 26921 selectedClass: this.selectedClass,
rlm@46 26922 itemSelector: this.itemSelector || '.' + cls + '-item'
rlm@46 26923 });
rlm@46 26924
rlm@46 26925 this.view.on('click', this.onViewClick, this);
rlm@46 26926
rlm@46 26927 this.bindStore(this.store, true);
rlm@46 26928
rlm@46 26929 if(this.resizable){
rlm@46 26930 this.resizer = new Ext.Resizable(this.list, {
rlm@46 26931 pinned:true, handles:'se'
rlm@46 26932 });
rlm@46 26933 this.resizer.on('resize', function(r, w, h){
rlm@46 26934 this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight;
rlm@46 26935 this.listWidth = w;
rlm@46 26936 this.innerList.setWidth(w - this.list.getFrameWidth('lr'));
rlm@46 26937 this.restrictHeight();
rlm@46 26938 }, this);
rlm@46 26939 this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px');
rlm@46 26940 }
rlm@46 26941 }
rlm@46 26942 },
rlm@46 26943
rlm@46 26944
rlm@46 26945 bindStore : function(store, initial){
rlm@46 26946 if(this.store && !initial){
rlm@46 26947 this.store.un('beforeload', this.onBeforeLoad, this);
rlm@46 26948 this.store.un('load', this.onLoad, this);
rlm@46 26949 this.store.un('loadexception', this.collapse, this);
rlm@46 26950 if(!store){
rlm@46 26951 this.store = null;
rlm@46 26952 if(this.view){
rlm@46 26953 this.view.setStore(null);
rlm@46 26954 }
rlm@46 26955 }
rlm@46 26956 }
rlm@46 26957 if(store){
rlm@46 26958 this.store = Ext.StoreMgr.lookup(store);
rlm@46 26959
rlm@46 26960 this.store.on('beforeload', this.onBeforeLoad, this);
rlm@46 26961 this.store.on('load', this.onLoad, this);
rlm@46 26962 this.store.on('loadexception', this.collapse, this);
rlm@46 26963
rlm@46 26964 if(this.view){
rlm@46 26965 this.view.setStore(store);
rlm@46 26966 }
rlm@46 26967 }
rlm@46 26968 },
rlm@46 26969
rlm@46 26970 initEvents : function(){
rlm@46 26971 Ext.form.ComboBox.superclass.initEvents.call(this);
rlm@46 26972
rlm@46 26973 this.keyNav = new Ext.KeyNav(this.el, {
rlm@46 26974 "up" : function(e){
rlm@46 26975 this.inKeyMode = true;
rlm@46 26976 this.selectPrev();
rlm@46 26977 },
rlm@46 26978
rlm@46 26979 "down" : function(e){
rlm@46 26980 if(!this.isExpanded()){
rlm@46 26981 this.onTriggerClick();
rlm@46 26982 }else{
rlm@46 26983 this.inKeyMode = true;
rlm@46 26984 this.selectNext();
rlm@46 26985 }
rlm@46 26986 },
rlm@46 26987
rlm@46 26988 "enter" : function(e){
rlm@46 26989 this.onViewClick();
rlm@46 26990 this.delayedCheck = true;
rlm@46 26991 this.unsetDelayCheck.defer(10, this);
rlm@46 26992 },
rlm@46 26993
rlm@46 26994 "esc" : function(e){
rlm@46 26995 this.collapse();
rlm@46 26996 },
rlm@46 26997
rlm@46 26998 "tab" : function(e){
rlm@46 26999 this.onViewClick(false);
rlm@46 27000 return true;
rlm@46 27001 },
rlm@46 27002
rlm@46 27003 scope : this,
rlm@46 27004
rlm@46 27005 doRelay : function(foo, bar, hname){
rlm@46 27006 if(hname == 'down' || this.scope.isExpanded()){
rlm@46 27007 return Ext.KeyNav.prototype.doRelay.apply(this, arguments);
rlm@46 27008 }
rlm@46 27009 return true;
rlm@46 27010 },
rlm@46 27011
rlm@46 27012 forceKeyDown : true
rlm@46 27013 });
rlm@46 27014 this.queryDelay = Math.max(this.queryDelay || 10,
rlm@46 27015 this.mode == 'local' ? 10 : 250);
rlm@46 27016 this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);
rlm@46 27017 if(this.typeAhead){
rlm@46 27018 this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this);
rlm@46 27019 }
rlm@46 27020 if(this.editable !== false){
rlm@46 27021 this.el.on("keyup", this.onKeyUp, this);
rlm@46 27022 }
rlm@46 27023 if(this.forceSelection){
rlm@46 27024 this.on('blur', this.doForce, this);
rlm@46 27025 }
rlm@46 27026 },
rlm@46 27027
rlm@46 27028 onDestroy : function(){
rlm@46 27029 if(this.view){
rlm@46 27030 this.view.el.removeAllListeners();
rlm@46 27031 this.view.el.remove();
rlm@46 27032 this.view.purgeListeners();
rlm@46 27033 }
rlm@46 27034 if(this.list){
rlm@46 27035 this.list.destroy();
rlm@46 27036 }
rlm@46 27037 this.bindStore(null);
rlm@46 27038 Ext.form.ComboBox.superclass.onDestroy.call(this);
rlm@46 27039 },
rlm@46 27040
rlm@46 27041 unsetDelayCheck : function(){
rlm@46 27042 delete this.delayedCheck;
rlm@46 27043 },
rlm@46 27044 fireKey : function(e){
rlm@46 27045 if(e.isNavKeyPress() && !this.isExpanded() && !this.delayedCheck){
rlm@46 27046 this.fireEvent("specialkey", this, e);
rlm@46 27047 }
rlm@46 27048 },
rlm@46 27049
rlm@46 27050 onResize: function(w, h){
rlm@46 27051 Ext.form.ComboBox.superclass.onResize.apply(this, arguments);
rlm@46 27052 if(this.list && this.listWidth === undefined){
rlm@46 27053 var lw = Math.max(w, this.minListWidth);
rlm@46 27054 this.list.setWidth(lw);
rlm@46 27055 this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
rlm@46 27056 }
rlm@46 27057 },
rlm@46 27058
rlm@46 27059 onEnable: function(){
rlm@46 27060 Ext.form.ComboBox.superclass.onEnable.apply(this, arguments);
rlm@46 27061 if(this.hiddenField){
rlm@46 27062 this.hiddenField.disabled = false;
rlm@46 27063 }
rlm@46 27064 },
rlm@46 27065
rlm@46 27066 onDisable: function(){
rlm@46 27067 Ext.form.ComboBox.superclass.onDisable.apply(this, arguments);
rlm@46 27068 if(this.hiddenField){
rlm@46 27069 this.hiddenField.disabled = true;
rlm@46 27070 }
rlm@46 27071 },
rlm@46 27072
rlm@46 27073
rlm@46 27074 setEditable : function(value){
rlm@46 27075 if(value == this.editable){
rlm@46 27076 return;
rlm@46 27077 }
rlm@46 27078 this.editable = value;
rlm@46 27079 if(!value){
rlm@46 27080 this.el.dom.setAttribute('readOnly', true);
rlm@46 27081 this.el.on('mousedown', this.onTriggerClick, this);
rlm@46 27082 this.el.addClass('x-combo-noedit');
rlm@46 27083 }else{
rlm@46 27084 this.el.dom.setAttribute('readOnly', false);
rlm@46 27085 this.el.un('mousedown', this.onTriggerClick, this);
rlm@46 27086 this.el.removeClass('x-combo-noedit');
rlm@46 27087 }
rlm@46 27088 },
rlm@46 27089
rlm@46 27090 onBeforeLoad : function(){
rlm@46 27091 if(!this.hasFocus){
rlm@46 27092 return;
rlm@46 27093 }
rlm@46 27094 this.innerList.update(this.loadingText ?
rlm@46 27095 '<div class="loading-indicator">'+this.loadingText+'</div>' : '');
rlm@46 27096 this.restrictHeight();
rlm@46 27097 this.selectedIndex = -1;
rlm@46 27098 },
rlm@46 27099
rlm@46 27100 onLoad : function(){
rlm@46 27101 if(!this.hasFocus){
rlm@46 27102 return;
rlm@46 27103 }
rlm@46 27104 if(this.store.getCount() > 0){
rlm@46 27105 this.expand();
rlm@46 27106 this.restrictHeight();
rlm@46 27107 if(this.lastQuery == this.allQuery){
rlm@46 27108 if(this.editable){
rlm@46 27109 this.el.dom.select();
rlm@46 27110 }
rlm@46 27111 if(!this.selectByValue(this.value, true)){
rlm@46 27112 this.select(0, true);
rlm@46 27113 }
rlm@46 27114 }else{
rlm@46 27115 this.selectNext();
rlm@46 27116 if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){
rlm@46 27117 this.taTask.delay(this.typeAheadDelay);
rlm@46 27118 }
rlm@46 27119 }
rlm@46 27120 }else{
rlm@46 27121 this.onEmptyResults();
rlm@46 27122 }
rlm@46 27123 },
rlm@46 27124
rlm@46 27125 onTypeAhead : function(){
rlm@46 27126 if(this.store.getCount() > 0){
rlm@46 27127 var r = this.store.getAt(0);
rlm@46 27128 var newValue = r.data[this.displayField];
rlm@46 27129 var len = newValue.length;
rlm@46 27130 var selStart = this.getRawValue().length;
rlm@46 27131 if(selStart != len){
rlm@46 27132 this.setRawValue(newValue);
rlm@46 27133 this.selectText(selStart, newValue.length);
rlm@46 27134 }
rlm@46 27135 }
rlm@46 27136 },
rlm@46 27137
rlm@46 27138 onSelect : function(record, index){
rlm@46 27139 if(this.fireEvent('beforeselect', this, record, index) !== false){
rlm@46 27140 this.setValue(record.data[this.valueField || this.displayField]);
rlm@46 27141 this.collapse();
rlm@46 27142 this.fireEvent('select', this, record, index);
rlm@46 27143 }
rlm@46 27144 },
rlm@46 27145
rlm@46 27146
rlm@46 27147 getValue : function(){
rlm@46 27148 if(this.valueField){
rlm@46 27149 return typeof this.value != 'undefined' ? this.value : '';
rlm@46 27150 }else{
rlm@46 27151 return Ext.form.ComboBox.superclass.getValue.call(this);
rlm@46 27152 }
rlm@46 27153 },
rlm@46 27154
rlm@46 27155
rlm@46 27156 clearValue : function(){
rlm@46 27157 if(this.hiddenField){
rlm@46 27158 this.hiddenField.value = '';
rlm@46 27159 }
rlm@46 27160 this.setRawValue('');
rlm@46 27161 this.lastSelectionText = '';
rlm@46 27162 this.applyEmptyText();
rlm@46 27163 this.value = '';
rlm@46 27164 },
rlm@46 27165
rlm@46 27166
rlm@46 27167 setValue : function(v){
rlm@46 27168 var text = v;
rlm@46 27169 if(this.valueField){
rlm@46 27170 var r = this.findRecord(this.valueField, v);
rlm@46 27171 if(r){
rlm@46 27172 text = r.data[this.displayField];
rlm@46 27173 }else if(this.valueNotFoundText !== undefined){
rlm@46 27174 text = this.valueNotFoundText;
rlm@46 27175 }
rlm@46 27176 }
rlm@46 27177 this.lastSelectionText = text;
rlm@46 27178 if(this.hiddenField){
rlm@46 27179 this.hiddenField.value = v;
rlm@46 27180 }
rlm@46 27181 Ext.form.ComboBox.superclass.setValue.call(this, text);
rlm@46 27182 this.value = v;
rlm@46 27183 },
rlm@46 27184
rlm@46 27185 findRecord : function(prop, value){
rlm@46 27186 var record;
rlm@46 27187 if(this.store.getCount() > 0){
rlm@46 27188 this.store.each(function(r){
rlm@46 27189 if(r.data[prop] == value){
rlm@46 27190 record = r;
rlm@46 27191 return false;
rlm@46 27192 }
rlm@46 27193 });
rlm@46 27194 }
rlm@46 27195 return record;
rlm@46 27196 },
rlm@46 27197
rlm@46 27198 onViewMove : function(e, t){
rlm@46 27199 this.inKeyMode = false;
rlm@46 27200 },
rlm@46 27201
rlm@46 27202 onViewOver : function(e, t){
rlm@46 27203 if(this.inKeyMode){ return;
rlm@46 27204 }
rlm@46 27205 var item = this.view.findItemFromChild(t);
rlm@46 27206 if(item){
rlm@46 27207 var index = this.view.indexOf(item);
rlm@46 27208 this.select(index, false);
rlm@46 27209 }
rlm@46 27210 },
rlm@46 27211
rlm@46 27212 onViewClick : function(doFocus){
rlm@46 27213 var index = this.view.getSelectedIndexes()[0];
rlm@46 27214 var r = this.store.getAt(index);
rlm@46 27215 if(r){
rlm@46 27216 this.onSelect(r, index);
rlm@46 27217 }
rlm@46 27218 if(doFocus !== false){
rlm@46 27219 this.el.focus();
rlm@46 27220 }
rlm@46 27221 },
rlm@46 27222
rlm@46 27223 restrictHeight : function(){
rlm@46 27224 this.innerList.dom.style.height = '';
rlm@46 27225 var inner = this.innerList.dom;
rlm@46 27226 var pad = this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight;
rlm@46 27227 var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight);
rlm@46 27228 var ha = this.getPosition()[1]-Ext.getBody().getScroll().top;
rlm@46 27229 var hb = Ext.lib.Dom.getViewHeight()-ha-this.getSize().height;
rlm@46 27230 var space = Math.max(ha, hb, this.minHeight || 0)-this.list.shadowOffset-pad-5;
rlm@46 27231 h = Math.min(h, space, this.maxHeight);
rlm@46 27232
rlm@46 27233 this.innerList.setHeight(h);
rlm@46 27234 this.list.beginUpdate();
rlm@46 27235 this.list.setHeight(h+pad);
rlm@46 27236 this.list.alignTo(this.wrap, this.listAlign);
rlm@46 27237 this.list.endUpdate();
rlm@46 27238 },
rlm@46 27239
rlm@46 27240 onEmptyResults : function(){
rlm@46 27241 this.collapse();
rlm@46 27242 },
rlm@46 27243
rlm@46 27244
rlm@46 27245 isExpanded : function(){
rlm@46 27246 return this.list && this.list.isVisible();
rlm@46 27247 },
rlm@46 27248
rlm@46 27249
rlm@46 27250 selectByValue : function(v, scrollIntoView){
rlm@46 27251 if(v !== undefined && v !== null){
rlm@46 27252 var r = this.findRecord(this.valueField || this.displayField, v);
rlm@46 27253 if(r){
rlm@46 27254 this.select(this.store.indexOf(r), scrollIntoView);
rlm@46 27255 return true;
rlm@46 27256 }
rlm@46 27257 }
rlm@46 27258 return false;
rlm@46 27259 },
rlm@46 27260
rlm@46 27261
rlm@46 27262 select : function(index, scrollIntoView){
rlm@46 27263 this.selectedIndex = index;
rlm@46 27264 this.view.select(index);
rlm@46 27265 if(scrollIntoView !== false){
rlm@46 27266 var el = this.view.getNode(index);
rlm@46 27267 if(el){
rlm@46 27268 this.innerList.scrollChildIntoView(el, false);
rlm@46 27269 }
rlm@46 27270 }
rlm@46 27271 },
rlm@46 27272
rlm@46 27273 selectNext : function(){
rlm@46 27274 var ct = this.store.getCount();
rlm@46 27275 if(ct > 0){
rlm@46 27276 if(this.selectedIndex == -1){
rlm@46 27277 this.select(0);
rlm@46 27278 }else if(this.selectedIndex < ct-1){
rlm@46 27279 this.select(this.selectedIndex+1);
rlm@46 27280 }
rlm@46 27281 }
rlm@46 27282 },
rlm@46 27283
rlm@46 27284 selectPrev : function(){
rlm@46 27285 var ct = this.store.getCount();
rlm@46 27286 if(ct > 0){
rlm@46 27287 if(this.selectedIndex == -1){
rlm@46 27288 this.select(0);
rlm@46 27289 }else if(this.selectedIndex != 0){
rlm@46 27290 this.select(this.selectedIndex-1);
rlm@46 27291 }
rlm@46 27292 }
rlm@46 27293 },
rlm@46 27294
rlm@46 27295 onKeyUp : function(e){
rlm@46 27296 if(this.editable !== false && !e.isSpecialKey()){
rlm@46 27297 this.lastKey = e.getKey();
rlm@46 27298 this.dqTask.delay(this.queryDelay);
rlm@46 27299 }
rlm@46 27300 },
rlm@46 27301
rlm@46 27302 validateBlur : function(){
rlm@46 27303 return !this.list || !this.list.isVisible();
rlm@46 27304 },
rlm@46 27305
rlm@46 27306 initQuery : function(){
rlm@46 27307 this.doQuery(this.getRawValue());
rlm@46 27308 },
rlm@46 27309
rlm@46 27310 doForce : function(){
rlm@46 27311 if(this.el.dom.value.length > 0){
rlm@46 27312 this.el.dom.value =
rlm@46 27313 this.lastSelectionText === undefined ? '' : this.lastSelectionText;
rlm@46 27314 this.applyEmptyText();
rlm@46 27315 }
rlm@46 27316 },
rlm@46 27317
rlm@46 27318
rlm@46 27319 doQuery : function(q, forceAll){
rlm@46 27320 if(q === undefined || q === null){
rlm@46 27321 q = '';
rlm@46 27322 }
rlm@46 27323 var qe = {
rlm@46 27324 query: q,
rlm@46 27325 forceAll: forceAll,
rlm@46 27326 combo: this,
rlm@46 27327 cancel:false
rlm@46 27328 };
rlm@46 27329 if(this.fireEvent('beforequery', qe)===false || qe.cancel){
rlm@46 27330 return false;
rlm@46 27331 }
rlm@46 27332 q = qe.query;
rlm@46 27333 forceAll = qe.forceAll;
rlm@46 27334 if(forceAll === true || (q.length >= this.minChars)){
rlm@46 27335 if(this.lastQuery !== q){
rlm@46 27336 this.lastQuery = q;
rlm@46 27337 if(this.mode == 'local'){
rlm@46 27338 this.selectedIndex = -1;
rlm@46 27339 if(forceAll){
rlm@46 27340 this.store.clearFilter();
rlm@46 27341 }else{
rlm@46 27342 this.store.filter(this.displayField, q);
rlm@46 27343 }
rlm@46 27344 this.onLoad();
rlm@46 27345 }else{
rlm@46 27346 this.store.baseParams[this.queryParam] = q;
rlm@46 27347 this.store.load({
rlm@46 27348 params: this.getParams(q)
rlm@46 27349 });
rlm@46 27350 this.expand();
rlm@46 27351 }
rlm@46 27352 }else{
rlm@46 27353 this.selectedIndex = -1;
rlm@46 27354 this.onLoad();
rlm@46 27355 }
rlm@46 27356 }
rlm@46 27357 },
rlm@46 27358
rlm@46 27359 getParams : function(q){
rlm@46 27360 var p = {};
rlm@46 27361 if(this.pageSize){
rlm@46 27362 p.start = 0;
rlm@46 27363 p.limit = this.pageSize;
rlm@46 27364 }
rlm@46 27365 return p;
rlm@46 27366 },
rlm@46 27367
rlm@46 27368
rlm@46 27369 collapse : function(){
rlm@46 27370 if(!this.isExpanded()){
rlm@46 27371 return;
rlm@46 27372 }
rlm@46 27373 this.list.hide();
rlm@46 27374 Ext.getDoc().un('mousewheel', this.collapseIf, this);
rlm@46 27375 Ext.getDoc().un('mousedown', this.collapseIf, this);
rlm@46 27376 this.fireEvent('collapse', this);
rlm@46 27377 },
rlm@46 27378
rlm@46 27379 collapseIf : function(e){
rlm@46 27380 if(!e.within(this.wrap) && !e.within(this.list)){
rlm@46 27381 this.collapse();
rlm@46 27382 }
rlm@46 27383 },
rlm@46 27384
rlm@46 27385
rlm@46 27386 expand : function(){
rlm@46 27387 if(this.isExpanded() || !this.hasFocus){
rlm@46 27388 return;
rlm@46 27389 }
rlm@46 27390 this.list.alignTo(this.wrap, this.listAlign);
rlm@46 27391 this.list.show();
rlm@46 27392 this.innerList.setOverflow('auto'); Ext.getDoc().on('mousewheel', this.collapseIf, this);
rlm@46 27393 Ext.getDoc().on('mousedown', this.collapseIf, this);
rlm@46 27394 this.fireEvent('expand', this);
rlm@46 27395 },
rlm@46 27396
rlm@46 27397 onTriggerClick : function(){
rlm@46 27398 if(this.disabled){
rlm@46 27399 return;
rlm@46 27400 }
rlm@46 27401 if(this.isExpanded()){
rlm@46 27402 this.collapse();
rlm@46 27403 this.el.focus();
rlm@46 27404 }else {
rlm@46 27405 this.onFocus({});
rlm@46 27406 if(this.triggerAction == 'all') {
rlm@46 27407 this.doQuery(this.allQuery, true);
rlm@46 27408 } else {
rlm@46 27409 this.doQuery(this.getRawValue());
rlm@46 27410 }
rlm@46 27411 this.el.focus();
rlm@46 27412 }
rlm@46 27413 }
rlm@46 27414
rlm@46 27415
rlm@46 27416
rlm@46 27417
rlm@46 27418
rlm@46 27419
rlm@46 27420 });
rlm@46 27421 Ext.reg('combo', Ext.form.ComboBox);
rlm@46 27422
rlm@46 27423 Ext.form.Checkbox = Ext.extend(Ext.form.Field, {
rlm@46 27424
rlm@46 27425 focusClass : undefined,
rlm@46 27426
rlm@46 27427 fieldClass: "x-form-field",
rlm@46 27428
rlm@46 27429 checked: false,
rlm@46 27430
rlm@46 27431 defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"},
rlm@46 27432
rlm@46 27433
rlm@46 27434
rlm@46 27435 initComponent : function(){
rlm@46 27436 Ext.form.Checkbox.superclass.initComponent.call(this);
rlm@46 27437 this.addEvents(
rlm@46 27438
rlm@46 27439 'check'
rlm@46 27440 );
rlm@46 27441 },
rlm@46 27442
rlm@46 27443 onResize : function(){
rlm@46 27444 Ext.form.Checkbox.superclass.onResize.apply(this, arguments);
rlm@46 27445 if(!this.boxLabel){
rlm@46 27446 this.el.alignTo(this.wrap, 'c-c');
rlm@46 27447 }
rlm@46 27448 },
rlm@46 27449
rlm@46 27450 initEvents : function(){
rlm@46 27451 Ext.form.Checkbox.superclass.initEvents.call(this);
rlm@46 27452 this.el.on("click", this.onClick, this);
rlm@46 27453 this.el.on("change", this.onClick, this);
rlm@46 27454 },
rlm@46 27455
rlm@46 27456 getResizeEl : function(){
rlm@46 27457 return this.wrap;
rlm@46 27458 },
rlm@46 27459
rlm@46 27460 getPositionEl : function(){
rlm@46 27461 return this.wrap;
rlm@46 27462 },
rlm@46 27463
rlm@46 27464
rlm@46 27465 markInvalid : Ext.emptyFn,
rlm@46 27466
rlm@46 27467 clearInvalid : Ext.emptyFn,
rlm@46 27468
rlm@46 27469 onRender : function(ct, position){
rlm@46 27470 Ext.form.Checkbox.superclass.onRender.call(this, ct, position);
rlm@46 27471 if(this.inputValue !== undefined){
rlm@46 27472 this.el.dom.value = this.inputValue;
rlm@46 27473 }
rlm@46 27474 this.wrap = this.el.wrap({cls: "x-form-check-wrap"});
rlm@46 27475 if(this.boxLabel){
rlm@46 27476 this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel});
rlm@46 27477 }
rlm@46 27478 if(this.checked){
rlm@46 27479 this.setValue(true);
rlm@46 27480 }else{
rlm@46 27481 this.checked = this.el.dom.checked;
rlm@46 27482 }
rlm@46 27483 },
rlm@46 27484
rlm@46 27485 onDestroy : function(){
rlm@46 27486 if(this.wrap){
rlm@46 27487 this.wrap.remove();
rlm@46 27488 }
rlm@46 27489 Ext.form.Checkbox.superclass.onDestroy.call(this);
rlm@46 27490 },
rlm@46 27491
rlm@46 27492 initValue : Ext.emptyFn,
rlm@46 27493
rlm@46 27494
rlm@46 27495 getValue : function(){
rlm@46 27496 if(this.rendered){
rlm@46 27497 return this.el.dom.checked;
rlm@46 27498 }
rlm@46 27499 return false;
rlm@46 27500 },
rlm@46 27501
rlm@46 27502 onClick : function(){
rlm@46 27503 if(this.el.dom.checked != this.checked){
rlm@46 27504 this.setValue(this.el.dom.checked);
rlm@46 27505 }
rlm@46 27506 },
rlm@46 27507
rlm@46 27508
rlm@46 27509 setValue : function(v){
rlm@46 27510 this.checked = (v === true || v === 'true' || v == '1' || String(v).toLowerCase() == 'on');
rlm@46 27511 if(this.el && this.el.dom){
rlm@46 27512 this.el.dom.checked = this.checked;
rlm@46 27513 this.el.dom.defaultChecked = this.checked;
rlm@46 27514 }
rlm@46 27515 this.fireEvent("check", this, this.checked);
rlm@46 27516 }
rlm@46 27517 });
rlm@46 27518 Ext.reg('checkbox', Ext.form.Checkbox);
rlm@46 27519
rlm@46 27520 Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {
rlm@46 27521 inputType: 'radio',
rlm@46 27522
rlm@46 27523
rlm@46 27524 markInvalid : Ext.emptyFn,
rlm@46 27525
rlm@46 27526 clearInvalid : Ext.emptyFn,
rlm@46 27527
rlm@46 27528
rlm@46 27529 getGroupValue : function(){
rlm@46 27530 var p = this.el.up('form') || Ext.getBody();
rlm@46 27531 var c = p.child('input[name='+this.el.dom.name+']:checked', true);
rlm@46 27532 return c ? c.value : null;
rlm@46 27533 },
rlm@46 27534
rlm@46 27535 onClick : function(){
rlm@46 27536 if(this.el.dom.checked != this.checked){
rlm@46 27537 var p = this.el.up('form') || Ext.getBody();
rlm@46 27538 var els = p.select('input[name='+this.el.dom.name+']');
rlm@46 27539 els.each(function(el){
rlm@46 27540 if(el.dom.id == this.id){
rlm@46 27541 this.setValue(true);
rlm@46 27542 }else{
rlm@46 27543 Ext.getCmp(el.dom.id).setValue(false);
rlm@46 27544 }
rlm@46 27545 }, this);
rlm@46 27546 }
rlm@46 27547 },
rlm@46 27548
rlm@46 27549
rlm@46 27550 setValue : function(v){
rlm@46 27551 if (typeof v == 'boolean') {
rlm@46 27552 Ext.form.Radio.superclass.setValue.call(this, v);
rlm@46 27553 } else {
rlm@46 27554 var r = this.el.up('form').child('input[name='+this.el.dom.name+'][value='+v+']', true);
rlm@46 27555 if (r){
rlm@46 27556 r.checked = true;
rlm@46 27557 };
rlm@46 27558 }
rlm@46 27559 }
rlm@46 27560 });
rlm@46 27561 Ext.reg('radio', Ext.form.Radio);
rlm@46 27562
rlm@46 27563 Ext.form.Hidden = Ext.extend(Ext.form.Field, {
rlm@46 27564
rlm@46 27565 inputType : 'hidden',
rlm@46 27566
rlm@46 27567
rlm@46 27568 onRender : function(){
rlm@46 27569 Ext.form.Hidden.superclass.onRender.apply(this, arguments);
rlm@46 27570 },
rlm@46 27571
rlm@46 27572
rlm@46 27573 initEvents : function(){
rlm@46 27574 this.originalValue = this.getValue();
rlm@46 27575 },
rlm@46 27576
rlm@46 27577
rlm@46 27578 setSize : Ext.emptyFn,
rlm@46 27579 setWidth : Ext.emptyFn,
rlm@46 27580 setHeight : Ext.emptyFn,
rlm@46 27581 setPosition : Ext.emptyFn,
rlm@46 27582 setPagePosition : Ext.emptyFn,
rlm@46 27583 markInvalid : Ext.emptyFn,
rlm@46 27584 clearInvalid : Ext.emptyFn
rlm@46 27585 });
rlm@46 27586 Ext.reg('hidden', Ext.form.Hidden);
rlm@46 27587
rlm@46 27588 Ext.form.BasicForm = function(el, config){
rlm@46 27589 Ext.apply(this, config);
rlm@46 27590
rlm@46 27591 this.items = new Ext.util.MixedCollection(false, function(o){
rlm@46 27592 return o.id || (o.id = Ext.id());
rlm@46 27593 });
rlm@46 27594 this.addEvents(
rlm@46 27595
rlm@46 27596 'beforeaction',
rlm@46 27597
rlm@46 27598 'actionfailed',
rlm@46 27599
rlm@46 27600 'actioncomplete'
rlm@46 27601 );
rlm@46 27602
rlm@46 27603 if(el){
rlm@46 27604 this.initEl(el);
rlm@46 27605 }
rlm@46 27606 Ext.form.BasicForm.superclass.constructor.call(this);
rlm@46 27607 };
rlm@46 27608
rlm@46 27609 Ext.extend(Ext.form.BasicForm, Ext.util.Observable, {
rlm@46 27610
rlm@46 27611
rlm@46 27612
rlm@46 27613
rlm@46 27614
rlm@46 27615
rlm@46 27616
rlm@46 27617 timeout: 30,
rlm@46 27618
rlm@46 27619 activeAction : null,
rlm@46 27620
rlm@46 27621
rlm@46 27622 trackResetOnLoad : false,
rlm@46 27623
rlm@46 27624
rlm@46 27625
rlm@46 27626
rlm@46 27627 initEl : function(el){
rlm@46 27628 this.el = Ext.get(el);
rlm@46 27629 this.id = this.el.id || Ext.id();
rlm@46 27630 if(!this.standardSubmit){
rlm@46 27631 this.el.on('submit', this.onSubmit, this);
rlm@46 27632 }
rlm@46 27633 this.el.addClass('x-form');
rlm@46 27634 },
rlm@46 27635
rlm@46 27636
rlm@46 27637 getEl: function(){
rlm@46 27638 return this.el;
rlm@46 27639 },
rlm@46 27640
rlm@46 27641 onSubmit : function(e){
rlm@46 27642 e.stopEvent();
rlm@46 27643 },
rlm@46 27644
rlm@46 27645 destroy: function() {
rlm@46 27646 this.items.each(function(f){
rlm@46 27647 Ext.destroy(f);
rlm@46 27648 });
rlm@46 27649 if(this.el){
rlm@46 27650 this.el.removeAllListeners();
rlm@46 27651 this.el.remove();
rlm@46 27652 }
rlm@46 27653 this.purgeListeners();
rlm@46 27654 },
rlm@46 27655
rlm@46 27656
rlm@46 27657 isValid : function(){
rlm@46 27658 var valid = true;
rlm@46 27659 this.items.each(function(f){
rlm@46 27660 if(!f.validate()){
rlm@46 27661 valid = false;
rlm@46 27662 }
rlm@46 27663 });
rlm@46 27664 return valid;
rlm@46 27665 },
rlm@46 27666
rlm@46 27667
rlm@46 27668 isDirty : function(){
rlm@46 27669 var dirty = false;
rlm@46 27670 this.items.each(function(f){
rlm@46 27671 if(f.isDirty()){
rlm@46 27672 dirty = true;
rlm@46 27673 return false;
rlm@46 27674 }
rlm@46 27675 });
rlm@46 27676 return dirty;
rlm@46 27677 },
rlm@46 27678
rlm@46 27679
rlm@46 27680 doAction : function(action, options){
rlm@46 27681 if(typeof action == 'string'){
rlm@46 27682 action = new Ext.form.Action.ACTION_TYPES[action](this, options);
rlm@46 27683 }
rlm@46 27684 if(this.fireEvent('beforeaction', this, action) !== false){
rlm@46 27685 this.beforeAction(action);
rlm@46 27686 action.run.defer(100, action);
rlm@46 27687 }
rlm@46 27688 return this;
rlm@46 27689 },
rlm@46 27690
rlm@46 27691
rlm@46 27692 submit : function(options){
rlm@46 27693 if(this.standardSubmit){
rlm@46 27694 var v = this.isValid();
rlm@46 27695 if(v){
rlm@46 27696 this.el.dom.submit();
rlm@46 27697 }
rlm@46 27698 return v;
rlm@46 27699 }
rlm@46 27700 this.doAction('submit', options);
rlm@46 27701 return this;
rlm@46 27702 },
rlm@46 27703
rlm@46 27704
rlm@46 27705 load : function(options){
rlm@46 27706 this.doAction('load', options);
rlm@46 27707 return this;
rlm@46 27708 },
rlm@46 27709
rlm@46 27710
rlm@46 27711 updateRecord : function(record){
rlm@46 27712 record.beginEdit();
rlm@46 27713 var fs = record.fields;
rlm@46 27714 fs.each(function(f){
rlm@46 27715 var field = this.findField(f.name);
rlm@46 27716 if(field){
rlm@46 27717 record.set(f.name, field.getValue());
rlm@46 27718 }
rlm@46 27719 }, this);
rlm@46 27720 record.endEdit();
rlm@46 27721 return this;
rlm@46 27722 },
rlm@46 27723
rlm@46 27724
rlm@46 27725 loadRecord : function(record){
rlm@46 27726 this.setValues(record.data);
rlm@46 27727 return this;
rlm@46 27728 },
rlm@46 27729
rlm@46 27730 beforeAction : function(action){
rlm@46 27731 var o = action.options;
rlm@46 27732 if(o.waitMsg){
rlm@46 27733 if(this.waitMsgTarget === true){
rlm@46 27734 this.el.mask(o.waitMsg, 'x-mask-loading');
rlm@46 27735 }else if(this.waitMsgTarget){
rlm@46 27736 this.waitMsgTarget = Ext.get(this.waitMsgTarget);
rlm@46 27737 this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading');
rlm@46 27738 }else{
rlm@46 27739 Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...');
rlm@46 27740 }
rlm@46 27741 }
rlm@46 27742 },
rlm@46 27743
rlm@46 27744 afterAction : function(action, success){
rlm@46 27745 this.activeAction = null;
rlm@46 27746 var o = action.options;
rlm@46 27747 if(o.waitMsg){
rlm@46 27748 if(this.waitMsgTarget === true){
rlm@46 27749 this.el.unmask();
rlm@46 27750 }else if(this.waitMsgTarget){
rlm@46 27751 this.waitMsgTarget.unmask();
rlm@46 27752 }else{
rlm@46 27753 Ext.MessageBox.updateProgress(1);
rlm@46 27754 Ext.MessageBox.hide();
rlm@46 27755 }
rlm@46 27756 }
rlm@46 27757 if(success){
rlm@46 27758 if(o.reset){
rlm@46 27759 this.reset();
rlm@46 27760 }
rlm@46 27761 Ext.callback(o.success, o.scope, [this, action]);
rlm@46 27762 this.fireEvent('actioncomplete', this, action);
rlm@46 27763 }else{
rlm@46 27764 Ext.callback(o.failure, o.scope, [this, action]);
rlm@46 27765 this.fireEvent('actionfailed', this, action);
rlm@46 27766 }
rlm@46 27767 },
rlm@46 27768
rlm@46 27769
rlm@46 27770 findField : function(id){
rlm@46 27771 var field = this.items.get(id);
rlm@46 27772 if(!field){
rlm@46 27773 this.items.each(function(f){
rlm@46 27774 if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){
rlm@46 27775 field = f;
rlm@46 27776 return false;
rlm@46 27777 }
rlm@46 27778 });
rlm@46 27779 }
rlm@46 27780 return field || null;
rlm@46 27781 },
rlm@46 27782
rlm@46 27783
rlm@46 27784
rlm@46 27785 markInvalid : function(errors){
rlm@46 27786 if(Ext.isArray(errors)){
rlm@46 27787 for(var i = 0, len = errors.length; i < len; i++){
rlm@46 27788 var fieldError = errors[i];
rlm@46 27789 var f = this.findField(fieldError.id);
rlm@46 27790 if(f){
rlm@46 27791 f.markInvalid(fieldError.msg);
rlm@46 27792 }
rlm@46 27793 }
rlm@46 27794 }else{
rlm@46 27795 var field, id;
rlm@46 27796 for(id in errors){
rlm@46 27797 if(typeof errors[id] != 'function' && (field = this.findField(id))){
rlm@46 27798 field.markInvalid(errors[id]);
rlm@46 27799 }
rlm@46 27800 }
rlm@46 27801 }
rlm@46 27802 return this;
rlm@46 27803 },
rlm@46 27804
rlm@46 27805
rlm@46 27806 setValues : function(values){
rlm@46 27807 if(Ext.isArray(values)){ for(var i = 0, len = values.length; i < len; i++){
rlm@46 27808 var v = values[i];
rlm@46 27809 var f = this.findField(v.id);
rlm@46 27810 if(f){
rlm@46 27811 f.setValue(v.value);
rlm@46 27812 if(this.trackResetOnLoad){
rlm@46 27813 f.originalValue = f.getValue();
rlm@46 27814 }
rlm@46 27815 }
rlm@46 27816 }
rlm@46 27817 }else{ var field, id;
rlm@46 27818 for(id in values){
rlm@46 27819 if(typeof values[id] != 'function' && (field = this.findField(id))){
rlm@46 27820 field.setValue(values[id]);
rlm@46 27821 if(this.trackResetOnLoad){
rlm@46 27822 field.originalValue = field.getValue();
rlm@46 27823 }
rlm@46 27824 }
rlm@46 27825 }
rlm@46 27826 }
rlm@46 27827 return this;
rlm@46 27828 },
rlm@46 27829
rlm@46 27830
rlm@46 27831 getValues : function(asString){
rlm@46 27832 var fs = Ext.lib.Ajax.serializeForm(this.el.dom);
rlm@46 27833 if(asString === true){
rlm@46 27834 return fs;
rlm@46 27835 }
rlm@46 27836 return Ext.urlDecode(fs);
rlm@46 27837 },
rlm@46 27838
rlm@46 27839
rlm@46 27840 clearInvalid : function(){
rlm@46 27841 this.items.each(function(f){
rlm@46 27842 f.clearInvalid();
rlm@46 27843 });
rlm@46 27844 return this;
rlm@46 27845 },
rlm@46 27846
rlm@46 27847
rlm@46 27848 reset : function(){
rlm@46 27849 this.items.each(function(f){
rlm@46 27850 f.reset();
rlm@46 27851 });
rlm@46 27852 return this;
rlm@46 27853 },
rlm@46 27854
rlm@46 27855
rlm@46 27856 add : function(){
rlm@46 27857 this.items.addAll(Array.prototype.slice.call(arguments, 0));
rlm@46 27858 return this;
rlm@46 27859 },
rlm@46 27860
rlm@46 27861
rlm@46 27862
rlm@46 27863 remove : function(field){
rlm@46 27864 this.items.remove(field);
rlm@46 27865 return this;
rlm@46 27866 },
rlm@46 27867
rlm@46 27868
rlm@46 27869 render : function(){
rlm@46 27870 this.items.each(function(f){
rlm@46 27871 if(f.isFormField && !f.rendered && document.getElementById(f.id)){ f.applyToMarkup(f.id);
rlm@46 27872 }
rlm@46 27873 });
rlm@46 27874 return this;
rlm@46 27875 },
rlm@46 27876
rlm@46 27877
rlm@46 27878 applyToFields : function(o){
rlm@46 27879 this.items.each(function(f){
rlm@46 27880 Ext.apply(f, o);
rlm@46 27881 });
rlm@46 27882 return this;
rlm@46 27883 },
rlm@46 27884
rlm@46 27885
rlm@46 27886 applyIfToFields : function(o){
rlm@46 27887 this.items.each(function(f){
rlm@46 27888 Ext.applyIf(f, o);
rlm@46 27889 });
rlm@46 27890 return this;
rlm@46 27891 }
rlm@46 27892 });
rlm@46 27893
rlm@46 27894 Ext.BasicForm = Ext.form.BasicForm;
rlm@46 27895
rlm@46 27896 Ext.FormPanel = Ext.extend(Ext.Panel, {
rlm@46 27897
rlm@46 27898
rlm@46 27899
rlm@46 27900
rlm@46 27901 buttonAlign:'center',
rlm@46 27902
rlm@46 27903
rlm@46 27904 minButtonWidth:75,
rlm@46 27905
rlm@46 27906
rlm@46 27907 labelAlign:'left',
rlm@46 27908
rlm@46 27909
rlm@46 27910 monitorValid : false,
rlm@46 27911
rlm@46 27912
rlm@46 27913 monitorPoll : 200,
rlm@46 27914
rlm@46 27915
rlm@46 27916 layout: 'form',
rlm@46 27917
rlm@46 27918 initComponent :function(){
rlm@46 27919 this.form = this.createForm();
rlm@46 27920
rlm@46 27921 Ext.FormPanel.superclass.initComponent.call(this);
rlm@46 27922
rlm@46 27923 this.addEvents(
rlm@46 27924
rlm@46 27925 'clientvalidation'
rlm@46 27926 );
rlm@46 27927
rlm@46 27928 this.relayEvents(this.form, ['beforeaction', 'actionfailed', 'actioncomplete']);
rlm@46 27929 },
rlm@46 27930
rlm@46 27931 createForm: function(){
rlm@46 27932 delete this.initialConfig.listeners;
rlm@46 27933 return new Ext.form.BasicForm(null, this.initialConfig);
rlm@46 27934 },
rlm@46 27935
rlm@46 27936 initFields : function(){
rlm@46 27937 var f = this.form;
rlm@46 27938 var formPanel = this;
rlm@46 27939 var fn = function(c){
rlm@46 27940 if(c.doLayout && c != formPanel){
rlm@46 27941 Ext.applyIf(c, {
rlm@46 27942 labelAlign: c.ownerCt.labelAlign,
rlm@46 27943 labelWidth: c.ownerCt.labelWidth,
rlm@46 27944 itemCls: c.ownerCt.itemCls
rlm@46 27945 });
rlm@46 27946 if(c.items){
rlm@46 27947 c.items.each(fn);
rlm@46 27948 }
rlm@46 27949 }else if(c.isFormField){
rlm@46 27950 f.add(c);
rlm@46 27951 }
rlm@46 27952 }
rlm@46 27953 this.items.each(fn);
rlm@46 27954 },
rlm@46 27955
rlm@46 27956 getLayoutTarget : function(){
rlm@46 27957 return this.form.el;
rlm@46 27958 },
rlm@46 27959
rlm@46 27960
rlm@46 27961 getForm : function(){
rlm@46 27962 return this.form;
rlm@46 27963 },
rlm@46 27964
rlm@46 27965 onRender : function(ct, position){
rlm@46 27966 this.initFields();
rlm@46 27967
rlm@46 27968 Ext.FormPanel.superclass.onRender.call(this, ct, position);
rlm@46 27969 var o = {
rlm@46 27970 tag: 'form',
rlm@46 27971 method : this.method || 'POST',
rlm@46 27972 id : this.formId || Ext.id()
rlm@46 27973 };
rlm@46 27974 if(this.fileUpload) {
rlm@46 27975 o.enctype = 'multipart/form-data';
rlm@46 27976 }
rlm@46 27977 this.form.initEl(this.body.createChild(o));
rlm@46 27978 },
rlm@46 27979
rlm@46 27980 beforeDestroy: function(){
rlm@46 27981 Ext.FormPanel.superclass.beforeDestroy.call(this);
rlm@46 27982 Ext.destroy(this.form);
rlm@46 27983 },
rlm@46 27984
rlm@46 27985 initEvents : function(){
rlm@46 27986 Ext.FormPanel.superclass.initEvents.call(this);
rlm@46 27987 this.items.on('remove', this.onRemove, this);
rlm@46 27988 this.items.on('add', this.onAdd, this);
rlm@46 27989 if(this.monitorValid){ this.startMonitoring();
rlm@46 27990 }
rlm@46 27991 },
rlm@46 27992
rlm@46 27993 onAdd : function(ct, c) {
rlm@46 27994 if (c.isFormField) {
rlm@46 27995 this.form.add(c);
rlm@46 27996 }
rlm@46 27997 },
rlm@46 27998
rlm@46 27999 onRemove : function(c) {
rlm@46 28000 if (c.isFormField) {
rlm@46 28001 Ext.destroy(c.container.up('.x-form-item'));
rlm@46 28002 this.form.remove(c);
rlm@46 28003 }
rlm@46 28004 },
rlm@46 28005
rlm@46 28006
rlm@46 28007 startMonitoring : function(){
rlm@46 28008 if(!this.bound){
rlm@46 28009 this.bound = true;
rlm@46 28010 Ext.TaskMgr.start({
rlm@46 28011 run : this.bindHandler,
rlm@46 28012 interval : this.monitorPoll || 200,
rlm@46 28013 scope: this
rlm@46 28014 });
rlm@46 28015 }
rlm@46 28016 },
rlm@46 28017
rlm@46 28018
rlm@46 28019 stopMonitoring : function(){
rlm@46 28020 this.bound = false;
rlm@46 28021 },
rlm@46 28022
rlm@46 28023
rlm@46 28024 load : function(){
rlm@46 28025 this.form.load.apply(this.form, arguments);
rlm@46 28026 },
rlm@46 28027
rlm@46 28028 onDisable : function(){
rlm@46 28029 Ext.FormPanel.superclass.onDisable.call(this);
rlm@46 28030 if(this.form){
rlm@46 28031 this.form.items.each(function(){
rlm@46 28032 this.disable();
rlm@46 28033 });
rlm@46 28034 }
rlm@46 28035 },
rlm@46 28036
rlm@46 28037 onEnable : function(){
rlm@46 28038 Ext.FormPanel.superclass.onEnable.call(this);
rlm@46 28039 if(this.form){
rlm@46 28040 this.form.items.each(function(){
rlm@46 28041 this.enable();
rlm@46 28042 });
rlm@46 28043 }
rlm@46 28044 },
rlm@46 28045
rlm@46 28046 bindHandler : function(){
rlm@46 28047 if(!this.bound){
rlm@46 28048 return false; }
rlm@46 28049 var valid = true;
rlm@46 28050 this.form.items.each(function(f){
rlm@46 28051 if(!f.isValid(true)){
rlm@46 28052 valid = false;
rlm@46 28053 return false;
rlm@46 28054 }
rlm@46 28055 });
rlm@46 28056 if(this.buttons){
rlm@46 28057 for(var i = 0, len = this.buttons.length; i < len; i++){
rlm@46 28058 var btn = this.buttons[i];
rlm@46 28059 if(btn.formBind === true && btn.disabled === valid){
rlm@46 28060 btn.setDisabled(!valid);
rlm@46 28061 }
rlm@46 28062 }
rlm@46 28063 }
rlm@46 28064 this.fireEvent('clientvalidation', this, valid);
rlm@46 28065 }
rlm@46 28066 });
rlm@46 28067 Ext.reg('form', Ext.FormPanel);
rlm@46 28068
rlm@46 28069 Ext.form.FormPanel = Ext.FormPanel;
rlm@46 28070
rlm@46 28071
rlm@46 28072
rlm@46 28073 Ext.form.FieldSet = Ext.extend(Ext.Panel, {
rlm@46 28074
rlm@46 28075
rlm@46 28076
rlm@46 28077
rlm@46 28078
rlm@46 28079 baseCls:'x-fieldset',
rlm@46 28080
rlm@46 28081 layout: 'form',
rlm@46 28082
rlm@46 28083
rlm@46 28084 onRender : function(ct, position){
rlm@46 28085 if(!this.el){
rlm@46 28086 this.el = document.createElement('fieldset');
rlm@46 28087 this.el.id = this.id;
rlm@46 28088 if (this.title || this.header || this.checkboxToggle) {
rlm@46 28089 this.el.appendChild(document.createElement('legend')).className = 'x-fieldset-header';
rlm@46 28090 }
rlm@46 28091 }
rlm@46 28092
rlm@46 28093 Ext.form.FieldSet.superclass.onRender.call(this, ct, position);
rlm@46 28094
rlm@46 28095 if(this.checkboxToggle){
rlm@46 28096 var o = typeof this.checkboxToggle == 'object' ?
rlm@46 28097 this.checkboxToggle :
rlm@46 28098 {tag: 'input', type: 'checkbox', name: this.checkboxName || this.id+'-checkbox'};
rlm@46 28099 this.checkbox = this.header.insertFirst(o);
rlm@46 28100 this.checkbox.dom.checked = !this.collapsed;
rlm@46 28101 this.checkbox.on('click', this.onCheckClick, this);
rlm@46 28102 }
rlm@46 28103 },
rlm@46 28104
rlm@46 28105
rlm@46 28106 onCollapse : function(doAnim, animArg){
rlm@46 28107 if(this.checkbox){
rlm@46 28108 this.checkbox.dom.checked = false;
rlm@46 28109 }
rlm@46 28110 this.afterCollapse();
rlm@46 28111
rlm@46 28112 },
rlm@46 28113
rlm@46 28114
rlm@46 28115 onExpand : function(doAnim, animArg){
rlm@46 28116 if(this.checkbox){
rlm@46 28117 this.checkbox.dom.checked = true;
rlm@46 28118 }
rlm@46 28119 this.afterExpand();
rlm@46 28120 },
rlm@46 28121
rlm@46 28122
rlm@46 28123 onCheckClick : function(){
rlm@46 28124 this[this.checkbox.dom.checked ? 'expand' : 'collapse']();
rlm@46 28125 }
rlm@46 28126
rlm@46 28127
rlm@46 28128
rlm@46 28129
rlm@46 28130
rlm@46 28131
rlm@46 28132
rlm@46 28133
rlm@46 28134
rlm@46 28135
rlm@46 28136
rlm@46 28137
rlm@46 28138
rlm@46 28139
rlm@46 28140
rlm@46 28141
rlm@46 28142
rlm@46 28143
rlm@46 28144
rlm@46 28145
rlm@46 28146
rlm@46 28147
rlm@46 28148
rlm@46 28149
rlm@46 28150
rlm@46 28151
rlm@46 28152
rlm@46 28153
rlm@46 28154
rlm@46 28155
rlm@46 28156
rlm@46 28157
rlm@46 28158
rlm@46 28159
rlm@46 28160
rlm@46 28161
rlm@46 28162
rlm@46 28163
rlm@46 28164 });
rlm@46 28165 Ext.reg('fieldset', Ext.form.FieldSet);
rlm@46 28166
rlm@46 28167
rlm@46 28168
rlm@46 28169
rlm@46 28170 Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {
rlm@46 28171
rlm@46 28172 enableFormat : true,
rlm@46 28173
rlm@46 28174 enableFontSize : true,
rlm@46 28175
rlm@46 28176 enableColors : true,
rlm@46 28177
rlm@46 28178 enableAlignments : true,
rlm@46 28179
rlm@46 28180 enableLists : true,
rlm@46 28181
rlm@46 28182 enableSourceEdit : true,
rlm@46 28183
rlm@46 28184 enableLinks : true,
rlm@46 28185
rlm@46 28186 enableFont : true,
rlm@46 28187
rlm@46 28188 createLinkText : 'Please enter the URL for the link:',
rlm@46 28189
rlm@46 28190 defaultLinkValue : 'http:/'+'/',
rlm@46 28191
rlm@46 28192 fontFamilies : [
rlm@46 28193 'Arial',
rlm@46 28194 'Courier New',
rlm@46 28195 'Tahoma',
rlm@46 28196 'Times New Roman',
rlm@46 28197 'Verdana'
rlm@46 28198 ],
rlm@46 28199 defaultFont: 'tahoma',
rlm@46 28200
rlm@46 28201
rlm@46 28202 validationEvent : false,
rlm@46 28203 deferHeight: true,
rlm@46 28204 initialized : false,
rlm@46 28205 activated : false,
rlm@46 28206 sourceEditMode : false,
rlm@46 28207 onFocus : Ext.emptyFn,
rlm@46 28208 iframePad:3,
rlm@46 28209 hideMode:'offsets',
rlm@46 28210 defaultAutoCreate : {
rlm@46 28211 tag: "textarea",
rlm@46 28212 style:"width:500px;height:300px;",
rlm@46 28213 autocomplete: "off"
rlm@46 28214 },
rlm@46 28215
rlm@46 28216
rlm@46 28217 initComponent : function(){
rlm@46 28218 this.addEvents(
rlm@46 28219
rlm@46 28220 'initialize',
rlm@46 28221
rlm@46 28222 'activate',
rlm@46 28223
rlm@46 28224 'beforesync',
rlm@46 28225
rlm@46 28226 'beforepush',
rlm@46 28227
rlm@46 28228 'sync',
rlm@46 28229
rlm@46 28230 'push',
rlm@46 28231
rlm@46 28232 'editmodechange'
rlm@46 28233 )
rlm@46 28234 },
rlm@46 28235
rlm@46 28236
rlm@46 28237 createFontOptions : function(){
rlm@46 28238 var buf = [], fs = this.fontFamilies, ff, lc;
rlm@46 28239 for(var i = 0, len = fs.length; i< len; i++){
rlm@46 28240 ff = fs[i];
rlm@46 28241 lc = ff.toLowerCase();
rlm@46 28242 buf.push(
rlm@46 28243 '<option value="',lc,'" style="font-family:',ff,';"',
rlm@46 28244 (this.defaultFont == lc ? ' selected="true">' : '>'),
rlm@46 28245 ff,
rlm@46 28246 '</option>'
rlm@46 28247 );
rlm@46 28248 }
rlm@46 28249 return buf.join('');
rlm@46 28250 },
rlm@46 28251
rlm@46 28252
rlm@46 28253 createToolbar : function(editor){
rlm@46 28254
rlm@46 28255 var tipsEnabled = Ext.QuickTips && Ext.QuickTips.isEnabled();
rlm@46 28256
rlm@46 28257 function btn(id, toggle, handler){
rlm@46 28258 return {
rlm@46 28259 itemId : id,
rlm@46 28260 cls : 'x-btn-icon x-edit-'+id,
rlm@46 28261 enableToggle:toggle !== false,
rlm@46 28262 scope: editor,
rlm@46 28263 handler:handler||editor.relayBtnCmd,
rlm@46 28264 clickEvent:'mousedown',
rlm@46 28265 tooltip: tipsEnabled ? editor.buttonTips[id] || undefined : undefined,
rlm@46 28266 tabIndex:-1
rlm@46 28267 };
rlm@46 28268 }
rlm@46 28269
rlm@46 28270
rlm@46 28271 var tb = new Ext.Toolbar({
rlm@46 28272 renderTo:this.wrap.dom.firstChild
rlm@46 28273 });
rlm@46 28274
rlm@46 28275
rlm@46 28276 tb.el.on('click', function(e){
rlm@46 28277 e.preventDefault();
rlm@46 28278 });
rlm@46 28279
rlm@46 28280 if(this.enableFont && !Ext.isSafari){
rlm@46 28281 this.fontSelect = tb.el.createChild({
rlm@46 28282 tag:'select',
rlm@46 28283 cls:'x-font-select',
rlm@46 28284 html: this.createFontOptions()
rlm@46 28285 });
rlm@46 28286 this.fontSelect.on('change', function(){
rlm@46 28287 var font = this.fontSelect.dom.value;
rlm@46 28288 this.relayCmd('fontname', font);
rlm@46 28289 this.deferFocus();
rlm@46 28290 }, this);
rlm@46 28291 tb.add(
rlm@46 28292 this.fontSelect.dom,
rlm@46 28293 '-'
rlm@46 28294 );
rlm@46 28295 };
rlm@46 28296
rlm@46 28297 if(this.enableFormat){
rlm@46 28298 tb.add(
rlm@46 28299 btn('bold'),
rlm@46 28300 btn('italic'),
rlm@46 28301 btn('underline')
rlm@46 28302 );
rlm@46 28303 };
rlm@46 28304
rlm@46 28305 if(this.enableFontSize){
rlm@46 28306 tb.add(
rlm@46 28307 '-',
rlm@46 28308 btn('increasefontsize', false, this.adjustFont),
rlm@46 28309 btn('decreasefontsize', false, this.adjustFont)
rlm@46 28310 );
rlm@46 28311 };
rlm@46 28312
rlm@46 28313 if(this.enableColors){
rlm@46 28314 tb.add(
rlm@46 28315 '-', {
rlm@46 28316 itemId:'forecolor',
rlm@46 28317 cls:'x-btn-icon x-edit-forecolor',
rlm@46 28318 clickEvent:'mousedown',
rlm@46 28319 tooltip: tipsEnabled ? editor.buttonTips['forecolor'] || undefined : undefined,
rlm@46 28320 tabIndex:-1,
rlm@46 28321 menu : new Ext.menu.ColorMenu({
rlm@46 28322 allowReselect: true,
rlm@46 28323 focus: Ext.emptyFn,
rlm@46 28324 value:'000000',
rlm@46 28325 plain:true,
rlm@46 28326 selectHandler: function(cp, color){
rlm@46 28327 this.execCmd('forecolor', Ext.isSafari || Ext.isIE ? '#'+color : color);
rlm@46 28328 this.deferFocus();
rlm@46 28329 },
rlm@46 28330 scope: this,
rlm@46 28331 clickEvent:'mousedown'
rlm@46 28332 })
rlm@46 28333 }, {
rlm@46 28334 itemId:'backcolor',
rlm@46 28335 cls:'x-btn-icon x-edit-backcolor',
rlm@46 28336 clickEvent:'mousedown',
rlm@46 28337 tooltip: tipsEnabled ? editor.buttonTips['backcolor'] || undefined : undefined,
rlm@46 28338 tabIndex:-1,
rlm@46 28339 menu : new Ext.menu.ColorMenu({
rlm@46 28340 focus: Ext.emptyFn,
rlm@46 28341 value:'FFFFFF',
rlm@46 28342 plain:true,
rlm@46 28343 allowReselect: true,
rlm@46 28344 selectHandler: function(cp, color){
rlm@46 28345 if(Ext.isGecko){
rlm@46 28346 this.execCmd('useCSS', false);
rlm@46 28347 this.execCmd('hilitecolor', color);
rlm@46 28348 this.execCmd('useCSS', true);
rlm@46 28349 this.deferFocus();
rlm@46 28350 }else{
rlm@46 28351 this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isSafari || Ext.isIE ? '#'+color : color);
rlm@46 28352 this.deferFocus();
rlm@46 28353 }
rlm@46 28354 },
rlm@46 28355 scope:this,
rlm@46 28356 clickEvent:'mousedown'
rlm@46 28357 })
rlm@46 28358 }
rlm@46 28359 );
rlm@46 28360 };
rlm@46 28361
rlm@46 28362 if(this.enableAlignments){
rlm@46 28363 tb.add(
rlm@46 28364 '-',
rlm@46 28365 btn('justifyleft'),
rlm@46 28366 btn('justifycenter'),
rlm@46 28367 btn('justifyright')
rlm@46 28368 );
rlm@46 28369 };
rlm@46 28370
rlm@46 28371 if(!Ext.isSafari){
rlm@46 28372 if(this.enableLinks){
rlm@46 28373 tb.add(
rlm@46 28374 '-',
rlm@46 28375 btn('createlink', false, this.createLink)
rlm@46 28376 );
rlm@46 28377 };
rlm@46 28378
rlm@46 28379 if(this.enableLists){
rlm@46 28380 tb.add(
rlm@46 28381 '-',
rlm@46 28382 btn('insertorderedlist'),
rlm@46 28383 btn('insertunorderedlist')
rlm@46 28384 );
rlm@46 28385 }
rlm@46 28386 if(this.enableSourceEdit){
rlm@46 28387 tb.add(
rlm@46 28388 '-',
rlm@46 28389 btn('sourceedit', true, function(btn){
rlm@46 28390 this.toggleSourceEdit(btn.pressed);
rlm@46 28391 })
rlm@46 28392 );
rlm@46 28393 }
rlm@46 28394 }
rlm@46 28395
rlm@46 28396 this.tb = tb;
rlm@46 28397 },
rlm@46 28398
rlm@46 28399
rlm@46 28400 getDocMarkup : function(){
rlm@46 28401 return '<html><head><style type="text/css">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>';
rlm@46 28402 },
rlm@46 28403
rlm@46 28404
rlm@46 28405 getEditorBody : function(){
rlm@46 28406 return this.doc.body || this.doc.documentElement;
rlm@46 28407 },
rlm@46 28408
rlm@46 28409
rlm@46 28410 onRender : function(ct, position){
rlm@46 28411 Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position);
rlm@46 28412 this.el.dom.style.border = '0 none';
rlm@46 28413 this.el.dom.setAttribute('tabIndex', -1);
rlm@46 28414 this.el.addClass('x-hidden');
rlm@46 28415 if(Ext.isIE){
rlm@46 28416 this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;')
rlm@46 28417 }
rlm@46 28418 this.wrap = this.el.wrap({
rlm@46 28419 cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'}
rlm@46 28420 });
rlm@46 28421
rlm@46 28422 this.createToolbar(this);
rlm@46 28423
rlm@46 28424 this.tb.items.each(function(item){
rlm@46 28425 if(item.itemId != 'sourceedit'){
rlm@46 28426 item.disable();
rlm@46 28427 }
rlm@46 28428 });
rlm@46 28429
rlm@46 28430 var iframe = document.createElement('iframe');
rlm@46 28431 iframe.name = Ext.id();
rlm@46 28432 iframe.frameBorder = 'no';
rlm@46 28433
rlm@46 28434 iframe.src=(Ext.SSL_SECURE_URL || "javascript:false");
rlm@46 28435
rlm@46 28436 this.wrap.dom.appendChild(iframe);
rlm@46 28437
rlm@46 28438 this.iframe = iframe;
rlm@46 28439
rlm@46 28440 if(Ext.isIE){
rlm@46 28441 iframe.contentWindow.document.designMode = 'on';
rlm@46 28442 this.doc = iframe.contentWindow.document;
rlm@46 28443 this.win = iframe.contentWindow;
rlm@46 28444 } else {
rlm@46 28445 this.doc = (iframe.contentDocument || window.frames[iframe.name].document);
rlm@46 28446 this.win = window.frames[iframe.name];
rlm@46 28447 this.doc.designMode = 'on';
rlm@46 28448 }
rlm@46 28449 this.doc.open();
rlm@46 28450 this.doc.write(this.getDocMarkup())
rlm@46 28451 this.doc.close();
rlm@46 28452
rlm@46 28453 var task = {
rlm@46 28454 run : function(){
rlm@46 28455 if(this.doc.body || this.doc.readyState == 'complete'){
rlm@46 28456 Ext.TaskMgr.stop(task);
rlm@46 28457 this.doc.designMode="on";
rlm@46 28458 this.initEditor.defer(10, this);
rlm@46 28459 }
rlm@46 28460 },
rlm@46 28461 interval : 10,
rlm@46 28462 duration:10000,
rlm@46 28463 scope: this
rlm@46 28464 };
rlm@46 28465 Ext.TaskMgr.start(task);
rlm@46 28466
rlm@46 28467 if(!this.width){
rlm@46 28468 this.setSize(this.el.getSize());
rlm@46 28469 }
rlm@46 28470 },
rlm@46 28471
rlm@46 28472
rlm@46 28473 onResize : function(w, h){
rlm@46 28474 Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);
rlm@46 28475 if(this.el && this.iframe){
rlm@46 28476 if(typeof w == 'number'){
rlm@46 28477 var aw = w - this.wrap.getFrameWidth('lr');
rlm@46 28478 this.el.setWidth(this.adjustWidth('textarea', aw));
rlm@46 28479 this.iframe.style.width = aw + 'px';
rlm@46 28480 }
rlm@46 28481 if(typeof h == 'number'){
rlm@46 28482 var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight();
rlm@46 28483 this.el.setHeight(this.adjustWidth('textarea', ah));
rlm@46 28484 this.iframe.style.height = ah + 'px';
rlm@46 28485 if(this.doc){
rlm@46 28486 this.getEditorBody().style.height = (ah - (this.iframePad*2)) + 'px';
rlm@46 28487 }
rlm@46 28488 }
rlm@46 28489 }
rlm@46 28490 },
rlm@46 28491
rlm@46 28492
rlm@46 28493 toggleSourceEdit : function(sourceEditMode){
rlm@46 28494 if(sourceEditMode === undefined){
rlm@46 28495 sourceEditMode = !this.sourceEditMode;
rlm@46 28496 }
rlm@46 28497 this.sourceEditMode = sourceEditMode === true;
rlm@46 28498 var btn = this.tb.items.get('sourceedit');
rlm@46 28499 if(btn.pressed !== this.sourceEditMode){
rlm@46 28500 btn.toggle(this.sourceEditMode);
rlm@46 28501 return;
rlm@46 28502 }
rlm@46 28503 if(this.sourceEditMode){
rlm@46 28504 this.tb.items.each(function(item){
rlm@46 28505 if(item.itemId != 'sourceedit'){
rlm@46 28506 item.disable();
rlm@46 28507 }
rlm@46 28508 });
rlm@46 28509 this.syncValue();
rlm@46 28510 this.iframe.className = 'x-hidden';
rlm@46 28511 this.el.removeClass('x-hidden');
rlm@46 28512 this.el.dom.removeAttribute('tabIndex');
rlm@46 28513 this.el.focus();
rlm@46 28514 }else{
rlm@46 28515 if(this.initialized){
rlm@46 28516 this.tb.items.each(function(item){
rlm@46 28517 item.enable();
rlm@46 28518 });
rlm@46 28519 }
rlm@46 28520 this.pushValue();
rlm@46 28521 this.iframe.className = '';
rlm@46 28522 this.el.addClass('x-hidden');
rlm@46 28523 this.el.dom.setAttribute('tabIndex', -1);
rlm@46 28524 this.deferFocus();
rlm@46 28525 }
rlm@46 28526 var lastSize = this.lastSize;
rlm@46 28527 if(lastSize){
rlm@46 28528 delete this.lastSize;
rlm@46 28529 this.setSize(lastSize);
rlm@46 28530 }
rlm@46 28531 this.fireEvent('editmodechange', this, this.sourceEditMode);
rlm@46 28532 },
rlm@46 28533
rlm@46 28534
rlm@46 28535 createLink : function(){
rlm@46 28536 var url = prompt(this.createLinkText, this.defaultLinkValue);
rlm@46 28537 if(url && url != 'http:/'+'/'){
rlm@46 28538 this.relayCmd('createlink', url);
rlm@46 28539 }
rlm@46 28540 },
rlm@46 28541
rlm@46 28542
rlm@46 28543 adjustSize : Ext.BoxComponent.prototype.adjustSize,
rlm@46 28544
rlm@46 28545
rlm@46 28546 getResizeEl : function(){
rlm@46 28547 return this.wrap;
rlm@46 28548 },
rlm@46 28549
rlm@46 28550
rlm@46 28551 getPositionEl : function(){
rlm@46 28552 return this.wrap;
rlm@46 28553 },
rlm@46 28554
rlm@46 28555
rlm@46 28556 initEvents : function(){
rlm@46 28557 this.originalValue = this.getValue();
rlm@46 28558 },
rlm@46 28559
rlm@46 28560
rlm@46 28561 markInvalid : Ext.emptyFn,
rlm@46 28562
rlm@46 28563
rlm@46 28564 clearInvalid : Ext.emptyFn,
rlm@46 28565
rlm@46 28566
rlm@46 28567 setValue : function(v){
rlm@46 28568 Ext.form.HtmlEditor.superclass.setValue.call(this, v);
rlm@46 28569 this.pushValue();
rlm@46 28570 },
rlm@46 28571
rlm@46 28572
rlm@46 28573 cleanHtml : function(html){
rlm@46 28574 html = String(html);
rlm@46 28575 if(html.length > 5){
rlm@46 28576 if(Ext.isSafari){
rlm@46 28577 html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
rlm@46 28578 }
rlm@46 28579 }
rlm@46 28580 if(html == '&nbsp;'){
rlm@46 28581 html = '';
rlm@46 28582 }
rlm@46 28583 return html;
rlm@46 28584 },
rlm@46 28585
rlm@46 28586
rlm@46 28587 syncValue : function(){
rlm@46 28588 if(this.initialized){
rlm@46 28589 var bd = this.getEditorBody();
rlm@46 28590 var html = bd.innerHTML;
rlm@46 28591 if(Ext.isSafari){
rlm@46 28592 var bs = bd.getAttribute('style');
rlm@46 28593 var m = bs.match(/text-align:(.*?);/i);
rlm@46 28594 if(m && m[1]){
rlm@46 28595 html = '<div style="'+m[0]+'">' + html + '</div>';
rlm@46 28596 }
rlm@46 28597 }
rlm@46 28598 html = this.cleanHtml(html);
rlm@46 28599 if(this.fireEvent('beforesync', this, html) !== false){
rlm@46 28600 this.el.dom.value = html;
rlm@46 28601 this.fireEvent('sync', this, html);
rlm@46 28602 }
rlm@46 28603 }
rlm@46 28604 },
rlm@46 28605
rlm@46 28606
rlm@46 28607 pushValue : function(){
rlm@46 28608 if(this.initialized){
rlm@46 28609 var v = this.el.dom.value;
rlm@46 28610 if(!this.activated && v.length < 1){
rlm@46 28611 v = '&nbsp;';
rlm@46 28612 }
rlm@46 28613 if(this.fireEvent('beforepush', this, v) !== false){
rlm@46 28614 this.getEditorBody().innerHTML = v;
rlm@46 28615 this.fireEvent('push', this, v);
rlm@46 28616 }
rlm@46 28617 }
rlm@46 28618 },
rlm@46 28619
rlm@46 28620
rlm@46 28621 deferFocus : function(){
rlm@46 28622 this.focus.defer(10, this);
rlm@46 28623 },
rlm@46 28624
rlm@46 28625
rlm@46 28626 focus : function(){
rlm@46 28627 if(this.win && !this.sourceEditMode){
rlm@46 28628 this.win.focus();
rlm@46 28629 }else{
rlm@46 28630 this.el.focus();
rlm@46 28631 }
rlm@46 28632 },
rlm@46 28633
rlm@46 28634
rlm@46 28635 initEditor : function(){
rlm@46 28636 var dbody = this.getEditorBody();
rlm@46 28637 var ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat');
rlm@46 28638 ss['background-attachment'] = 'fixed';
rlm@46 28639 dbody.bgProperties = 'fixed';
rlm@46 28640 Ext.DomHelper.applyStyles(dbody, ss);
rlm@46 28641 Ext.EventManager.on(this.doc, {
rlm@46 28642 'mousedown': this.onEditorEvent,
rlm@46 28643 'dblclick': this.onEditorEvent,
rlm@46 28644 'click': this.onEditorEvent,
rlm@46 28645 'keyup': this.onEditorEvent,
rlm@46 28646 buffer:100,
rlm@46 28647 scope: this
rlm@46 28648 });
rlm@46 28649 if(Ext.isGecko){
rlm@46 28650 Ext.EventManager.on(this.doc, 'keypress', this.applyCommand, this);
rlm@46 28651 }
rlm@46 28652 if(Ext.isIE || Ext.isSafari || Ext.isOpera){
rlm@46 28653 Ext.EventManager.on(this.doc, 'keydown', this.fixKeys, this);
rlm@46 28654 }
rlm@46 28655 this.initialized = true;
rlm@46 28656
rlm@46 28657 this.fireEvent('initialize', this);
rlm@46 28658 this.pushValue();
rlm@46 28659 },
rlm@46 28660
rlm@46 28661
rlm@46 28662 onDestroy : function(){
rlm@46 28663 if(this.rendered){
rlm@46 28664 this.tb.items.each(function(item){
rlm@46 28665 if(item.menu){
rlm@46 28666 item.menu.removeAll();
rlm@46 28667 if(item.menu.el){
rlm@46 28668 item.menu.el.destroy();
rlm@46 28669 }
rlm@46 28670 }
rlm@46 28671 item.destroy();
rlm@46 28672 });
rlm@46 28673 this.wrap.dom.innerHTML = '';
rlm@46 28674 this.wrap.remove();
rlm@46 28675 }
rlm@46 28676 },
rlm@46 28677
rlm@46 28678
rlm@46 28679 onFirstFocus : function(){
rlm@46 28680 this.activated = true;
rlm@46 28681 this.tb.items.each(function(item){
rlm@46 28682 item.enable();
rlm@46 28683 });
rlm@46 28684 if(Ext.isGecko){
rlm@46 28685 this.win.focus();
rlm@46 28686 var s = this.win.getSelection();
rlm@46 28687 if(!s.focusNode || s.focusNode.nodeType != 3){
rlm@46 28688 var r = s.getRangeAt(0);
rlm@46 28689 r.selectNodeContents(this.getEditorBody());
rlm@46 28690 r.collapse(true);
rlm@46 28691 this.deferFocus();
rlm@46 28692 }
rlm@46 28693 try{
rlm@46 28694 this.execCmd('useCSS', true);
rlm@46 28695 this.execCmd('styleWithCSS', false);
rlm@46 28696 }catch(e){}
rlm@46 28697 }
rlm@46 28698 this.fireEvent('activate', this);
rlm@46 28699 },
rlm@46 28700
rlm@46 28701
rlm@46 28702 adjustFont: function(btn){
rlm@46 28703 var adjust = btn.itemId == 'increasefontsize' ? 1 : -1;
rlm@46 28704
rlm@46 28705 var v = parseInt(this.doc.queryCommandValue('FontSize') || 2, 10);
rlm@46 28706 if(Ext.isSafari3 || Ext.isAir){
rlm@46 28707
rlm@46 28708
rlm@46 28709 if(v <= 10){
rlm@46 28710 v = 1 + adjust;
rlm@46 28711 }else if(v <= 13){
rlm@46 28712 v = 2 + adjust;
rlm@46 28713 }else if(v <= 16){
rlm@46 28714 v = 3 + adjust;
rlm@46 28715 }else if(v <= 18){
rlm@46 28716 v = 4 + adjust;
rlm@46 28717 }else if(v <= 24){
rlm@46 28718 v = 5 + adjust;
rlm@46 28719 }else {
rlm@46 28720 v = 6 + adjust;
rlm@46 28721 }
rlm@46 28722 v = v.constrain(1, 6);
rlm@46 28723 }else{
rlm@46 28724 if(Ext.isSafari){
rlm@46 28725 adjust *= 2;
rlm@46 28726 }
rlm@46 28727 v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0);
rlm@46 28728 }
rlm@46 28729 this.execCmd('FontSize', v);
rlm@46 28730 },
rlm@46 28731
rlm@46 28732
rlm@46 28733 onEditorEvent : function(e){
rlm@46 28734 this.updateToolbar();
rlm@46 28735 },
rlm@46 28736
rlm@46 28737
rlm@46 28738
rlm@46 28739 updateToolbar: function(){
rlm@46 28740
rlm@46 28741 if(!this.activated){
rlm@46 28742 this.onFirstFocus();
rlm@46 28743 return;
rlm@46 28744 }
rlm@46 28745
rlm@46 28746 var btns = this.tb.items.map, doc = this.doc;
rlm@46 28747
rlm@46 28748 if(this.enableFont && !Ext.isSafari){
rlm@46 28749 var name = (this.doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();
rlm@46 28750 if(name != this.fontSelect.dom.value){
rlm@46 28751 this.fontSelect.dom.value = name;
rlm@46 28752 }
rlm@46 28753 }
rlm@46 28754 if(this.enableFormat){
rlm@46 28755 btns.bold.toggle(doc.queryCommandState('bold'));
rlm@46 28756 btns.italic.toggle(doc.queryCommandState('italic'));
rlm@46 28757 btns.underline.toggle(doc.queryCommandState('underline'));
rlm@46 28758 }
rlm@46 28759 if(this.enableAlignments){
rlm@46 28760 btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));
rlm@46 28761 btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));
rlm@46 28762 btns.justifyright.toggle(doc.queryCommandState('justifyright'));
rlm@46 28763 }
rlm@46 28764 if(!Ext.isSafari && this.enableLists){
rlm@46 28765 btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));
rlm@46 28766 btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));
rlm@46 28767 }
rlm@46 28768
rlm@46 28769 Ext.menu.MenuMgr.hideAll();
rlm@46 28770
rlm@46 28771 this.syncValue();
rlm@46 28772 },
rlm@46 28773
rlm@46 28774
rlm@46 28775 relayBtnCmd : function(btn){
rlm@46 28776 this.relayCmd(btn.itemId);
rlm@46 28777 },
rlm@46 28778
rlm@46 28779
rlm@46 28780 relayCmd : function(cmd, value){
rlm@46 28781 this.win.focus();
rlm@46 28782 this.execCmd(cmd, value);
rlm@46 28783 this.updateToolbar();
rlm@46 28784 this.deferFocus();
rlm@46 28785 },
rlm@46 28786
rlm@46 28787
rlm@46 28788 execCmd : function(cmd, value){
rlm@46 28789 this.doc.execCommand(cmd, false, value === undefined ? null : value);
rlm@46 28790 this.syncValue();
rlm@46 28791 },
rlm@46 28792
rlm@46 28793
rlm@46 28794 applyCommand : function(e){
rlm@46 28795 if(e.ctrlKey){
rlm@46 28796 var c = e.getCharCode(), cmd;
rlm@46 28797 if(c > 0){
rlm@46 28798 c = String.fromCharCode(c);
rlm@46 28799 switch(c){
rlm@46 28800 case 'b':
rlm@46 28801 cmd = 'bold';
rlm@46 28802 break;
rlm@46 28803 case 'i':
rlm@46 28804 cmd = 'italic';
rlm@46 28805 break;
rlm@46 28806 case 'u':
rlm@46 28807 cmd = 'underline';
rlm@46 28808 break;
rlm@46 28809 }
rlm@46 28810 if(cmd){
rlm@46 28811 this.win.focus();
rlm@46 28812 this.execCmd(cmd);
rlm@46 28813 this.deferFocus();
rlm@46 28814 e.preventDefault();
rlm@46 28815 }
rlm@46 28816 }
rlm@46 28817 }
rlm@46 28818 },
rlm@46 28819
rlm@46 28820
rlm@46 28821 insertAtCursor : function(text){
rlm@46 28822 if(!this.activated){
rlm@46 28823 return;
rlm@46 28824 }
rlm@46 28825 if(Ext.isIE){
rlm@46 28826 this.win.focus();
rlm@46 28827 var r = this.doc.selection.createRange();
rlm@46 28828 if(r){
rlm@46 28829 r.collapse(true);
rlm@46 28830 r.pasteHTML(text);
rlm@46 28831 this.syncValue();
rlm@46 28832 this.deferFocus();
rlm@46 28833 }
rlm@46 28834 }else if(Ext.isGecko || Ext.isOpera){
rlm@46 28835 this.win.focus();
rlm@46 28836 this.execCmd('InsertHTML', text);
rlm@46 28837 this.deferFocus();
rlm@46 28838 }else if(Ext.isSafari){
rlm@46 28839 this.execCmd('InsertText', text);
rlm@46 28840 this.deferFocus();
rlm@46 28841 }
rlm@46 28842 },
rlm@46 28843
rlm@46 28844
rlm@46 28845 fixKeys : function(){
rlm@46 28846 if(Ext.isIE){
rlm@46 28847 return function(e){
rlm@46 28848 var k = e.getKey(), r;
rlm@46 28849 if(k == e.TAB){
rlm@46 28850 e.stopEvent();
rlm@46 28851 r = this.doc.selection.createRange();
rlm@46 28852 if(r){
rlm@46 28853 r.collapse(true);
rlm@46 28854 r.pasteHTML('&nbsp;&nbsp;&nbsp;&nbsp;');
rlm@46 28855 this.deferFocus();
rlm@46 28856 }
rlm@46 28857 }else if(k == e.ENTER){
rlm@46 28858 r = this.doc.selection.createRange();
rlm@46 28859 if(r){
rlm@46 28860 var target = r.parentElement();
rlm@46 28861 if(!target || target.tagName.toLowerCase() != 'li'){
rlm@46 28862 e.stopEvent();
rlm@46 28863 r.pasteHTML('<br />');
rlm@46 28864 r.collapse(false);
rlm@46 28865 r.select();
rlm@46 28866 }
rlm@46 28867 }
rlm@46 28868 }
rlm@46 28869 };
rlm@46 28870 }else if(Ext.isOpera){
rlm@46 28871 return function(e){
rlm@46 28872 var k = e.getKey();
rlm@46 28873 if(k == e.TAB){
rlm@46 28874 e.stopEvent();
rlm@46 28875 this.win.focus();
rlm@46 28876 this.execCmd('InsertHTML','&nbsp;&nbsp;&nbsp;&nbsp;');
rlm@46 28877 this.deferFocus();
rlm@46 28878 }
rlm@46 28879 };
rlm@46 28880 }else if(Ext.isSafari){
rlm@46 28881 return function(e){
rlm@46 28882 var k = e.getKey();
rlm@46 28883 if(k == e.TAB){
rlm@46 28884 e.stopEvent();
rlm@46 28885 this.execCmd('InsertText','\t');
rlm@46 28886 this.deferFocus();
rlm@46 28887 }
rlm@46 28888 };
rlm@46 28889 }
rlm@46 28890 }(),
rlm@46 28891
rlm@46 28892
rlm@46 28893 getToolbar : function(){
rlm@46 28894 return this.tb;
rlm@46 28895 },
rlm@46 28896
rlm@46 28897
rlm@46 28898 buttonTips : {
rlm@46 28899 bold : {
rlm@46 28900 title: 'Bold (Ctrl+B)',
rlm@46 28901 text: 'Make the selected text bold.',
rlm@46 28902 cls: 'x-html-editor-tip'
rlm@46 28903 },
rlm@46 28904 italic : {
rlm@46 28905 title: 'Italic (Ctrl+I)',
rlm@46 28906 text: 'Make the selected text italic.',
rlm@46 28907 cls: 'x-html-editor-tip'
rlm@46 28908 },
rlm@46 28909 underline : {
rlm@46 28910 title: 'Underline (Ctrl+U)',
rlm@46 28911 text: 'Underline the selected text.',
rlm@46 28912 cls: 'x-html-editor-tip'
rlm@46 28913 },
rlm@46 28914 increasefontsize : {
rlm@46 28915 title: 'Grow Text',
rlm@46 28916 text: 'Increase the font size.',
rlm@46 28917 cls: 'x-html-editor-tip'
rlm@46 28918 },
rlm@46 28919 decreasefontsize : {
rlm@46 28920 title: 'Shrink Text',
rlm@46 28921 text: 'Decrease the font size.',
rlm@46 28922 cls: 'x-html-editor-tip'
rlm@46 28923 },
rlm@46 28924 backcolor : {
rlm@46 28925 title: 'Text Highlight Color',
rlm@46 28926 text: 'Change the background color of the selected text.',
rlm@46 28927 cls: 'x-html-editor-tip'
rlm@46 28928 },
rlm@46 28929 forecolor : {
rlm@46 28930 title: 'Font Color',
rlm@46 28931 text: 'Change the color of the selected text.',
rlm@46 28932 cls: 'x-html-editor-tip'
rlm@46 28933 },
rlm@46 28934 justifyleft : {
rlm@46 28935 title: 'Align Text Left',
rlm@46 28936 text: 'Align text to the left.',
rlm@46 28937 cls: 'x-html-editor-tip'
rlm@46 28938 },
rlm@46 28939 justifycenter : {
rlm@46 28940 title: 'Center Text',
rlm@46 28941 text: 'Center text in the editor.',
rlm@46 28942 cls: 'x-html-editor-tip'
rlm@46 28943 },
rlm@46 28944 justifyright : {
rlm@46 28945 title: 'Align Text Right',
rlm@46 28946 text: 'Align text to the right.',
rlm@46 28947 cls: 'x-html-editor-tip'
rlm@46 28948 },
rlm@46 28949 insertunorderedlist : {
rlm@46 28950 title: 'Bullet List',
rlm@46 28951 text: 'Start a bulleted list.',
rlm@46 28952 cls: 'x-html-editor-tip'
rlm@46 28953 },
rlm@46 28954 insertorderedlist : {
rlm@46 28955 title: 'Numbered List',
rlm@46 28956 text: 'Start a numbered list.',
rlm@46 28957 cls: 'x-html-editor-tip'
rlm@46 28958 },
rlm@46 28959 createlink : {
rlm@46 28960 title: 'Hyperlink',
rlm@46 28961 text: 'Make the selected text a hyperlink.',
rlm@46 28962 cls: 'x-html-editor-tip'
rlm@46 28963 },
rlm@46 28964 sourceedit : {
rlm@46 28965 title: 'Source Edit',
rlm@46 28966 text: 'Switch to source editing mode.',
rlm@46 28967 cls: 'x-html-editor-tip'
rlm@46 28968 }
rlm@46 28969 }
rlm@46 28970
rlm@46 28971
rlm@46 28972
rlm@46 28973
rlm@46 28974
rlm@46 28975
rlm@46 28976
rlm@46 28977
rlm@46 28978
rlm@46 28979
rlm@46 28980
rlm@46 28981
rlm@46 28982
rlm@46 28983
rlm@46 28984
rlm@46 28985
rlm@46 28986
rlm@46 28987
rlm@46 28988
rlm@46 28989
rlm@46 28990
rlm@46 28991
rlm@46 28992
rlm@46 28993
rlm@46 28994
rlm@46 28995
rlm@46 28996
rlm@46 28997
rlm@46 28998
rlm@46 28999
rlm@46 29000
rlm@46 29001
rlm@46 29002
rlm@46 29003
rlm@46 29004
rlm@46 29005 });
rlm@46 29006 Ext.reg('htmleditor', Ext.form.HtmlEditor);
rlm@46 29007
rlm@46 29008 Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {
rlm@46 29009
rlm@46 29010 minValue : null,
rlm@46 29011
rlm@46 29012 maxValue : null,
rlm@46 29013
rlm@46 29014 minText : "The time in this field must be equal to or after {0}",
rlm@46 29015
rlm@46 29016 maxText : "The time in this field must be equal to or before {0}",
rlm@46 29017
rlm@46 29018 invalidText : "{0} is not a valid time",
rlm@46 29019
rlm@46 29020 format : "g:i A",
rlm@46 29021
rlm@46 29022 altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",
rlm@46 29023
rlm@46 29024 increment: 15,
rlm@46 29025
rlm@46 29026
rlm@46 29027 mode: 'local',
rlm@46 29028
rlm@46 29029 triggerAction: 'all',
rlm@46 29030
rlm@46 29031 typeAhead: false,
rlm@46 29032
rlm@46 29033
rlm@46 29034 initComponent : function(){
rlm@46 29035 Ext.form.TimeField.superclass.initComponent.call(this);
rlm@46 29036
rlm@46 29037 if(typeof this.minValue == "string"){
rlm@46 29038 this.minValue = this.parseDate(this.minValue);
rlm@46 29039 }
rlm@46 29040 if(typeof this.maxValue == "string"){
rlm@46 29041 this.maxValue = this.parseDate(this.maxValue);
rlm@46 29042 }
rlm@46 29043
rlm@46 29044 if(!this.store){
rlm@46 29045 var min = this.parseDate(this.minValue);
rlm@46 29046 if(!min){
rlm@46 29047 min = new Date().clearTime();
rlm@46 29048 }
rlm@46 29049 var max = this.parseDate(this.maxValue);
rlm@46 29050 if(!max){
rlm@46 29051 max = new Date().clearTime().add('mi', (24 * 60) - 1);
rlm@46 29052 }
rlm@46 29053 var times = [];
rlm@46 29054 while(min <= max){
rlm@46 29055 times.push([min.dateFormat(this.format)]);
rlm@46 29056 min = min.add('mi', this.increment);
rlm@46 29057 }
rlm@46 29058 this.store = new Ext.data.SimpleStore({
rlm@46 29059 fields: ['text'],
rlm@46 29060 data : times
rlm@46 29061 });
rlm@46 29062 this.displayField = 'text';
rlm@46 29063 }
rlm@46 29064 },
rlm@46 29065
rlm@46 29066
rlm@46 29067 getValue : function(){
rlm@46 29068 var v = Ext.form.TimeField.superclass.getValue.call(this);
rlm@46 29069 return this.formatDate(this.parseDate(v)) || '';
rlm@46 29070 },
rlm@46 29071
rlm@46 29072
rlm@46 29073 setValue : function(value){
rlm@46 29074 Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value)));
rlm@46 29075 },
rlm@46 29076
rlm@46 29077
rlm@46 29078 validateValue : Ext.form.DateField.prototype.validateValue,
rlm@46 29079 parseDate : Ext.form.DateField.prototype.parseDate,
rlm@46 29080 formatDate : Ext.form.DateField.prototype.formatDate,
rlm@46 29081
rlm@46 29082
rlm@46 29083 beforeBlur : function(){
rlm@46 29084 var v = this.parseDate(this.getRawValue());
rlm@46 29085 if(v){
rlm@46 29086 this.setValue(v.dateFormat(this.format));
rlm@46 29087 }
rlm@46 29088 }
rlm@46 29089
rlm@46 29090
rlm@46 29091
rlm@46 29092
rlm@46 29093
rlm@46 29094 });
rlm@46 29095 Ext.reg('timefield', Ext.form.TimeField);
rlm@46 29096
rlm@46 29097 Ext.form.Label = Ext.extend(Ext.BoxComponent, {
rlm@46 29098
rlm@46 29099
rlm@46 29100
rlm@46 29101 onRender : function(ct, position){
rlm@46 29102 if(!this.el){
rlm@46 29103 this.el = document.createElement('label');
rlm@46 29104 this.el.id = this.getId();
rlm@46 29105 this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || '');
rlm@46 29106 if(this.forId){
rlm@46 29107 this.el.setAttribute('htmlFor', this.forId);
rlm@46 29108 }
rlm@46 29109 }
rlm@46 29110 Ext.form.Label.superclass.onRender.call(this, ct, position);
rlm@46 29111 }
rlm@46 29112 });
rlm@46 29113
rlm@46 29114 Ext.reg('label', Ext.form.Label);
rlm@46 29115
rlm@46 29116 Ext.form.Action = function(form, options){
rlm@46 29117 this.form = form;
rlm@46 29118 this.options = options || {};
rlm@46 29119 };
rlm@46 29120
rlm@46 29121
rlm@46 29122 Ext.form.Action.CLIENT_INVALID = 'client';
rlm@46 29123
rlm@46 29124 Ext.form.Action.SERVER_INVALID = 'server';
rlm@46 29125
rlm@46 29126 Ext.form.Action.CONNECT_FAILURE = 'connect';
rlm@46 29127
rlm@46 29128 Ext.form.Action.LOAD_FAILURE = 'load';
rlm@46 29129
rlm@46 29130 Ext.form.Action.prototype = {
rlm@46 29131
rlm@46 29132
rlm@46 29133
rlm@46 29134
rlm@46 29135
rlm@46 29136
rlm@46 29137
rlm@46 29138
rlm@46 29139
rlm@46 29140
rlm@46 29141
rlm@46 29142 type : 'default',
rlm@46 29143
rlm@46 29144
rlm@46 29145 run : function(options){
rlm@46 29146
rlm@46 29147 },
rlm@46 29148
rlm@46 29149 success : function(response){
rlm@46 29150
rlm@46 29151 },
rlm@46 29152
rlm@46 29153 handleResponse : function(response){
rlm@46 29154
rlm@46 29155 },
rlm@46 29156
rlm@46 29157 failure : function(response){
rlm@46 29158 this.response = response;
rlm@46 29159 this.failureType = Ext.form.Action.CONNECT_FAILURE;
rlm@46 29160 this.form.afterAction(this, false);
rlm@46 29161 },
rlm@46 29162
rlm@46 29163 processResponse : function(response){
rlm@46 29164 this.response = response;
rlm@46 29165 if(!response.responseText){
rlm@46 29166 return true;
rlm@46 29167 }
rlm@46 29168 this.result = this.handleResponse(response);
rlm@46 29169 return this.result;
rlm@46 29170 },
rlm@46 29171
rlm@46 29172 getUrl : function(appendParams){
rlm@46 29173 var url = this.options.url || this.form.url || this.form.el.dom.action;
rlm@46 29174 if(appendParams){
rlm@46 29175 var p = this.getParams();
rlm@46 29176 if(p){
rlm@46 29177 url += (url.indexOf('?') != -1 ? '&' : '?') + p;
rlm@46 29178 }
rlm@46 29179 }
rlm@46 29180 return url;
rlm@46 29181 },
rlm@46 29182
rlm@46 29183 getMethod : function(){
rlm@46 29184 return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();
rlm@46 29185 },
rlm@46 29186
rlm@46 29187 getParams : function(){
rlm@46 29188 var bp = this.form.baseParams;
rlm@46 29189 var p = this.options.params;
rlm@46 29190 if(p){
rlm@46 29191 if(typeof p == "object"){
rlm@46 29192 p = Ext.urlEncode(Ext.applyIf(p, bp));
rlm@46 29193 }else if(typeof p == 'string' && bp){
rlm@46 29194 p += '&' + Ext.urlEncode(bp);
rlm@46 29195 }
rlm@46 29196 }else if(bp){
rlm@46 29197 p = Ext.urlEncode(bp);
rlm@46 29198 }
rlm@46 29199 return p;
rlm@46 29200 },
rlm@46 29201
rlm@46 29202 createCallback : function(opts){
rlm@46 29203 var opts = opts || {};
rlm@46 29204 return {
rlm@46 29205 success: this.success,
rlm@46 29206 failure: this.failure,
rlm@46 29207 scope: this,
rlm@46 29208 timeout: (opts.timeout*1000) || (this.form.timeout*1000),
rlm@46 29209 upload: this.form.fileUpload ? this.success : undefined
rlm@46 29210 };
rlm@46 29211 }
rlm@46 29212 };
rlm@46 29213
rlm@46 29214
rlm@46 29215 Ext.form.Action.Submit = function(form, options){
rlm@46 29216 Ext.form.Action.Submit.superclass.constructor.call(this, form, options);
rlm@46 29217 };
rlm@46 29218
rlm@46 29219 Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
rlm@46 29220
rlm@46 29221 type : 'submit',
rlm@46 29222
rlm@46 29223 run : function(){
rlm@46 29224 var o = this.options;
rlm@46 29225 var method = this.getMethod();
rlm@46 29226 var isGet = method == 'GET';
rlm@46 29227 if(o.clientValidation === false || this.form.isValid()){
rlm@46 29228 Ext.Ajax.request(Ext.apply(this.createCallback(o), {
rlm@46 29229 form:this.form.el.dom,
rlm@46 29230 url:this.getUrl(isGet),
rlm@46 29231 method: method,
rlm@46 29232 headers: o.headers,
rlm@46 29233 params:!isGet ? this.getParams() : null,
rlm@46 29234 isUpload: this.form.fileUpload
rlm@46 29235 }));
rlm@46 29236 }else if (o.clientValidation !== false){ this.failureType = Ext.form.Action.CLIENT_INVALID;
rlm@46 29237 this.form.afterAction(this, false);
rlm@46 29238 }
rlm@46 29239 },
rlm@46 29240
rlm@46 29241 success : function(response){
rlm@46 29242 var result = this.processResponse(response);
rlm@46 29243 if(result === true || result.success){
rlm@46 29244 this.form.afterAction(this, true);
rlm@46 29245 return;
rlm@46 29246 }
rlm@46 29247 if(result.errors){
rlm@46 29248 this.form.markInvalid(result.errors);
rlm@46 29249 this.failureType = Ext.form.Action.SERVER_INVALID;
rlm@46 29250 }
rlm@46 29251 this.form.afterAction(this, false);
rlm@46 29252 },
rlm@46 29253
rlm@46 29254 handleResponse : function(response){
rlm@46 29255 if(this.form.errorReader){
rlm@46 29256 var rs = this.form.errorReader.read(response);
rlm@46 29257 var errors = [];
rlm@46 29258 if(rs.records){
rlm@46 29259 for(var i = 0, len = rs.records.length; i < len; i++) {
rlm@46 29260 var r = rs.records[i];
rlm@46 29261 errors[i] = r.data;
rlm@46 29262 }
rlm@46 29263 }
rlm@46 29264 if(errors.length < 1){
rlm@46 29265 errors = null;
rlm@46 29266 }
rlm@46 29267 return {
rlm@46 29268 success : rs.success,
rlm@46 29269 errors : errors
rlm@46 29270 };
rlm@46 29271 }
rlm@46 29272 return Ext.decode(response.responseText);
rlm@46 29273 }
rlm@46 29274 });
rlm@46 29275
rlm@46 29276
rlm@46 29277
rlm@46 29278 Ext.form.Action.Load = function(form, options){
rlm@46 29279 Ext.form.Action.Load.superclass.constructor.call(this, form, options);
rlm@46 29280 this.reader = this.form.reader;
rlm@46 29281 };
rlm@46 29282
rlm@46 29283 Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
rlm@46 29284 type : 'load',
rlm@46 29285
rlm@46 29286 run : function(){
rlm@46 29287 Ext.Ajax.request(Ext.apply(
rlm@46 29288 this.createCallback(this.options), {
rlm@46 29289 method:this.getMethod(),
rlm@46 29290 url:this.getUrl(false),
rlm@46 29291 headers: this.options.headers,
rlm@46 29292 params:this.getParams()
rlm@46 29293 }));
rlm@46 29294 },
rlm@46 29295
rlm@46 29296 success : function(response){
rlm@46 29297 var result = this.processResponse(response);
rlm@46 29298 if(result === true || !result.success || !result.data){
rlm@46 29299 this.failureType = Ext.form.Action.LOAD_FAILURE;
rlm@46 29300 this.form.afterAction(this, false);
rlm@46 29301 return;
rlm@46 29302 }
rlm@46 29303 this.form.clearInvalid();
rlm@46 29304 this.form.setValues(result.data);
rlm@46 29305 this.form.afterAction(this, true);
rlm@46 29306 },
rlm@46 29307
rlm@46 29308 handleResponse : function(response){
rlm@46 29309 if(this.form.reader){
rlm@46 29310 var rs = this.form.reader.read(response);
rlm@46 29311 var data = rs.records && rs.records[0] ? rs.records[0].data : null;
rlm@46 29312 return {
rlm@46 29313 success : rs.success,
rlm@46 29314 data : data
rlm@46 29315 };
rlm@46 29316 }
rlm@46 29317 return Ext.decode(response.responseText);
rlm@46 29318 }
rlm@46 29319 });
rlm@46 29320
rlm@46 29321 Ext.form.Action.ACTION_TYPES = {
rlm@46 29322 'load' : Ext.form.Action.Load,
rlm@46 29323 'submit' : Ext.form.Action.Submit
rlm@46 29324 };
rlm@46 29325
rlm@46 29326
rlm@46 29327 Ext.form.VTypes = function(){
rlm@46 29328 var alpha = /^[a-zA-Z_]+$/;
rlm@46 29329 var alphanum = /^[a-zA-Z0-9_]+$/;
rlm@46 29330 var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
rlm@46 29331 var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
rlm@46 29332
rlm@46 29333 return {
rlm@46 29334
rlm@46 29335 'email' : function(v){
rlm@46 29336 return email.test(v);
rlm@46 29337 },
rlm@46 29338
rlm@46 29339 'emailText' : 'This field should be an e-mail address in the format "user@domain.com"',
rlm@46 29340
rlm@46 29341 'emailMask' : /[a-z0-9_\.\-@]/i,
rlm@46 29342
rlm@46 29343
rlm@46 29344 'url' : function(v){
rlm@46 29345 return url.test(v);
rlm@46 29346 },
rlm@46 29347
rlm@46 29348 'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"',
rlm@46 29349
rlm@46 29350
rlm@46 29351 'alpha' : function(v){
rlm@46 29352 return alpha.test(v);
rlm@46 29353 },
rlm@46 29354
rlm@46 29355 'alphaText' : 'This field should only contain letters and _',
rlm@46 29356
rlm@46 29357 'alphaMask' : /[a-z_]/i,
rlm@46 29358
rlm@46 29359
rlm@46 29360 'alphanum' : function(v){
rlm@46 29361 return alphanum.test(v);
rlm@46 29362 },
rlm@46 29363
rlm@46 29364 'alphanumText' : 'This field should only contain letters, numbers and _',
rlm@46 29365
rlm@46 29366 'alphanumMask' : /[a-z0-9_]/i
rlm@46 29367 };
rlm@46 29368 }();
rlm@46 29369
rlm@46 29370 Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
rlm@46 29371
rlm@46 29372
rlm@46 29373
rlm@46 29374
rlm@46 29375
rlm@46 29376
rlm@46 29377
rlm@46 29378
rlm@46 29379
rlm@46 29380
rlm@46 29381
rlm@46 29382
rlm@46 29383
rlm@46 29384
rlm@46 29385 ddText : "{0} selected row{1}",
rlm@46 29386
rlm@46 29387 minColumnWidth : 25,
rlm@46 29388
rlm@46 29389 trackMouseOver : true,
rlm@46 29390
rlm@46 29391 enableDragDrop : false,
rlm@46 29392
rlm@46 29393 enableColumnMove : true,
rlm@46 29394
rlm@46 29395 enableColumnHide : true,
rlm@46 29396
rlm@46 29397 enableHdMenu : true,
rlm@46 29398
rlm@46 29399 stripeRows : false,
rlm@46 29400
rlm@46 29401 autoExpandColumn : false,
rlm@46 29402
rlm@46 29403 autoExpandMin : 50,
rlm@46 29404
rlm@46 29405 autoExpandMax : 1000,
rlm@46 29406
rlm@46 29407 view : null,
rlm@46 29408
rlm@46 29409 loadMask : false,
rlm@46 29410
rlm@46 29411
rlm@46 29412 rendered : false,
rlm@46 29413
rlm@46 29414 viewReady: false,
rlm@46 29415
rlm@46 29416 stateEvents: ["columnmove", "columnresize", "sortchange"],
rlm@46 29417
rlm@46 29418
rlm@46 29419 initComponent : function(){
rlm@46 29420 Ext.grid.GridPanel.superclass.initComponent.call(this);
rlm@46 29421
rlm@46 29422
rlm@46 29423
rlm@46 29424 this.autoScroll = false;
rlm@46 29425 this.autoWidth = false;
rlm@46 29426
rlm@46 29427 if(Ext.isArray(this.columns)){
rlm@46 29428 this.colModel = new Ext.grid.ColumnModel(this.columns);
rlm@46 29429 delete this.columns;
rlm@46 29430 }
rlm@46 29431
rlm@46 29432
rlm@46 29433 if(this.ds){
rlm@46 29434 this.store = this.ds;
rlm@46 29435 delete this.ds;
rlm@46 29436 }
rlm@46 29437 if(this.cm){
rlm@46 29438 this.colModel = this.cm;
rlm@46 29439 delete this.cm;
rlm@46 29440 }
rlm@46 29441 if(this.sm){
rlm@46 29442 this.selModel = this.sm;
rlm@46 29443 delete this.sm;
rlm@46 29444 }
rlm@46 29445 this.store = Ext.StoreMgr.lookup(this.store);
rlm@46 29446
rlm@46 29447 this.addEvents(
rlm@46 29448
rlm@46 29449
rlm@46 29450 "click",
rlm@46 29451
rlm@46 29452 "dblclick",
rlm@46 29453
rlm@46 29454 "contextmenu",
rlm@46 29455
rlm@46 29456 "mousedown",
rlm@46 29457
rlm@46 29458 "mouseup",
rlm@46 29459
rlm@46 29460 "mouseover",
rlm@46 29461
rlm@46 29462 "mouseout",
rlm@46 29463
rlm@46 29464 "keypress",
rlm@46 29465
rlm@46 29466 "keydown",
rlm@46 29467
rlm@46 29468
rlm@46 29469
rlm@46 29470 "cellmousedown",
rlm@46 29471
rlm@46 29472 "rowmousedown",
rlm@46 29473
rlm@46 29474 "headermousedown",
rlm@46 29475
rlm@46 29476
rlm@46 29477 "cellclick",
rlm@46 29478
rlm@46 29479 "celldblclick",
rlm@46 29480
rlm@46 29481 "rowclick",
rlm@46 29482
rlm@46 29483 "rowdblclick",
rlm@46 29484
rlm@46 29485 "headerclick",
rlm@46 29486
rlm@46 29487 "headerdblclick",
rlm@46 29488
rlm@46 29489 "rowcontextmenu",
rlm@46 29490
rlm@46 29491 "cellcontextmenu",
rlm@46 29492
rlm@46 29493 "headercontextmenu",
rlm@46 29494
rlm@46 29495 "bodyscroll",
rlm@46 29496
rlm@46 29497 "columnresize",
rlm@46 29498
rlm@46 29499 "columnmove",
rlm@46 29500
rlm@46 29501 "sortchange"
rlm@46 29502 );
rlm@46 29503 },
rlm@46 29504
rlm@46 29505
rlm@46 29506 onRender : function(ct, position){
rlm@46 29507 Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
rlm@46 29508
rlm@46 29509 var c = this.body;
rlm@46 29510
rlm@46 29511 this.el.addClass('x-grid-panel');
rlm@46 29512
rlm@46 29513 var view = this.getView();
rlm@46 29514 view.init(this);
rlm@46 29515
rlm@46 29516 c.on("mousedown", this.onMouseDown, this);
rlm@46 29517 c.on("click", this.onClick, this);
rlm@46 29518 c.on("dblclick", this.onDblClick, this);
rlm@46 29519 c.on("contextmenu", this.onContextMenu, this);
rlm@46 29520 c.on("keydown", this.onKeyDown, this);
rlm@46 29521
rlm@46 29522 this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]);
rlm@46 29523
rlm@46 29524 this.getSelectionModel().init(this);
rlm@46 29525 this.view.render();
rlm@46 29526 },
rlm@46 29527
rlm@46 29528
rlm@46 29529 initEvents : function(){
rlm@46 29530 Ext.grid.GridPanel.superclass.initEvents.call(this);
rlm@46 29531
rlm@46 29532 if(this.loadMask){
rlm@46 29533 this.loadMask = new Ext.LoadMask(this.bwrap,
rlm@46 29534 Ext.apply({store:this.store}, this.loadMask));
rlm@46 29535 }
rlm@46 29536 },
rlm@46 29537
rlm@46 29538 initStateEvents : function(){
rlm@46 29539 Ext.grid.GridPanel.superclass.initStateEvents.call(this);
rlm@46 29540 this.colModel.on('hiddenchange', this.saveState, this, {delay: 100});
rlm@46 29541 },
rlm@46 29542
rlm@46 29543 applyState : function(state){
rlm@46 29544 var cm = this.colModel;
rlm@46 29545 var cs = state.columns;
rlm@46 29546 if(cs){
rlm@46 29547 for(var i = 0, len = cs.length; i < len; i++){
rlm@46 29548 var s = cs[i];
rlm@46 29549 var c = cm.getColumnById(s.id);
rlm@46 29550 if(c){
rlm@46 29551 c.hidden = s.hidden;
rlm@46 29552 c.width = s.width;
rlm@46 29553 var oldIndex = cm.getIndexById(s.id);
rlm@46 29554 if(oldIndex != i){
rlm@46 29555 cm.moveColumn(oldIndex, i);
rlm@46 29556 }
rlm@46 29557 }
rlm@46 29558 }
rlm@46 29559 }
rlm@46 29560 if(state.sort){
rlm@46 29561 this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction);
rlm@46 29562 }
rlm@46 29563 },
rlm@46 29564
rlm@46 29565 getState : function(){
rlm@46 29566 var o = {columns: []};
rlm@46 29567 for(var i = 0, c; c = this.colModel.config[i]; i++){
rlm@46 29568 o.columns[i] = {
rlm@46 29569 id: c.id,
rlm@46 29570 width: c.width
rlm@46 29571 };
rlm@46 29572 if(c.hidden){
rlm@46 29573 o.columns[i].hidden = true;
rlm@46 29574 }
rlm@46 29575 }
rlm@46 29576 var ss = this.store.getSortState();
rlm@46 29577 if(ss){
rlm@46 29578 o.sort = ss;
rlm@46 29579 }
rlm@46 29580 return o;
rlm@46 29581 },
rlm@46 29582
rlm@46 29583
rlm@46 29584 afterRender : function(){
rlm@46 29585 Ext.grid.GridPanel.superclass.afterRender.call(this);
rlm@46 29586 this.view.layout();
rlm@46 29587 this.viewReady = true;
rlm@46 29588 },
rlm@46 29589
rlm@46 29590
rlm@46 29591 reconfigure : function(store, colModel){
rlm@46 29592 if(this.loadMask){
rlm@46 29593 this.loadMask.destroy();
rlm@46 29594 this.loadMask = new Ext.LoadMask(this.bwrap,
rlm@46 29595 Ext.apply({store:store}, this.initialConfig.loadMask));
rlm@46 29596 }
rlm@46 29597 this.view.bind(store, colModel);
rlm@46 29598 this.store = store;
rlm@46 29599 this.colModel = colModel;
rlm@46 29600 if(this.rendered){
rlm@46 29601 this.view.refresh(true);
rlm@46 29602 }
rlm@46 29603 },
rlm@46 29604
rlm@46 29605
rlm@46 29606 onKeyDown : function(e){
rlm@46 29607 this.fireEvent("keydown", e);
rlm@46 29608 },
rlm@46 29609
rlm@46 29610
rlm@46 29611 onDestroy : function(){
rlm@46 29612 if(this.rendered){
rlm@46 29613 if(this.loadMask){
rlm@46 29614 this.loadMask.destroy();
rlm@46 29615 }
rlm@46 29616 var c = this.body;
rlm@46 29617 c.removeAllListeners();
rlm@46 29618 this.view.destroy();
rlm@46 29619 c.update("");
rlm@46 29620 }
rlm@46 29621 this.colModel.purgeListeners();
rlm@46 29622 Ext.grid.GridPanel.superclass.onDestroy.call(this);
rlm@46 29623 },
rlm@46 29624
rlm@46 29625
rlm@46 29626 processEvent : function(name, e){
rlm@46 29627 this.fireEvent(name, e);
rlm@46 29628 var t = e.getTarget();
rlm@46 29629 var v = this.view;
rlm@46 29630 var header = v.findHeaderIndex(t);
rlm@46 29631 if(header !== false){
rlm@46 29632 this.fireEvent("header" + name, this, header, e);
rlm@46 29633 }else{
rlm@46 29634 var row = v.findRowIndex(t);
rlm@46 29635 var cell = v.findCellIndex(t);
rlm@46 29636 if(row !== false){
rlm@46 29637 this.fireEvent("row" + name, this, row, e);
rlm@46 29638 if(cell !== false){
rlm@46 29639 this.fireEvent("cell" + name, this, row, cell, e);
rlm@46 29640 }
rlm@46 29641 }
rlm@46 29642 }
rlm@46 29643 },
rlm@46 29644
rlm@46 29645
rlm@46 29646 onClick : function(e){
rlm@46 29647 this.processEvent("click", e);
rlm@46 29648 },
rlm@46 29649
rlm@46 29650
rlm@46 29651 onMouseDown : function(e){
rlm@46 29652 this.processEvent("mousedown", e);
rlm@46 29653 },
rlm@46 29654
rlm@46 29655
rlm@46 29656 onContextMenu : function(e, t){
rlm@46 29657 this.processEvent("contextmenu", e);
rlm@46 29658 },
rlm@46 29659
rlm@46 29660
rlm@46 29661 onDblClick : function(e){
rlm@46 29662 this.processEvent("dblclick", e);
rlm@46 29663 },
rlm@46 29664
rlm@46 29665
rlm@46 29666 walkCells : function(row, col, step, fn, scope){
rlm@46 29667 var cm = this.colModel, clen = cm.getColumnCount();
rlm@46 29668 var ds = this.store, rlen = ds.getCount(), first = true;
rlm@46 29669 if(step < 0){
rlm@46 29670 if(col < 0){
rlm@46 29671 row--;
rlm@46 29672 first = false;
rlm@46 29673 }
rlm@46 29674 while(row >= 0){
rlm@46 29675 if(!first){
rlm@46 29676 col = clen-1;
rlm@46 29677 }
rlm@46 29678 first = false;
rlm@46 29679 while(col >= 0){
rlm@46 29680 if(fn.call(scope || this, row, col, cm) === true){
rlm@46 29681 return [row, col];
rlm@46 29682 }
rlm@46 29683 col--;
rlm@46 29684 }
rlm@46 29685 row--;
rlm@46 29686 }
rlm@46 29687 } else {
rlm@46 29688 if(col >= clen){
rlm@46 29689 row++;
rlm@46 29690 first = false;
rlm@46 29691 }
rlm@46 29692 while(row < rlen){
rlm@46 29693 if(!first){
rlm@46 29694 col = 0;
rlm@46 29695 }
rlm@46 29696 first = false;
rlm@46 29697 while(col < clen){
rlm@46 29698 if(fn.call(scope || this, row, col, cm) === true){
rlm@46 29699 return [row, col];
rlm@46 29700 }
rlm@46 29701 col++;
rlm@46 29702 }
rlm@46 29703 row++;
rlm@46 29704 }
rlm@46 29705 }
rlm@46 29706 return null;
rlm@46 29707 },
rlm@46 29708
rlm@46 29709
rlm@46 29710 getSelections : function(){
rlm@46 29711 return this.selModel.getSelections();
rlm@46 29712 },
rlm@46 29713
rlm@46 29714
rlm@46 29715 onResize : function(){
rlm@46 29716 Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);
rlm@46 29717 if(this.viewReady){
rlm@46 29718 this.view.layout();
rlm@46 29719 }
rlm@46 29720 },
rlm@46 29721
rlm@46 29722
rlm@46 29723 getGridEl : function(){
rlm@46 29724 return this.body;
rlm@46 29725 },
rlm@46 29726
rlm@46 29727
rlm@46 29728 stopEditing : function(){},
rlm@46 29729
rlm@46 29730
rlm@46 29731 getSelectionModel : function(){
rlm@46 29732 if(!this.selModel){
rlm@46 29733 this.selModel = new Ext.grid.RowSelectionModel(
rlm@46 29734 this.disableSelection ? {selectRow: Ext.emptyFn} : null);
rlm@46 29735 }
rlm@46 29736 return this.selModel;
rlm@46 29737 },
rlm@46 29738
rlm@46 29739
rlm@46 29740 getStore : function(){
rlm@46 29741 return this.store;
rlm@46 29742 },
rlm@46 29743
rlm@46 29744
rlm@46 29745 getColumnModel : function(){
rlm@46 29746 return this.colModel;
rlm@46 29747 },
rlm@46 29748
rlm@46 29749
rlm@46 29750 getView : function(){
rlm@46 29751 if(!this.view){
rlm@46 29752 this.view = new Ext.grid.GridView(this.viewConfig);
rlm@46 29753 }
rlm@46 29754 return this.view;
rlm@46 29755 },
rlm@46 29756
rlm@46 29757 getDragDropText : function(){
rlm@46 29758 var count = this.selModel.getCount();
rlm@46 29759 return String.format(this.ddText, count, count == 1 ? '' : 's');
rlm@46 29760 }
rlm@46 29761
rlm@46 29762
rlm@46 29763
rlm@46 29764
rlm@46 29765
rlm@46 29766
rlm@46 29767
rlm@46 29768
rlm@46 29769
rlm@46 29770
rlm@46 29771
rlm@46 29772
rlm@46 29773
rlm@46 29774
rlm@46 29775
rlm@46 29776
rlm@46 29777
rlm@46 29778
rlm@46 29779
rlm@46 29780
rlm@46 29781
rlm@46 29782
rlm@46 29783
rlm@46 29784
rlm@46 29785
rlm@46 29786
rlm@46 29787
rlm@46 29788
rlm@46 29789
rlm@46 29790
rlm@46 29791
rlm@46 29792
rlm@46 29793
rlm@46 29794
rlm@46 29795
rlm@46 29796
rlm@46 29797
rlm@46 29798
rlm@46 29799
rlm@46 29800
rlm@46 29801
rlm@46 29802
rlm@46 29803
rlm@46 29804
rlm@46 29805
rlm@46 29806
rlm@46 29807
rlm@46 29808
rlm@46 29809
rlm@46 29810
rlm@46 29811 });
rlm@46 29812 Ext.reg('grid', Ext.grid.GridPanel);
rlm@46 29813
rlm@46 29814 Ext.grid.GridView = function(config){
rlm@46 29815 Ext.apply(this, config);
rlm@46 29816 this.addEvents(
rlm@46 29817
rlm@46 29818 "beforerowremoved",
rlm@46 29819
rlm@46 29820 "beforerowsinserted",
rlm@46 29821
rlm@46 29822 "beforerefresh",
rlm@46 29823
rlm@46 29824 "rowremoved",
rlm@46 29825
rlm@46 29826 "rowsinserted",
rlm@46 29827
rlm@46 29828 "rowupdated",
rlm@46 29829
rlm@46 29830 "refresh"
rlm@46 29831 );
rlm@46 29832 Ext.grid.GridView.superclass.constructor.call(this);
rlm@46 29833 };
rlm@46 29834
rlm@46 29835 Ext.extend(Ext.grid.GridView, Ext.util.Observable, {
rlm@46 29836
rlm@46 29837
rlm@46 29838
rlm@46 29839
rlm@46 29840 deferEmptyText: true,
rlm@46 29841
rlm@46 29842 scrollOffset: 19,
rlm@46 29843
rlm@46 29844 autoFill: false,
rlm@46 29845
rlm@46 29846 forceFit: false,
rlm@46 29847
rlm@46 29848 sortClasses : ["sort-asc", "sort-desc"],
rlm@46 29849
rlm@46 29850 sortAscText : "Sort Ascending",
rlm@46 29851
rlm@46 29852 sortDescText : "Sort Descending",
rlm@46 29853
rlm@46 29854 columnsText : "Columns",
rlm@46 29855
rlm@46 29856 borderWidth: 2,
rlm@46 29857
rlm@46 29858
rlm@46 29859
rlm@46 29860 initTemplates : function(){
rlm@46 29861 var ts = this.templates || {};
rlm@46 29862 if(!ts.master){
rlm@46 29863 ts.master = new Ext.Template(
rlm@46 29864 '<div class="x-grid3" hidefocus="true">',
rlm@46 29865 '<div class="x-grid3-viewport">',
rlm@46 29866 '<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset">{header}</div></div><div class="x-clear"></div></div>',
rlm@46 29867 '<div class="x-grid3-scroller"><div class="x-grid3-body">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>',
rlm@46 29868 "</div>",
rlm@46 29869 '<div class="x-grid3-resize-marker">&#160;</div>',
rlm@46 29870 '<div class="x-grid3-resize-proxy">&#160;</div>',
rlm@46 29871 "</div>"
rlm@46 29872 );
rlm@46 29873 }
rlm@46 29874
rlm@46 29875 if(!ts.header){
rlm@46 29876 ts.header = new Ext.Template(
rlm@46 29877 '<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
rlm@46 29878 '<thead><tr class="x-grid3-hd-row">{cells}</tr></thead>',
rlm@46 29879 "</table>"
rlm@46 29880 );
rlm@46 29881 }
rlm@46 29882
rlm@46 29883 if(!ts.hcell){
rlm@46 29884 ts.hcell = new Ext.Template(
rlm@46 29885 '<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id}" style="{style}"><div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '',
rlm@46 29886 '{value}<img class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />',
rlm@46 29887 "</div></td>"
rlm@46 29888 );
rlm@46 29889 }
rlm@46 29890
rlm@46 29891 if(!ts.body){
rlm@46 29892 ts.body = new Ext.Template('{rows}');
rlm@46 29893 }
rlm@46 29894
rlm@46 29895 if(!ts.row){
rlm@46 29896 ts.row = new Ext.Template(
rlm@46 29897 '<div class="x-grid3-row {alt}" style="{tstyle}"><table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
rlm@46 29898 '<tbody><tr>{cells}</tr>',
rlm@46 29899 (this.enableRowBody ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>' : ''),
rlm@46 29900 '</tbody></table></div>'
rlm@46 29901 );
rlm@46 29902 }
rlm@46 29903
rlm@46 29904 if(!ts.cell){
rlm@46 29905 ts.cell = new Ext.Template(
rlm@46 29906 '<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>',
rlm@46 29907 '<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>',
rlm@46 29908 "</td>"
rlm@46 29909 );
rlm@46 29910 }
rlm@46 29911
rlm@46 29912 for(var k in ts){
rlm@46 29913 var t = ts[k];
rlm@46 29914 if(t && typeof t.compile == 'function' && !t.compiled){
rlm@46 29915 t.disableFormats = true;
rlm@46 29916 t.compile();
rlm@46 29917 }
rlm@46 29918 }
rlm@46 29919
rlm@46 29920 this.templates = ts;
rlm@46 29921
rlm@46 29922 this.tdClass = 'x-grid3-cell';
rlm@46 29923 this.cellSelector = 'td.x-grid3-cell';
rlm@46 29924 this.hdCls = 'x-grid3-hd';
rlm@46 29925 this.rowSelector = 'div.x-grid3-row';
rlm@46 29926 this.colRe = new RegExp("x-grid3-td-([^\\s]+)", "");
rlm@46 29927 },
rlm@46 29928
rlm@46 29929 fly : function(el){
rlm@46 29930 if(!this._flyweight){
rlm@46 29931 this._flyweight = new Ext.Element.Flyweight(document.body);
rlm@46 29932 }
rlm@46 29933 this._flyweight.dom = el;
rlm@46 29934 return this._flyweight;
rlm@46 29935 },
rlm@46 29936
rlm@46 29937 getEditorParent : function(ed){
rlm@46 29938 return this.scroller.dom;
rlm@46 29939 },
rlm@46 29940
rlm@46 29941 initElements : function(){
rlm@46 29942 var E = Ext.Element;
rlm@46 29943
rlm@46 29944 var el = this.grid.getGridEl().dom.firstChild;
rlm@46 29945 var cs = el.childNodes;
rlm@46 29946
rlm@46 29947 this.el = new E(el);
rlm@46 29948
rlm@46 29949 this.mainWrap = new E(cs[0]);
rlm@46 29950 this.mainHd = new E(this.mainWrap.dom.firstChild);
rlm@46 29951
rlm@46 29952 if(this.grid.hideHeaders){
rlm@46 29953 this.mainHd.setDisplayed(false);
rlm@46 29954 }
rlm@46 29955
rlm@46 29956 this.innerHd = this.mainHd.dom.firstChild;
rlm@46 29957 this.scroller = new E(this.mainWrap.dom.childNodes[1]);
rlm@46 29958 if(this.forceFit){
rlm@46 29959 this.scroller.setStyle('overflow-x', 'hidden');
rlm@46 29960 }
rlm@46 29961 this.mainBody = new E(this.scroller.dom.firstChild);
rlm@46 29962
rlm@46 29963 this.focusEl = new E(this.scroller.dom.childNodes[1]);
rlm@46 29964 this.focusEl.swallowEvent("click", true);
rlm@46 29965
rlm@46 29966 this.resizeMarker = new E(cs[1]);
rlm@46 29967 this.resizeProxy = new E(cs[2]);
rlm@46 29968 },
rlm@46 29969
rlm@46 29970 getRows : function(){
rlm@46 29971 return this.hasRows() ? this.mainBody.dom.childNodes : [];
rlm@46 29972 },
rlm@46 29973
rlm@46 29974
rlm@46 29975 findCell : function(el){
rlm@46 29976 if(!el){
rlm@46 29977 return false;
rlm@46 29978 }
rlm@46 29979 return this.fly(el).findParent(this.cellSelector, 3);
rlm@46 29980 },
rlm@46 29981
rlm@46 29982 findCellIndex : function(el, requiredCls){
rlm@46 29983 var cell = this.findCell(el);
rlm@46 29984 if(cell && (!requiredCls || this.fly(cell).hasClass(requiredCls))){
rlm@46 29985 return this.getCellIndex(cell);
rlm@46 29986 }
rlm@46 29987 return false;
rlm@46 29988 },
rlm@46 29989
rlm@46 29990 getCellIndex : function(el){
rlm@46 29991 if(el){
rlm@46 29992 var m = el.className.match(this.colRe);
rlm@46 29993 if(m && m[1]){
rlm@46 29994 return this.cm.getIndexById(m[1]);
rlm@46 29995 }
rlm@46 29996 }
rlm@46 29997 return false;
rlm@46 29998 },
rlm@46 29999
rlm@46 30000 findHeaderCell : function(el){
rlm@46 30001 var cell = this.findCell(el);
rlm@46 30002 return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null;
rlm@46 30003 },
rlm@46 30004
rlm@46 30005 findHeaderIndex : function(el){
rlm@46 30006 return this.findCellIndex(el, this.hdCls);
rlm@46 30007 },
rlm@46 30008
rlm@46 30009 findRow : function(el){
rlm@46 30010 if(!el){
rlm@46 30011 return false;
rlm@46 30012 }
rlm@46 30013 return this.fly(el).findParent(this.rowSelector, 10);
rlm@46 30014 },
rlm@46 30015
rlm@46 30016 findRowIndex : function(el){
rlm@46 30017 var r = this.findRow(el);
rlm@46 30018 return r ? r.rowIndex : false;
rlm@46 30019 },
rlm@46 30020
rlm@46 30021
rlm@46 30022
rlm@46 30023 getRow : function(row){
rlm@46 30024 return this.getRows()[row];
rlm@46 30025 },
rlm@46 30026
rlm@46 30027
rlm@46 30028 getCell : function(row, col){
rlm@46 30029 return this.getRow(row).getElementsByTagName('td')[col];
rlm@46 30030 },
rlm@46 30031
rlm@46 30032
rlm@46 30033 getHeaderCell : function(index){
rlm@46 30034 return this.mainHd.dom.getElementsByTagName('td')[index];
rlm@46 30035 },
rlm@46 30036
rlm@46 30037
rlm@46 30038 addRowClass : function(row, cls){
rlm@46 30039 var r = this.getRow(row);
rlm@46 30040 if(r){
rlm@46 30041 this.fly(r).addClass(cls);
rlm@46 30042 }
rlm@46 30043 },
rlm@46 30044
rlm@46 30045 removeRowClass : function(row, cls){
rlm@46 30046 var r = this.getRow(row);
rlm@46 30047 if(r){
rlm@46 30048 this.fly(r).removeClass(cls);
rlm@46 30049 }
rlm@46 30050 },
rlm@46 30051
rlm@46 30052 removeRow : function(row){
rlm@46 30053 Ext.removeNode(this.getRow(row));
rlm@46 30054 },
rlm@46 30055
rlm@46 30056 removeRows : function(firstRow, lastRow){
rlm@46 30057 var bd = this.mainBody.dom;
rlm@46 30058 for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
rlm@46 30059 Ext.removeNode(bd.childNodes[firstRow]);
rlm@46 30060 }
rlm@46 30061 },
rlm@46 30062
rlm@46 30063
rlm@46 30064 getScrollState : function(){
rlm@46 30065 var sb = this.scroller.dom;
rlm@46 30066 return {left: sb.scrollLeft, top: sb.scrollTop};
rlm@46 30067 },
rlm@46 30068
rlm@46 30069 restoreScroll : function(state){
rlm@46 30070 var sb = this.scroller.dom;
rlm@46 30071 sb.scrollLeft = state.left;
rlm@46 30072 sb.scrollTop = state.top;
rlm@46 30073 },
rlm@46 30074
rlm@46 30075
rlm@46 30076 scrollToTop : function(){
rlm@46 30077 this.scroller.dom.scrollTop = 0;
rlm@46 30078 this.scroller.dom.scrollLeft = 0;
rlm@46 30079 },
rlm@46 30080
rlm@46 30081 syncScroll : function(){
rlm@46 30082 this.syncHeaderScroll();
rlm@46 30083 var mb = this.scroller.dom;
rlm@46 30084 this.grid.fireEvent("bodyscroll", mb.scrollLeft, mb.scrollTop);
rlm@46 30085 },
rlm@46 30086
rlm@46 30087 syncHeaderScroll : function(){
rlm@46 30088 var mb = this.scroller.dom;
rlm@46 30089 this.innerHd.scrollLeft = mb.scrollLeft;
rlm@46 30090 this.innerHd.scrollLeft = mb.scrollLeft; },
rlm@46 30091
rlm@46 30092 updateSortIcon : function(col, dir){
rlm@46 30093 var sc = this.sortClasses;
rlm@46 30094 var hds = this.mainHd.select('td').removeClass(sc);
rlm@46 30095 hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);
rlm@46 30096 },
rlm@46 30097
rlm@46 30098 updateAllColumnWidths : function(){
rlm@46 30099 var tw = this.getTotalWidth();
rlm@46 30100 var clen = this.cm.getColumnCount();
rlm@46 30101 var ws = [];
rlm@46 30102 for(var i = 0; i < clen; i++){
rlm@46 30103 ws[i] = this.getColumnWidth(i);
rlm@46 30104 }
rlm@46 30105
rlm@46 30106 this.innerHd.firstChild.firstChild.style.width = tw;
rlm@46 30107
rlm@46 30108 for(var i = 0; i < clen; i++){
rlm@46 30109 var hd = this.getHeaderCell(i);
rlm@46 30110 hd.style.width = ws[i];
rlm@46 30111 }
rlm@46 30112
rlm@46 30113 var ns = this.getRows();
rlm@46 30114 for(var i = 0, len = ns.length; i < len; i++){
rlm@46 30115 ns[i].style.width = tw;
rlm@46 30116 ns[i].firstChild.style.width = tw;
rlm@46 30117 var row = ns[i].firstChild.rows[0];
rlm@46 30118 for(var j = 0; j < clen; j++){
rlm@46 30119 row.childNodes[j].style.width = ws[j];
rlm@46 30120 }
rlm@46 30121 }
rlm@46 30122
rlm@46 30123 this.onAllColumnWidthsUpdated(ws, tw);
rlm@46 30124 },
rlm@46 30125
rlm@46 30126 updateColumnWidth : function(col, width){
rlm@46 30127 var w = this.getColumnWidth(col);
rlm@46 30128 var tw = this.getTotalWidth();
rlm@46 30129
rlm@46 30130 this.innerHd.firstChild.firstChild.style.width = tw;
rlm@46 30131 var hd = this.getHeaderCell(col);
rlm@46 30132 hd.style.width = w;
rlm@46 30133
rlm@46 30134 var ns = this.getRows();
rlm@46 30135 for(var i = 0, len = ns.length; i < len; i++){
rlm@46 30136 ns[i].style.width = tw;
rlm@46 30137 ns[i].firstChild.style.width = tw;
rlm@46 30138 ns[i].firstChild.rows[0].childNodes[col].style.width = w;
rlm@46 30139 }
rlm@46 30140
rlm@46 30141 this.onColumnWidthUpdated(col, w, tw);
rlm@46 30142 },
rlm@46 30143
rlm@46 30144 updateColumnHidden : function(col, hidden){
rlm@46 30145 var tw = this.getTotalWidth();
rlm@46 30146
rlm@46 30147 this.innerHd.firstChild.firstChild.style.width = tw;
rlm@46 30148
rlm@46 30149 var display = hidden ? 'none' : '';
rlm@46 30150
rlm@46 30151 var hd = this.getHeaderCell(col);
rlm@46 30152 hd.style.display = display;
rlm@46 30153
rlm@46 30154 var ns = this.getRows();
rlm@46 30155 for(var i = 0, len = ns.length; i < len; i++){
rlm@46 30156 ns[i].style.width = tw;
rlm@46 30157 ns[i].firstChild.style.width = tw;
rlm@46 30158 ns[i].firstChild.rows[0].childNodes[col].style.display = display;
rlm@46 30159 }
rlm@46 30160
rlm@46 30161 this.onColumnHiddenUpdated(col, hidden, tw);
rlm@46 30162
rlm@46 30163 delete this.lastViewWidth; this.layout();
rlm@46 30164 },
rlm@46 30165
rlm@46 30166 doRender : function(cs, rs, ds, startRow, colCount, stripe){
rlm@46 30167 var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;
rlm@46 30168 var tstyle = 'width:'+this.getTotalWidth()+';';
rlm@46 30169 var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;
rlm@46 30170 for(var j = 0, len = rs.length; j < len; j++){
rlm@46 30171 r = rs[j]; cb = [];
rlm@46 30172 var rowIndex = (j+startRow);
rlm@46 30173 for(var i = 0; i < colCount; i++){
rlm@46 30174 c = cs[i];
rlm@46 30175 p.id = c.id;
rlm@46 30176 p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
rlm@46 30177 p.attr = p.cellAttr = "";
rlm@46 30178 p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
rlm@46 30179 p.style = c.style;
rlm@46 30180 if(p.value == undefined || p.value === "") p.value = "&#160;";
rlm@46 30181 if(r.dirty && typeof r.modified[c.name] !== 'undefined'){
rlm@46 30182 p.css += ' x-grid3-dirty-cell';
rlm@46 30183 }
rlm@46 30184 cb[cb.length] = ct.apply(p);
rlm@46 30185 }
rlm@46 30186 var alt = [];
rlm@46 30187 if(stripe && ((rowIndex+1) % 2 == 0)){
rlm@46 30188 alt[0] = "x-grid3-row-alt";
rlm@46 30189 }
rlm@46 30190 if(r.dirty){
rlm@46 30191 alt[1] = " x-grid3-dirty-row";
rlm@46 30192 }
rlm@46 30193 rp.cols = colCount;
rlm@46 30194 if(this.getRowClass){
rlm@46 30195 alt[2] = this.getRowClass(r, rowIndex, rp, ds);
rlm@46 30196 }
rlm@46 30197 rp.alt = alt.join(" ");
rlm@46 30198 rp.cells = cb.join("");
rlm@46 30199 buf[buf.length] = rt.apply(rp);
rlm@46 30200 }
rlm@46 30201 return buf.join("");
rlm@46 30202 },
rlm@46 30203
rlm@46 30204 processRows : function(startRow, skipStripe){
rlm@46 30205 if(this.ds.getCount() < 1){
rlm@46 30206 return;
rlm@46 30207 }
rlm@46 30208 skipStripe = skipStripe || !this.grid.stripeRows;
rlm@46 30209 startRow = startRow || 0;
rlm@46 30210 var rows = this.getRows();
rlm@46 30211 var cls = ' x-grid3-row-alt ';
rlm@46 30212 for(var i = startRow, len = rows.length; i < len; i++){
rlm@46 30213 var row = rows[i];
rlm@46 30214 row.rowIndex = i;
rlm@46 30215 if(!skipStripe){
rlm@46 30216 var isAlt = ((i+1) % 2 == 0);
rlm@46 30217 var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1;
rlm@46 30218 if(isAlt == hasAlt){
rlm@46 30219 continue;
rlm@46 30220 }
rlm@46 30221 if(isAlt){
rlm@46 30222 row.className += " x-grid3-row-alt";
rlm@46 30223 }else{
rlm@46 30224 row.className = row.className.replace("x-grid3-row-alt", "");
rlm@46 30225 }
rlm@46 30226 }
rlm@46 30227 }
rlm@46 30228 },
rlm@46 30229
rlm@46 30230 renderUI : function(){
rlm@46 30231
rlm@46 30232 var header = this.renderHeaders();
rlm@46 30233 var body = this.templates.body.apply({rows:''});
rlm@46 30234
rlm@46 30235
rlm@46 30236 var html = this.templates.master.apply({
rlm@46 30237 body: body,
rlm@46 30238 header: header
rlm@46 30239 });
rlm@46 30240
rlm@46 30241 var g = this.grid;
rlm@46 30242
rlm@46 30243 g.getGridEl().dom.innerHTML = html;
rlm@46 30244
rlm@46 30245 this.initElements();
rlm@46 30246
rlm@46 30247
rlm@46 30248 this.mainBody.dom.innerHTML = this.renderRows();
rlm@46 30249 this.processRows(0, true);
rlm@46 30250
rlm@46 30251 if(this.deferEmptyText !== true){
rlm@46 30252 this.applyEmptyText();
rlm@46 30253 }
rlm@46 30254
rlm@46 30255 Ext.fly(this.innerHd).on("click", this.handleHdDown, this);
rlm@46 30256 this.mainHd.on("mouseover", this.handleHdOver, this);
rlm@46 30257 this.mainHd.on("mouseout", this.handleHdOut, this);
rlm@46 30258 this.mainHd.on("mousemove", this.handleHdMove, this);
rlm@46 30259
rlm@46 30260 this.scroller.on('scroll', this.syncScroll, this);
rlm@46 30261 if(g.enableColumnResize !== false){
rlm@46 30262 this.splitone = new Ext.grid.GridView.SplitDragZone(g, this.mainHd.dom);
rlm@46 30263 }
rlm@46 30264
rlm@46 30265 if(g.enableColumnMove){
rlm@46 30266 this.columnDrag = new Ext.grid.GridView.ColumnDragZone(g, this.innerHd);
rlm@46 30267 this.columnDrop = new Ext.grid.HeaderDropZone(g, this.mainHd.dom);
rlm@46 30268 }
rlm@46 30269
rlm@46 30270 if(g.enableHdMenu !== false){
rlm@46 30271 if(g.enableColumnHide !== false){
rlm@46 30272 this.colMenu = new Ext.menu.Menu({id:g.id + "-hcols-menu"});
rlm@46 30273 this.colMenu.on("beforeshow", this.beforeColMenuShow, this);
rlm@46 30274 this.colMenu.on("itemclick", this.handleHdMenuClick, this);
rlm@46 30275 }
rlm@46 30276 this.hmenu = new Ext.menu.Menu({id: g.id + "-hctx"});
rlm@46 30277 this.hmenu.add(
rlm@46 30278 {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"},
rlm@46 30279 {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"}
rlm@46 30280 );
rlm@46 30281 if(g.enableColumnHide !== false){
rlm@46 30282 this.hmenu.add('-',
rlm@46 30283 {id:"columns", text: this.columnsText, menu: this.colMenu, iconCls: 'x-cols-icon'}
rlm@46 30284 );
rlm@46 30285 }
rlm@46 30286 this.hmenu.on("itemclick", this.handleHdMenuClick, this);
rlm@46 30287
rlm@46 30288 }
rlm@46 30289
rlm@46 30290 if(g.enableDragDrop || g.enableDrag){
rlm@46 30291 this.dragZone = new Ext.grid.GridDragZone(g, {
rlm@46 30292 ddGroup : g.ddGroup || 'GridDD'
rlm@46 30293 });
rlm@46 30294 }
rlm@46 30295
rlm@46 30296 this.updateHeaderSortState();
rlm@46 30297
rlm@46 30298 },
rlm@46 30299
rlm@46 30300 layout : function(){
rlm@46 30301 if(!this.mainBody){
rlm@46 30302 return; }
rlm@46 30303 var g = this.grid;
rlm@46 30304 var c = g.getGridEl();
rlm@46 30305 var csize = c.getSize(true);
rlm@46 30306 var vw = csize.width;
rlm@46 30307
rlm@46 30308 if(vw < 20 || csize.height < 20){ return;
rlm@46 30309 }
rlm@46 30310
rlm@46 30311 if(g.autoHeight){
rlm@46 30312 this.scroller.dom.style.overflow = 'visible';
rlm@46 30313 }else{
rlm@46 30314 this.el.setSize(csize.width, csize.height);
rlm@46 30315
rlm@46 30316 var hdHeight = this.mainHd.getHeight();
rlm@46 30317 var vh = csize.height - (hdHeight);
rlm@46 30318
rlm@46 30319 this.scroller.setSize(vw, vh);
rlm@46 30320 if(this.innerHd){
rlm@46 30321 this.innerHd.style.width = (vw)+'px';
rlm@46 30322 }
rlm@46 30323 }
rlm@46 30324 if(this.forceFit){
rlm@46 30325 if(this.lastViewWidth != vw){
rlm@46 30326 this.fitColumns(false, false);
rlm@46 30327 this.lastViewWidth = vw;
rlm@46 30328 }
rlm@46 30329 }else {
rlm@46 30330 this.autoExpand();
rlm@46 30331 this.syncHeaderScroll();
rlm@46 30332 }
rlm@46 30333 this.onLayout(vw, vh);
rlm@46 30334 },
rlm@46 30335
rlm@46 30336 onLayout : function(vw, vh){
rlm@46 30337 },
rlm@46 30338
rlm@46 30339 onColumnWidthUpdated : function(col, w, tw){
rlm@46 30340 },
rlm@46 30341
rlm@46 30342 onAllColumnWidthsUpdated : function(ws, tw){
rlm@46 30343 },
rlm@46 30344
rlm@46 30345 onColumnHiddenUpdated : function(col, hidden, tw){
rlm@46 30346 },
rlm@46 30347
rlm@46 30348 updateColumnText : function(col, text){
rlm@46 30349 },
rlm@46 30350
rlm@46 30351 afterMove : function(colIndex){
rlm@46 30352 },
rlm@46 30353
rlm@46 30354
rlm@46 30355 init: function(grid){
rlm@46 30356 this.grid = grid;
rlm@46 30357
rlm@46 30358 this.initTemplates();
rlm@46 30359 this.initData(grid.store, grid.colModel);
rlm@46 30360 this.initUI(grid);
rlm@46 30361 },
rlm@46 30362
rlm@46 30363 getColumnId : function(index){
rlm@46 30364 return this.cm.getColumnId(index);
rlm@46 30365 },
rlm@46 30366
rlm@46 30367 renderHeaders : function(){
rlm@46 30368 var cm = this.cm, ts = this.templates;
rlm@46 30369 var ct = ts.hcell;
rlm@46 30370
rlm@46 30371 var cb = [], sb = [], p = {};
rlm@46 30372
rlm@46 30373 for(var i = 0, len = cm.getColumnCount(); i < len; i++){
rlm@46 30374 p.id = cm.getColumnId(i);
rlm@46 30375 p.value = cm.getColumnHeader(i) || "";
rlm@46 30376 p.style = this.getColumnStyle(i, true);
rlm@46 30377 p.tooltip = this.getColumnTooltip(i);
rlm@46 30378 if(cm.config[i].align == 'right'){
rlm@46 30379 p.istyle = 'padding-right:16px';
rlm@46 30380 } else {
rlm@46 30381 delete p.istyle;
rlm@46 30382 }
rlm@46 30383 cb[cb.length] = ct.apply(p);
rlm@46 30384 }
rlm@46 30385 return ts.header.apply({cells: cb.join(""), tstyle:'width:'+this.getTotalWidth()+';'});
rlm@46 30386 },
rlm@46 30387
rlm@46 30388 getColumnTooltip : function(i){
rlm@46 30389 var tt = this.cm.getColumnTooltip(i);
rlm@46 30390 if(tt){
rlm@46 30391 if(Ext.QuickTips.isEnabled()){
rlm@46 30392 return 'ext:qtip="'+tt+'"';
rlm@46 30393 }else{
rlm@46 30394 return 'title="'+tt+'"';
rlm@46 30395 }
rlm@46 30396 }
rlm@46 30397 return "";
rlm@46 30398 },
rlm@46 30399
rlm@46 30400 beforeUpdate : function(){
rlm@46 30401 this.grid.stopEditing(true);
rlm@46 30402 },
rlm@46 30403
rlm@46 30404 updateHeaders : function(){
rlm@46 30405 this.innerHd.firstChild.innerHTML = this.renderHeaders();
rlm@46 30406 },
rlm@46 30407
rlm@46 30408
rlm@46 30409 focusRow : function(row){
rlm@46 30410 this.focusCell(row, 0, false);
rlm@46 30411 },
rlm@46 30412
rlm@46 30413
rlm@46 30414 focusCell : function(row, col, hscroll){
rlm@46 30415 var xy = this.ensureVisible(row, col, hscroll);
rlm@46 30416 this.focusEl.setXY(xy);
rlm@46 30417 if(Ext.isGecko){
rlm@46 30418 this.focusEl.focus();
rlm@46 30419 }else{
rlm@46 30420 this.focusEl.focus.defer(1, this.focusEl);
rlm@46 30421 }
rlm@46 30422 },
rlm@46 30423
rlm@46 30424 ensureVisible : function(row, col, hscroll){
rlm@46 30425 if(typeof row != "number"){
rlm@46 30426 row = row.rowIndex;
rlm@46 30427 }
rlm@46 30428 if(!this.ds){
rlm@46 30429 return;
rlm@46 30430 }
rlm@46 30431 if(row < 0 || row >= this.ds.getCount()){
rlm@46 30432 return;
rlm@46 30433 }
rlm@46 30434 col = (col !== undefined ? col : 0);
rlm@46 30435
rlm@46 30436 var rowEl = this.getRow(row), cellEl;
rlm@46 30437 if(!(hscroll === false && col === 0)){
rlm@46 30438 while(this.cm.isHidden(col)){
rlm@46 30439 col++;
rlm@46 30440 }
rlm@46 30441 cellEl = this.getCell(row, col);
rlm@46 30442 }
rlm@46 30443 if(!rowEl){
rlm@46 30444 return;
rlm@46 30445 }
rlm@46 30446
rlm@46 30447 var c = this.scroller.dom;
rlm@46 30448
rlm@46 30449 var ctop = 0;
rlm@46 30450 var p = rowEl, stop = this.el.dom;
rlm@46 30451 while(p && p != stop){
rlm@46 30452 ctop += p.offsetTop;
rlm@46 30453 p = p.offsetParent;
rlm@46 30454 }
rlm@46 30455 ctop -= this.mainHd.dom.offsetHeight;
rlm@46 30456
rlm@46 30457 var cbot = ctop + rowEl.offsetHeight;
rlm@46 30458
rlm@46 30459 var ch = c.clientHeight;
rlm@46 30460 var stop = parseInt(c.scrollTop, 10);
rlm@46 30461 var sbot = stop + ch;
rlm@46 30462
rlm@46 30463 if(ctop < stop){
rlm@46 30464 c.scrollTop = ctop;
rlm@46 30465 }else if(cbot > sbot){
rlm@46 30466 c.scrollTop = cbot-ch;
rlm@46 30467 }
rlm@46 30468
rlm@46 30469 if(hscroll !== false){
rlm@46 30470 var cleft = parseInt(cellEl.offsetLeft, 10);
rlm@46 30471 var cright = cleft + cellEl.offsetWidth;
rlm@46 30472
rlm@46 30473 var sleft = parseInt(c.scrollLeft, 10);
rlm@46 30474 var sright = sleft + c.clientWidth;
rlm@46 30475 if(cleft < sleft){
rlm@46 30476 c.scrollLeft = cleft;
rlm@46 30477 }else if(cright > sright){
rlm@46 30478 c.scrollLeft = cright-c.clientWidth;
rlm@46 30479 }
rlm@46 30480 }
rlm@46 30481 return cellEl ? Ext.fly(cellEl).getXY() : [c.scrollLeft, Ext.fly(rowEl).getY()];
rlm@46 30482 },
rlm@46 30483
rlm@46 30484 insertRows : function(dm, firstRow, lastRow, isUpdate){
rlm@46 30485 if(!isUpdate && firstRow === 0 && lastRow == dm.getCount()-1){
rlm@46 30486 this.refresh();
rlm@46 30487 }else{
rlm@46 30488 if(!isUpdate){
rlm@46 30489 this.fireEvent("beforerowsinserted", this, firstRow, lastRow);
rlm@46 30490 }
rlm@46 30491 var html = this.renderRows(firstRow, lastRow);
rlm@46 30492 var before = this.getRow(firstRow);
rlm@46 30493 if(before){
rlm@46 30494 Ext.DomHelper.insertHtml('beforeBegin', before, html);
rlm@46 30495 }else{
rlm@46 30496 Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html);
rlm@46 30497 }
rlm@46 30498 if(!isUpdate){
rlm@46 30499 this.fireEvent("rowsinserted", this, firstRow, lastRow);
rlm@46 30500 this.processRows(firstRow);
rlm@46 30501 }
rlm@46 30502 }
rlm@46 30503 },
rlm@46 30504
rlm@46 30505 deleteRows : function(dm, firstRow, lastRow){
rlm@46 30506 if(dm.getRowCount()<1){
rlm@46 30507 this.refresh();
rlm@46 30508 }else{
rlm@46 30509 this.fireEvent("beforerowsdeleted", this, firstRow, lastRow);
rlm@46 30510
rlm@46 30511 this.removeRows(firstRow, lastRow);
rlm@46 30512
rlm@46 30513 this.processRows(firstRow);
rlm@46 30514 this.fireEvent("rowsdeleted", this, firstRow, lastRow);
rlm@46 30515 }
rlm@46 30516 },
rlm@46 30517
rlm@46 30518 getColumnStyle : function(col, isHeader){
rlm@46 30519 var style = !isHeader ? (this.cm.config[col].css || '') : '';
rlm@46 30520 style += 'width:'+this.getColumnWidth(col)+';';
rlm@46 30521 if(this.cm.isHidden(col)){
rlm@46 30522 style += 'display:none;';
rlm@46 30523 }
rlm@46 30524 var align = this.cm.config[col].align;
rlm@46 30525 if(align){
rlm@46 30526 style += 'text-align:'+align+';';
rlm@46 30527 }
rlm@46 30528 return style;
rlm@46 30529 },
rlm@46 30530
rlm@46 30531 getColumnWidth : function(col){
rlm@46 30532 var w = this.cm.getColumnWidth(col);
rlm@46 30533 if(typeof w == 'number'){
rlm@46 30534 return (Ext.isBorderBox ? w : (w-this.borderWidth > 0 ? w-this.borderWidth:0)) + 'px';
rlm@46 30535 }
rlm@46 30536 return w;
rlm@46 30537 },
rlm@46 30538
rlm@46 30539 getTotalWidth : function(){
rlm@46 30540 return this.cm.getTotalWidth()+'px';
rlm@46 30541 },
rlm@46 30542
rlm@46 30543 fitColumns : function(preventRefresh, onlyExpand, omitColumn){
rlm@46 30544 var cm = this.cm, leftOver, dist, i;
rlm@46 30545 var tw = cm.getTotalWidth(false);
rlm@46 30546 var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset;
rlm@46 30547
rlm@46 30548 if(aw < 20){ return;
rlm@46 30549 }
rlm@46 30550 var extra = aw - tw;
rlm@46 30551
rlm@46 30552 if(extra === 0){
rlm@46 30553 return false;
rlm@46 30554 }
rlm@46 30555
rlm@46 30556 var vc = cm.getColumnCount(true);
rlm@46 30557 var ac = vc-(typeof omitColumn == 'number' ? 1 : 0);
rlm@46 30558 if(ac === 0){
rlm@46 30559 ac = 1;
rlm@46 30560 omitColumn = undefined;
rlm@46 30561 }
rlm@46 30562 var colCount = cm.getColumnCount();
rlm@46 30563 var cols = [];
rlm@46 30564 var extraCol = 0;
rlm@46 30565 var width = 0;
rlm@46 30566 var w;
rlm@46 30567 for (i = 0; i < colCount; i++){
rlm@46 30568 if(!cm.isHidden(i) && !cm.isFixed(i) && i !== omitColumn){
rlm@46 30569 w = cm.getColumnWidth(i);
rlm@46 30570 cols.push(i);
rlm@46 30571 extraCol = i;
rlm@46 30572 cols.push(w);
rlm@46 30573 width += w;
rlm@46 30574 }
rlm@46 30575 }
rlm@46 30576 var frac = (aw - cm.getTotalWidth())/width;
rlm@46 30577 while (cols.length){
rlm@46 30578 w = cols.pop();
rlm@46 30579 i = cols.pop();
rlm@46 30580 cm.setColumnWidth(i, Math.max(this.grid.minColumnWidth, Math.floor(w + w*frac)), true);
rlm@46 30581 }
rlm@46 30582
rlm@46 30583 if((tw = cm.getTotalWidth(false)) > aw){
rlm@46 30584 var adjustCol = ac != vc ? omitColumn : extraCol;
rlm@46 30585 cm.setColumnWidth(adjustCol, Math.max(1,
rlm@46 30586 cm.getColumnWidth(adjustCol)- (tw-aw)), true);
rlm@46 30587 }
rlm@46 30588
rlm@46 30589 if(preventRefresh !== true){
rlm@46 30590 this.updateAllColumnWidths();
rlm@46 30591 }
rlm@46 30592
rlm@46 30593
rlm@46 30594 return true;
rlm@46 30595 },
rlm@46 30596
rlm@46 30597 autoExpand : function(preventUpdate){
rlm@46 30598 var g = this.grid, cm = this.cm;
rlm@46 30599 if(!this.userResized && g.autoExpandColumn){
rlm@46 30600 var tw = cm.getTotalWidth(false);
rlm@46 30601 var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset;
rlm@46 30602 if(tw != aw){
rlm@46 30603 var ci = cm.getIndexById(g.autoExpandColumn);
rlm@46 30604 var currentWidth = cm.getColumnWidth(ci);
rlm@46 30605 var cw = Math.min(Math.max(((aw-tw)+currentWidth), g.autoExpandMin), g.autoExpandMax);
rlm@46 30606 if(cw != currentWidth){
rlm@46 30607 cm.setColumnWidth(ci, cw, true);
rlm@46 30608 if(preventUpdate !== true){
rlm@46 30609 this.updateColumnWidth(ci, cw);
rlm@46 30610 }
rlm@46 30611 }
rlm@46 30612 }
rlm@46 30613 }
rlm@46 30614 },
rlm@46 30615
rlm@46 30616 getColumnData : function(){
rlm@46 30617 var cs = [], cm = this.cm, colCount = cm.getColumnCount();
rlm@46 30618 for(var i = 0; i < colCount; i++){
rlm@46 30619 var name = cm.getDataIndex(i);
rlm@46 30620 cs[i] = {
rlm@46 30621 name : (typeof name == 'undefined' ? this.ds.fields.get(i).name : name),
rlm@46 30622 renderer : cm.getRenderer(i),
rlm@46 30623 id : cm.getColumnId(i),
rlm@46 30624 style : this.getColumnStyle(i)
rlm@46 30625 };
rlm@46 30626 }
rlm@46 30627 return cs;
rlm@46 30628 },
rlm@46 30629
rlm@46 30630 renderRows : function(startRow, endRow){
rlm@46 30631 var g = this.grid, cm = g.colModel, ds = g.store, stripe = g.stripeRows;
rlm@46 30632 var colCount = cm.getColumnCount();
rlm@46 30633
rlm@46 30634 if(ds.getCount() < 1){
rlm@46 30635 return "";
rlm@46 30636 }
rlm@46 30637
rlm@46 30638 var cs = this.getColumnData();
rlm@46 30639
rlm@46 30640 startRow = startRow || 0;
rlm@46 30641 endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow;
rlm@46 30642
rlm@46 30643 var rs = ds.getRange(startRow, endRow);
rlm@46 30644
rlm@46 30645 return this.doRender(cs, rs, ds, startRow, colCount, stripe);
rlm@46 30646 },
rlm@46 30647
rlm@46 30648 renderBody : function(){
rlm@46 30649 var markup = this.renderRows();
rlm@46 30650 return this.templates.body.apply({rows: markup});
rlm@46 30651 },
rlm@46 30652
rlm@46 30653 refreshRow : function(record){
rlm@46 30654 var ds = this.ds, index;
rlm@46 30655 if(typeof record == 'number'){
rlm@46 30656 index = record;
rlm@46 30657 record = ds.getAt(index);
rlm@46 30658 }else{
rlm@46 30659 index = ds.indexOf(record);
rlm@46 30660 }
rlm@46 30661 var cls = [];
rlm@46 30662 this.insertRows(ds, index, index, true);
rlm@46 30663 this.getRow(index).rowIndex = index;
rlm@46 30664 this.onRemove(ds, record, index+1, true);
rlm@46 30665 this.fireEvent("rowupdated", this, index, record);
rlm@46 30666 },
rlm@46 30667
rlm@46 30668
rlm@46 30669 refresh : function(headersToo){
rlm@46 30670 this.fireEvent("beforerefresh", this);
rlm@46 30671 this.grid.stopEditing(true);
rlm@46 30672
rlm@46 30673 var result = this.renderBody();
rlm@46 30674 this.mainBody.update(result);
rlm@46 30675
rlm@46 30676 if(headersToo === true){
rlm@46 30677 this.updateHeaders();
rlm@46 30678 this.updateHeaderSortState();
rlm@46 30679 }
rlm@46 30680 this.processRows(0, true);
rlm@46 30681 this.layout();
rlm@46 30682 this.applyEmptyText();
rlm@46 30683 this.fireEvent("refresh", this);
rlm@46 30684 },
rlm@46 30685
rlm@46 30686 applyEmptyText : function(){
rlm@46 30687 if(this.emptyText && !this.hasRows()){
rlm@46 30688 this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + '</div>');
rlm@46 30689 }
rlm@46 30690 },
rlm@46 30691
rlm@46 30692 updateHeaderSortState : function(){
rlm@46 30693 var state = this.ds.getSortState();
rlm@46 30694 if(!state){
rlm@46 30695 return;
rlm@46 30696 }
rlm@46 30697 if(!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)){
rlm@46 30698 this.grid.fireEvent('sortchange', this.grid, state);
rlm@46 30699 }
rlm@46 30700 this.sortState = state;
rlm@46 30701 var sortColumn = this.cm.findColumnIndex(state.field);
rlm@46 30702 if(sortColumn != -1){
rlm@46 30703 var sortDir = state.direction;
rlm@46 30704 this.updateSortIcon(sortColumn, sortDir);
rlm@46 30705 }
rlm@46 30706 },
rlm@46 30707
rlm@46 30708 destroy : function(){
rlm@46 30709 if(this.colMenu){
rlm@46 30710 this.colMenu.removeAll();
rlm@46 30711 Ext.menu.MenuMgr.unregister(this.colMenu);
rlm@46 30712 this.colMenu.getEl().remove();
rlm@46 30713 delete this.colMenu;
rlm@46 30714 }
rlm@46 30715 if(this.hmenu){
rlm@46 30716 this.hmenu.removeAll();
rlm@46 30717 Ext.menu.MenuMgr.unregister(this.hmenu);
rlm@46 30718 this.hmenu.getEl().remove();
rlm@46 30719 delete this.hmenu;
rlm@46 30720 }
rlm@46 30721 if(this.grid.enableColumnMove){
rlm@46 30722 var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id];
rlm@46 30723 if(dds){
rlm@46 30724 for(var dd in dds){
rlm@46 30725 if(!dds[dd].config.isTarget && dds[dd].dragElId){
rlm@46 30726 var elid = dds[dd].dragElId;
rlm@46 30727 dds[dd].unreg();
rlm@46 30728 Ext.get(elid).remove();
rlm@46 30729 } else if(dds[dd].config.isTarget){
rlm@46 30730 dds[dd].proxyTop.remove();
rlm@46 30731 dds[dd].proxyBottom.remove();
rlm@46 30732 dds[dd].unreg();
rlm@46 30733 }
rlm@46 30734 if(Ext.dd.DDM.locationCache[dd]){
rlm@46 30735 delete Ext.dd.DDM.locationCache[dd];
rlm@46 30736 }
rlm@46 30737 }
rlm@46 30738 delete Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id];
rlm@46 30739 }
rlm@46 30740 }
rlm@46 30741
rlm@46 30742 Ext.destroy(this.resizeMarker, this.resizeProxy);
rlm@46 30743
rlm@46 30744 if(this.dragZone){
rlm@46 30745 this.dragZone.unreg();
rlm@46 30746 }
rlm@46 30747
rlm@46 30748 this.initData(null, null);
rlm@46 30749 Ext.EventManager.removeResizeListener(this.onWindowResize, this);
rlm@46 30750 },
rlm@46 30751
rlm@46 30752 onDenyColumnHide : function(){
rlm@46 30753
rlm@46 30754 },
rlm@46 30755
rlm@46 30756 render : function(){
rlm@46 30757
rlm@46 30758 var cm = this.cm;
rlm@46 30759 var colCount = cm.getColumnCount();
rlm@46 30760
rlm@46 30761 if(this.autoFill){
rlm@46 30762 this.fitColumns(true, true);
rlm@46 30763 }else if(this.forceFit){
rlm@46 30764 this.fitColumns(true, false);
rlm@46 30765 }else if(this.grid.autoExpandColumn){
rlm@46 30766 this.autoExpand(true);
rlm@46 30767 }
rlm@46 30768
rlm@46 30769 this.renderUI();
rlm@46 30770 },
rlm@46 30771
rlm@46 30772
rlm@46 30773 initData : function(ds, cm){
rlm@46 30774 if(this.ds){
rlm@46 30775 this.ds.un("load", this.onLoad, this);
rlm@46 30776 this.ds.un("datachanged", this.onDataChange, this);
rlm@46 30777 this.ds.un("add", this.onAdd, this);
rlm@46 30778 this.ds.un("remove", this.onRemove, this);
rlm@46 30779 this.ds.un("update", this.onUpdate, this);
rlm@46 30780 this.ds.un("clear", this.onClear, this);
rlm@46 30781 }
rlm@46 30782 if(ds){
rlm@46 30783 ds.on("load", this.onLoad, this);
rlm@46 30784 ds.on("datachanged", this.onDataChange, this);
rlm@46 30785 ds.on("add", this.onAdd, this);
rlm@46 30786 ds.on("remove", this.onRemove, this);
rlm@46 30787 ds.on("update", this.onUpdate, this);
rlm@46 30788 ds.on("clear", this.onClear, this);
rlm@46 30789 }
rlm@46 30790 this.ds = ds;
rlm@46 30791
rlm@46 30792 if(this.cm){
rlm@46 30793 this.cm.un("configchange", this.onColConfigChange, this);
rlm@46 30794 this.cm.un("widthchange", this.onColWidthChange, this);
rlm@46 30795 this.cm.un("headerchange", this.onHeaderChange, this);
rlm@46 30796 this.cm.un("hiddenchange", this.onHiddenChange, this);
rlm@46 30797 this.cm.un("columnmoved", this.onColumnMove, this);
rlm@46 30798 this.cm.un("columnlockchange", this.onColumnLock, this);
rlm@46 30799 }
rlm@46 30800 if(cm){
rlm@46 30801 cm.on("configchange", this.onColConfigChange, this);
rlm@46 30802 cm.on("widthchange", this.onColWidthChange, this);
rlm@46 30803 cm.on("headerchange", this.onHeaderChange, this);
rlm@46 30804 cm.on("hiddenchange", this.onHiddenChange, this);
rlm@46 30805 cm.on("columnmoved", this.onColumnMove, this);
rlm@46 30806 cm.on("columnlockchange", this.onColumnLock, this);
rlm@46 30807 }
rlm@46 30808 this.cm = cm;
rlm@46 30809 },
rlm@46 30810
rlm@46 30811 onDataChange : function(){
rlm@46 30812 this.refresh();
rlm@46 30813 this.updateHeaderSortState();
rlm@46 30814 },
rlm@46 30815
rlm@46 30816 onClear : function(){
rlm@46 30817 this.refresh();
rlm@46 30818 },
rlm@46 30819
rlm@46 30820 onUpdate : function(ds, record){
rlm@46 30821 this.refreshRow(record);
rlm@46 30822 },
rlm@46 30823
rlm@46 30824 onAdd : function(ds, records, index){
rlm@46 30825 this.insertRows(ds, index, index + (records.length-1));
rlm@46 30826 },
rlm@46 30827
rlm@46 30828 onRemove : function(ds, record, index, isUpdate){
rlm@46 30829 if(isUpdate !== true){
rlm@46 30830 this.fireEvent("beforerowremoved", this, index, record);
rlm@46 30831 }
rlm@46 30832 this.removeRow(index);
rlm@46 30833 if(isUpdate !== true){
rlm@46 30834 this.processRows(index);
rlm@46 30835 this.applyEmptyText();
rlm@46 30836 this.fireEvent("rowremoved", this, index, record);
rlm@46 30837 }
rlm@46 30838 },
rlm@46 30839
rlm@46 30840 onLoad : function(){
rlm@46 30841 this.scrollToTop();
rlm@46 30842 },
rlm@46 30843
rlm@46 30844 onColWidthChange : function(cm, col, width){
rlm@46 30845 this.updateColumnWidth(col, width);
rlm@46 30846 },
rlm@46 30847
rlm@46 30848 onHeaderChange : function(cm, col, text){
rlm@46 30849 this.updateHeaders();
rlm@46 30850 },
rlm@46 30851
rlm@46 30852 onHiddenChange : function(cm, col, hidden){
rlm@46 30853 this.updateColumnHidden(col, hidden);
rlm@46 30854 },
rlm@46 30855
rlm@46 30856 onColumnMove : function(cm, oldIndex, newIndex){
rlm@46 30857 this.indexMap = null;
rlm@46 30858 var s = this.getScrollState();
rlm@46 30859 this.refresh(true);
rlm@46 30860 this.restoreScroll(s);
rlm@46 30861 this.afterMove(newIndex);
rlm@46 30862 },
rlm@46 30863
rlm@46 30864 onColConfigChange : function(){
rlm@46 30865 delete this.lastViewWidth;
rlm@46 30866 this.indexMap = null;
rlm@46 30867 this.refresh(true);
rlm@46 30868 },
rlm@46 30869
rlm@46 30870
rlm@46 30871 initUI : function(grid){
rlm@46 30872 grid.on("headerclick", this.onHeaderClick, this);
rlm@46 30873
rlm@46 30874 if(grid.trackMouseOver){
rlm@46 30875 grid.on("mouseover", this.onRowOver, this);
rlm@46 30876 grid.on("mouseout", this.onRowOut, this);
rlm@46 30877 }
rlm@46 30878 },
rlm@46 30879
rlm@46 30880 initEvents : function(){
rlm@46 30881
rlm@46 30882 },
rlm@46 30883
rlm@46 30884 onHeaderClick : function(g, index){
rlm@46 30885 if(this.headersDisabled || !this.cm.isSortable(index)){
rlm@46 30886 return;
rlm@46 30887 }
rlm@46 30888 g.stopEditing(true);
rlm@46 30889 g.store.sort(this.cm.getDataIndex(index));
rlm@46 30890 },
rlm@46 30891
rlm@46 30892 onRowOver : function(e, t){
rlm@46 30893 var row;
rlm@46 30894 if((row = this.findRowIndex(t)) !== false){
rlm@46 30895 this.addRowClass(row, "x-grid3-row-over");
rlm@46 30896 }
rlm@46 30897 },
rlm@46 30898
rlm@46 30899 onRowOut : function(e, t){
rlm@46 30900 var row;
rlm@46 30901 if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){
rlm@46 30902 this.removeRowClass(row, "x-grid3-row-over");
rlm@46 30903 }
rlm@46 30904 },
rlm@46 30905
rlm@46 30906 handleWheel : function(e){
rlm@46 30907 e.stopPropagation();
rlm@46 30908 },
rlm@46 30909
rlm@46 30910 onRowSelect : function(row){
rlm@46 30911 this.addRowClass(row, "x-grid3-row-selected");
rlm@46 30912 },
rlm@46 30913
rlm@46 30914 onRowDeselect : function(row){
rlm@46 30915 this.removeRowClass(row, "x-grid3-row-selected");
rlm@46 30916 },
rlm@46 30917
rlm@46 30918 onCellSelect : function(row, col){
rlm@46 30919 var cell = this.getCell(row, col);
rlm@46 30920 if(cell){
rlm@46 30921 this.fly(cell).addClass("x-grid3-cell-selected");
rlm@46 30922 }
rlm@46 30923 },
rlm@46 30924
rlm@46 30925 onCellDeselect : function(row, col){
rlm@46 30926 var cell = this.getCell(row, col);
rlm@46 30927 if(cell){
rlm@46 30928 this.fly(cell).removeClass("x-grid3-cell-selected");
rlm@46 30929 }
rlm@46 30930 },
rlm@46 30931
rlm@46 30932 onColumnSplitterMoved : function(i, w){
rlm@46 30933 this.userResized = true;
rlm@46 30934 var cm = this.grid.colModel;
rlm@46 30935 cm.setColumnWidth(i, w, true);
rlm@46 30936
rlm@46 30937 if(this.forceFit){
rlm@46 30938 this.fitColumns(true, false, i);
rlm@46 30939 this.updateAllColumnWidths();
rlm@46 30940 }else{
rlm@46 30941 this.updateColumnWidth(i, w);
rlm@46 30942 }
rlm@46 30943
rlm@46 30944 this.grid.fireEvent("columnresize", i, w);
rlm@46 30945 },
rlm@46 30946
rlm@46 30947 handleHdMenuClick : function(item){
rlm@46 30948 var index = this.hdCtxIndex;
rlm@46 30949 var cm = this.cm, ds = this.ds;
rlm@46 30950 switch(item.id){
rlm@46 30951 case "asc":
rlm@46 30952 ds.sort(cm.getDataIndex(index), "ASC");
rlm@46 30953 break;
rlm@46 30954 case "desc":
rlm@46 30955 ds.sort(cm.getDataIndex(index), "DESC");
rlm@46 30956 break;
rlm@46 30957 default:
rlm@46 30958 index = cm.getIndexById(item.id.substr(4));
rlm@46 30959 if(index != -1){
rlm@46 30960 if(item.checked && cm.getColumnsBy(this.isHideableColumn, this).length <= 1){
rlm@46 30961 this.onDenyColumnHide();
rlm@46 30962 return false;
rlm@46 30963 }
rlm@46 30964 cm.setHidden(index, item.checked);
rlm@46 30965 }
rlm@46 30966 }
rlm@46 30967 return true;
rlm@46 30968 },
rlm@46 30969
rlm@46 30970 isHideableColumn : function(c){
rlm@46 30971 return !c.hidden && !c.fixed;
rlm@46 30972 },
rlm@46 30973
rlm@46 30974 beforeColMenuShow : function(){
rlm@46 30975 var cm = this.cm, colCount = cm.getColumnCount();
rlm@46 30976 this.colMenu.removeAll();
rlm@46 30977 for(var i = 0; i < colCount; i++){
rlm@46 30978 if(cm.config[i].fixed !== true && cm.config[i].hideable !== false){
rlm@46 30979 this.colMenu.add(new Ext.menu.CheckItem({
rlm@46 30980 id: "col-"+cm.getColumnId(i),
rlm@46 30981 text: cm.getColumnHeader(i),
rlm@46 30982 checked: !cm.isHidden(i),
rlm@46 30983 hideOnClick:false,
rlm@46 30984 disabled: cm.config[i].hideable === false
rlm@46 30985 }));
rlm@46 30986 }
rlm@46 30987 }
rlm@46 30988 },
rlm@46 30989
rlm@46 30990 handleHdDown : function(e, t){
rlm@46 30991 if(Ext.fly(t).hasClass('x-grid3-hd-btn')){
rlm@46 30992 e.stopEvent();
rlm@46 30993 var hd = this.findHeaderCell(t);
rlm@46 30994 Ext.fly(hd).addClass('x-grid3-hd-menu-open');
rlm@46 30995 var index = this.getCellIndex(hd);
rlm@46 30996 this.hdCtxIndex = index;
rlm@46 30997 var ms = this.hmenu.items, cm = this.cm;
rlm@46 30998 ms.get("asc").setDisabled(!cm.isSortable(index));
rlm@46 30999 ms.get("desc").setDisabled(!cm.isSortable(index));
rlm@46 31000 this.hmenu.on("hide", function(){
rlm@46 31001 Ext.fly(hd).removeClass('x-grid3-hd-menu-open');
rlm@46 31002 }, this, {single:true});
rlm@46 31003 this.hmenu.show(t, "tl-bl?");
rlm@46 31004 }
rlm@46 31005 },
rlm@46 31006
rlm@46 31007 handleHdOver : function(e, t){
rlm@46 31008 var hd = this.findHeaderCell(t);
rlm@46 31009 if(hd && !this.headersDisabled){
rlm@46 31010 this.activeHd = hd;
rlm@46 31011 this.activeHdIndex = this.getCellIndex(hd);
rlm@46 31012 var fly = this.fly(hd);
rlm@46 31013 this.activeHdRegion = fly.getRegion();
rlm@46 31014 if(!this.cm.isMenuDisabled(this.activeHdIndex)){
rlm@46 31015 fly.addClass("x-grid3-hd-over");
rlm@46 31016 this.activeHdBtn = fly.child('.x-grid3-hd-btn');
rlm@46 31017 if(this.activeHdBtn){
rlm@46 31018 this.activeHdBtn.dom.style.height = (hd.firstChild.offsetHeight-1)+'px';
rlm@46 31019 }
rlm@46 31020 }
rlm@46 31021 }
rlm@46 31022 },
rlm@46 31023
rlm@46 31024 handleHdMove : function(e, t){
rlm@46 31025 if(this.activeHd && !this.headersDisabled){
rlm@46 31026 var hw = this.splitHandleWidth || 5;
rlm@46 31027 var r = this.activeHdRegion;
rlm@46 31028 var x = e.getPageX();
rlm@46 31029 var ss = this.activeHd.style;
rlm@46 31030 if(x - r.left <= hw && this.cm.isResizable(this.activeHdIndex-1)){
rlm@46 31031 ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'e-resize' : 'col-resize'; }else if(r.right - x <= (!this.activeHdBtn ? hw : 2) && this.cm.isResizable(this.activeHdIndex)){
rlm@46 31032 ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'w-resize' : 'col-resize';
rlm@46 31033 }else{
rlm@46 31034 ss.cursor = '';
rlm@46 31035 }
rlm@46 31036 }
rlm@46 31037 },
rlm@46 31038
rlm@46 31039 handleHdOut : function(e, t){
rlm@46 31040 var hd = this.findHeaderCell(t);
rlm@46 31041 if(hd && (!Ext.isIE || !e.within(hd, true))){
rlm@46 31042 this.activeHd = null;
rlm@46 31043 this.fly(hd).removeClass("x-grid3-hd-over");
rlm@46 31044 hd.style.cursor = '';
rlm@46 31045 }
rlm@46 31046 },
rlm@46 31047
rlm@46 31048 hasRows : function(){
rlm@46 31049 var fc = this.mainBody.dom.firstChild;
rlm@46 31050 return fc && fc.className != 'x-grid-empty';
rlm@46 31051 },
rlm@46 31052
rlm@46 31053 bind : function(d, c){
rlm@46 31054 this.initData(d, c);
rlm@46 31055 }
rlm@46 31056 });
rlm@46 31057
rlm@46 31058
rlm@46 31059 Ext.grid.GridView.SplitDragZone = function(grid, hd){
rlm@46 31060 this.grid = grid;
rlm@46 31061 this.view = grid.getView();
rlm@46 31062 this.marker = this.view.resizeMarker;
rlm@46 31063 this.proxy = this.view.resizeProxy;
rlm@46 31064 Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd,
rlm@46 31065 "gridSplitters" + this.grid.getGridEl().id, {
rlm@46 31066 dragElId : Ext.id(this.proxy.dom), resizeFrame:false
rlm@46 31067 });
rlm@46 31068 this.scroll = false;
rlm@46 31069 this.hw = this.view.splitHandleWidth || 5;
rlm@46 31070 };
rlm@46 31071 Ext.extend(Ext.grid.GridView.SplitDragZone, Ext.dd.DDProxy, {
rlm@46 31072
rlm@46 31073 b4StartDrag : function(x, y){
rlm@46 31074 this.view.headersDisabled = true;
rlm@46 31075 var h = this.view.mainWrap.getHeight();
rlm@46 31076 this.marker.setHeight(h);
rlm@46 31077 this.marker.show();
rlm@46 31078 this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]);
rlm@46 31079 this.proxy.setHeight(h);
rlm@46 31080 var w = this.cm.getColumnWidth(this.cellIndex);
rlm@46 31081 var minw = Math.max(w-this.grid.minColumnWidth, 0);
rlm@46 31082 this.resetConstraints();
rlm@46 31083 this.setXConstraint(minw, 1000);
rlm@46 31084 this.setYConstraint(0, 0);
rlm@46 31085 this.minX = x - minw;
rlm@46 31086 this.maxX = x + 1000;
rlm@46 31087 this.startPos = x;
rlm@46 31088 Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
rlm@46 31089 },
rlm@46 31090
rlm@46 31091
rlm@46 31092 handleMouseDown : function(e){
rlm@46 31093 var t = this.view.findHeaderCell(e.getTarget());
rlm@46 31094 if(t){
rlm@46 31095 var xy = this.view.fly(t).getXY(), x = xy[0], y = xy[1];
rlm@46 31096 var exy = e.getXY(), ex = exy[0], ey = exy[1];
rlm@46 31097 var w = t.offsetWidth, adjust = false;
rlm@46 31098 if((ex - x) <= this.hw){
rlm@46 31099 adjust = -1;
rlm@46 31100 }else if((x+w) - ex <= this.hw){
rlm@46 31101 adjust = 0;
rlm@46 31102 }
rlm@46 31103 if(adjust !== false){
rlm@46 31104 this.cm = this.grid.colModel;
rlm@46 31105 var ci = this.view.getCellIndex(t);
rlm@46 31106 if(adjust == -1){
rlm@46 31107 if (ci + adjust < 0) {
rlm@46 31108 return;
rlm@46 31109 }
rlm@46 31110 while(this.cm.isHidden(ci+adjust)){
rlm@46 31111 --adjust;
rlm@46 31112 if(ci+adjust < 0){
rlm@46 31113 return;
rlm@46 31114 }
rlm@46 31115 }
rlm@46 31116 }
rlm@46 31117 this.cellIndex = ci+adjust;
rlm@46 31118 this.split = t.dom;
rlm@46 31119 if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
rlm@46 31120 Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
rlm@46 31121 }
rlm@46 31122 }else if(this.view.columnDrag){
rlm@46 31123 this.view.columnDrag.callHandleMouseDown(e);
rlm@46 31124 }
rlm@46 31125 }
rlm@46 31126 },
rlm@46 31127
rlm@46 31128 endDrag : function(e){
rlm@46 31129 this.marker.hide();
rlm@46 31130 var v = this.view;
rlm@46 31131 var endX = Math.max(this.minX, e.getPageX());
rlm@46 31132 var diff = endX - this.startPos;
rlm@46 31133 v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
rlm@46 31134 setTimeout(function(){
rlm@46 31135 v.headersDisabled = false;
rlm@46 31136 }, 50);
rlm@46 31137 },
rlm@46 31138
rlm@46 31139 autoOffset : function(){
rlm@46 31140 this.setDelta(0,0);
rlm@46 31141 }
rlm@46 31142 });
rlm@46 31143
rlm@46 31144
rlm@46 31145 Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {
rlm@46 31146
rlm@46 31147 hideGroupedColumn:false,
rlm@46 31148
rlm@46 31149 showGroupName:true,
rlm@46 31150
rlm@46 31151 startCollapsed:false,
rlm@46 31152
rlm@46 31153 enableGrouping:true,
rlm@46 31154
rlm@46 31155 enableGroupingMenu:true,
rlm@46 31156
rlm@46 31157 enableNoGroups:true,
rlm@46 31158
rlm@46 31159 emptyGroupText : '(None)',
rlm@46 31160
rlm@46 31161 ignoreAdd: false,
rlm@46 31162
rlm@46 31163 groupTextTpl : '{text}',
rlm@46 31164
rlm@46 31165
rlm@46 31166
rlm@46 31167
rlm@46 31168 gidSeed : 1000,
rlm@46 31169
rlm@46 31170
rlm@46 31171 initTemplates : function(){
rlm@46 31172 Ext.grid.GroupingView.superclass.initTemplates.call(this);
rlm@46 31173 this.state = {};
rlm@46 31174
rlm@46 31175 var sm = this.grid.getSelectionModel();
rlm@46 31176 sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect',
rlm@46 31177 this.onBeforeRowSelect, this);
rlm@46 31178
rlm@46 31179 if(!this.startGroup){
rlm@46 31180 this.startGroup = new Ext.XTemplate(
rlm@46 31181 '<div id="{groupId}" class="x-grid-group {cls}">',
rlm@46 31182 '<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div>', this.groupTextTpl ,'</div></div>',
rlm@46 31183 '<div id="{groupId}-bd" class="x-grid-group-body">'
rlm@46 31184 );
rlm@46 31185 }
rlm@46 31186 this.startGroup.compile();
rlm@46 31187 this.endGroup = '</div></div>';
rlm@46 31188 },
rlm@46 31189
rlm@46 31190
rlm@46 31191 findGroup : function(el){
rlm@46 31192 return Ext.fly(el).up('.x-grid-group', this.mainBody.dom);
rlm@46 31193 },
rlm@46 31194
rlm@46 31195
rlm@46 31196 getGroups : function(){
rlm@46 31197 return this.hasRows() ? this.mainBody.dom.childNodes : [];
rlm@46 31198 },
rlm@46 31199
rlm@46 31200
rlm@46 31201 onAdd : function(){
rlm@46 31202 if(this.enableGrouping && !this.ignoreAdd){
rlm@46 31203 var ss = this.getScrollState();
rlm@46 31204 this.refresh();
rlm@46 31205 this.restoreScroll(ss);
rlm@46 31206 }else if(!this.enableGrouping){
rlm@46 31207 Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments);
rlm@46 31208 }
rlm@46 31209 },
rlm@46 31210
rlm@46 31211
rlm@46 31212 onRemove : function(ds, record, index, isUpdate){
rlm@46 31213 Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);
rlm@46 31214 var g = document.getElementById(record._groupId);
rlm@46 31215 if(g && g.childNodes[1].childNodes.length < 1){
rlm@46 31216 Ext.removeNode(g);
rlm@46 31217 }
rlm@46 31218 this.applyEmptyText();
rlm@46 31219 },
rlm@46 31220
rlm@46 31221
rlm@46 31222 refreshRow : function(record){
rlm@46 31223 if(this.ds.getCount()==1){
rlm@46 31224 this.refresh();
rlm@46 31225 }else{
rlm@46 31226 this.isUpdating = true;
rlm@46 31227 Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);
rlm@46 31228 this.isUpdating = false;
rlm@46 31229 }
rlm@46 31230 },
rlm@46 31231
rlm@46 31232
rlm@46 31233 beforeMenuShow : function(){
rlm@46 31234 var field = this.getGroupField();
rlm@46 31235 var g = this.hmenu.items.get('groupBy');
rlm@46 31236 if(g){
rlm@46 31237 g.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false);
rlm@46 31238 }
rlm@46 31239 var s = this.hmenu.items.get('showGroups');
rlm@46 31240 if(s){
rlm@46 31241 s.setDisabled(!field && this.cm.config[this.hdCtxIndex].groupable === false);
rlm@46 31242 s.setChecked(!!field, true);
rlm@46 31243 }
rlm@46 31244 },
rlm@46 31245
rlm@46 31246
rlm@46 31247 renderUI : function(){
rlm@46 31248 Ext.grid.GroupingView.superclass.renderUI.call(this);
rlm@46 31249 this.mainBody.on('mousedown', this.interceptMouse, this);
rlm@46 31250
rlm@46 31251 if(this.enableGroupingMenu && this.hmenu){
rlm@46 31252 this.hmenu.add('-',{
rlm@46 31253 id:'groupBy',
rlm@46 31254 text: this.groupByText,
rlm@46 31255 handler: this.onGroupByClick,
rlm@46 31256 scope: this,
rlm@46 31257 iconCls:'x-group-by-icon'
rlm@46 31258 });
rlm@46 31259 if(this.enableNoGroups){
rlm@46 31260 this.hmenu.add({
rlm@46 31261 id:'showGroups',
rlm@46 31262 text: this.showGroupsText,
rlm@46 31263 checked: true,
rlm@46 31264 checkHandler: this.onShowGroupsClick,
rlm@46 31265 scope: this
rlm@46 31266 });
rlm@46 31267 }
rlm@46 31268 this.hmenu.on('beforeshow', this.beforeMenuShow, this);
rlm@46 31269 }
rlm@46 31270 },
rlm@46 31271
rlm@46 31272
rlm@46 31273 onGroupByClick : function(){
rlm@46 31274 this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
rlm@46 31275 this.beforeMenuShow();
rlm@46 31276 },
rlm@46 31277
rlm@46 31278
rlm@46 31279 onShowGroupsClick : function(mi, checked){
rlm@46 31280 if(checked){
rlm@46 31281 this.onGroupByClick();
rlm@46 31282 }else{
rlm@46 31283 this.grid.store.clearGrouping();
rlm@46 31284 }
rlm@46 31285 },
rlm@46 31286
rlm@46 31287
rlm@46 31288 toggleGroup : function(group, expanded){
rlm@46 31289 this.grid.stopEditing(true);
rlm@46 31290 group = Ext.getDom(group);
rlm@46 31291 var gel = Ext.fly(group);
rlm@46 31292 expanded = expanded !== undefined ?
rlm@46 31293 expanded : gel.hasClass('x-grid-group-collapsed');
rlm@46 31294
rlm@46 31295 this.state[gel.dom.id] = expanded;
rlm@46 31296 gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed');
rlm@46 31297 },
rlm@46 31298
rlm@46 31299
rlm@46 31300 toggleAllGroups : function(expanded){
rlm@46 31301 var groups = this.getGroups();
rlm@46 31302 for(var i = 0, len = groups.length; i < len; i++){
rlm@46 31303 this.toggleGroup(groups[i], expanded);
rlm@46 31304 }
rlm@46 31305 },
rlm@46 31306
rlm@46 31307
rlm@46 31308 expandAllGroups : function(){
rlm@46 31309 this.toggleAllGroups(true);
rlm@46 31310 },
rlm@46 31311
rlm@46 31312
rlm@46 31313 collapseAllGroups : function(){
rlm@46 31314 this.toggleAllGroups(false);
rlm@46 31315 },
rlm@46 31316
rlm@46 31317
rlm@46 31318 interceptMouse : function(e){
rlm@46 31319 var hd = e.getTarget('.x-grid-group-hd', this.mainBody);
rlm@46 31320 if(hd){
rlm@46 31321 e.stopEvent();
rlm@46 31322 this.toggleGroup(hd.parentNode);
rlm@46 31323 }
rlm@46 31324 },
rlm@46 31325
rlm@46 31326
rlm@46 31327 getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){
rlm@46 31328 var g = groupRenderer ? groupRenderer(v, {}, r, rowIndex, colIndex, ds) : String(v);
rlm@46 31329 if(g === ''){
rlm@46 31330 g = this.cm.config[colIndex].emptyGroupText || this.emptyGroupText;
rlm@46 31331 }
rlm@46 31332 return g;
rlm@46 31333 },
rlm@46 31334
rlm@46 31335
rlm@46 31336 getGroupField : function(){
rlm@46 31337 return this.grid.store.getGroupState();
rlm@46 31338 },
rlm@46 31339
rlm@46 31340
rlm@46 31341 renderRows : function(){
rlm@46 31342 var groupField = this.getGroupField();
rlm@46 31343 var eg = !!groupField;
rlm@46 31344
rlm@46 31345 if(this.hideGroupedColumn) {
rlm@46 31346 var colIndex = this.cm.findColumnIndex(groupField);
rlm@46 31347 if(!eg && this.lastGroupField !== undefined) {
rlm@46 31348 this.mainBody.update('');
rlm@46 31349 this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);
rlm@46 31350 delete this.lastGroupField;
rlm@46 31351 }else if (eg && this.lastGroupField === undefined) {
rlm@46 31352 this.lastGroupField = groupField;
rlm@46 31353 this.cm.setHidden(colIndex, true);
rlm@46 31354 }else if (eg && this.lastGroupField !== undefined && groupField !== this.lastGroupField) {
rlm@46 31355 this.mainBody.update('');
rlm@46 31356 var oldIndex = this.cm.findColumnIndex(this.lastGroupField);
rlm@46 31357 this.cm.setHidden(oldIndex, false);
rlm@46 31358 this.lastGroupField = groupField;
rlm@46 31359 this.cm.setHidden(colIndex, true);
rlm@46 31360 }
rlm@46 31361 }
rlm@46 31362 return Ext.grid.GroupingView.superclass.renderRows.apply(
rlm@46 31363 this, arguments);
rlm@46 31364 },
rlm@46 31365
rlm@46 31366
rlm@46 31367 doRender : function(cs, rs, ds, startRow, colCount, stripe){
rlm@46 31368 if(rs.length < 1){
rlm@46 31369 return '';
rlm@46 31370 }
rlm@46 31371 var groupField = this.getGroupField();
rlm@46 31372 var colIndex = this.cm.findColumnIndex(groupField);
rlm@46 31373
rlm@46 31374 this.enableGrouping = !!groupField;
rlm@46 31375
rlm@46 31376 if(!this.enableGrouping || this.isUpdating){
rlm@46 31377 return Ext.grid.GroupingView.superclass.doRender.apply(
rlm@46 31378 this, arguments);
rlm@46 31379 }
rlm@46 31380 var gstyle = 'width:'+this.getTotalWidth()+';';
rlm@46 31381
rlm@46 31382 var gidPrefix = this.grid.getGridEl().id;
rlm@46 31383 var cfg = this.cm.config[colIndex];
rlm@46 31384 var groupRenderer = cfg.groupRenderer || cfg.renderer;
rlm@46 31385 var prefix = this.showGroupName ?
rlm@46 31386 (cfg.groupName || cfg.header)+': ' : '';
rlm@46 31387
rlm@46 31388 var groups = [], curGroup, i, len, gid;
rlm@46 31389 for(i = 0, len = rs.length; i < len; i++){
rlm@46 31390 var rowIndex = startRow + i;
rlm@46 31391 var r = rs[i],
rlm@46 31392 gvalue = r.data[groupField],
rlm@46 31393 g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds);
rlm@46 31394 if(!curGroup || curGroup.group != g){
rlm@46 31395 gid = gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(g);
rlm@46 31396
rlm@46 31397
rlm@46 31398 var isCollapsed = typeof this.state[gid] !== 'undefined' ? !this.state[gid] : this.startCollapsed;
rlm@46 31399 var gcls = isCollapsed ? 'x-grid-group-collapsed' : '';
rlm@46 31400 curGroup = {
rlm@46 31401 group: g,
rlm@46 31402 gvalue: gvalue,
rlm@46 31403 text: prefix + g,
rlm@46 31404 groupId: gid,
rlm@46 31405 startRow: rowIndex,
rlm@46 31406 rs: [r],
rlm@46 31407 cls: gcls,
rlm@46 31408 style: gstyle
rlm@46 31409 };
rlm@46 31410 groups.push(curGroup);
rlm@46 31411 }else{
rlm@46 31412 curGroup.rs.push(r);
rlm@46 31413 }
rlm@46 31414 r._groupId = gid;
rlm@46 31415 }
rlm@46 31416
rlm@46 31417 var buf = [];
rlm@46 31418 for(i = 0, len = groups.length; i < len; i++){
rlm@46 31419 var g = groups[i];
rlm@46 31420 this.doGroupStart(buf, g, cs, ds, colCount);
rlm@46 31421 buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call(
rlm@46 31422 this, cs, g.rs, ds, g.startRow, colCount, stripe);
rlm@46 31423
rlm@46 31424 this.doGroupEnd(buf, g, cs, ds, colCount);
rlm@46 31425 }
rlm@46 31426 return buf.join('');
rlm@46 31427 },
rlm@46 31428
rlm@46 31429
rlm@46 31430 getGroupId : function(value){
rlm@46 31431 var gidPrefix = this.grid.getGridEl().id;
rlm@46 31432 var groupField = this.getGroupField();
rlm@46 31433 var colIndex = this.cm.findColumnIndex(groupField);
rlm@46 31434 var cfg = this.cm.config[colIndex];
rlm@46 31435 var groupRenderer = cfg.groupRenderer || cfg.renderer;
rlm@46 31436 var gtext = this.getGroup(value, {data:{}}, groupRenderer, 0, colIndex, this.ds);
rlm@46 31437 return gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(value);
rlm@46 31438 },
rlm@46 31439
rlm@46 31440
rlm@46 31441 doGroupStart : function(buf, g, cs, ds, colCount){
rlm@46 31442 buf[buf.length] = this.startGroup.apply(g);
rlm@46 31443 },
rlm@46 31444
rlm@46 31445
rlm@46 31446 doGroupEnd : function(buf, g, cs, ds, colCount){
rlm@46 31447 buf[buf.length] = this.endGroup;
rlm@46 31448 },
rlm@46 31449
rlm@46 31450
rlm@46 31451 getRows : function(){
rlm@46 31452 if(!this.enableGrouping){
rlm@46 31453 return Ext.grid.GroupingView.superclass.getRows.call(this);
rlm@46 31454 }
rlm@46 31455 var r = [];
rlm@46 31456 var g, gs = this.getGroups();
rlm@46 31457 for(var i = 0, len = gs.length; i < len; i++){
rlm@46 31458 g = gs[i].childNodes[1].childNodes;
rlm@46 31459 for(var j = 0, jlen = g.length; j < jlen; j++){
rlm@46 31460 r[r.length] = g[j];
rlm@46 31461 }
rlm@46 31462 }
rlm@46 31463 return r;
rlm@46 31464 },
rlm@46 31465
rlm@46 31466
rlm@46 31467 updateGroupWidths : function(){
rlm@46 31468 if(!this.enableGrouping || !this.hasRows()){
rlm@46 31469 return;
rlm@46 31470 }
rlm@46 31471 var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.scrollOffset) +'px';
rlm@46 31472 var gs = this.getGroups();
rlm@46 31473 for(var i = 0, len = gs.length; i < len; i++){
rlm@46 31474 gs[i].firstChild.style.width = tw;
rlm@46 31475 }
rlm@46 31476 },
rlm@46 31477
rlm@46 31478
rlm@46 31479 onColumnWidthUpdated : function(col, w, tw){
rlm@46 31480 this.updateGroupWidths();
rlm@46 31481 },
rlm@46 31482
rlm@46 31483
rlm@46 31484 onAllColumnWidthsUpdated : function(ws, tw){
rlm@46 31485 this.updateGroupWidths();
rlm@46 31486 },
rlm@46 31487
rlm@46 31488
rlm@46 31489 onColumnHiddenUpdated : function(col, hidden, tw){
rlm@46 31490 this.updateGroupWidths();
rlm@46 31491 },
rlm@46 31492
rlm@46 31493
rlm@46 31494 onLayout : function(){
rlm@46 31495 this.updateGroupWidths();
rlm@46 31496 },
rlm@46 31497
rlm@46 31498
rlm@46 31499 onBeforeRowSelect : function(sm, rowIndex){
rlm@46 31500 if(!this.enableGrouping){
rlm@46 31501 return;
rlm@46 31502 }
rlm@46 31503 var row = this.getRow(rowIndex);
rlm@46 31504 if(row && !row.offsetParent){
rlm@46 31505 var g = this.findGroup(row);
rlm@46 31506 this.toggleGroup(g, true);
rlm@46 31507 }
rlm@46 31508 },
rlm@46 31509
rlm@46 31510
rlm@46 31511 groupByText: 'Group By This Field',
rlm@46 31512
rlm@46 31513 showGroupsText: 'Show in Groups'
rlm@46 31514 });
rlm@46 31515
rlm@46 31516 Ext.grid.GroupingView.GROUP_ID = 1000;
rlm@46 31517
rlm@46 31518
rlm@46 31519 Ext.grid.HeaderDragZone = function(grid, hd, hd2){
rlm@46 31520 this.grid = grid;
rlm@46 31521 this.view = grid.getView();
rlm@46 31522 this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
rlm@46 31523 Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd);
rlm@46 31524 if(hd2){
rlm@46 31525 this.setHandleElId(Ext.id(hd));
rlm@46 31526 this.setOuterHandleElId(Ext.id(hd2));
rlm@46 31527 }
rlm@46 31528 this.scroll = false;
rlm@46 31529 };
rlm@46 31530 Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, {
rlm@46 31531 maxDragWidth: 120,
rlm@46 31532 getDragData : function(e){
rlm@46 31533 var t = Ext.lib.Event.getTarget(e);
rlm@46 31534 var h = this.view.findHeaderCell(t);
rlm@46 31535 if(h){
rlm@46 31536 return {ddel: h.firstChild, header:h};
rlm@46 31537 }
rlm@46 31538 return false;
rlm@46 31539 },
rlm@46 31540
rlm@46 31541 onInitDrag : function(e){
rlm@46 31542 this.view.headersDisabled = true;
rlm@46 31543 var clone = this.dragData.ddel.cloneNode(true);
rlm@46 31544 clone.id = Ext.id();
rlm@46 31545 clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px";
rlm@46 31546 this.proxy.update(clone);
rlm@46 31547 return true;
rlm@46 31548 },
rlm@46 31549
rlm@46 31550 afterValidDrop : function(){
rlm@46 31551 var v = this.view;
rlm@46 31552 setTimeout(function(){
rlm@46 31553 v.headersDisabled = false;
rlm@46 31554 }, 50);
rlm@46 31555 },
rlm@46 31556
rlm@46 31557 afterInvalidDrop : function(){
rlm@46 31558 var v = this.view;
rlm@46 31559 setTimeout(function(){
rlm@46 31560 v.headersDisabled = false;
rlm@46 31561 }, 50);
rlm@46 31562 }
rlm@46 31563 });
rlm@46 31564
rlm@46 31565
rlm@46 31566
rlm@46 31567 Ext.grid.HeaderDropZone = function(grid, hd, hd2){
rlm@46 31568 this.grid = grid;
rlm@46 31569 this.view = grid.getView();
rlm@46 31570
rlm@46 31571 this.proxyTop = Ext.DomHelper.append(document.body, {
rlm@46 31572 cls:"col-move-top", html:"&#160;"
rlm@46 31573 }, true);
rlm@46 31574 this.proxyBottom = Ext.DomHelper.append(document.body, {
rlm@46 31575 cls:"col-move-bottom", html:"&#160;"
rlm@46 31576 }, true);
rlm@46 31577 this.proxyTop.hide = this.proxyBottom.hide = function(){
rlm@46 31578 this.setLeftTop(-100,-100);
rlm@46 31579 this.setStyle("visibility", "hidden");
rlm@46 31580 };
rlm@46 31581 this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
rlm@46 31582
rlm@46 31583
rlm@46 31584 Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom);
rlm@46 31585 };
rlm@46 31586 Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, {
rlm@46 31587 proxyOffsets : [-4, -9],
rlm@46 31588 fly: Ext.Element.fly,
rlm@46 31589
rlm@46 31590 getTargetFromEvent : function(e){
rlm@46 31591 var t = Ext.lib.Event.getTarget(e);
rlm@46 31592 var cindex = this.view.findCellIndex(t);
rlm@46 31593 if(cindex !== false){
rlm@46 31594 return this.view.getHeaderCell(cindex);
rlm@46 31595 }
rlm@46 31596 },
rlm@46 31597
rlm@46 31598 nextVisible : function(h){
rlm@46 31599 var v = this.view, cm = this.grid.colModel;
rlm@46 31600 h = h.nextSibling;
rlm@46 31601 while(h){
rlm@46 31602 if(!cm.isHidden(v.getCellIndex(h))){
rlm@46 31603 return h;
rlm@46 31604 }
rlm@46 31605 h = h.nextSibling;
rlm@46 31606 }
rlm@46 31607 return null;
rlm@46 31608 },
rlm@46 31609
rlm@46 31610 prevVisible : function(h){
rlm@46 31611 var v = this.view, cm = this.grid.colModel;
rlm@46 31612 h = h.prevSibling;
rlm@46 31613 while(h){
rlm@46 31614 if(!cm.isHidden(v.getCellIndex(h))){
rlm@46 31615 return h;
rlm@46 31616 }
rlm@46 31617 h = h.prevSibling;
rlm@46 31618 }
rlm@46 31619 return null;
rlm@46 31620 },
rlm@46 31621
rlm@46 31622 positionIndicator : function(h, n, e){
rlm@46 31623 var x = Ext.lib.Event.getPageX(e);
rlm@46 31624 var r = Ext.lib.Dom.getRegion(n.firstChild);
rlm@46 31625 var px, pt, py = r.top + this.proxyOffsets[1];
rlm@46 31626 if((r.right - x) <= (r.right-r.left)/2){
rlm@46 31627 px = r.right+this.view.borderWidth;
rlm@46 31628 pt = "after";
rlm@46 31629 }else{
rlm@46 31630 px = r.left;
rlm@46 31631 pt = "before";
rlm@46 31632 }
rlm@46 31633 var oldIndex = this.view.getCellIndex(h);
rlm@46 31634 var newIndex = this.view.getCellIndex(n);
rlm@46 31635
rlm@46 31636 if(this.grid.colModel.isFixed(newIndex)){
rlm@46 31637 return false;
rlm@46 31638 }
rlm@46 31639
rlm@46 31640 var locked = this.grid.colModel.isLocked(newIndex);
rlm@46 31641
rlm@46 31642 if(pt == "after"){
rlm@46 31643 newIndex++;
rlm@46 31644 }
rlm@46 31645 if(oldIndex < newIndex){
rlm@46 31646 newIndex--;
rlm@46 31647 }
rlm@46 31648 if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){
rlm@46 31649 return false;
rlm@46 31650 }
rlm@46 31651 px += this.proxyOffsets[0];
rlm@46 31652 this.proxyTop.setLeftTop(px, py);
rlm@46 31653 this.proxyTop.show();
rlm@46 31654 if(!this.bottomOffset){
rlm@46 31655 this.bottomOffset = this.view.mainHd.getHeight();
rlm@46 31656 }
rlm@46 31657 this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset);
rlm@46 31658 this.proxyBottom.show();
rlm@46 31659 return pt;
rlm@46 31660 },
rlm@46 31661
rlm@46 31662 onNodeEnter : function(n, dd, e, data){
rlm@46 31663 if(data.header != n){
rlm@46 31664 this.positionIndicator(data.header, n, e);
rlm@46 31665 }
rlm@46 31666 },
rlm@46 31667
rlm@46 31668 onNodeOver : function(n, dd, e, data){
rlm@46 31669 var result = false;
rlm@46 31670 if(data.header != n){
rlm@46 31671 result = this.positionIndicator(data.header, n, e);
rlm@46 31672 }
rlm@46 31673 if(!result){
rlm@46 31674 this.proxyTop.hide();
rlm@46 31675 this.proxyBottom.hide();
rlm@46 31676 }
rlm@46 31677 return result ? this.dropAllowed : this.dropNotAllowed;
rlm@46 31678 },
rlm@46 31679
rlm@46 31680 onNodeOut : function(n, dd, e, data){
rlm@46 31681 this.proxyTop.hide();
rlm@46 31682 this.proxyBottom.hide();
rlm@46 31683 },
rlm@46 31684
rlm@46 31685 onNodeDrop : function(n, dd, e, data){
rlm@46 31686 var h = data.header;
rlm@46 31687 if(h != n){
rlm@46 31688 var cm = this.grid.colModel;
rlm@46 31689 var x = Ext.lib.Event.getPageX(e);
rlm@46 31690 var r = Ext.lib.Dom.getRegion(n.firstChild);
rlm@46 31691 var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before";
rlm@46 31692 var oldIndex = this.view.getCellIndex(h);
rlm@46 31693 var newIndex = this.view.getCellIndex(n);
rlm@46 31694 var locked = cm.isLocked(newIndex);
rlm@46 31695 if(pt == "after"){
rlm@46 31696 newIndex++;
rlm@46 31697 }
rlm@46 31698 if(oldIndex < newIndex){
rlm@46 31699 newIndex--;
rlm@46 31700 }
rlm@46 31701 if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){
rlm@46 31702 return false;
rlm@46 31703 }
rlm@46 31704 cm.setLocked(oldIndex, locked, true);
rlm@46 31705 cm.moveColumn(oldIndex, newIndex);
rlm@46 31706 this.grid.fireEvent("columnmove", oldIndex, newIndex);
rlm@46 31707 return true;
rlm@46 31708 }
rlm@46 31709 return false;
rlm@46 31710 }
rlm@46 31711 });
rlm@46 31712
rlm@46 31713
rlm@46 31714 Ext.grid.GridView.ColumnDragZone = function(grid, hd){
rlm@46 31715 Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null);
rlm@46 31716 this.proxy.el.addClass('x-grid3-col-dd');
rlm@46 31717 };
rlm@46 31718
rlm@46 31719 Ext.extend(Ext.grid.GridView.ColumnDragZone, Ext.grid.HeaderDragZone, {
rlm@46 31720 handleMouseDown : function(e){
rlm@46 31721
rlm@46 31722 },
rlm@46 31723
rlm@46 31724 callHandleMouseDown : function(e){
rlm@46 31725 Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e);
rlm@46 31726 }
rlm@46 31727 });
rlm@46 31728 Ext.grid.SplitDragZone = function(grid, hd, hd2){
rlm@46 31729 this.grid = grid;
rlm@46 31730 this.view = grid.getView();
rlm@46 31731 this.proxy = this.view.resizeProxy;
rlm@46 31732 Ext.grid.SplitDragZone.superclass.constructor.call(this, hd,
rlm@46 31733 "gridSplitters" + this.grid.getGridEl().id, {
rlm@46 31734 dragElId : Ext.id(this.proxy.dom), resizeFrame:false
rlm@46 31735 });
rlm@46 31736 this.setHandleElId(Ext.id(hd));
rlm@46 31737 this.setOuterHandleElId(Ext.id(hd2));
rlm@46 31738 this.scroll = false;
rlm@46 31739 };
rlm@46 31740 Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, {
rlm@46 31741 fly: Ext.Element.fly,
rlm@46 31742
rlm@46 31743 b4StartDrag : function(x, y){
rlm@46 31744 this.view.headersDisabled = true;
rlm@46 31745 this.proxy.setHeight(this.view.mainWrap.getHeight());
rlm@46 31746 var w = this.cm.getColumnWidth(this.cellIndex);
rlm@46 31747 var minw = Math.max(w-this.grid.minColumnWidth, 0);
rlm@46 31748 this.resetConstraints();
rlm@46 31749 this.setXConstraint(minw, 1000);
rlm@46 31750 this.setYConstraint(0, 0);
rlm@46 31751 this.minX = x - minw;
rlm@46 31752 this.maxX = x + 1000;
rlm@46 31753 this.startPos = x;
rlm@46 31754 Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
rlm@46 31755 },
rlm@46 31756
rlm@46 31757
rlm@46 31758 handleMouseDown : function(e){
rlm@46 31759 ev = Ext.EventObject.setEvent(e);
rlm@46 31760 var t = this.fly(ev.getTarget());
rlm@46 31761 if(t.hasClass("x-grid-split")){
rlm@46 31762 this.cellIndex = this.view.getCellIndex(t.dom);
rlm@46 31763 this.split = t.dom;
rlm@46 31764 this.cm = this.grid.colModel;
rlm@46 31765 if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
rlm@46 31766 Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
rlm@46 31767 }
rlm@46 31768 }
rlm@46 31769 },
rlm@46 31770
rlm@46 31771 endDrag : function(e){
rlm@46 31772 this.view.headersDisabled = false;
rlm@46 31773 var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e));
rlm@46 31774 var diff = endX - this.startPos;
rlm@46 31775 this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
rlm@46 31776 },
rlm@46 31777
rlm@46 31778 autoOffset : function(){
rlm@46 31779 this.setDelta(0,0);
rlm@46 31780 }
rlm@46 31781 });
rlm@46 31782 Ext.grid.GridDragZone = function(grid, config){
rlm@46 31783 this.view = grid.getView();
rlm@46 31784 Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config);
rlm@46 31785 if(this.view.lockedBody){
rlm@46 31786 this.setHandleElId(Ext.id(this.view.mainBody.dom));
rlm@46 31787 this.setOuterHandleElId(Ext.id(this.view.lockedBody.dom));
rlm@46 31788 }
rlm@46 31789 this.scroll = false;
rlm@46 31790 this.grid = grid;
rlm@46 31791 this.ddel = document.createElement('div');
rlm@46 31792 this.ddel.className = 'x-grid-dd-wrap';
rlm@46 31793 };
rlm@46 31794
rlm@46 31795 Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
rlm@46 31796 ddGroup : "GridDD",
rlm@46 31797
rlm@46 31798 getDragData : function(e){
rlm@46 31799 var t = Ext.lib.Event.getTarget(e);
rlm@46 31800 var rowIndex = this.view.findRowIndex(t);
rlm@46 31801 if(rowIndex !== false){
rlm@46 31802 var sm = this.grid.selModel;
rlm@46 31803 if(!sm.isSelected(rowIndex) || e.hasModifier()){
rlm@46 31804 sm.handleMouseDown(this.grid, rowIndex, e);
rlm@46 31805 }
rlm@46 31806 return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()};
rlm@46 31807 }
rlm@46 31808 return false;
rlm@46 31809 },
rlm@46 31810
rlm@46 31811 onInitDrag : function(e){
rlm@46 31812 var data = this.dragData;
rlm@46 31813 this.ddel.innerHTML = this.grid.getDragDropText();
rlm@46 31814 this.proxy.update(this.ddel);
rlm@46 31815 },
rlm@46 31816
rlm@46 31817 afterRepair : function(){
rlm@46 31818 this.dragging = false;
rlm@46 31819 },
rlm@46 31820
rlm@46 31821 getRepairXY : function(e, data){
rlm@46 31822 return false;
rlm@46 31823 },
rlm@46 31824
rlm@46 31825 onEndDrag : function(data, e){
rlm@46 31826 },
rlm@46 31827
rlm@46 31828 onValidDrop : function(dd, e, id){
rlm@46 31829 this.hideProxy();
rlm@46 31830 },
rlm@46 31831
rlm@46 31832 beforeInvalidDrop : function(e, id){
rlm@46 31833
rlm@46 31834 }
rlm@46 31835 });
rlm@46 31836
rlm@46 31837
rlm@46 31838 Ext.grid.ColumnModel = function(config){
rlm@46 31839
rlm@46 31840 this.defaultWidth = 100;
rlm@46 31841
rlm@46 31842
rlm@46 31843 this.defaultSortable = false;
rlm@46 31844
rlm@46 31845
rlm@46 31846 if(config.columns){
rlm@46 31847 Ext.apply(this, config);
rlm@46 31848 this.setConfig(config.columns, true);
rlm@46 31849 }else{
rlm@46 31850 this.setConfig(config, true);
rlm@46 31851 }
rlm@46 31852 this.addEvents(
rlm@46 31853
rlm@46 31854 "widthchange",
rlm@46 31855
rlm@46 31856 "headerchange",
rlm@46 31857
rlm@46 31858 "hiddenchange",
rlm@46 31859
rlm@46 31860 "columnmoved",
rlm@46 31861 "columnlockchange",
rlm@46 31862
rlm@46 31863 "configchange"
rlm@46 31864 );
rlm@46 31865 Ext.grid.ColumnModel.superclass.constructor.call(this);
rlm@46 31866 };
rlm@46 31867 Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, {
rlm@46 31868
rlm@46 31869
rlm@46 31870
rlm@46 31871
rlm@46 31872
rlm@46 31873
rlm@46 31874
rlm@46 31875
rlm@46 31876
rlm@46 31877
rlm@46 31878
rlm@46 31879
rlm@46 31880
rlm@46 31881
rlm@46 31882
rlm@46 31883
rlm@46 31884
rlm@46 31885 getColumnId : function(index){
rlm@46 31886 return this.config[index].id;
rlm@46 31887 },
rlm@46 31888
rlm@46 31889
rlm@46 31890 setConfig : function(config, initial){
rlm@46 31891 if(!initial){ delete this.totalWidth;
rlm@46 31892 for(var i = 0, len = this.config.length; i < len; i++){
rlm@46 31893 var c = this.config[i];
rlm@46 31894 if(c.editor){
rlm@46 31895 c.editor.destroy();
rlm@46 31896 }
rlm@46 31897 }
rlm@46 31898 }
rlm@46 31899 this.config = config;
rlm@46 31900 this.lookup = {};
rlm@46 31901 for(var i = 0, len = config.length; i < len; i++){
rlm@46 31902 var c = config[i];
rlm@46 31903 if(typeof c.renderer == "string"){
rlm@46 31904 c.renderer = Ext.util.Format[c.renderer];
rlm@46 31905 }
rlm@46 31906 if(typeof c.id == "undefined"){
rlm@46 31907 c.id = i;
rlm@46 31908 }
rlm@46 31909 if(c.editor && c.editor.isFormField){
rlm@46 31910 c.editor = new Ext.grid.GridEditor(c.editor);
rlm@46 31911 }
rlm@46 31912 this.lookup[c.id] = c;
rlm@46 31913 }
rlm@46 31914 if(!initial){
rlm@46 31915 this.fireEvent('configchange', this);
rlm@46 31916 }
rlm@46 31917 },
rlm@46 31918
rlm@46 31919
rlm@46 31920 getColumnById : function(id){
rlm@46 31921 return this.lookup[id];
rlm@46 31922 },
rlm@46 31923
rlm@46 31924
rlm@46 31925 getIndexById : function(id){
rlm@46 31926 for(var i = 0, len = this.config.length; i < len; i++){
rlm@46 31927 if(this.config[i].id == id){
rlm@46 31928 return i;
rlm@46 31929 }
rlm@46 31930 }
rlm@46 31931 return -1;
rlm@46 31932 },
rlm@46 31933
rlm@46 31934 moveColumn : function(oldIndex, newIndex){
rlm@46 31935 var c = this.config[oldIndex];
rlm@46 31936 this.config.splice(oldIndex, 1);
rlm@46 31937 this.config.splice(newIndex, 0, c);
rlm@46 31938 this.dataMap = null;
rlm@46 31939 this.fireEvent("columnmoved", this, oldIndex, newIndex);
rlm@46 31940 },
rlm@46 31941
rlm@46 31942 isLocked : function(colIndex){
rlm@46 31943 return this.config[colIndex].locked === true;
rlm@46 31944 },
rlm@46 31945
rlm@46 31946 setLocked : function(colIndex, value, suppressEvent){
rlm@46 31947 if(this.isLocked(colIndex) == value){
rlm@46 31948 return;
rlm@46 31949 }
rlm@46 31950 this.config[colIndex].locked = value;
rlm@46 31951 if(!suppressEvent){
rlm@46 31952 this.fireEvent("columnlockchange", this, colIndex, value);
rlm@46 31953 }
rlm@46 31954 },
rlm@46 31955
rlm@46 31956 getTotalLockedWidth : function(){
rlm@46 31957 var totalWidth = 0;
rlm@46 31958 for(var i = 0; i < this.config.length; i++){
rlm@46 31959 if(this.isLocked(i) && !this.isHidden(i)){
rlm@46 31960 this.totalWidth += this.getColumnWidth(i);
rlm@46 31961 }
rlm@46 31962 }
rlm@46 31963 return totalWidth;
rlm@46 31964 },
rlm@46 31965
rlm@46 31966 getLockedCount : function(){
rlm@46 31967 for(var i = 0, len = this.config.length; i < len; i++){
rlm@46 31968 if(!this.isLocked(i)){
rlm@46 31969 return i;
rlm@46 31970 }
rlm@46 31971 }
rlm@46 31972 },
rlm@46 31973
rlm@46 31974
rlm@46 31975 getColumnCount : function(visibleOnly){
rlm@46 31976 if(visibleOnly === true){
rlm@46 31977 var c = 0;
rlm@46 31978 for(var i = 0, len = this.config.length; i < len; i++){
rlm@46 31979 if(!this.isHidden(i)){
rlm@46 31980 c++;
rlm@46 31981 }
rlm@46 31982 }
rlm@46 31983 return c;
rlm@46 31984 }
rlm@46 31985 return this.config.length;
rlm@46 31986 },
rlm@46 31987
rlm@46 31988
rlm@46 31989 getColumnsBy : function(fn, scope){
rlm@46 31990 var r = [];
rlm@46 31991 for(var i = 0, len = this.config.length; i < len; i++){
rlm@46 31992 var c = this.config[i];
rlm@46 31993 if(fn.call(scope||this, c, i) === true){
rlm@46 31994 r[r.length] = c;
rlm@46 31995 }
rlm@46 31996 }
rlm@46 31997 return r;
rlm@46 31998 },
rlm@46 31999
rlm@46 32000
rlm@46 32001 isSortable : function(col){
rlm@46 32002 if(typeof this.config[col].sortable == "undefined"){
rlm@46 32003 return this.defaultSortable;
rlm@46 32004 }
rlm@46 32005 return this.config[col].sortable;
rlm@46 32006 },
rlm@46 32007
rlm@46 32008
rlm@46 32009 isMenuDisabled : function(col){
rlm@46 32010 return !!this.config[col].menuDisabled;
rlm@46 32011 },
rlm@46 32012
rlm@46 32013
rlm@46 32014 getRenderer : function(col){
rlm@46 32015 if(!this.config[col].renderer){
rlm@46 32016 return Ext.grid.ColumnModel.defaultRenderer;
rlm@46 32017 }
rlm@46 32018 return this.config[col].renderer;
rlm@46 32019 },
rlm@46 32020
rlm@46 32021
rlm@46 32022 setRenderer : function(col, fn){
rlm@46 32023 this.config[col].renderer = fn;
rlm@46 32024 },
rlm@46 32025
rlm@46 32026
rlm@46 32027 getColumnWidth : function(col){
rlm@46 32028 return this.config[col].width || this.defaultWidth;
rlm@46 32029 },
rlm@46 32030
rlm@46 32031
rlm@46 32032 setColumnWidth : function(col, width, suppressEvent){
rlm@46 32033 this.config[col].width = width;
rlm@46 32034 this.totalWidth = null;
rlm@46 32035 if(!suppressEvent){
rlm@46 32036 this.fireEvent("widthchange", this, col, width);
rlm@46 32037 }
rlm@46 32038 },
rlm@46 32039
rlm@46 32040
rlm@46 32041 getTotalWidth : function(includeHidden){
rlm@46 32042 if(!this.totalWidth){
rlm@46 32043 this.totalWidth = 0;
rlm@46 32044 for(var i = 0, len = this.config.length; i < len; i++){
rlm@46 32045 if(includeHidden || !this.isHidden(i)){
rlm@46 32046 this.totalWidth += this.getColumnWidth(i);
rlm@46 32047 }
rlm@46 32048 }
rlm@46 32049 }
rlm@46 32050 return this.totalWidth;
rlm@46 32051 },
rlm@46 32052
rlm@46 32053
rlm@46 32054 getColumnHeader : function(col){
rlm@46 32055 return this.config[col].header;
rlm@46 32056 },
rlm@46 32057
rlm@46 32058
rlm@46 32059 setColumnHeader : function(col, header){
rlm@46 32060 this.config[col].header = header;
rlm@46 32061 this.fireEvent("headerchange", this, col, header);
rlm@46 32062 },
rlm@46 32063
rlm@46 32064
rlm@46 32065 getColumnTooltip : function(col){
rlm@46 32066 return this.config[col].tooltip;
rlm@46 32067 },
rlm@46 32068
rlm@46 32069 setColumnTooltip : function(col, tooltip){
rlm@46 32070 this.config[col].tooltip = tooltip;
rlm@46 32071 },
rlm@46 32072
rlm@46 32073
rlm@46 32074 getDataIndex : function(col){
rlm@46 32075 return this.config[col].dataIndex;
rlm@46 32076 },
rlm@46 32077
rlm@46 32078
rlm@46 32079 setDataIndex : function(col, dataIndex){
rlm@46 32080 this.config[col].dataIndex = dataIndex;
rlm@46 32081 },
rlm@46 32082
rlm@46 32083
rlm@46 32084 findColumnIndex : function(dataIndex){
rlm@46 32085 var c = this.config;
rlm@46 32086 for(var i = 0, len = c.length; i < len; i++){
rlm@46 32087 if(c[i].dataIndex == dataIndex){
rlm@46 32088 return i;
rlm@46 32089 }
rlm@46 32090 }
rlm@46 32091 return -1;
rlm@46 32092 },
rlm@46 32093
rlm@46 32094
rlm@46 32095 isCellEditable : function(colIndex, rowIndex){
rlm@46 32096 return (this.config[colIndex].editable || (typeof this.config[colIndex].editable == "undefined" && this.config[colIndex].editor)) ? true : false;
rlm@46 32097 },
rlm@46 32098
rlm@46 32099
rlm@46 32100 getCellEditor : function(colIndex, rowIndex){
rlm@46 32101 return this.config[colIndex].editor;
rlm@46 32102 },
rlm@46 32103
rlm@46 32104
rlm@46 32105 setEditable : function(col, editable){
rlm@46 32106 this.config[col].editable = editable;
rlm@46 32107 },
rlm@46 32108
rlm@46 32109
rlm@46 32110
rlm@46 32111 isHidden : function(colIndex){
rlm@46 32112 return this.config[colIndex].hidden;
rlm@46 32113 },
rlm@46 32114
rlm@46 32115
rlm@46 32116
rlm@46 32117 isFixed : function(colIndex){
rlm@46 32118 return this.config[colIndex].fixed;
rlm@46 32119 },
rlm@46 32120
rlm@46 32121
rlm@46 32122 isResizable : function(colIndex){
rlm@46 32123 return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true;
rlm@46 32124 },
rlm@46 32125
rlm@46 32126 setHidden : function(colIndex, hidden){
rlm@46 32127 var c = this.config[colIndex];
rlm@46 32128 if(c.hidden !== hidden){
rlm@46 32129 c.hidden = hidden;
rlm@46 32130 this.totalWidth = null;
rlm@46 32131 this.fireEvent("hiddenchange", this, colIndex, hidden);
rlm@46 32132 }
rlm@46 32133 },
rlm@46 32134
rlm@46 32135
rlm@46 32136 setEditor : function(col, editor){
rlm@46 32137 this.config[col].editor = editor;
rlm@46 32138 }
rlm@46 32139 });
rlm@46 32140
rlm@46 32141 Ext.grid.ColumnModel.defaultRenderer = function(value){
rlm@46 32142 if(typeof value == "string" && value.length < 1){
rlm@46 32143 return "&#160;";
rlm@46 32144 }
rlm@46 32145 return value;
rlm@46 32146 };
rlm@46 32147
rlm@46 32148 Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel;
rlm@46 32149
rlm@46 32150
rlm@46 32151 Ext.grid.AbstractSelectionModel = function(){
rlm@46 32152 this.locked = false;
rlm@46 32153 Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);
rlm@46 32154 };
rlm@46 32155
rlm@46 32156 Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable, {
rlm@46 32157
rlm@46 32158 init : function(grid){
rlm@46 32159 this.grid = grid;
rlm@46 32160 this.initEvents();
rlm@46 32161 },
rlm@46 32162
rlm@46 32163
rlm@46 32164 lock : function(){
rlm@46 32165 this.locked = true;
rlm@46 32166 },
rlm@46 32167
rlm@46 32168
rlm@46 32169 unlock : function(){
rlm@46 32170 this.locked = false;
rlm@46 32171 },
rlm@46 32172
rlm@46 32173
rlm@46 32174 isLocked : function(){
rlm@46 32175 return this.locked;
rlm@46 32176 }
rlm@46 32177 });
rlm@46 32178
rlm@46 32179 Ext.grid.RowSelectionModel = function(config){
rlm@46 32180 Ext.apply(this, config);
rlm@46 32181 this.selections = new Ext.util.MixedCollection(false, function(o){
rlm@46 32182 return o.id;
rlm@46 32183 });
rlm@46 32184
rlm@46 32185 this.last = false;
rlm@46 32186 this.lastActive = false;
rlm@46 32187
rlm@46 32188 this.addEvents(
rlm@46 32189
rlm@46 32190 "selectionchange",
rlm@46 32191
rlm@46 32192 "beforerowselect",
rlm@46 32193
rlm@46 32194 "rowselect",
rlm@46 32195
rlm@46 32196 "rowdeselect"
rlm@46 32197 );
rlm@46 32198
rlm@46 32199 Ext.grid.RowSelectionModel.superclass.constructor.call(this);
rlm@46 32200 };
rlm@46 32201
rlm@46 32202 Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, {
rlm@46 32203
rlm@46 32204 singleSelect : false,
rlm@46 32205
rlm@46 32206
rlm@46 32207 initEvents : function(){
rlm@46 32208
rlm@46 32209 if(!this.grid.enableDragDrop && !this.grid.enableDrag){
rlm@46 32210 this.grid.on("rowmousedown", this.handleMouseDown, this);
rlm@46 32211 }else{ this.grid.on("rowclick", function(grid, rowIndex, e) {
rlm@46 32212 if(e.button === 0 && !e.shiftKey && !e.ctrlKey) {
rlm@46 32213 this.selectRow(rowIndex, false);
rlm@46 32214 grid.view.focusRow(rowIndex);
rlm@46 32215 }
rlm@46 32216 }, this);
rlm@46 32217 }
rlm@46 32218
rlm@46 32219 this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {
rlm@46 32220 "up" : function(e){
rlm@46 32221 if(!e.shiftKey){
rlm@46 32222 this.selectPrevious(e.shiftKey);
rlm@46 32223 }else if(this.last !== false && this.lastActive !== false){
rlm@46 32224 var last = this.last;
rlm@46 32225 this.selectRange(this.last, this.lastActive-1);
rlm@46 32226 this.grid.getView().focusRow(this.lastActive);
rlm@46 32227 if(last !== false){
rlm@46 32228 this.last = last;
rlm@46 32229 }
rlm@46 32230 }else{
rlm@46 32231 this.selectFirstRow();
rlm@46 32232 }
rlm@46 32233 },
rlm@46 32234 "down" : function(e){
rlm@46 32235 if(!e.shiftKey){
rlm@46 32236 this.selectNext(e.shiftKey);
rlm@46 32237 }else if(this.last !== false && this.lastActive !== false){
rlm@46 32238 var last = this.last;
rlm@46 32239 this.selectRange(this.last, this.lastActive+1);
rlm@46 32240 this.grid.getView().focusRow(this.lastActive);
rlm@46 32241 if(last !== false){
rlm@46 32242 this.last = last;
rlm@46 32243 }
rlm@46 32244 }else{
rlm@46 32245 this.selectFirstRow();
rlm@46 32246 }
rlm@46 32247 },
rlm@46 32248 scope: this
rlm@46 32249 });
rlm@46 32250
rlm@46 32251 var view = this.grid.view;
rlm@46 32252 view.on("refresh", this.onRefresh, this);
rlm@46 32253 view.on("rowupdated", this.onRowUpdated, this);
rlm@46 32254 view.on("rowremoved", this.onRemove, this);
rlm@46 32255 },
rlm@46 32256
rlm@46 32257 onRefresh : function(){
rlm@46 32258 var ds = this.grid.store, index;
rlm@46 32259 var s = this.getSelections();
rlm@46 32260 this.clearSelections(true);
rlm@46 32261 for(var i = 0, len = s.length; i < len; i++){
rlm@46 32262 var r = s[i];
rlm@46 32263 if((index = ds.indexOfId(r.id)) != -1){
rlm@46 32264 this.selectRow(index, true);
rlm@46 32265 }
rlm@46 32266 }
rlm@46 32267 if(s.length != this.selections.getCount()){
rlm@46 32268 this.fireEvent("selectionchange", this);
rlm@46 32269 }
rlm@46 32270 },
rlm@46 32271
rlm@46 32272 onRemove : function(v, index, r){
rlm@46 32273 if(this.selections.remove(r) !== false){
rlm@46 32274 this.fireEvent('selectionchange', this);
rlm@46 32275 }
rlm@46 32276 },
rlm@46 32277
rlm@46 32278 onRowUpdated : function(v, index, r){
rlm@46 32279 if(this.isSelected(r)){
rlm@46 32280 v.onRowSelect(index);
rlm@46 32281 }
rlm@46 32282 },
rlm@46 32283
rlm@46 32284
rlm@46 32285 selectRecords : function(records, keepExisting){
rlm@46 32286 if(!keepExisting){
rlm@46 32287 this.clearSelections();
rlm@46 32288 }
rlm@46 32289 var ds = this.grid.store;
rlm@46 32290 for(var i = 0, len = records.length; i < len; i++){
rlm@46 32291 this.selectRow(ds.indexOf(records[i]), true);
rlm@46 32292 }
rlm@46 32293 },
rlm@46 32294
rlm@46 32295
rlm@46 32296 getCount : function(){
rlm@46 32297 return this.selections.length;
rlm@46 32298 },
rlm@46 32299
rlm@46 32300
rlm@46 32301 selectFirstRow : function(){
rlm@46 32302 this.selectRow(0);
rlm@46 32303 },
rlm@46 32304
rlm@46 32305
rlm@46 32306 selectLastRow : function(keepExisting){
rlm@46 32307 this.selectRow(this.grid.store.getCount() - 1, keepExisting);
rlm@46 32308 },
rlm@46 32309
rlm@46 32310
rlm@46 32311 selectNext : function(keepExisting){
rlm@46 32312 if(this.hasNext()){
rlm@46 32313 this.selectRow(this.last+1, keepExisting);
rlm@46 32314 this.grid.getView().focusRow(this.last);
rlm@46 32315 return true;
rlm@46 32316 }
rlm@46 32317 return false;
rlm@46 32318 },
rlm@46 32319
rlm@46 32320
rlm@46 32321 selectPrevious : function(keepExisting){
rlm@46 32322 if(this.hasPrevious()){
rlm@46 32323 this.selectRow(this.last-1, keepExisting);
rlm@46 32324 this.grid.getView().focusRow(this.last);
rlm@46 32325 return true;
rlm@46 32326 }
rlm@46 32327 return false;
rlm@46 32328 },
rlm@46 32329
rlm@46 32330
rlm@46 32331 hasNext : function(){
rlm@46 32332 return this.last !== false && (this.last+1) < this.grid.store.getCount();
rlm@46 32333 },
rlm@46 32334
rlm@46 32335
rlm@46 32336 hasPrevious : function(){
rlm@46 32337 return !!this.last;
rlm@46 32338 },
rlm@46 32339
rlm@46 32340
rlm@46 32341
rlm@46 32342 getSelections : function(){
rlm@46 32343 return [].concat(this.selections.items);
rlm@46 32344 },
rlm@46 32345
rlm@46 32346
rlm@46 32347 getSelected : function(){
rlm@46 32348 return this.selections.itemAt(0);
rlm@46 32349 },
rlm@46 32350
rlm@46 32351
rlm@46 32352 each : function(fn, scope){
rlm@46 32353 var s = this.getSelections();
rlm@46 32354 for(var i = 0, len = s.length; i < len; i++){
rlm@46 32355 if(fn.call(scope || this, s[i], i) === false){
rlm@46 32356 return false;
rlm@46 32357 }
rlm@46 32358 }
rlm@46 32359 return true;
rlm@46 32360 },
rlm@46 32361
rlm@46 32362
rlm@46 32363 clearSelections : function(fast){
rlm@46 32364 if(this.locked) return;
rlm@46 32365 if(fast !== true){
rlm@46 32366 var ds = this.grid.store;
rlm@46 32367 var s = this.selections;
rlm@46 32368 s.each(function(r){
rlm@46 32369 this.deselectRow(ds.indexOfId(r.id));
rlm@46 32370 }, this);
rlm@46 32371 s.clear();
rlm@46 32372 }else{
rlm@46 32373 this.selections.clear();
rlm@46 32374 }
rlm@46 32375 this.last = false;
rlm@46 32376 },
rlm@46 32377
rlm@46 32378
rlm@46 32379
rlm@46 32380 selectAll : function(){
rlm@46 32381 if(this.locked) return;
rlm@46 32382 this.selections.clear();
rlm@46 32383 for(var i = 0, len = this.grid.store.getCount(); i < len; i++){
rlm@46 32384 this.selectRow(i, true);
rlm@46 32385 }
rlm@46 32386 },
rlm@46 32387
rlm@46 32388
rlm@46 32389 hasSelection : function(){
rlm@46 32390 return this.selections.length > 0;
rlm@46 32391 },
rlm@46 32392
rlm@46 32393
rlm@46 32394 isSelected : function(index){
rlm@46 32395 var r = typeof index == "number" ? this.grid.store.getAt(index) : index;
rlm@46 32396 return (r && this.selections.key(r.id) ? true : false);
rlm@46 32397 },
rlm@46 32398
rlm@46 32399
rlm@46 32400 isIdSelected : function(id){
rlm@46 32401 return (this.selections.key(id) ? true : false);
rlm@46 32402 },
rlm@46 32403
rlm@46 32404 handleMouseDown : function(g, rowIndex, e){
rlm@46 32405 if(e.button !== 0 || this.isLocked()){
rlm@46 32406 return;
rlm@46 32407 };
rlm@46 32408 var view = this.grid.getView();
rlm@46 32409 if(e.shiftKey && this.last !== false){
rlm@46 32410 var last = this.last;
rlm@46 32411 this.selectRange(last, rowIndex, e.ctrlKey);
rlm@46 32412 this.last = last; view.focusRow(rowIndex);
rlm@46 32413 }else{
rlm@46 32414 var isSelected = this.isSelected(rowIndex);
rlm@46 32415 if(e.ctrlKey && isSelected){
rlm@46 32416 this.deselectRow(rowIndex);
rlm@46 32417 }else if(!isSelected || this.getCount() > 1){
rlm@46 32418 this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);
rlm@46 32419 view.focusRow(rowIndex);
rlm@46 32420 }
rlm@46 32421 }
rlm@46 32422 },
rlm@46 32423
rlm@46 32424
rlm@46 32425 selectRows : function(rows, keepExisting){
rlm@46 32426 if(!keepExisting){
rlm@46 32427 this.clearSelections();
rlm@46 32428 }
rlm@46 32429 for(var i = 0, len = rows.length; i < len; i++){
rlm@46 32430 this.selectRow(rows[i], true);
rlm@46 32431 }
rlm@46 32432 },
rlm@46 32433
rlm@46 32434
rlm@46 32435 selectRange : function(startRow, endRow, keepExisting){
rlm@46 32436 if(this.locked) return;
rlm@46 32437 if(!keepExisting){
rlm@46 32438 this.clearSelections();
rlm@46 32439 }
rlm@46 32440 if(startRow <= endRow){
rlm@46 32441 for(var i = startRow; i <= endRow; i++){
rlm@46 32442 this.selectRow(i, true);
rlm@46 32443 }
rlm@46 32444 }else{
rlm@46 32445 for(var i = startRow; i >= endRow; i--){
rlm@46 32446 this.selectRow(i, true);
rlm@46 32447 }
rlm@46 32448 }
rlm@46 32449 },
rlm@46 32450
rlm@46 32451
rlm@46 32452 deselectRange : function(startRow, endRow, preventViewNotify){
rlm@46 32453 if(this.locked) return;
rlm@46 32454 for(var i = startRow; i <= endRow; i++){
rlm@46 32455 this.deselectRow(i, preventViewNotify);
rlm@46 32456 }
rlm@46 32457 },
rlm@46 32458
rlm@46 32459
rlm@46 32460 selectRow : function(index, keepExisting, preventViewNotify){
rlm@46 32461 if(this.locked || (index < 0 || index >= this.grid.store.getCount())) return;
rlm@46 32462 var r = this.grid.store.getAt(index);
rlm@46 32463 if(r && this.fireEvent("beforerowselect", this, index, keepExisting, r) !== false){
rlm@46 32464 if(!keepExisting || this.singleSelect){
rlm@46 32465 this.clearSelections();
rlm@46 32466 }
rlm@46 32467 this.selections.add(r);
rlm@46 32468 this.last = this.lastActive = index;
rlm@46 32469 if(!preventViewNotify){
rlm@46 32470 this.grid.getView().onRowSelect(index);
rlm@46 32471 }
rlm@46 32472 this.fireEvent("rowselect", this, index, r);
rlm@46 32473 this.fireEvent("selectionchange", this);
rlm@46 32474 }
rlm@46 32475 },
rlm@46 32476
rlm@46 32477
rlm@46 32478 deselectRow : function(index, preventViewNotify){
rlm@46 32479 if(this.locked) return;
rlm@46 32480 if(this.last == index){
rlm@46 32481 this.last = false;
rlm@46 32482 }
rlm@46 32483 if(this.lastActive == index){
rlm@46 32484 this.lastActive = false;
rlm@46 32485 }
rlm@46 32486 var r = this.grid.store.getAt(index);
rlm@46 32487 if(r){
rlm@46 32488 this.selections.remove(r);
rlm@46 32489 if(!preventViewNotify){
rlm@46 32490 this.grid.getView().onRowDeselect(index);
rlm@46 32491 }
rlm@46 32492 this.fireEvent("rowdeselect", this, index, r);
rlm@46 32493 this.fireEvent("selectionchange", this);
rlm@46 32494 }
rlm@46 32495 },
rlm@46 32496
rlm@46 32497 restoreLast : function(){
rlm@46 32498 if(this._last){
rlm@46 32499 this.last = this._last;
rlm@46 32500 }
rlm@46 32501 },
rlm@46 32502
rlm@46 32503 acceptsNav : function(row, col, cm){
rlm@46 32504 return !cm.isHidden(col) && cm.isCellEditable(col, row);
rlm@46 32505 },
rlm@46 32506
rlm@46 32507 onEditorKey : function(field, e){
rlm@46 32508 var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;
rlm@46 32509 var shift = e.shiftKey;
rlm@46 32510 if(k == e.TAB){
rlm@46 32511 e.stopEvent();
rlm@46 32512 ed.completeEdit();
rlm@46 32513 if(shift){
rlm@46 32514 newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);
rlm@46 32515 }else{
rlm@46 32516 newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);
rlm@46 32517 }
rlm@46 32518 }else if(k == e.ENTER){
rlm@46 32519 e.stopEvent();
rlm@46 32520 ed.completeEdit();
rlm@46 32521 if(this.moveEditorOnEnter !== false){
rlm@46 32522 if(shift){
rlm@46 32523 newCell = g.walkCells(ed.row - 1, ed.col, -1, this.acceptsNav, this);
rlm@46 32524 }else{
rlm@46 32525 newCell = g.walkCells(ed.row + 1, ed.col, 1, this.acceptsNav, this);
rlm@46 32526 }
rlm@46 32527 }
rlm@46 32528 }else if(k == e.ESC){
rlm@46 32529 ed.cancelEdit();
rlm@46 32530 }
rlm@46 32531 if(newCell){
rlm@46 32532 g.startEditing(newCell[0], newCell[1]);
rlm@46 32533 }
rlm@46 32534 }
rlm@46 32535 });
rlm@46 32536
rlm@46 32537 Ext.grid.CellSelectionModel = function(config){
rlm@46 32538 Ext.apply(this, config);
rlm@46 32539
rlm@46 32540 this.selection = null;
rlm@46 32541
rlm@46 32542 this.addEvents(
rlm@46 32543
rlm@46 32544 "beforecellselect",
rlm@46 32545
rlm@46 32546 "cellselect",
rlm@46 32547
rlm@46 32548 "selectionchange"
rlm@46 32549 );
rlm@46 32550
rlm@46 32551 Ext.grid.CellSelectionModel.superclass.constructor.call(this);
rlm@46 32552 };
rlm@46 32553
rlm@46 32554 Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, {
rlm@46 32555
rlm@46 32556
rlm@46 32557 initEvents : function(){
rlm@46 32558 this.grid.on("cellmousedown", this.handleMouseDown, this);
rlm@46 32559 this.grid.getGridEl().on(Ext.isIE || Ext.isSafari3 ? "keydown" : "keypress", this.handleKeyDown, this);
rlm@46 32560 var view = this.grid.view;
rlm@46 32561 view.on("refresh", this.onViewChange, this);
rlm@46 32562 view.on("rowupdated", this.onRowUpdated, this);
rlm@46 32563 view.on("beforerowremoved", this.clearSelections, this);
rlm@46 32564 view.on("beforerowsinserted", this.clearSelections, this);
rlm@46 32565 if(this.grid.isEditor){
rlm@46 32566 this.grid.on("beforeedit", this.beforeEdit, this);
rlm@46 32567 }
rlm@46 32568 },
rlm@46 32569
rlm@46 32570 beforeEdit : function(e){
rlm@46 32571 this.select(e.row, e.column, false, true, e.record);
rlm@46 32572 },
rlm@46 32573
rlm@46 32574 onRowUpdated : function(v, index, r){
rlm@46 32575 if(this.selection && this.selection.record == r){
rlm@46 32576 v.onCellSelect(index, this.selection.cell[1]);
rlm@46 32577 }
rlm@46 32578 },
rlm@46 32579
rlm@46 32580 onViewChange : function(){
rlm@46 32581 this.clearSelections(true);
rlm@46 32582 },
rlm@46 32583
rlm@46 32584
rlm@46 32585 getSelectedCell : function(){
rlm@46 32586 return this.selection ? this.selection.cell : null;
rlm@46 32587 },
rlm@46 32588
rlm@46 32589
rlm@46 32590 clearSelections : function(preventNotify){
rlm@46 32591 var s = this.selection;
rlm@46 32592 if(s){
rlm@46 32593 if(preventNotify !== true){
rlm@46 32594 this.grid.view.onCellDeselect(s.cell[0], s.cell[1]);
rlm@46 32595 }
rlm@46 32596 this.selection = null;
rlm@46 32597 this.fireEvent("selectionchange", this, null);
rlm@46 32598 }
rlm@46 32599 },
rlm@46 32600
rlm@46 32601
rlm@46 32602 hasSelection : function(){
rlm@46 32603 return this.selection ? true : false;
rlm@46 32604 },
rlm@46 32605
rlm@46 32606
rlm@46 32607 handleMouseDown : function(g, row, cell, e){
rlm@46 32608 if(e.button !== 0 || this.isLocked()){
rlm@46 32609 return;
rlm@46 32610 };
rlm@46 32611 this.select(row, cell);
rlm@46 32612 },
rlm@46 32613
rlm@46 32614
rlm@46 32615 select : function(rowIndex, colIndex, preventViewNotify, preventFocus, r){
rlm@46 32616 if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){
rlm@46 32617 this.clearSelections();
rlm@46 32618 r = r || this.grid.store.getAt(rowIndex);
rlm@46 32619 this.selection = {
rlm@46 32620 record : r,
rlm@46 32621 cell : [rowIndex, colIndex]
rlm@46 32622 };
rlm@46 32623 if(!preventViewNotify){
rlm@46 32624 var v = this.grid.getView();
rlm@46 32625 v.onCellSelect(rowIndex, colIndex);
rlm@46 32626 if(preventFocus !== true){
rlm@46 32627 v.focusCell(rowIndex, colIndex);
rlm@46 32628 }
rlm@46 32629 }
rlm@46 32630 this.fireEvent("cellselect", this, rowIndex, colIndex);
rlm@46 32631 this.fireEvent("selectionchange", this, this.selection);
rlm@46 32632 }
rlm@46 32633 },
rlm@46 32634
rlm@46 32635 isSelectable : function(rowIndex, colIndex, cm){
rlm@46 32636 return !cm.isHidden(colIndex);
rlm@46 32637 },
rlm@46 32638
rlm@46 32639
rlm@46 32640 handleKeyDown : function(e){
rlm@46 32641 if(!e.isNavKeyPress()){
rlm@46 32642 return;
rlm@46 32643 }
rlm@46 32644 var g = this.grid, s = this.selection;
rlm@46 32645 if(!s){
rlm@46 32646 e.stopEvent();
rlm@46 32647 var cell = g.walkCells(0, 0, 1, this.isSelectable, this);
rlm@46 32648 if(cell){
rlm@46 32649 this.select(cell[0], cell[1]);
rlm@46 32650 }
rlm@46 32651 return;
rlm@46 32652 }
rlm@46 32653 var sm = this;
rlm@46 32654 var walk = function(row, col, step){
rlm@46 32655 return g.walkCells(row, col, step, sm.isSelectable, sm);
rlm@46 32656 };
rlm@46 32657 var k = e.getKey(), r = s.cell[0], c = s.cell[1];
rlm@46 32658 var newCell;
rlm@46 32659
rlm@46 32660 switch(k){
rlm@46 32661 case e.TAB:
rlm@46 32662 if(e.shiftKey){
rlm@46 32663 newCell = walk(r, c-1, -1);
rlm@46 32664 }else{
rlm@46 32665 newCell = walk(r, c+1, 1);
rlm@46 32666 }
rlm@46 32667 break;
rlm@46 32668 case e.DOWN:
rlm@46 32669 newCell = walk(r+1, c, 1);
rlm@46 32670 break;
rlm@46 32671 case e.UP:
rlm@46 32672 newCell = walk(r-1, c, -1);
rlm@46 32673 break;
rlm@46 32674 case e.RIGHT:
rlm@46 32675 newCell = walk(r, c+1, 1);
rlm@46 32676 break;
rlm@46 32677 case e.LEFT:
rlm@46 32678 newCell = walk(r, c-1, -1);
rlm@46 32679 break;
rlm@46 32680 case e.ENTER:
rlm@46 32681 if(g.isEditor && !g.editing){
rlm@46 32682 g.startEditing(r, c);
rlm@46 32683 e.stopEvent();
rlm@46 32684 return;
rlm@46 32685 }
rlm@46 32686 break;
rlm@46 32687 };
rlm@46 32688 if(newCell){
rlm@46 32689 this.select(newCell[0], newCell[1]);
rlm@46 32690 e.stopEvent();
rlm@46 32691 }
rlm@46 32692 },
rlm@46 32693
rlm@46 32694 acceptsNav : function(row, col, cm){
rlm@46 32695 return !cm.isHidden(col) && cm.isCellEditable(col, row);
rlm@46 32696 },
rlm@46 32697
rlm@46 32698 onEditorKey : function(field, e){
rlm@46 32699 var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;
rlm@46 32700 if(k == e.TAB){
rlm@46 32701 if(e.shiftKey){
rlm@46 32702 newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);
rlm@46 32703 }else{
rlm@46 32704 newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);
rlm@46 32705 }
rlm@46 32706 e.stopEvent();
rlm@46 32707 }else if(k == e.ENTER){
rlm@46 32708 ed.completeEdit();
rlm@46 32709 e.stopEvent();
rlm@46 32710 }else if(k == e.ESC){
rlm@46 32711 e.stopEvent();
rlm@46 32712 ed.cancelEdit();
rlm@46 32713 }
rlm@46 32714 if(newCell){
rlm@46 32715 g.startEditing(newCell[0], newCell[1]);
rlm@46 32716 }
rlm@46 32717 }
rlm@46 32718 });
rlm@46 32719
rlm@46 32720 Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
rlm@46 32721
rlm@46 32722 clicksToEdit: 2,
rlm@46 32723
rlm@46 32724 isEditor : true,
rlm@46 32725 detectEdit: false,
rlm@46 32726
rlm@46 32727
rlm@46 32728 autoEncode : false,
rlm@46 32729
rlm@46 32730
rlm@46 32731 trackMouseOver: false,
rlm@46 32732 initComponent : function(){
rlm@46 32733 Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
rlm@46 32734
rlm@46 32735 if(!this.selModel){
rlm@46 32736
rlm@46 32737 this.selModel = new Ext.grid.CellSelectionModel();
rlm@46 32738 }
rlm@46 32739
rlm@46 32740 this.activeEditor = null;
rlm@46 32741
rlm@46 32742 this.addEvents(
rlm@46 32743
rlm@46 32744 "beforeedit",
rlm@46 32745
rlm@46 32746 "afteredit",
rlm@46 32747
rlm@46 32748 "validateedit"
rlm@46 32749 );
rlm@46 32750 },
rlm@46 32751
rlm@46 32752 initEvents : function(){
rlm@46 32753 Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
rlm@46 32754
rlm@46 32755 this.on("bodyscroll", this.stopEditing, this, [true]);
rlm@46 32756
rlm@46 32757 if(this.clicksToEdit == 1){
rlm@46 32758 this.on("cellclick", this.onCellDblClick, this);
rlm@46 32759 }else {
rlm@46 32760 if(this.clicksToEdit == 'auto' && this.view.mainBody){
rlm@46 32761 this.view.mainBody.on("mousedown", this.onAutoEditClick, this);
rlm@46 32762 }
rlm@46 32763 this.on("celldblclick", this.onCellDblClick, this);
rlm@46 32764 }
rlm@46 32765 this.getGridEl().addClass("xedit-grid");
rlm@46 32766 },
rlm@46 32767
rlm@46 32768 onCellDblClick : function(g, row, col){
rlm@46 32769 this.startEditing(row, col);
rlm@46 32770 },
rlm@46 32771
rlm@46 32772 onAutoEditClick : function(e, t){
rlm@46 32773 if(e.button !== 0){
rlm@46 32774 return;
rlm@46 32775 }
rlm@46 32776 var row = this.view.findRowIndex(t);
rlm@46 32777 var col = this.view.findCellIndex(t);
rlm@46 32778 if(row !== false && col !== false){
rlm@46 32779 this.stopEditing();
rlm@46 32780 if(this.selModel.getSelectedCell){ var sc = this.selModel.getSelectedCell();
rlm@46 32781 if(sc && sc.cell[0] === row && sc.cell[1] === col){
rlm@46 32782 this.startEditing(row, col);
rlm@46 32783 }
rlm@46 32784 }else{
rlm@46 32785 if(this.selModel.isSelected(row)){
rlm@46 32786 this.startEditing(row, col);
rlm@46 32787 }
rlm@46 32788 }
rlm@46 32789 }
rlm@46 32790 },
rlm@46 32791
rlm@46 32792 onEditComplete : function(ed, value, startValue){
rlm@46 32793 this.editing = false;
rlm@46 32794 this.activeEditor = null;
rlm@46 32795 ed.un("specialkey", this.selModel.onEditorKey, this.selModel);
rlm@46 32796 var r = ed.record;
rlm@46 32797 var field = this.colModel.getDataIndex(ed.col);
rlm@46 32798 value = this.postEditValue(value, startValue, r, field);
rlm@46 32799 if(String(value) !== String(startValue)){
rlm@46 32800 var e = {
rlm@46 32801 grid: this,
rlm@46 32802 record: r,
rlm@46 32803 field: field,
rlm@46 32804 originalValue: startValue,
rlm@46 32805 value: value,
rlm@46 32806 row: ed.row,
rlm@46 32807 column: ed.col,
rlm@46 32808 cancel:false
rlm@46 32809 };
rlm@46 32810 if(this.fireEvent("validateedit", e) !== false && !e.cancel){
rlm@46 32811 r.set(field, e.value);
rlm@46 32812 delete e.cancel;
rlm@46 32813 this.fireEvent("afteredit", e);
rlm@46 32814 }
rlm@46 32815 }
rlm@46 32816 this.view.focusCell(ed.row, ed.col);
rlm@46 32817 },
rlm@46 32818
rlm@46 32819
rlm@46 32820 startEditing : function(row, col){
rlm@46 32821 this.stopEditing();
rlm@46 32822 if(this.colModel.isCellEditable(col, row)){
rlm@46 32823 this.view.ensureVisible(row, col, true);
rlm@46 32824 var r = this.store.getAt(row);
rlm@46 32825 var field = this.colModel.getDataIndex(col);
rlm@46 32826 var e = {
rlm@46 32827 grid: this,
rlm@46 32828 record: r,
rlm@46 32829 field: field,
rlm@46 32830 value: r.data[field],
rlm@46 32831 row: row,
rlm@46 32832 column: col,
rlm@46 32833 cancel:false
rlm@46 32834 };
rlm@46 32835 if(this.fireEvent("beforeedit", e) !== false && !e.cancel){
rlm@46 32836 this.editing = true;
rlm@46 32837 var ed = this.colModel.getCellEditor(col, row);
rlm@46 32838 if(!ed.rendered){
rlm@46 32839 ed.render(this.view.getEditorParent(ed));
rlm@46 32840 }
rlm@46 32841 (function(){ ed.row = row;
rlm@46 32842 ed.col = col;
rlm@46 32843 ed.record = r;
rlm@46 32844 ed.on("complete", this.onEditComplete, this, {single: true});
rlm@46 32845 ed.on("specialkey", this.selModel.onEditorKey, this.selModel);
rlm@46 32846 this.activeEditor = ed;
rlm@46 32847 var v = this.preEditValue(r, field);
rlm@46 32848 ed.startEdit(this.view.getCell(row, col), v);
rlm@46 32849 }).defer(50, this);
rlm@46 32850 }
rlm@46 32851 }
rlm@46 32852 },
rlm@46 32853
rlm@46 32854 preEditValue : function(r, field){
rlm@46 32855 return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlDecode(r.data[field]) : r.data[field];
rlm@46 32856 },
rlm@46 32857
rlm@46 32858 postEditValue : function(value, originalValue, r, field){
rlm@46 32859 return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value;
rlm@46 32860 },
rlm@46 32861
rlm@46 32862
rlm@46 32863 stopEditing : function(cancel){
rlm@46 32864 if(this.activeEditor){
rlm@46 32865 this.activeEditor[cancel === true ? 'cancelEdit' : 'completeEdit']();
rlm@46 32866 }
rlm@46 32867 this.activeEditor = null;
rlm@46 32868 }
rlm@46 32869 });
rlm@46 32870 Ext.reg('editorgrid', Ext.grid.EditorGridPanel);
rlm@46 32871 Ext.grid.GridEditor = function(field, config){
rlm@46 32872 Ext.grid.GridEditor.superclass.constructor.call(this, field, config);
rlm@46 32873 field.monitorTab = false;
rlm@46 32874 };
rlm@46 32875
rlm@46 32876 Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
rlm@46 32877 alignment: "tl-tl",
rlm@46 32878 autoSize: "width",
rlm@46 32879 hideEl : false,
rlm@46 32880 cls: "x-small-editor x-grid-editor",
rlm@46 32881 shim:false,
rlm@46 32882 shadow:false
rlm@46 32883 });
rlm@46 32884
rlm@46 32885 Ext.grid.PropertyRecord = Ext.data.Record.create([
rlm@46 32886 {name:'name',type:'string'}, 'value'
rlm@46 32887 ]);
rlm@46 32888
rlm@46 32889
rlm@46 32890 Ext.grid.PropertyStore = function(grid, source){
rlm@46 32891 this.grid = grid;
rlm@46 32892 this.store = new Ext.data.Store({
rlm@46 32893 recordType : Ext.grid.PropertyRecord
rlm@46 32894 });
rlm@46 32895 this.store.on('update', this.onUpdate, this);
rlm@46 32896 if(source){
rlm@46 32897 this.setSource(source);
rlm@46 32898 }
rlm@46 32899 Ext.grid.PropertyStore.superclass.constructor.call(this);
rlm@46 32900 };
rlm@46 32901 Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, {
rlm@46 32902 setSource : function(o){
rlm@46 32903 this.source = o;
rlm@46 32904 this.store.removeAll();
rlm@46 32905 var data = [];
rlm@46 32906 for(var k in o){
rlm@46 32907 if(this.isEditableValue(o[k])){
rlm@46 32908 data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k));
rlm@46 32909 }
rlm@46 32910 }
rlm@46 32911 this.store.loadRecords({records: data}, {}, true);
rlm@46 32912 },
rlm@46 32913
rlm@46 32914 onUpdate : function(ds, record, type){
rlm@46 32915 if(type == Ext.data.Record.EDIT){
rlm@46 32916 var v = record.data['value'];
rlm@46 32917 var oldValue = record.modified['value'];
rlm@46 32918 if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){
rlm@46 32919 this.source[record.id] = v;
rlm@46 32920 record.commit();
rlm@46 32921 this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue);
rlm@46 32922 }else{
rlm@46 32923 record.reject();
rlm@46 32924 }
rlm@46 32925 }
rlm@46 32926 },
rlm@46 32927
rlm@46 32928 getProperty : function(row){
rlm@46 32929 return this.store.getAt(row);
rlm@46 32930 },
rlm@46 32931
rlm@46 32932 isEditableValue: function(val){
rlm@46 32933 if(Ext.isDate(val)){
rlm@46 32934 return true;
rlm@46 32935 }else if(typeof val == 'object' || typeof val == 'function'){
rlm@46 32936 return false;
rlm@46 32937 }
rlm@46 32938 return true;
rlm@46 32939 },
rlm@46 32940
rlm@46 32941 setValue : function(prop, value){
rlm@46 32942 this.source[prop] = value;
rlm@46 32943 this.store.getById(prop).set('value', value);
rlm@46 32944 },
rlm@46 32945
rlm@46 32946 getSource : function(){
rlm@46 32947 return this.source;
rlm@46 32948 }
rlm@46 32949 });
rlm@46 32950
rlm@46 32951
rlm@46 32952 Ext.grid.PropertyColumnModel = function(grid, store){
rlm@46 32953 this.grid = grid;
rlm@46 32954 var g = Ext.grid;
rlm@46 32955 g.PropertyColumnModel.superclass.constructor.call(this, [
rlm@46 32956 {header: this.nameText, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true},
rlm@46 32957 {header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true}
rlm@46 32958 ]);
rlm@46 32959 this.store = store;
rlm@46 32960 this.bselect = Ext.DomHelper.append(document.body, {
rlm@46 32961 tag: 'select', cls: 'x-grid-editor x-hide-display', children: [
rlm@46 32962 {tag: 'option', value: 'true', html: 'true'},
rlm@46 32963 {tag: 'option', value: 'false', html: 'false'}
rlm@46 32964 ]
rlm@46 32965 });
rlm@46 32966 var f = Ext.form;
rlm@46 32967
rlm@46 32968 var bfield = new f.Field({
rlm@46 32969 el:this.bselect,
rlm@46 32970 bselect : this.bselect,
rlm@46 32971 autoShow: true,
rlm@46 32972 getValue : function(){
rlm@46 32973 return this.bselect.value == 'true';
rlm@46 32974 }
rlm@46 32975 });
rlm@46 32976 this.editors = {
rlm@46 32977 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})),
rlm@46 32978 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})),
rlm@46 32979 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})),
rlm@46 32980 'boolean' : new g.GridEditor(bfield)
rlm@46 32981 };
rlm@46 32982 this.renderCellDelegate = this.renderCell.createDelegate(this);
rlm@46 32983 this.renderPropDelegate = this.renderProp.createDelegate(this);
rlm@46 32984 };
rlm@46 32985
rlm@46 32986 Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, {
rlm@46 32987 nameText : 'Name',
rlm@46 32988 valueText : 'Value',
rlm@46 32989 dateFormat : 'm/j/Y',
rlm@46 32990
rlm@46 32991 renderDate : function(dateVal){
rlm@46 32992 return dateVal.dateFormat(this.dateFormat);
rlm@46 32993 },
rlm@46 32994
rlm@46 32995 renderBool : function(bVal){
rlm@46 32996 return bVal ? 'true' : 'false';
rlm@46 32997 },
rlm@46 32998
rlm@46 32999 isCellEditable : function(colIndex, rowIndex){
rlm@46 33000 return colIndex == 1;
rlm@46 33001 },
rlm@46 33002
rlm@46 33003 getRenderer : function(col){
rlm@46 33004 return col == 1 ?
rlm@46 33005 this.renderCellDelegate : this.renderPropDelegate;
rlm@46 33006 },
rlm@46 33007
rlm@46 33008 renderProp : function(v){
rlm@46 33009 return this.getPropertyName(v);
rlm@46 33010 },
rlm@46 33011
rlm@46 33012 renderCell : function(val){
rlm@46 33013 var rv = val;
rlm@46 33014 if(Ext.isDate(val)){
rlm@46 33015 rv = this.renderDate(val);
rlm@46 33016 }else if(typeof val == 'boolean'){
rlm@46 33017 rv = this.renderBool(val);
rlm@46 33018 }
rlm@46 33019 return Ext.util.Format.htmlEncode(rv);
rlm@46 33020 },
rlm@46 33021
rlm@46 33022 getPropertyName : function(name){
rlm@46 33023 var pn = this.grid.propertyNames;
rlm@46 33024 return pn && pn[name] ? pn[name] : name;
rlm@46 33025 },
rlm@46 33026
rlm@46 33027 getCellEditor : function(colIndex, rowIndex){
rlm@46 33028 var p = this.store.getProperty(rowIndex);
rlm@46 33029 var n = p.data['name'], val = p.data['value'];
rlm@46 33030 if(this.grid.customEditors[n]){
rlm@46 33031 return this.grid.customEditors[n];
rlm@46 33032 }
rlm@46 33033 if(Ext.isDate(val)){
rlm@46 33034 return this.editors['date'];
rlm@46 33035 }else if(typeof val == 'number'){
rlm@46 33036 return this.editors['number'];
rlm@46 33037 }else if(typeof val == 'boolean'){
rlm@46 33038 return this.editors['boolean'];
rlm@46 33039 }else{
rlm@46 33040 return this.editors['string'];
rlm@46 33041 }
rlm@46 33042 }
rlm@46 33043 });
rlm@46 33044
rlm@46 33045
rlm@46 33046 Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {
rlm@46 33047
rlm@46 33048
rlm@46 33049
rlm@46 33050 enableColumnMove:false,
rlm@46 33051 stripeRows:false,
rlm@46 33052 trackMouseOver: false,
rlm@46 33053 clicksToEdit:1,
rlm@46 33054 enableHdMenu : false,
rlm@46 33055 viewConfig : {
rlm@46 33056 forceFit:true
rlm@46 33057 },
rlm@46 33058
rlm@46 33059 initComponent : function(){
rlm@46 33060 this.customEditors = this.customEditors || {};
rlm@46 33061 this.lastEditRow = null;
rlm@46 33062 var store = new Ext.grid.PropertyStore(this);
rlm@46 33063 this.propStore = store;
rlm@46 33064 var cm = new Ext.grid.PropertyColumnModel(this, store);
rlm@46 33065 store.store.sort('name', 'ASC');
rlm@46 33066 this.addEvents(
rlm@46 33067
rlm@46 33068 'beforepropertychange',
rlm@46 33069
rlm@46 33070 'propertychange'
rlm@46 33071 );
rlm@46 33072 this.cm = cm;
rlm@46 33073 this.ds = store.store;
rlm@46 33074 Ext.grid.PropertyGrid.superclass.initComponent.call(this);
rlm@46 33075
rlm@46 33076 this.selModel.on('beforecellselect', function(sm, rowIndex, colIndex){
rlm@46 33077 if(colIndex === 0){
rlm@46 33078 this.startEditing.defer(200, this, [rowIndex, 1]);
rlm@46 33079 return false;
rlm@46 33080 }
rlm@46 33081 }, this);
rlm@46 33082 },
rlm@46 33083
rlm@46 33084 onRender : function(){
rlm@46 33085 Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);
rlm@46 33086
rlm@46 33087 this.getGridEl().addClass('x-props-grid');
rlm@46 33088 },
rlm@46 33089
rlm@46 33090 afterRender: function(){
rlm@46 33091 Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);
rlm@46 33092 if(this.source){
rlm@46 33093 this.setSource(this.source);
rlm@46 33094 }
rlm@46 33095 },
rlm@46 33096
rlm@46 33097
rlm@46 33098 setSource : function(source){
rlm@46 33099 this.propStore.setSource(source);
rlm@46 33100 },
rlm@46 33101
rlm@46 33102
rlm@46 33103 getSource : function(){
rlm@46 33104 return this.propStore.getSource();
rlm@46 33105 }
rlm@46 33106 });
rlm@46 33107 Ext.reg("propertygrid", Ext.grid.PropertyGrid);
rlm@46 33108
rlm@46 33109
rlm@46 33110 Ext.grid.RowNumberer = function(config){
rlm@46 33111 Ext.apply(this, config);
rlm@46 33112 if(this.rowspan){
rlm@46 33113 this.renderer = this.renderer.createDelegate(this);
rlm@46 33114 }
rlm@46 33115 };
rlm@46 33116
rlm@46 33117 Ext.grid.RowNumberer.prototype = {
rlm@46 33118
rlm@46 33119 header: "",
rlm@46 33120
rlm@46 33121 width: 23,
rlm@46 33122
rlm@46 33123 sortable: false,
rlm@46 33124
rlm@46 33125
rlm@46 33126 fixed:true,
rlm@46 33127 menuDisabled:true,
rlm@46 33128 dataIndex: '',
rlm@46 33129 id: 'numberer',
rlm@46 33130 rowspan: undefined,
rlm@46 33131
rlm@46 33132
rlm@46 33133 renderer : function(v, p, record, rowIndex){
rlm@46 33134 if(this.rowspan){
rlm@46 33135 p.cellAttr = 'rowspan="'+this.rowspan+'"';
rlm@46 33136 }
rlm@46 33137 return rowIndex+1;
rlm@46 33138 }
rlm@46 33139 };
rlm@46 33140
rlm@46 33141 Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
rlm@46 33142
rlm@46 33143 header: '<div class="x-grid3-hd-checker">&#160;</div>',
rlm@46 33144
rlm@46 33145 width: 20,
rlm@46 33146
rlm@46 33147 sortable: false,
rlm@46 33148
rlm@46 33149
rlm@46 33150 menuDisabled:true,
rlm@46 33151 fixed:true,
rlm@46 33152 dataIndex: '',
rlm@46 33153 id: 'checker',
rlm@46 33154
rlm@46 33155
rlm@46 33156 initEvents : function(){
rlm@46 33157 Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
rlm@46 33158 this.grid.on('render', function(){
rlm@46 33159 var view = this.grid.getView();
rlm@46 33160 view.mainBody.on('mousedown', this.onMouseDown, this);
rlm@46 33161 Ext.fly(view.innerHd).on('mousedown', this.onHdMouseDown, this);
rlm@46 33162
rlm@46 33163 }, this);
rlm@46 33164 },
rlm@46 33165
rlm@46 33166
rlm@46 33167 onMouseDown : function(e, t){
rlm@46 33168 if(e.button === 0 && t.className == 'x-grid3-row-checker'){
rlm@46 33169 e.stopEvent();
rlm@46 33170 var row = e.getTarget('.x-grid3-row');
rlm@46 33171 if(row){
rlm@46 33172 var index = row.rowIndex;
rlm@46 33173 if(this.isSelected(index)){
rlm@46 33174 this.deselectRow(index);
rlm@46 33175 }else{
rlm@46 33176 this.selectRow(index, true);
rlm@46 33177 }
rlm@46 33178 }
rlm@46 33179 }
rlm@46 33180 },
rlm@46 33181
rlm@46 33182
rlm@46 33183 onHdMouseDown : function(e, t){
rlm@46 33184 if(t.className == 'x-grid3-hd-checker'){
rlm@46 33185 e.stopEvent();
rlm@46 33186 var hd = Ext.fly(t.parentNode);
rlm@46 33187 var isChecked = hd.hasClass('x-grid3-hd-checker-on');
rlm@46 33188 if(isChecked){
rlm@46 33189 hd.removeClass('x-grid3-hd-checker-on');
rlm@46 33190 this.clearSelections();
rlm@46 33191 }else{
rlm@46 33192 hd.addClass('x-grid3-hd-checker-on');
rlm@46 33193 this.selectAll();
rlm@46 33194 }
rlm@46 33195 }
rlm@46 33196 },
rlm@46 33197
rlm@46 33198
rlm@46 33199 renderer : function(v, p, record){
rlm@46 33200 return '<div class="x-grid3-row-checker">&#160;</div>';
rlm@46 33201 }
rlm@46 33202 });
rlm@46 33203
rlm@46 33204 Ext.LoadMask = function(el, config){
rlm@46 33205 this.el = Ext.get(el);
rlm@46 33206 Ext.apply(this, config);
rlm@46 33207 if(this.store){
rlm@46 33208 this.store.on('beforeload', this.onBeforeLoad, this);
rlm@46 33209 this.store.on('load', this.onLoad, this);
rlm@46 33210 this.store.on('loadexception', this.onLoad, this);
rlm@46 33211 this.removeMask = Ext.value(this.removeMask, false);
rlm@46 33212 }else{
rlm@46 33213 var um = this.el.getUpdater();
rlm@46 33214 um.showLoadIndicator = false; um.on('beforeupdate', this.onBeforeLoad, this);
rlm@46 33215 um.on('update', this.onLoad, this);
rlm@46 33216 um.on('failure', this.onLoad, this);
rlm@46 33217 this.removeMask = Ext.value(this.removeMask, true);
rlm@46 33218 }
rlm@46 33219 };
rlm@46 33220
rlm@46 33221 Ext.LoadMask.prototype = {
rlm@46 33222
rlm@46 33223
rlm@46 33224
rlm@46 33225 msg : 'Loading...',
rlm@46 33226
rlm@46 33227 msgCls : 'x-mask-loading',
rlm@46 33228
rlm@46 33229
rlm@46 33230 disabled: false,
rlm@46 33231
rlm@46 33232
rlm@46 33233 disable : function(){
rlm@46 33234 this.disabled = true;
rlm@46 33235 },
rlm@46 33236
rlm@46 33237
rlm@46 33238 enable : function(){
rlm@46 33239 this.disabled = false;
rlm@46 33240 },
rlm@46 33241
rlm@46 33242 onLoad : function(){
rlm@46 33243 this.el.unmask(this.removeMask);
rlm@46 33244 },
rlm@46 33245
rlm@46 33246 onBeforeLoad : function(){
rlm@46 33247 if(!this.disabled){
rlm@46 33248 this.el.mask(this.msg, this.msgCls);
rlm@46 33249 }
rlm@46 33250 },
rlm@46 33251
rlm@46 33252
rlm@46 33253 show: function(){
rlm@46 33254 this.onBeforeLoad();
rlm@46 33255 },
rlm@46 33256
rlm@46 33257
rlm@46 33258 hide: function(){
rlm@46 33259 this.onLoad();
rlm@46 33260 },
rlm@46 33261
rlm@46 33262 destroy : function(){
rlm@46 33263 if(this.store){
rlm@46 33264 this.store.un('beforeload', this.onBeforeLoad, this);
rlm@46 33265 this.store.un('load', this.onLoad, this);
rlm@46 33266 this.store.un('loadexception', this.onLoad, this);
rlm@46 33267 }else{
rlm@46 33268 var um = this.el.getUpdater();
rlm@46 33269 um.un('beforeupdate', this.onBeforeLoad, this);
rlm@46 33270 um.un('update', this.onLoad, this);
rlm@46 33271 um.un('failure', this.onLoad, this);
rlm@46 33272 }
rlm@46 33273 }
rlm@46 33274 };
rlm@46 33275
rlm@46 33276 Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
rlm@46 33277
rlm@46 33278 baseCls : 'x-progress',
rlm@46 33279
rlm@46 33280
rlm@46 33281 waitTimer : null,
rlm@46 33282
rlm@46 33283
rlm@46 33284 initComponent : function(){
rlm@46 33285 Ext.ProgressBar.superclass.initComponent.call(this);
rlm@46 33286 this.addEvents(
rlm@46 33287
rlm@46 33288 "update"
rlm@46 33289 );
rlm@46 33290 },
rlm@46 33291
rlm@46 33292
rlm@46 33293 onRender : function(ct, position){
rlm@46 33294 Ext.ProgressBar.superclass.onRender.call(this, ct, position);
rlm@46 33295
rlm@46 33296 var tpl = new Ext.Template(
rlm@46 33297 '<div class="{cls}-wrap">',
rlm@46 33298 '<div class="{cls}-inner">',
rlm@46 33299 '<div class="{cls}-bar">',
rlm@46 33300 '<div class="{cls}-text">',
rlm@46 33301 '<div>&#160;</div>',
rlm@46 33302 '</div>',
rlm@46 33303 '</div>',
rlm@46 33304 '<div class="{cls}-text {cls}-text-back">',
rlm@46 33305 '<div>&#160;</div>',
rlm@46 33306 '</div>',
rlm@46 33307 '</div>',
rlm@46 33308 '</div>'
rlm@46 33309 );
rlm@46 33310
rlm@46 33311 if(position){
rlm@46 33312 this.el = tpl.insertBefore(position, {cls: this.baseCls}, true);
rlm@46 33313 }else{
rlm@46 33314 this.el = tpl.append(ct, {cls: this.baseCls}, true);
rlm@46 33315 }
rlm@46 33316 if(this.id){
rlm@46 33317 this.el.dom.id = this.id;
rlm@46 33318 }
rlm@46 33319 var inner = this.el.dom.firstChild;
rlm@46 33320 this.progressBar = Ext.get(inner.firstChild);
rlm@46 33321
rlm@46 33322 if(this.textEl){
rlm@46 33323
rlm@46 33324 this.textEl = Ext.get(this.textEl);
rlm@46 33325 delete this.textTopEl;
rlm@46 33326 }else{
rlm@46 33327
rlm@46 33328 this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
rlm@46 33329 var textBackEl = Ext.get(inner.childNodes[1]);
rlm@46 33330 this.textTopEl.setStyle("z-index", 99).addClass('x-hidden');
rlm@46 33331 this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]);
rlm@46 33332 this.textEl.setWidth(inner.offsetWidth);
rlm@46 33333 }
rlm@46 33334 this.progressBar.setHeight(inner.offsetHeight);
rlm@46 33335 },
rlm@46 33336
rlm@46 33337
rlm@46 33338 afterRender : function(){
rlm@46 33339 Ext.ProgressBar.superclass.afterRender.call(this);
rlm@46 33340 if(this.value){
rlm@46 33341 this.updateProgress(this.value, this.text);
rlm@46 33342 }else{
rlm@46 33343 this.updateText(this.text);
rlm@46 33344 }
rlm@46 33345 },
rlm@46 33346
rlm@46 33347
rlm@46 33348 updateProgress : function(value, text){
rlm@46 33349 this.value = value || 0;
rlm@46 33350 if(text){
rlm@46 33351 this.updateText(text);
rlm@46 33352 }
rlm@46 33353 var w = Math.floor(value*this.el.dom.firstChild.offsetWidth);
rlm@46 33354 this.progressBar.setWidth(w);
rlm@46 33355 if(this.textTopEl){
rlm@46 33356
rlm@46 33357 this.textTopEl.removeClass('x-hidden').setWidth(w);
rlm@46 33358 }
rlm@46 33359 this.fireEvent('update', this, value, text);
rlm@46 33360 return this;
rlm@46 33361 },
rlm@46 33362
rlm@46 33363
rlm@46 33364 wait : function(o){
rlm@46 33365 if(!this.waitTimer){
rlm@46 33366 var scope = this;
rlm@46 33367 o = o || {};
rlm@46 33368 this.waitTimer = Ext.TaskMgr.start({
rlm@46 33369 run: function(i){
rlm@46 33370 var inc = o.increment || 10;
rlm@46 33371 this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*.01);
rlm@46 33372 },
rlm@46 33373 interval: o.interval || 1000,
rlm@46 33374 duration: o.duration,
rlm@46 33375 onStop: function(){
rlm@46 33376 if(o.fn){
rlm@46 33377 o.fn.apply(o.scope || this);
rlm@46 33378 }
rlm@46 33379 this.reset();
rlm@46 33380 },
rlm@46 33381 scope: scope
rlm@46 33382 });
rlm@46 33383 }
rlm@46 33384 return this;
rlm@46 33385 },
rlm@46 33386
rlm@46 33387
rlm@46 33388 isWaiting : function(){
rlm@46 33389 return this.waitTimer != null;
rlm@46 33390 },
rlm@46 33391
rlm@46 33392
rlm@46 33393 updateText : function(text){
rlm@46 33394 this.text = text || '&#160;';
rlm@46 33395 this.textEl.update(this.text);
rlm@46 33396 return this;
rlm@46 33397 },
rlm@46 33398
rlm@46 33399
rlm@46 33400 setSize : function(w, h){
rlm@46 33401 Ext.ProgressBar.superclass.setSize.call(this, w, h);
rlm@46 33402 if(this.textTopEl){
rlm@46 33403 var inner = this.el.dom.firstChild;
rlm@46 33404 this.textEl.setSize(inner.offsetWidth, inner.offsetHeight);
rlm@46 33405 }
rlm@46 33406 return this;
rlm@46 33407 },
rlm@46 33408
rlm@46 33409
rlm@46 33410 reset : function(hide){
rlm@46 33411 this.updateProgress(0);
rlm@46 33412 if(this.textTopEl){
rlm@46 33413 this.textTopEl.addClass('x-hidden');
rlm@46 33414 }
rlm@46 33415 if(this.waitTimer){
rlm@46 33416 this.waitTimer.onStop = null;
rlm@46 33417 Ext.TaskMgr.stop(this.waitTimer);
rlm@46 33418 this.waitTimer = null;
rlm@46 33419 }
rlm@46 33420 if(hide === true){
rlm@46 33421 this.hide();
rlm@46 33422 }
rlm@46 33423 return this;
rlm@46 33424 }
rlm@46 33425 });
rlm@46 33426 Ext.reg('progress', Ext.ProgressBar);
rlm@46 33427
rlm@46 33428 Ext.Slider = Ext.extend(Ext.BoxComponent, {
rlm@46 33429
rlm@46 33430
rlm@46 33431 vertical: false,
rlm@46 33432
rlm@46 33433 minValue: 0,
rlm@46 33434
rlm@46 33435 maxValue: 100,
rlm@46 33436
rlm@46 33437 keyIncrement: 1,
rlm@46 33438
rlm@46 33439 increment: 0,
rlm@46 33440
rlm@46 33441 clickRange: [5,15],
rlm@46 33442
rlm@46 33443 clickToChange : true,
rlm@46 33444
rlm@46 33445 animate: true,
rlm@46 33446
rlm@46 33447
rlm@46 33448 initComponent : function(){
rlm@46 33449 if(this.value === undefined){
rlm@46 33450 this.value = this.minValue;
rlm@46 33451 }
rlm@46 33452 Ext.Slider.superclass.initComponent.call(this);
rlm@46 33453 this.keyIncrement = Math.max(this.increment, this.keyIncrement);
rlm@46 33454 this.addEvents(
rlm@46 33455
rlm@46 33456 'beforechange',
rlm@46 33457
rlm@46 33458 'change',
rlm@46 33459
rlm@46 33460 'dragstart',
rlm@46 33461
rlm@46 33462 'drag',
rlm@46 33463
rlm@46 33464 'dragend'
rlm@46 33465 );
rlm@46 33466
rlm@46 33467 if(this.vertical){
rlm@46 33468 Ext.apply(this, Ext.Slider.Vertical);
rlm@46 33469 }
rlm@46 33470 },
rlm@46 33471
rlm@46 33472
rlm@46 33473 onRender : function(){
rlm@46 33474 this.autoEl = {
rlm@46 33475 cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'),
rlm@46 33476 cn:{cls:'x-slider-end',cn:{cls:'x-slider-inner',cn:[{cls:'x-slider-thumb'},{tag:'a', cls:'x-slider-focus', href:"#", tabIndex: '-1', hidefocus:'on'}]}}
rlm@46 33477 };
rlm@46 33478 Ext.Slider.superclass.onRender.apply(this, arguments);
rlm@46 33479 this.endEl = this.el.first();
rlm@46 33480 this.innerEl = this.endEl.first();
rlm@46 33481 this.thumb = this.innerEl.first();
rlm@46 33482 this.halfThumb = (this.vertical ? this.thumb.getHeight() : this.thumb.getWidth())/2;
rlm@46 33483 this.focusEl = this.thumb.next();
rlm@46 33484 this.initEvents();
rlm@46 33485 },
rlm@46 33486
rlm@46 33487
rlm@46 33488 initEvents : function(){
rlm@46 33489 this.thumb.addClassOnOver('x-slider-thumb-over');
rlm@46 33490 this.mon(this.el, 'mousedown', this.onMouseDown, this);
rlm@46 33491 this.mon(this.el, 'keydown', this.onKeyDown, this);
rlm@46 33492
rlm@46 33493 this.tracker = new Ext.dd.DragTracker({
rlm@46 33494 onBeforeStart: this.onBeforeDragStart.createDelegate(this),
rlm@46 33495 onStart: this.onDragStart.createDelegate(this),
rlm@46 33496 onDrag: this.onDrag.createDelegate(this),
rlm@46 33497 onEnd: this.onDragEnd.createDelegate(this),
rlm@46 33498 tolerance: 3,
rlm@46 33499 autoStart: 300
rlm@46 33500 });
rlm@46 33501 this.tracker.initEl(this.thumb);
rlm@46 33502 this.on('beforedestroy', this.tracker.destroy, this.tracker);
rlm@46 33503 },
rlm@46 33504
rlm@46 33505
rlm@46 33506 onMouseDown : function(e){
rlm@46 33507 if(this.disabled) {return;}
rlm@46 33508 if(this.clickToChange && e.target != this.thumb.dom){
rlm@46 33509 var local = this.innerEl.translatePoints(e.getXY());
rlm@46 33510 this.onClickChange(local);
rlm@46 33511 }
rlm@46 33512 this.focus();
rlm@46 33513 },
rlm@46 33514
rlm@46 33515
rlm@46 33516 onClickChange : function(local){
rlm@46 33517 if(local.top > this.clickRange[0] && local.top < this.clickRange[1]){
rlm@46 33518 this.setValue(Math.round(local.left/this.getRatio()));
rlm@46 33519 }
rlm@46 33520 },
rlm@46 33521
rlm@46 33522
rlm@46 33523 onKeyDown : function(e){
rlm@46 33524 if(this.disabled){e.preventDefault();return;}
rlm@46 33525 var k = e.getKey();
rlm@46 33526 switch(k){
rlm@46 33527 case e.UP:
rlm@46 33528 case e.RIGHT:
rlm@46 33529 e.stopEvent();
rlm@46 33530 if(e.ctrlKey){
rlm@46 33531 this.setValue(this.maxValue);
rlm@46 33532 }else{
rlm@46 33533 this.setValue(this.value+this.keyIncrement);
rlm@46 33534 }
rlm@46 33535 break;
rlm@46 33536 case e.DOWN:
rlm@46 33537 case e.LEFT:
rlm@46 33538 e.stopEvent();
rlm@46 33539 if(e.ctrlKey){
rlm@46 33540 this.setValue(this.minValue);
rlm@46 33541 }else{
rlm@46 33542 this.setValue(this.value-this.keyIncrement);
rlm@46 33543 }
rlm@46 33544 break;
rlm@46 33545 default:
rlm@46 33546 e.preventDefault();
rlm@46 33547 }
rlm@46 33548 },
rlm@46 33549
rlm@46 33550
rlm@46 33551 doSnap : function(value){
rlm@46 33552 if(!this.increment || this.increment == 1 || !value) {
rlm@46 33553 return value;
rlm@46 33554 }
rlm@46 33555 var newValue = value, inc = this.increment;
rlm@46 33556 var m = value % inc;
rlm@46 33557 if(m > 0){
rlm@46 33558 if(m > (inc/2)){
rlm@46 33559 newValue = value + (inc-m);
rlm@46 33560 }else{
rlm@46 33561 newValue = value - m;
rlm@46 33562 }
rlm@46 33563 }
rlm@46 33564 return newValue.constrain(this.minValue, this.maxValue);
rlm@46 33565 },
rlm@46 33566
rlm@46 33567
rlm@46 33568 afterRender : function(){
rlm@46 33569 Ext.Slider.superclass.afterRender.apply(this, arguments);
rlm@46 33570 if(this.value !== undefined){
rlm@46 33571 var v = this.normalizeValue(this.value);
rlm@46 33572 if(v !== this.value){
rlm@46 33573 delete this.value;
rlm@46 33574 this.setValue(v, false);
rlm@46 33575 }else{
rlm@46 33576 this.moveThumb(this.translateValue(v), false);
rlm@46 33577 }
rlm@46 33578 }
rlm@46 33579 },
rlm@46 33580
rlm@46 33581
rlm@46 33582 getRatio : function(){
rlm@46 33583 var w = this.innerEl.getWidth();
rlm@46 33584 var v = this.maxValue - this.minValue;
rlm@46 33585 return w/v;
rlm@46 33586 },
rlm@46 33587
rlm@46 33588
rlm@46 33589 normalizeValue : function(v){
rlm@46 33590 if(typeof v != 'number'){
rlm@46 33591 v = parseInt(v);
rlm@46 33592 }
rlm@46 33593 v = Math.round(v);
rlm@46 33594 v = this.doSnap(v);
rlm@46 33595 v = v.constrain(this.minValue, this.maxValue);
rlm@46 33596 return v;
rlm@46 33597 },
rlm@46 33598
rlm@46 33599
rlm@46 33600 setValue : function(v, animate){
rlm@46 33601 v = this.normalizeValue(v);
rlm@46 33602 if(v !== this.value && this.fireEvent('beforechange', this, v, this.value) !== false){
rlm@46 33603 this.value = v;
rlm@46 33604 this.moveThumb(this.translateValue(v), animate !== false);
rlm@46 33605 this.fireEvent('change', this, v);
rlm@46 33606 }
rlm@46 33607 },
rlm@46 33608
rlm@46 33609
rlm@46 33610 translateValue : function(v){
rlm@46 33611 return (v * this.getRatio())-this.halfThumb;
rlm@46 33612 },
rlm@46 33613
rlm@46 33614
rlm@46 33615 moveThumb: function(v, animate){
rlm@46 33616 if(!animate || this.animate === false){
rlm@46 33617 this.thumb.setLeft(v);
rlm@46 33618 }else{
rlm@46 33619 this.thumb.shift({left: v, stopFx: true, duration:.35});
rlm@46 33620 }
rlm@46 33621 },
rlm@46 33622
rlm@46 33623
rlm@46 33624 focus : function(){
rlm@46 33625 this.focusEl.focus(10);
rlm@46 33626 },
rlm@46 33627
rlm@46 33628
rlm@46 33629 onBeforeDragStart : function(e){
rlm@46 33630 return !this.disabled;
rlm@46 33631 },
rlm@46 33632
rlm@46 33633
rlm@46 33634 onDragStart: function(e){
rlm@46 33635 this.thumb.addClass('x-slider-thumb-drag');
rlm@46 33636 this.fireEvent('dragstart', this, e);
rlm@46 33637 },
rlm@46 33638
rlm@46 33639
rlm@46 33640 onDrag: function(e){
rlm@46 33641 var pos = this.innerEl.translatePoints(this.tracker.getXY());
rlm@46 33642 this.setValue(Math.round(pos.left/this.getRatio()), false);
rlm@46 33643 this.fireEvent('drag', this, e);
rlm@46 33644 },
rlm@46 33645
rlm@46 33646
rlm@46 33647 onDragEnd: function(e){
rlm@46 33648 this.thumb.removeClass('x-slider-thumb-drag');
rlm@46 33649 this.fireEvent('dragend', this, e);
rlm@46 33650 },
rlm@46 33651
rlm@46 33652
rlm@46 33653 onResize : function(w, h){
rlm@46 33654 this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r')));
rlm@46 33655 },
rlm@46 33656
rlm@46 33657
rlm@46 33658 getValue : function(){
rlm@46 33659 return this.value;
rlm@46 33660 }
rlm@46 33661 });
rlm@46 33662 Ext.reg('slider', Ext.Slider);
rlm@46 33663
rlm@46 33664
rlm@46 33665 Ext.Slider.Vertical = {
rlm@46 33666 onResize : function(w, h){
rlm@46 33667 this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b')));
rlm@46 33668 },
rlm@46 33669
rlm@46 33670 getRatio : function(){
rlm@46 33671 var h = this.innerEl.getHeight();
rlm@46 33672 var v = this.maxValue - this.minValue;
rlm@46 33673 return h/v;
rlm@46 33674 },
rlm@46 33675
rlm@46 33676 moveThumb: function(v, animate){
rlm@46 33677 if(!animate || this.animate === false){
rlm@46 33678 this.thumb.setBottom(v);
rlm@46 33679 }else{
rlm@46 33680 this.thumb.shift({bottom: v, stopFx: true, duration:.35});
rlm@46 33681 }
rlm@46 33682 },
rlm@46 33683
rlm@46 33684 onDrag: function(e){
rlm@46 33685 var pos = this.innerEl.translatePoints(this.tracker.getXY());
rlm@46 33686 var bottom = this.innerEl.getHeight()-pos.top;
rlm@46 33687 this.setValue(Math.round(bottom/this.getRatio()), false);
rlm@46 33688 this.fireEvent('drag', this, e);
rlm@46 33689 },
rlm@46 33690
rlm@46 33691 onClickChange : function(local){
rlm@46 33692 if(local.left > this.clickRange[0] && local.left < this.clickRange[1]){
rlm@46 33693 var bottom = this.innerEl.getHeight()-local.top;
rlm@46 33694 this.setValue(Math.round(bottom/this.getRatio()));
rlm@46 33695 }
rlm@46 33696 }
rlm@46 33697 };
rlm@46 33698
rlm@46 33699 Ext.StatusBar = Ext.extend(Ext.Toolbar, {
rlm@46 33700
rlm@46 33701
rlm@46 33702
rlm@46 33703
rlm@46 33704
rlm@46 33705
rlm@46 33706
rlm@46 33707 cls : 'x-statusbar',
rlm@46 33708
rlm@46 33709 busyIconCls : 'x-status-busy',
rlm@46 33710
rlm@46 33711 busyText : 'Loading...',
rlm@46 33712
rlm@46 33713 autoClear : 5000,
rlm@46 33714
rlm@46 33715 activeThreadId : 0,
rlm@46 33716
rlm@46 33717 initComponent : function(){
rlm@46 33718 if(this.statusAlign=='right'){
rlm@46 33719 this.cls += ' x-status-right';
rlm@46 33720 }
rlm@46 33721 Ext.StatusBar.superclass.initComponent.call(this);
rlm@46 33722 },
rlm@46 33723
rlm@46 33724 afterRender : function(){
rlm@46 33725 Ext.StatusBar.superclass.afterRender.call(this);
rlm@46 33726
rlm@46 33727 var right = this.statusAlign=='right',
rlm@46 33728 td = Ext.get(this.nextBlock());
rlm@46 33729
rlm@46 33730 if(right){
rlm@46 33731 this.tr.appendChild(td.dom);
rlm@46 33732 }else{
rlm@46 33733 td.insertBefore(this.tr.firstChild);
rlm@46 33734 }
rlm@46 33735
rlm@46 33736 this.statusEl = td.createChild({
rlm@46 33737 cls: 'x-status-text ' + (this.iconCls || this.defaultIconCls || ''),
rlm@46 33738 html: this.text || this.defaultText || ''
rlm@46 33739 });
rlm@46 33740 this.statusEl.unselectable();
rlm@46 33741
rlm@46 33742 this.spacerEl = td.insertSibling({
rlm@46 33743 tag: 'td',
rlm@46 33744 style: 'width:100%',
rlm@46 33745 cn: [{cls:'ytb-spacer'}]
rlm@46 33746 }, right ? 'before' : 'after');
rlm@46 33747 },
rlm@46 33748
rlm@46 33749
rlm@46 33750 setStatus : function(o){
rlm@46 33751 o = o || {};
rlm@46 33752
rlm@46 33753 if(typeof o == 'string'){
rlm@46 33754 o = {text:o};
rlm@46 33755 }
rlm@46 33756 if(o.text !== undefined){
rlm@46 33757 this.setText(o.text);
rlm@46 33758 }
rlm@46 33759 if(o.iconCls !== undefined){
rlm@46 33760 this.setIcon(o.iconCls);
rlm@46 33761 }
rlm@46 33762
rlm@46 33763 if(o.clear){
rlm@46 33764 var c = o.clear,
rlm@46 33765 wait = this.autoClear,
rlm@46 33766 defaults = {useDefaults: true, anim: true};
rlm@46 33767
rlm@46 33768 if(typeof c == 'object'){
rlm@46 33769 c = Ext.applyIf(c, defaults);
rlm@46 33770 if(c.wait){
rlm@46 33771 wait = c.wait;
rlm@46 33772 }
rlm@46 33773 }else if(typeof c == 'number'){
rlm@46 33774 wait = c;
rlm@46 33775 c = defaults;
rlm@46 33776 }else if(typeof c == 'boolean'){
rlm@46 33777 c = defaults;
rlm@46 33778 }
rlm@46 33779
rlm@46 33780 c.threadId = this.activeThreadId;
rlm@46 33781 this.clearStatus.defer(wait, this, [c]);
rlm@46 33782 }
rlm@46 33783 return this;
rlm@46 33784 },
rlm@46 33785
rlm@46 33786
rlm@46 33787 clearStatus : function(o){
rlm@46 33788 o = o || {};
rlm@46 33789
rlm@46 33790 if(o.threadId && o.threadId !== this.activeThreadId){
rlm@46 33791 return this;
rlm@46 33792 }
rlm@46 33793
rlm@46 33794 var text = o.useDefaults ? this.defaultText : '',
rlm@46 33795 iconCls = o.useDefaults ? this.defaultIconCls : '';
rlm@46 33796
rlm@46 33797 if(o.anim){
rlm@46 33798 this.statusEl.fadeOut({
rlm@46 33799 remove: false,
rlm@46 33800 useDisplay: true,
rlm@46 33801 scope: this,
rlm@46 33802 callback: function(){
rlm@46 33803 this.setStatus({
rlm@46 33804 text: text,
rlm@46 33805 iconCls: iconCls
rlm@46 33806 });
rlm@46 33807 this.statusEl.show();
rlm@46 33808 }
rlm@46 33809 });
rlm@46 33810 }else{
rlm@46 33811 this.statusEl.hide();
rlm@46 33812 this.setStatus({
rlm@46 33813 text: text,
rlm@46 33814 iconCls: iconCls
rlm@46 33815 });
rlm@46 33816 this.statusEl.show();
rlm@46 33817 }
rlm@46 33818 return this;
rlm@46 33819 },
rlm@46 33820
rlm@46 33821
rlm@46 33822 setText : function(text){
rlm@46 33823 this.activeThreadId++;
rlm@46 33824 this.text = text || '';
rlm@46 33825 if(this.rendered){
rlm@46 33826 this.statusEl.update(this.text);
rlm@46 33827 }
rlm@46 33828 return this;
rlm@46 33829 },
rlm@46 33830
rlm@46 33831
rlm@46 33832 getText : function(){
rlm@46 33833 return this.text;
rlm@46 33834 },
rlm@46 33835
rlm@46 33836
rlm@46 33837 setIcon : function(cls){
rlm@46 33838 this.activeThreadId++;
rlm@46 33839 cls = cls || '';
rlm@46 33840
rlm@46 33841 if(this.rendered){
rlm@46 33842 if(this.currIconCls){
rlm@46 33843 this.statusEl.removeClass(this.currIconCls);
rlm@46 33844 this.currIconCls = null;
rlm@46 33845 }
rlm@46 33846 if(cls.length > 0){
rlm@46 33847 this.statusEl.addClass(cls);
rlm@46 33848 this.currIconCls = cls;
rlm@46 33849 }
rlm@46 33850 }else{
rlm@46 33851 this.currIconCls = cls;
rlm@46 33852 }
rlm@46 33853 return this;
rlm@46 33854 },
rlm@46 33855
rlm@46 33856
rlm@46 33857 showBusy : function(o){
rlm@46 33858 if(typeof o == 'string'){
rlm@46 33859 o = {text:o};
rlm@46 33860 }
rlm@46 33861 o = Ext.applyIf(o || {}, {
rlm@46 33862 text: this.busyText,
rlm@46 33863 iconCls: this.busyIconCls
rlm@46 33864 });
rlm@46 33865 return this.setStatus(o);
rlm@46 33866 }
rlm@46 33867 });
rlm@46 33868 Ext.reg('statusbar', Ext.StatusBar);
rlm@46 33869
rlm@46 33870 Ext.debug = {};
rlm@46 33871
rlm@46 33872 (function(){
rlm@46 33873
rlm@46 33874 var cp;
rlm@46 33875
rlm@46 33876 function createConsole(){
rlm@46 33877
rlm@46 33878 var scriptPanel = new Ext.debug.ScriptsPanel();
rlm@46 33879 var logView = new Ext.debug.LogPanel();
rlm@46 33880 var tree = new Ext.debug.DomTree();
rlm@46 33881
rlm@46 33882 var tabs = new Ext.TabPanel({
rlm@46 33883 activeTab: 0,
rlm@46 33884 border: false,
rlm@46 33885 tabPosition: 'bottom',
rlm@46 33886 items: [{
rlm@46 33887 title: 'Debug Console',
rlm@46 33888 layout:'border',
rlm@46 33889 items: [logView, scriptPanel]
rlm@46 33890 },{
rlm@46 33891 title: 'DOM Inspector',
rlm@46 33892 layout:'border',
rlm@46 33893 items: [tree]
rlm@46 33894 }]
rlm@46 33895 });
rlm@46 33896
rlm@46 33897 cp = new Ext.Panel({
rlm@46 33898 id: 'x-debug-browser',
rlm@46 33899 title: 'Console',
rlm@46 33900 collapsible: true,
rlm@46 33901 animCollapse: false,
rlm@46 33902 style: 'position:absolute;left:0;bottom:0;',
rlm@46 33903 height:200,
rlm@46 33904 logView: logView,
rlm@46 33905 layout: 'fit',
rlm@46 33906
rlm@46 33907 tools:[{
rlm@46 33908 id: 'close',
rlm@46 33909 handler: function(){
rlm@46 33910 cp.destroy();
rlm@46 33911 cp = null;
rlm@46 33912 Ext.EventManager.removeResizeListener(handleResize);
rlm@46 33913 }
rlm@46 33914 }],
rlm@46 33915
rlm@46 33916 items: tabs
rlm@46 33917 });
rlm@46 33918
rlm@46 33919 cp.render(document.body);
rlm@46 33920
rlm@46 33921 cp.resizer = new Ext.Resizable(cp.el, {
rlm@46 33922 minHeight:50,
rlm@46 33923 handles: "n",
rlm@46 33924 pinned: true,
rlm@46 33925 transparent:true,
rlm@46 33926 resizeElement : function(){
rlm@46 33927 var box = this.proxy.getBox();
rlm@46 33928 this.proxy.hide();
rlm@46 33929 cp.setHeight(box.height);
rlm@46 33930 return box;
rlm@46 33931 }
rlm@46 33932 });
rlm@46 33933
rlm@46 33934 function handleResize(){
rlm@46 33935 cp.setWidth(Ext.getBody().getViewSize().width);
rlm@46 33936 }
rlm@46 33937 Ext.EventManager.onWindowResize(handleResize);
rlm@46 33938
rlm@46 33939 handleResize();
rlm@46 33940 }
rlm@46 33941
rlm@46 33942
rlm@46 33943 Ext.apply(Ext, {
rlm@46 33944 log : function(){
rlm@46 33945 if(!cp){
rlm@46 33946 createConsole();
rlm@46 33947 }
rlm@46 33948 cp.logView.log.apply(cp.logView, arguments);
rlm@46 33949 },
rlm@46 33950
rlm@46 33951 logf : function(format, arg1, arg2, etc){
rlm@46 33952 Ext.log(String.format.apply(String, arguments));
rlm@46 33953 },
rlm@46 33954
rlm@46 33955 dump : function(o){
rlm@46 33956 if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || Ext.isDate(o)){
rlm@46 33957 Ext.log(o);
rlm@46 33958 }else if(!o){
rlm@46 33959 Ext.log("null");
rlm@46 33960 }else if(typeof o != "object"){
rlm@46 33961 Ext.log('Unknown return type');
rlm@46 33962 }else if(Ext.isArray(o)){
rlm@46 33963 Ext.log('['+o.join(',')+']');
rlm@46 33964 }else{
rlm@46 33965 var b = ["{\n"];
rlm@46 33966 for(var key in o){
rlm@46 33967 var to = typeof o[key];
rlm@46 33968 if(to != "function" && to != "object"){
rlm@46 33969 b.push(String.format(" {0}: {1},\n", key, o[key]));
rlm@46 33970 }
rlm@46 33971 }
rlm@46 33972 var s = b.join("");
rlm@46 33973 if(s.length > 3){
rlm@46 33974 s = s.substr(0, s.length-2);
rlm@46 33975 }
rlm@46 33976 Ext.log(s + "\n}");
rlm@46 33977 }
rlm@46 33978 },
rlm@46 33979
rlm@46 33980 _timers : {},
rlm@46 33981
rlm@46 33982 time : function(name){
rlm@46 33983 name = name || "def";
rlm@46 33984 Ext._timers[name] = new Date().getTime();
rlm@46 33985 },
rlm@46 33986
rlm@46 33987 timeEnd : function(name, printResults){
rlm@46 33988 var t = new Date().getTime();
rlm@46 33989 name = name || "def";
rlm@46 33990 var v = String.format("{0} ms", t-Ext._timers[name]);
rlm@46 33991 Ext._timers[name] = new Date().getTime();
rlm@46 33992 if(printResults !== false){
rlm@46 33993 Ext.log('Timer ' + (name == "def" ? v : name + ": " + v));
rlm@46 33994 }
rlm@46 33995 return v;
rlm@46 33996 }
rlm@46 33997 });
rlm@46 33998
rlm@46 33999 })();
rlm@46 34000
rlm@46 34001
rlm@46 34002 Ext.debug.ScriptsPanel = Ext.extend(Ext.Panel, {
rlm@46 34003 id:'x-debug-scripts',
rlm@46 34004 region: 'east',
rlm@46 34005 minWidth: 200,
rlm@46 34006 split: true,
rlm@46 34007 width: 350,
rlm@46 34008 border: false,
rlm@46 34009 layout:'anchor',
rlm@46 34010 style:'border-width:0 0 0 1px;',
rlm@46 34011
rlm@46 34012 initComponent : function(){
rlm@46 34013
rlm@46 34014 this.scriptField = new Ext.form.TextArea({
rlm@46 34015 anchor: '100% -26',
rlm@46 34016 style:'border-width:0;'
rlm@46 34017 });
rlm@46 34018
rlm@46 34019 this.trapBox = new Ext.form.Checkbox({
rlm@46 34020 id: 'console-trap',
rlm@46 34021 boxLabel: 'Trap Errors',
rlm@46 34022 checked: true
rlm@46 34023 });
rlm@46 34024
rlm@46 34025 this.toolbar = new Ext.Toolbar([{
rlm@46 34026 text: 'Run',
rlm@46 34027 scope: this,
rlm@46 34028 handler: this.evalScript
rlm@46 34029 },{
rlm@46 34030 text: 'Clear',
rlm@46 34031 scope: this,
rlm@46 34032 handler: this.clear
rlm@46 34033 },
rlm@46 34034 '->',
rlm@46 34035 this.trapBox,
rlm@46 34036 ' ', ' '
rlm@46 34037 ]);
rlm@46 34038
rlm@46 34039 this.items = [this.toolbar, this.scriptField];
rlm@46 34040
rlm@46 34041 Ext.debug.ScriptsPanel.superclass.initComponent.call(this);
rlm@46 34042 },
rlm@46 34043
rlm@46 34044 evalScript : function(){
rlm@46 34045 var s = this.scriptField.getValue();
rlm@46 34046 if(this.trapBox.getValue()){
rlm@46 34047 try{
rlm@46 34048 var rt = eval(s);
rlm@46 34049 Ext.dump(rt === undefined? '(no return)' : rt);
rlm@46 34050 }catch(e){
rlm@46 34051 Ext.log(e.message || e.descript);
rlm@46 34052 }
rlm@46 34053 }else{
rlm@46 34054 var rt = eval(s);
rlm@46 34055 Ext.dump(rt === undefined? '(no return)' : rt);
rlm@46 34056 }
rlm@46 34057 },
rlm@46 34058
rlm@46 34059 clear : function(){
rlm@46 34060 this.scriptField.setValue('');
rlm@46 34061 this.scriptField.focus();
rlm@46 34062 }
rlm@46 34063
rlm@46 34064 });
rlm@46 34065
rlm@46 34066 Ext.debug.LogPanel = Ext.extend(Ext.Panel, {
rlm@46 34067 autoScroll: true,
rlm@46 34068 region: 'center',
rlm@46 34069 border: false,
rlm@46 34070 style:'border-width:0 1px 0 0',
rlm@46 34071
rlm@46 34072 log : function(){
rlm@46 34073 var markup = [ '<div style="padding:5px !important;border-bottom:1px solid #ccc;">',
rlm@46 34074 Ext.util.Format.htmlEncode(Array.prototype.join.call(arguments, ', ')).replace(/\n/g, '<br />').replace(/\s/g, '&#160;'),
rlm@46 34075 '</div>'].join('');
rlm@46 34076
rlm@46 34077 this.body.insertHtml('beforeend', markup);
rlm@46 34078 this.body.scrollTo('top', 100000);
rlm@46 34079 },
rlm@46 34080
rlm@46 34081 clear : function(){
rlm@46 34082 this.body.update('');
rlm@46 34083 this.body.dom.scrollTop = 0;
rlm@46 34084 }
rlm@46 34085 });
rlm@46 34086
rlm@46 34087 Ext.debug.DomTree = Ext.extend(Ext.tree.TreePanel, {
rlm@46 34088 enableDD:false ,
rlm@46 34089 lines:false,
rlm@46 34090 rootVisible:false,
rlm@46 34091 animate:false,
rlm@46 34092 hlColor:'ffff9c',
rlm@46 34093 autoScroll: true,
rlm@46 34094 region:'center',
rlm@46 34095 border:false,
rlm@46 34096
rlm@46 34097 initComponent : function(){
rlm@46 34098
rlm@46 34099
rlm@46 34100 Ext.debug.DomTree.superclass.initComponent.call(this);
rlm@46 34101
rlm@46 34102 var styles = false, hnode;
rlm@46 34103 var nonSpace = /^\s*$/;
rlm@46 34104 var html = Ext.util.Format.htmlEncode;
rlm@46 34105 var ellipsis = Ext.util.Format.ellipsis;
rlm@46 34106 var styleRe = /\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi;
rlm@46 34107
rlm@46 34108 function findNode(n){
rlm@46 34109 if(!n || n.nodeType != 1 || n == document.body || n == document){
rlm@46 34110 return false;
rlm@46 34111 }
rlm@46 34112 var pn = [n], p = n;
rlm@46 34113 while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){
rlm@46 34114 pn.unshift(p);
rlm@46 34115 }
rlm@46 34116 var cn = hnode;
rlm@46 34117 for(var i = 0, len = pn.length; i < len; i++){
rlm@46 34118 cn.expand();
rlm@46 34119 cn = cn.findChild('htmlNode', pn[i]);
rlm@46 34120 if(!cn){ return false;
rlm@46 34121 }
rlm@46 34122 }
rlm@46 34123 cn.select();
rlm@46 34124 var a = cn.ui.anchor;
rlm@46 34125 treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10);
rlm@46 34126 cn.highlight();
rlm@46 34127 return true;
rlm@46 34128 }
rlm@46 34129
rlm@46 34130 function nodeTitle(n){
rlm@46 34131 var s = n.tagName;
rlm@46 34132 if(n.id){
rlm@46 34133 s += '#'+n.id;
rlm@46 34134 }else if(n.className){
rlm@46 34135 s += '.'+n.className;
rlm@46 34136 }
rlm@46 34137 return s;
rlm@46 34138 }
rlm@46 34139
rlm@46 34140 function onNodeSelect(t, n, last){
rlm@46 34141 return;
rlm@46 34142 if(last && last.unframe){
rlm@46 34143 last.unframe();
rlm@46 34144 }
rlm@46 34145 var props = {};
rlm@46 34146 if(n && n.htmlNode){
rlm@46 34147 if(frameEl.pressed){
rlm@46 34148 n.frame();
rlm@46 34149 }
rlm@46 34150 if(inspecting){
rlm@46 34151 return;
rlm@46 34152 }
rlm@46 34153 addStyle.enable();
rlm@46 34154 reload.setDisabled(n.leaf);
rlm@46 34155 var dom = n.htmlNode;
rlm@46 34156 stylePanel.setTitle(nodeTitle(dom));
rlm@46 34157 if(styles && !showAll.pressed){
rlm@46 34158 var s = dom.style ? dom.style.cssText : '';
rlm@46 34159 if(s){
rlm@46 34160 var m;
rlm@46 34161 while ((m = styleRe.exec(s)) != null){
rlm@46 34162 props[m[1].toLowerCase()] = m[2];
rlm@46 34163 }
rlm@46 34164 }
rlm@46 34165 }else if(styles){
rlm@46 34166 var cl = Ext.debug.cssList;
rlm@46 34167 var s = dom.style, fly = Ext.fly(dom);
rlm@46 34168 if(s){
rlm@46 34169 for(var i = 0, len = cl.length; i<len; i++){
rlm@46 34170 var st = cl[i];
rlm@46 34171 var v = s[st] || fly.getStyle(st);
rlm@46 34172 if(v != undefined && v !== null && v !== ''){
rlm@46 34173 props[st] = v;
rlm@46 34174 }
rlm@46 34175 }
rlm@46 34176 }
rlm@46 34177 }else{
rlm@46 34178 for(var a in dom){
rlm@46 34179 var v = dom[a];
rlm@46 34180 if((isNaN(a+10)) && v != undefined && v !== null && v !== '' && !(Ext.isGecko && a[0] == a[0].toUpperCase())){
rlm@46 34181 props[a] = v;
rlm@46 34182 }
rlm@46 34183 }
rlm@46 34184 }
rlm@46 34185 }else{
rlm@46 34186 if(inspecting){
rlm@46 34187 return;
rlm@46 34188 }
rlm@46 34189 addStyle.disable();
rlm@46 34190 reload.disabled();
rlm@46 34191 }
rlm@46 34192 stylesGrid.setSource(props);
rlm@46 34193 stylesGrid.treeNode = n;
rlm@46 34194 stylesGrid.view.fitColumns();
rlm@46 34195 }
rlm@46 34196
rlm@46 34197 this.loader = new Ext.tree.TreeLoader();
rlm@46 34198 this.loader.load = function(n, cb){
rlm@46 34199 var isBody = n.htmlNode == document.body;
rlm@46 34200 var cn = n.htmlNode.childNodes;
rlm@46 34201 for(var i = 0, c; c = cn[i]; i++){
rlm@46 34202 if(isBody && c.id == 'x-debug-browser'){
rlm@46 34203 continue;
rlm@46 34204 }
rlm@46 34205 if(c.nodeType == 1){
rlm@46 34206 n.appendChild(new Ext.debug.HtmlNode(c));
rlm@46 34207 }else if(c.nodeType == 3 && !nonSpace.test(c.nodeValue)){
rlm@46 34208 n.appendChild(new Ext.tree.TreeNode({
rlm@46 34209 text:'<em>' + ellipsis(html(String(c.nodeValue)), 35) + '</em>',
rlm@46 34210 cls: 'x-tree-noicon'
rlm@46 34211 }));
rlm@46 34212 }
rlm@46 34213 }
rlm@46 34214 cb();
rlm@46 34215 };
rlm@46 34216
rlm@46 34217
rlm@46 34218 this.root = this.setRootNode(new Ext.tree.TreeNode('Ext'));
rlm@46 34219
rlm@46 34220 hnode = this.root.appendChild(new Ext.debug.HtmlNode(
rlm@46 34221 document.getElementsByTagName('html')[0]
rlm@46 34222 ));
rlm@46 34223
rlm@46 34224 }
rlm@46 34225 });
rlm@46 34226
rlm@46 34227
rlm@46 34228 Ext.debug.HtmlNode = function(){
rlm@46 34229 var html = Ext.util.Format.htmlEncode;
rlm@46 34230 var ellipsis = Ext.util.Format.ellipsis;
rlm@46 34231 var nonSpace = /^\s*$/;
rlm@46 34232
rlm@46 34233 var attrs = [
rlm@46 34234 {n: 'id', v: 'id'},
rlm@46 34235 {n: 'className', v: 'class'},
rlm@46 34236 {n: 'name', v: 'name'},
rlm@46 34237 {n: 'type', v: 'type'},
rlm@46 34238 {n: 'src', v: 'src'},
rlm@46 34239 {n: 'href', v: 'href'}
rlm@46 34240 ];
rlm@46 34241
rlm@46 34242 function hasChild(n){
rlm@46 34243 for(var i = 0, c; c = n.childNodes[i]; i++){
rlm@46 34244 if(c.nodeType == 1){
rlm@46 34245 return true;
rlm@46 34246 }
rlm@46 34247 }
rlm@46 34248 return false;
rlm@46 34249 }
rlm@46 34250
rlm@46 34251 function renderNode(n, leaf){
rlm@46 34252 var tag = n.tagName.toLowerCase();
rlm@46 34253 var s = '&lt;' + tag;
rlm@46 34254 for(var i = 0, len = attrs.length; i < len; i++){
rlm@46 34255 var a = attrs[i];
rlm@46 34256 var v = n[a.n];
rlm@46 34257 if(v && !nonSpace.test(v)){
rlm@46 34258 s += ' ' + a.v + '=&quot;<i>' + html(v) +'</i>&quot;';
rlm@46 34259 }
rlm@46 34260 }
rlm@46 34261 var style = n.style ? n.style.cssText : '';
rlm@46 34262 if(style){
rlm@46 34263 s += ' style=&quot;<i>' + html(style.toLowerCase()) +'</i>&quot;';
rlm@46 34264 }
rlm@46 34265 if(leaf && n.childNodes.length > 0){
rlm@46 34266 s+='&gt;<em>' + ellipsis(html(String(n.innerHTML)), 35) + '</em>&lt;/'+tag+'&gt;';
rlm@46 34267 }else if(leaf){
rlm@46 34268 s += ' /&gt;';
rlm@46 34269 }else{
rlm@46 34270 s += '&gt;';
rlm@46 34271 }
rlm@46 34272 return s;
rlm@46 34273 }
rlm@46 34274
rlm@46 34275 var HtmlNode = function(n){
rlm@46 34276 var leaf = !hasChild(n);
rlm@46 34277 this.htmlNode = n;
rlm@46 34278 this.tagName = n.tagName.toLowerCase();
rlm@46 34279 var attr = {
rlm@46 34280 text : renderNode(n, leaf),
rlm@46 34281 leaf : leaf,
rlm@46 34282 cls: 'x-tree-noicon'
rlm@46 34283 };
rlm@46 34284 HtmlNode.superclass.constructor.call(this, attr);
rlm@46 34285 this.attributes.htmlNode = n; if(!leaf){
rlm@46 34286 this.on('expand', this.onExpand, this);
rlm@46 34287 this.on('collapse', this.onCollapse, this);
rlm@46 34288 }
rlm@46 34289 };
rlm@46 34290
rlm@46 34291
rlm@46 34292 Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, {
rlm@46 34293 cls: 'x-tree-noicon',
rlm@46 34294 preventHScroll: true,
rlm@46 34295 refresh : function(highlight){
rlm@46 34296 var leaf = !hasChild(this.htmlNode);
rlm@46 34297 this.setText(renderNode(this.htmlNode, leaf));
rlm@46 34298 if(highlight){
rlm@46 34299 Ext.fly(this.ui.textNode).highlight();
rlm@46 34300 }
rlm@46 34301 },
rlm@46 34302
rlm@46 34303 onExpand : function(){
rlm@46 34304 if(!this.closeNode && this.parentNode){
rlm@46 34305 this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({
rlm@46 34306 text:'&lt;/' + this.tagName + '&gt;',
rlm@46 34307 cls: 'x-tree-noicon'
rlm@46 34308 }), this.nextSibling);
rlm@46 34309 }else if(this.closeNode){
rlm@46 34310 this.closeNode.ui.show();
rlm@46 34311 }
rlm@46 34312 },
rlm@46 34313
rlm@46 34314 onCollapse : function(){
rlm@46 34315 if(this.closeNode){
rlm@46 34316 this.closeNode.ui.hide();
rlm@46 34317 }
rlm@46 34318 },
rlm@46 34319
rlm@46 34320 render : function(bulkRender){
rlm@46 34321 HtmlNode.superclass.render.call(this, bulkRender);
rlm@46 34322 },
rlm@46 34323
rlm@46 34324 highlightNode : function(){
rlm@46 34325 },
rlm@46 34326
rlm@46 34327 highlight : function(){
rlm@46 34328 },
rlm@46 34329
rlm@46 34330 frame : function(){
rlm@46 34331 this.htmlNode.style.border = '1px solid #0000ff';
rlm@46 34332 },
rlm@46 34333
rlm@46 34334 unframe : function(){
rlm@46 34335 this.htmlNode.style.border = '';
rlm@46 34336 }
rlm@46 34337 });
rlm@46 34338
rlm@46 34339 return HtmlNode;
rlm@46 34340 }();
rlm@46 34341
rlm@46 34342
rlm@46 34343