[ Index ]

PHP Cross Reference of Joomla 1.5.26 DE

title

Body

[close]

/plugins/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/ -> editor_plugin_src.js (source)

   1  /**
   2   * $Id: editor_plugin_src.js 1150 2009-06-01 11:50:46Z spocke $
   3   *
   4   * @author Moxiecode
   5   * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
   6   */
   7  
   8  (function() {
   9      var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;
  10  
  11      tinymce.create('tinymce.plugins.InlinePopups', {
  12          init : function(ed, url) {
  13              // Replace window manager
  14              ed.onBeforeRenderUI.add(function() {
  15                  ed.windowManager = new tinymce.InlineWindowManager(ed);
  16                  DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css");
  17              });
  18          },
  19  
  20          getInfo : function() {
  21              return {
  22                  longname : 'InlinePopups',
  23                  author : 'Moxiecode Systems AB',
  24                  authorurl : 'http://tinymce.moxiecode.com',
  25                  infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',
  26                  version : tinymce.majorVersion + "." + tinymce.minorVersion
  27              };
  28          }
  29      });
  30  
  31      tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', {
  32          InlineWindowManager : function(ed) {
  33              var t = this;
  34  
  35              t.parent(ed);
  36              t.zIndex = 300000;
  37              t.count = 0;
  38              t.windows = {};
  39          },
  40  
  41          open : function(f, p) {
  42              var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u;
  43  
  44              f = f || {};
  45              p = p || {};
  46  
  47              // Run native windows
  48              if (!f.inline)
  49                  return t.parent(f, p);
  50  
  51              // Only store selection if the type is a normal window
  52              if (!f.type)
  53                  t.bookmark = ed.selection.getBookmark(1);
  54  
  55              id = DOM.uniqueId();
  56              vp = DOM.getViewPort();
  57              f.width = parseInt(f.width || 320);
  58              f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0);
  59              f.min_width = parseInt(f.min_width || 150);
  60              f.min_height = parseInt(f.min_height || 100);
  61              f.max_width = parseInt(f.max_width || 2000);
  62              f.max_height = parseInt(f.max_height || 2000);
  63              f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0)));
  64              f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0)));
  65              f.movable = f.resizable = true;
  66              p.mce_width = f.width;
  67              p.mce_height = f.height;
  68              p.mce_inline = true;
  69              p.mce_window_id = id;
  70              p.mce_auto_focus = f.auto_focus;
  71  
  72              // Transpose
  73  //            po = DOM.getPos(ed.getContainer());
  74  //            f.left -= po.x;
  75  //            f.top -= po.y;
  76  
  77              t.features = f;
  78              t.params = p;
  79              t.onOpen.dispatch(t, f, p);
  80  
  81              if (f.type) {
  82                  opt += ' mceModal';
  83  
  84                  if (f.type)
  85                      opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1);
  86  
  87                  f.resizable = false;
  88              }
  89  
  90              if (f.statusbar)
  91                  opt += ' mceStatusbar';
  92  
  93              if (f.resizable)
  94                  opt += ' mceResizable';
  95  
  96              if (f.minimizable)
  97                  opt += ' mceMinimizable';
  98  
  99              if (f.maximizable)
 100                  opt += ' mceMaximizable';
 101  
 102              if (f.movable)
 103                  opt += ' mceMovable';
 104  
 105              // Create DOM objects
 106              t._addAll(DOM.doc.body, 
 107                  ['div', {id : id, 'class' : ed.settings.inlinepopups_skin || 'clearlooks2', style : 'width:100px;height:100px'}, 
 108                      ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt},
 109                          ['div', {id : id + '_top', 'class' : 'mceTop'}, 
 110                              ['div', {'class' : 'mceLeft'}],
 111                              ['div', {'class' : 'mceCenter'}],
 112                              ['div', {'class' : 'mceRight'}],
 113                              ['span', {id : id + '_title'}, f.title || '']
 114                          ],
 115  
 116                          ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, 
 117                              ['div', {id : id + '_left', 'class' : 'mceLeft'}],
 118                              ['span', {id : id + '_content'}],
 119                              ['div', {id : id + '_right', 'class' : 'mceRight'}]
 120                          ],
 121  
 122                          ['div', {id : id + '_bottom', 'class' : 'mceBottom'},
 123                              ['div', {'class' : 'mceLeft'}],
 124                              ['div', {'class' : 'mceCenter'}],
 125                              ['div', {'class' : 'mceRight'}],
 126                              ['span', {id : id + '_status'}, 'Content']
 127                          ],
 128  
 129                          ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}],
 130                          ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
 131                          ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
 132                          ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
 133                          ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
 134                          ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}],
 135                          ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}],
 136                          ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}],
 137                          ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}],
 138                          ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}],
 139                          ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}],
 140                          ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}],
 141                          ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}]
 142                      ]
 143                  ]
 144              );
 145  
 146              DOM.setStyles(id, {top : -10000, left : -10000});
 147  
 148              // Fix gecko rendering bug, where the editors iframe messed with window contents
 149              if (tinymce.isGecko)
 150                  DOM.setStyle(id, 'overflow', 'auto');
 151  
 152              // Measure borders
 153              if (!f.type) {
 154                  dw += DOM.get(id + '_left').clientWidth;
 155                  dw += DOM.get(id + '_right').clientWidth;
 156                  dh += DOM.get(id + '_top').clientHeight;
 157                  dh += DOM.get(id + '_bottom').clientHeight;
 158              }
 159  
 160              // Resize window
 161              DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh});
 162  
 163              u = f.url || f.file;
 164              if (u) {
 165                  if (tinymce.relaxedDomain)
 166                      u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;
 167  
 168                  u = tinymce._addVer(u);
 169              }
 170  
 171              if (!f.type) {
 172                  DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'});
 173                  DOM.setStyles(id + '_ifr', {width : f.width, height : f.height});
 174                  DOM.setAttrib(id + '_ifr', 'src', u);
 175              } else {
 176                  DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok');
 177  
 178                  if (f.type == 'confirm')
 179                      DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel');
 180  
 181                  DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'});
 182                  DOM.setHTML(id + '_content', f.content.replace('\n', '<br />'));
 183              }
 184  
 185              // Register events
 186              mdf = Event.add(id, 'mousedown', function(e) {
 187                  var n = e.target, w, vp;
 188  
 189                  w = t.windows[id];
 190                  t.focus(id);
 191  
 192                  if (n.nodeName == 'A' || n.nodeName == 'a') {
 193                      if (n.className == 'mceMax') {
 194                          w.oldPos = w.element.getXY();
 195                          w.oldSize = w.element.getSize();
 196  
 197                          vp = DOM.getViewPort();
 198  
 199                          // Reduce viewport size to avoid scrollbars
 200                          vp.w -= 2;
 201                          vp.h -= 2;
 202  
 203                          w.element.moveTo(vp.x, vp.y);
 204                          w.element.resizeTo(vp.w, vp.h);
 205                          DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight});
 206                          DOM.addClass(id + '_wrapper', 'mceMaximized');
 207                      } else if (n.className == 'mceMed') {
 208                          // Reset to old size
 209                          w.element.moveTo(w.oldPos.x, w.oldPos.y);
 210                          w.element.resizeTo(w.oldSize.w, w.oldSize.h);
 211                          w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight);
 212  
 213                          DOM.removeClass(id + '_wrapper', 'mceMaximized');
 214                      } else if (n.className == 'mceMove')
 215                          return t._startDrag(id, e, n.className);
 216                      else if (DOM.hasClass(n, 'mceResize'))
 217                          return t._startDrag(id, e, n.className.substring(13));
 218                  }
 219              });
 220  
 221              clf = Event.add(id, 'click', function(e) {
 222                  var n = e.target;
 223  
 224                  t.focus(id);
 225  
 226                  if (n.nodeName == 'A' || n.nodeName == 'a') {
 227                      switch (n.className) {
 228                          case 'mceClose':
 229                              t.close(null, id);
 230                              return Event.cancel(e);
 231  
 232                          case 'mceButton mceOk':
 233                          case 'mceButton mceCancel':
 234                              f.button_func(n.className == 'mceButton mceOk');
 235                              return Event.cancel(e);
 236                      }
 237                  }
 238              });
 239  
 240              // Add window
 241              w = t.windows[id] = {
 242                  id : id,
 243                  mousedown_func : mdf,
 244                  click_func : clf,
 245                  element : new Element(id, {blocker : 1, container : ed.getContainer()}),
 246                  iframeElement : new Element(id + '_ifr'),
 247                  features : f,
 248                  deltaWidth : dw,
 249                  deltaHeight : dh
 250              };
 251  
 252              w.iframeElement.on('focus', function() {
 253                  t.focus(id);
 254              });
 255  
 256              // Setup blocker
 257              if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') {
 258                  DOM.add(DOM.doc.body, 'div', {
 259                      id : 'mceModalBlocker',
 260                      'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker',
 261                      style : {zIndex : t.zIndex - 1}
 262                  });
 263  
 264                  DOM.show('mceModalBlocker'); // Reduces flicker in IE
 265              } else
 266                  DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1);
 267  
 268              if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel))
 269                  DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});
 270  
 271              t.focus(id);
 272              t._fixIELayout(id, 1);
 273  
 274              // Focus ok button
 275              if (DOM.get(id + '_ok'))
 276                  DOM.get(id + '_ok').focus();
 277  
 278              t.count++;
 279  
 280              return w;
 281          },
 282  
 283          focus : function(id) {
 284              var t = this, w;
 285  
 286              if (w = t.windows[id]) {
 287                  w.zIndex = this.zIndex++;
 288                  w.element.setStyle('zIndex', w.zIndex);
 289                  w.element.update();
 290  
 291                  id = id + '_wrapper';
 292                  DOM.removeClass(t.lastId, 'mceFocus');
 293                  DOM.addClass(id, 'mceFocus');
 294                  t.lastId = id;
 295              }
 296          },
 297  
 298          _addAll : function(te, ne) {
 299              var i, n, t = this, dom = tinymce.DOM;
 300  
 301              if (is(ne, 'string'))
 302                  te.appendChild(dom.doc.createTextNode(ne));
 303              else if (ne.length) {
 304                  te = te.appendChild(dom.create(ne[0], ne[1]));
 305  
 306                  for (i=2; i<ne.length; i++)
 307                      t._addAll(te, ne[i]);
 308              }
 309          },
 310  
 311          _startDrag : function(id, se, ac) {
 312              var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh;
 313  
 314              // Get positons and sizes
 315  //            cp = DOM.getPos(t.editor.getContainer());
 316              cp = {x : 0, y : 0};
 317              vp = DOM.getViewPort();
 318  
 319              // Reduce viewport size to avoid scrollbars while dragging
 320              vp.w -= 2;
 321              vp.h -= 2;
 322  
 323              sex = se.screenX;
 324              sey = se.screenY;
 325              dx = dy = dw = dh = 0;
 326  
 327              // Handle mouse up
 328              mu = Event.add(d, 'mouseup', function(e) {
 329                  Event.remove(d, 'mouseup', mu);
 330                  Event.remove(d, 'mousemove', mm);
 331  
 332                  if (eb)
 333                      eb.remove();
 334  
 335                  we.moveBy(dx, dy);
 336                  we.resizeBy(dw, dh);
 337                  sz = we.getSize();
 338                  DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight});
 339                  t._fixIELayout(id, 1);
 340  
 341                  return Event.cancel(e);
 342              });
 343  
 344              if (ac != 'Move')
 345                  startMove();
 346  
 347  			function startMove() {
 348                  if (eb)
 349                      return;
 350  
 351                  t._fixIELayout(id, 0);
 352  
 353                  // Setup event blocker
 354                  DOM.add(d.body, 'div', {
 355                      id : 'mceEventBlocker',
 356                      'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'),
 357                      style : {zIndex : t.zIndex + 1}
 358                  });
 359  
 360                  if (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel))
 361                      DOM.setStyles('mceEventBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});
 362  
 363                  eb = new Element('mceEventBlocker');
 364                  eb.update();
 365  
 366                  // Setup placeholder
 367                  p = we.getXY();
 368                  sz = we.getSize();
 369                  sx = cp.x + p.x - vp.x;
 370                  sy = cp.y + p.y - vp.y;
 371                  DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}});
 372                  ph = new Element('mcePlaceHolder');
 373              };
 374  
 375              // Handle mouse move/drag
 376              mm = Event.add(d, 'mousemove', function(e) {
 377                  var x, y, v;
 378  
 379                  startMove();
 380  
 381                  x = e.screenX - sex;
 382                  y = e.screenY - sey;
 383  
 384                  switch (ac) {
 385                      case 'ResizeW':
 386                          dx = x;
 387                          dw = 0 - x;
 388                          break;
 389  
 390                      case 'ResizeE':
 391                          dw = x;
 392                          break;
 393  
 394                      case 'ResizeN':
 395                      case 'ResizeNW':
 396                      case 'ResizeNE':
 397                          if (ac == "ResizeNW") {
 398                              dx = x;
 399                              dw = 0 - x;
 400                          } else if (ac == "ResizeNE")
 401                              dw = x;
 402  
 403                          dy = y;
 404                          dh = 0 - y;
 405                          break;
 406  
 407                      case 'ResizeS':
 408                      case 'ResizeSW':
 409                      case 'ResizeSE':
 410                          if (ac == "ResizeSW") {
 411                              dx = x;
 412                              dw = 0 - x;
 413                          } else if (ac == "ResizeSE")
 414                              dw = x;
 415  
 416                          dh = y;
 417                          break;
 418  
 419                      case 'mceMove':
 420                          dx = x;
 421                          dy = y;
 422                          break;
 423                  }
 424  
 425                  // Boundary check
 426                  if (dw < (v = w.features.min_width - sz.w)) {
 427                      if (dx !== 0)
 428                          dx += dw - v;
 429  
 430                      dw = v;
 431                  }
 432      
 433                  if (dh < (v = w.features.min_height - sz.h)) {
 434                      if (dy !== 0)
 435                          dy += dh - v;
 436  
 437                      dh = v;
 438                  }
 439  
 440                  dw = Math.min(dw, w.features.max_width - sz.w);
 441                  dh = Math.min(dh, w.features.max_height - sz.h);
 442                  dx = Math.max(dx, vp.x - (sx + vp.x));
 443                  dy = Math.max(dy, vp.y - (sy + vp.y));
 444                  dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x));
 445                  dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y));
 446  
 447                  // Move if needed
 448                  if (dx + dy !== 0) {
 449                      if (sx + dx < 0)
 450                          dx = 0;
 451      
 452                      if (sy + dy < 0)
 453                          dy = 0;
 454  
 455                      ph.moveTo(sx + dx, sy + dy);
 456                  }
 457  
 458                  // Resize if needed
 459                  if (dw + dh !== 0)
 460                      ph.resizeTo(sz.w + dw, sz.h + dh);
 461  
 462                  return Event.cancel(e);
 463              });
 464  
 465              return Event.cancel(se);
 466          },
 467  
 468          resizeBy : function(dw, dh, id) {
 469              var w = this.windows[id];
 470  
 471              if (w) {
 472                  w.element.resizeBy(dw, dh);
 473                  w.iframeElement.resizeBy(dw, dh);
 474              }
 475          },
 476  
 477          close : function(win, id) {
 478              var t = this, w, d = DOM.doc, ix = 0, fw, id;
 479  
 480              id = t._findId(id || win);
 481  
 482              // Probably not inline
 483              if (!t.windows[id]) {
 484                  t.parent(win);
 485                  return;
 486              }
 487  
 488              t.count--;
 489  
 490              if (t.count == 0)
 491                  DOM.remove('mceModalBlocker');
 492  
 493              if (w = t.windows[id]) {
 494                  t.onClose.dispatch(t);
 495                  Event.remove(d, 'mousedown', w.mousedownFunc);
 496                  Event.remove(d, 'click', w.clickFunc);
 497                  Event.clear(id);
 498                  Event.clear(id + '_ifr');
 499  
 500                  DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak
 501                  w.element.remove();
 502                  delete t.windows[id];
 503  
 504                  // Find front most window and focus that
 505                  each (t.windows, function(w) {
 506                      if (w.zIndex > ix) {
 507                          fw = w;
 508                          ix = w.zIndex;
 509                      }
 510                  });
 511  
 512                  if (fw)
 513                      t.focus(fw.id);
 514              }
 515          },
 516  
 517          setTitle : function(w, ti) {
 518              var e;
 519  
 520              w = this._findId(w);
 521  
 522              if (e = DOM.get(w + '_title'))
 523                  e.innerHTML = DOM.encode(ti);
 524          },
 525  
 526          alert : function(txt, cb, s) {
 527              var t = this, w;
 528  
 529              w = t.open({
 530                  title : t,
 531                  type : 'alert',
 532                  button_func : function(s) {
 533                      if (cb)
 534                          cb.call(s || t, s);
 535  
 536                      t.close(null, w.id);
 537                  },
 538                  content : DOM.encode(t.editor.getLang(txt, txt)),
 539                  inline : 1,
 540                  width : 400,
 541                  height : 130
 542              });
 543          },
 544  
 545          confirm : function(txt, cb, s) {
 546              var t = this, w;
 547  
 548              w = t.open({
 549                  title : t,
 550                  type : 'confirm',
 551                  button_func : function(s) {
 552                      if (cb)
 553                          cb.call(s || t, s);
 554  
 555                      t.close(null, w.id);
 556                  },
 557                  content : DOM.encode(t.editor.getLang(txt, txt)),
 558                  inline : 1,
 559                  width : 400,
 560                  height : 130
 561              });
 562          },
 563  
 564          // Internal functions
 565  
 566          _findId : function(w) {
 567              var t = this;
 568  
 569              if (typeof(w) == 'string')
 570                  return w;
 571  
 572              each(t.windows, function(wo) {
 573                  var ifr = DOM.get(wo.id + '_ifr');
 574  
 575                  if (ifr && w == ifr.contentWindow) {
 576                      w = wo.id;
 577                      return false;
 578                  }
 579              });
 580  
 581              return w;
 582          },
 583  
 584          _fixIELayout : function(id, s) {
 585              var w, img;
 586  
 587              if (!tinymce.isIE6)
 588                  return;
 589  
 590              // Fixes the bug where hover flickers and does odd things in IE6
 591              each(['n','s','w','e','nw','ne','sw','se'], function(v) {
 592                  var e = DOM.get(id + '_resize_' + v);
 593  
 594                  DOM.setStyles(e, {
 595                      width : s ? e.clientWidth : '',
 596                      height : s ? e.clientHeight : '',
 597                      cursor : DOM.getStyle(e, 'cursor', 1)
 598                  });
 599  
 600                  DOM.setStyle(id + "_bottom", 'bottom', '-1px');
 601  
 602                  e = 0;
 603              });
 604  
 605              // Fixes graphics glitch
 606              if (w = this.windows[id]) {
 607                  // Fixes rendering bug after resize
 608                  w.element.hide();
 609                  w.element.show();
 610  
 611                  // Forced a repaint of the window
 612                  //DOM.get(id).style.filter = '';
 613  
 614                  // IE has a bug where images used in CSS won't get loaded
 615                  // sometimes when the cache in the browser is disabled
 616                  // This fix tries to solve it by loading the images using the image object
 617                  each(DOM.select('div,a', id), function(e, i) {
 618                      if (e.currentStyle.backgroundImage != 'none') {
 619                          img = new Image();
 620                          img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1');
 621                      }
 622                  });
 623  
 624                  DOM.get(id).style.filter = '';
 625              }
 626          }
 627      });
 628  
 629      // Register plugin
 630      tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups);
 631  })();
 632  


Generated: Wed Mar 28 15:54:07 2012 Cross-referenced by PHPXref 0.7.1