[ Index ]
 

Code source de CMS made simple 1.0.5

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/lib/scriptaculous/ -> prototype.js (source)

   1  /*  Prototype JavaScript framework, version 1.4.0_pre2

   2   *  (c) 2005 Sam Stephenson <sam@conio.net>

   3   *

   4   *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff

   5   *  against the source tree, available from the Prototype darcs repository. 

   6   *

   7   *  Prototype is freely distributable under the terms of an MIT-style license.

   8   *

   9   *  For details, see the Prototype web site: http://prototype.conio.net/

  10   *

  11  /*--------------------------------------------------------------------------*/

  12  

  13  var Prototype = {

  14    Version: '1.4.0_pre2',

  15    emptyFunction: function() {}

  16  }

  17  

  18  var Class = {

  19    create: function() {

  20      return function() { 

  21        this.initialize.apply(this, arguments);

  22      }

  23    }

  24  }

  25  

  26  var Abstract = new Object();

  27  

  28  Object.extend = function(destination, source) {

  29    for (property in source) {

  30      destination[property] = source[property];

  31    }

  32    return destination;

  33  }

  34  

  35  /*

  36  Object.prototype.extend = function(object) {

  37    return Object.extend.apply(this, [this, object]);

  38  }

  39  */
  40  
  41  Function.prototype.bind = function(object) {
  42    var __method = this;
  43    return function() {
  44      return __method.apply(object, arguments);
  45    }
  46  }
  47  
  48  Function.prototype.bindAsEventListener = function(object) {
  49    var __method = this;
  50    return function(event) {
  51      return __method.call(object, event || window.event);
  52    }
  53  }
  54  
  55  Number.prototype.toColorPart = function() {
  56    var digits = this.toString(16);
  57    if (this < 16) return '0' + digits;
  58    return digits;
  59  }
  60  
  61  var Try = {
  62    these: function() {
  63      var returnValue;
  64  
  65      for (var i = 0; i < arguments.length; i++) {
  66        var lambda = arguments[i];
  67        try {
  68          returnValue = lambda();
  69          break;
  70        } catch (e) {}
  71      }
  72  
  73      return returnValue;
  74    }
  75  }
  76  
  77  /*--------------------------------------------------------------------------*/

  78  
  79  var PeriodicalExecuter = Class.create();
  80  PeriodicalExecuter.prototype = {
  81    initialize: function(callback, frequency) {
  82      this.callback = callback;
  83      this.frequency = frequency;
  84      this.currentlyExecuting = false;
  85  
  86      this.registerCallback();
  87    },
  88  
  89    registerCallback: function() {
  90      setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  91    },
  92  
  93    onTimerEvent: function() {
  94      if (!this.currentlyExecuting) {
  95        try { 
  96          this.currentlyExecuting = true;
  97          this.callback(); 
  98        } finally { 
  99          this.currentlyExecuting = false;
 100        }
 101      }
 102    }
 103  }
 104  
 105  /*--------------------------------------------------------------------------*/

 106  
 107  function $() {
 108    var elements = new Array();
 109  
 110    for (var i = 0; i < arguments.length; i++) {
 111      var element = arguments[i];
 112      if (typeof element == 'string')
 113        element = document.getElementById(element);
 114  
 115      if (arguments.length == 1) 
 116        return element;
 117  
 118      elements.push(element);
 119    }
 120  
 121    return elements;
 122  }
 123  
 124  if (!Array.prototype.push) {
 125    Array.prototype.push = function() {
 126          var startLength = this.length;
 127          for (var i = 0; i < arguments.length; i++)
 128        this[startLength + i] = arguments[i];
 129        return this.length;
 130    }
 131  }
 132  
 133  if (!Function.prototype.apply) {
 134    // Based on code from http://www.youngpup.net/

 135    Function.prototype.apply = function(object, parameters) {
 136      var parameterStrings = new Array();
 137      if (!object)     object = window;
 138      if (!parameters) parameters = new Array();
 139      
 140      for (var i = 0; i < parameters.length; i++)
 141        parameterStrings[i] = 'parameters[' + i + ']';
 142      
 143      object.__apply__ = this;
 144      var result = eval('object.__apply__(' + 
 145        parameterStrings.join(', ') + ')');
 146      object.__apply__ = null;
 147      
 148      return result;
 149    }
 150  }
 151  
 152  Object.extend(String.prototype, {
 153    stripTags: function() {
 154      return this.replace(/<\/?[^>]+>/gi, '');
 155    },
 156  
 157    escapeHTML: function() {
 158      var div = document.createElement('div');
 159      var text = document.createTextNode(this);
 160      div.appendChild(text);
 161      return div.innerHTML;
 162    },
 163  
 164    unescapeHTML: function() {
 165      var div = document.createElement('div');
 166      div.innerHTML = this.stripTags();
 167      return div.childNodes[0].nodeValue;
 168    }
 169  });
 170  
 171  var Ajax = {
 172    getTransport: function() {
 173      return Try.these(
 174        function() {return new ActiveXObject('Msxml2.XMLHTTP')},
 175        function() {return new ActiveXObject('Microsoft.XMLHTTP')},
 176        function() {return new XMLHttpRequest()}
 177      ) || false;
 178    }
 179  }
 180  
 181  Ajax.Base = function() {};
 182  Ajax.Base.prototype = {
 183    setOptions: function(options) {
 184      this.options = {
 185        method:       'post',
 186        asynchronous: true,
 187        parameters:   ''
 188      }
 189      Object.extend(this.options, options || {});
 190    },
 191  
 192    responseIsSuccess: function() {
 193      return this.transport.status == undefined
 194          || this.transport.status == 0 
 195          || (this.transport.status >= 200 && this.transport.status < 300);
 196    },
 197  
 198    responseIsFailure: function() {
 199      return !this.responseIsSuccess();
 200    }
 201  }
 202  
 203  Ajax.Request = Class.create();
 204  Ajax.Request.Events = 
 205    ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
 206  
 207  Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
 208    initialize: function(url, options) {
 209      this.transport = Ajax.getTransport();
 210      this.setOptions(options);
 211      this.request(url);
 212    },
 213  
 214    request: function(url) {
 215      var parameters = this.options.parameters || '';
 216      if (parameters.length > 0) parameters += '&_=';
 217  
 218      try {
 219        if (this.options.method == 'get')
 220          url += '?' + parameters;
 221  
 222        this.transport.open(this.options.method, url,
 223          this.options.asynchronous);
 224  
 225        if (this.options.asynchronous) {
 226          this.transport.onreadystatechange = this.onStateChange.bind(this);
 227          setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
 228        }
 229  
 230        this.setRequestHeaders();
 231  
 232        var body = this.options.postBody ? this.options.postBody : parameters;
 233        this.transport.send(this.options.method == 'post' ? body : null);
 234  
 235      } catch (e) {
 236      }
 237    },
 238  
 239    setRequestHeaders: function() {
 240      var requestHeaders = 
 241        ['X-Requested-With', 'XMLHttpRequest',
 242         'X-Prototype-Version', Prototype.Version];
 243  
 244      if (this.options.method == 'post') {
 245        requestHeaders.push('Content-type', 
 246          'application/x-www-form-urlencoded');
 247  
 248        /* Force "Connection: close" for Mozilla browsers to work around

 249         * a bug where XMLHttpReqeuest sends an incorrect Content-length

 250         * header. See Mozilla Bugzilla #246651. 

 251         */
 252        if (this.transport.overrideMimeType)
 253          requestHeaders.push('Connection', 'close');
 254      }
 255  
 256      if (this.options.requestHeaders)
 257        requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
 258  
 259      for (var i = 0; i < requestHeaders.length; i += 2)
 260        this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
 261    },
 262  
 263    onStateChange: function() {
 264      var readyState = this.transport.readyState;
 265      if (readyState != 1)
 266        this.respondToReadyState(this.transport.readyState);
 267    },
 268  
 269    respondToReadyState: function(readyState) {
 270      var event = Ajax.Request.Events[readyState];
 271  
 272      if (event == 'Complete')
 273        (this.options['on' + this.transport.status]
 274         || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
 275         || Prototype.emptyFunction)(this.transport);
 276  
 277      (this.options['on' + event] || Prototype.emptyFunction)(this.transport);
 278  
 279      /* Avoid memory leak in MSIE: clean up the oncomplete event handler */

 280      if (event == 'Complete')
 281        this.transport.onreadystatechange = Prototype.emptyFunction;
 282    }
 283  });
 284  
 285  Ajax.Updater = Class.create();
 286  Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
 287  
 288  Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
 289    initialize: function(container, url, options) {
 290      this.containers = {
 291        success: container.success ? $(container.success) : $(container),
 292        failure: container.failure ? $(container.failure) :
 293          (container.success ? null : $(container))
 294      }
 295  
 296      this.transport = Ajax.getTransport();
 297      this.setOptions(options);
 298  
 299      var onComplete = this.options.onComplete || Prototype.emptyFunction;
 300      this.options.onComplete = (function() {
 301        this.updateContent();
 302        onComplete(this.transport);
 303      }).bind(this);
 304  
 305      this.request(url);
 306    },
 307  
 308    updateContent: function() {
 309      var receiver = this.responseIsSuccess() ?
 310        this.containers.success : this.containers.failure;
 311  
 312      var match    = new RegExp(Ajax.Updater.ScriptFragment, 'img');
 313      var response = this.transport.responseText.replace(match, '');
 314      var scripts  = this.transport.responseText.match(match);
 315  
 316      if (receiver) {
 317        if (this.options.insertion) {
 318          new this.options.insertion(receiver, response);
 319        } else {
 320          receiver.innerHTML = response;
 321        }
 322      }
 323  
 324      if (this.responseIsSuccess()) {
 325        if (this.onComplete)
 326          setTimeout((function() {this.onComplete(
 327            this.transport)}).bind(this), 10);
 328      }
 329  
 330      if (this.options.evalScripts && scripts) {
 331        match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
 332        setTimeout((function() {
 333          for (var i = 0; i < scripts.length; i++)
 334            eval(scripts[i].match(match)[1]);
 335        }).bind(this), 10);
 336      }
 337    }
 338  });
 339  
 340  Ajax.PeriodicalUpdater = Class.create();
 341  Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
 342    initialize: function(container, url, options) {
 343      this.setOptions(options);
 344      this.onComplete = this.options.onComplete;
 345  
 346      this.frequency = (this.options.frequency || 2);
 347      this.decay = 1;
 348  
 349      this.updater = {};
 350      this.container = container;
 351      this.url = url;
 352  
 353      this.start();
 354    },
 355  
 356    start: function() {
 357      this.options.onComplete = this.updateComplete.bind(this);
 358      this.onTimerEvent();
 359    },
 360  
 361    stop: function() {
 362      this.updater.onComplete = undefined;
 363      clearTimeout(this.timer);
 364      (this.onComplete || Ajax.emptyFunction).apply(this, arguments);
 365    },
 366  
 367    updateComplete: function(request) {
 368      if (this.options.decay) {
 369        this.decay = (request.responseText == this.lastText ? 
 370          this.decay * this.options.decay : 1);
 371  
 372        this.lastText = request.responseText;
 373      }
 374      this.timer = setTimeout(this.onTimerEvent.bind(this), 
 375        this.decay * this.frequency * 1000);
 376    },
 377  
 378    onTimerEvent: function() {
 379      this.updater = new Ajax.Updater(this.container, this.url, this.options);
 380    }
 381  });
 382  
 383  document.getElementsByClassName = function(className) {
 384    var children = document.getElementsByTagName('*') || document.all;
 385    var elements = new Array();
 386    
 387    for (var i = 0; i < children.length; i++) {
 388      var child = children[i];
 389      var classNames = child.className.split(' ');
 390      for (var j = 0; j < classNames.length; j++) {
 391        if (classNames[j] == className) {
 392          elements.push(child);
 393          break;
 394        }
 395      }
 396    }
 397    
 398    return elements;
 399  }
 400  
 401  /*--------------------------------------------------------------------------*/

 402  
 403  if (!window.Element) {
 404    var Element = new Object();
 405  }
 406  
 407  Object.extend(Element, {
 408    toggle: function() {
 409      for (var i = 0; i < arguments.length; i++) {
 410        var element = $(arguments[i]);
 411        element.style.display = 
 412          (element.style.display == 'none' ? '' : 'none');
 413      }
 414    },
 415  
 416    hide: function() {
 417      for (var i = 0; i < arguments.length; i++) {
 418        var element = $(arguments[i]);
 419        element.style.display = 'none';
 420      }
 421    },
 422  
 423    show: function() {
 424      for (var i = 0; i < arguments.length; i++) {
 425        var element = $(arguments[i]);
 426        element.style.display = '';
 427      }
 428    },
 429  
 430    remove: function(element) {
 431      element = $(element);
 432      element.parentNode.removeChild(element);
 433    },
 434     
 435    getHeight: function(element) {
 436      element = $(element);
 437      return element.offsetHeight; 
 438    },
 439  
 440    hasClassName: function(element, className) {
 441      element = $(element);
 442      if (!element)
 443        return;
 444      var a = element.className.split(' ');
 445      for (var i = 0; i < a.length; i++) {
 446        if (a[i] == className)
 447          return true;
 448      }
 449      return false;
 450    },
 451  
 452    addClassName: function(element, className) {
 453      element = $(element);
 454      Element.removeClassName(element, className);
 455      element.className += ' ' + className;
 456    },
 457  
 458    removeClassName: function(element, className) {
 459      element = $(element);
 460      if (!element)
 461        return;
 462      var newClassName = '';
 463      var a = element.className.split(' ');
 464      for (var i = 0; i < a.length; i++) {
 465        if (a[i] != className) {
 466          if (i > 0)
 467            newClassName += ' ';
 468          newClassName += a[i];
 469        }
 470      }
 471      element.className = newClassName;
 472    },
 473    
 474    // removes whitespace-only text node children

 475    cleanWhitespace: function(element) {
 476      var element = $(element);
 477      for (var i = 0; i < element.childNodes.length; i++) {
 478        var node = element.childNodes[i];
 479        if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 
 480          Element.remove(node);
 481      }
 482    }
 483  });
 484  
 485  var Toggle = new Object();
 486  Toggle.display = Element.toggle;
 487  
 488  /*--------------------------------------------------------------------------*/

 489  
 490  Abstract.Insertion = function(adjacency) {
 491    this.adjacency = adjacency;
 492  }
 493  
 494  Abstract.Insertion.prototype = {
 495    initialize: function(element, content) {
 496      this.element = $(element);
 497      this.content = content;
 498      
 499      if (this.adjacency && this.element.insertAdjacentHTML) {
 500        this.element.insertAdjacentHTML(this.adjacency, this.content);
 501      } else {
 502        this.range = this.element.ownerDocument.createRange();
 503        if (this.initializeRange) this.initializeRange();
 504        this.fragment = this.range.createContextualFragment(this.content);
 505        this.insertContent();
 506      }
 507    }
 508  }
 509  
 510  var Insertion = new Object();
 511  
 512  Insertion.Before = Class.create();
 513  Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
 514    initializeRange: function() {
 515      this.range.setStartBefore(this.element);
 516    },
 517    
 518    insertContent: function() {
 519      this.element.parentNode.insertBefore(this.fragment, this.element);
 520    }
 521  });
 522  
 523  Insertion.Top = Class.create();
 524  Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
 525    initializeRange: function() {
 526      this.range.selectNodeContents(this.element);
 527      this.range.collapse(true);
 528    },
 529    
 530    insertContent: function() {  
 531      this.element.insertBefore(this.fragment, this.element.firstChild);
 532    }
 533  });
 534  
 535  Insertion.Bottom = Class.create();
 536  Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
 537    initializeRange: function() {
 538      this.range.selectNodeContents(this.element);
 539      this.range.collapse(this.element);
 540    },
 541    
 542    insertContent: function() {
 543      this.element.appendChild(this.fragment);
 544    }
 545  });
 546  
 547  Insertion.After = Class.create();
 548  Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
 549    initializeRange: function() {
 550      this.range.setStartAfter(this.element);
 551    },
 552    
 553    insertContent: function() {
 554      this.element.parentNode.insertBefore(this.fragment, 
 555        this.element.nextSibling);
 556    }
 557  });
 558  
 559  var Field = {
 560    clear: function() {
 561      for (var i = 0; i < arguments.length; i++)
 562        $(arguments[i]).value = '';
 563    },
 564  
 565    focus: function(element) {
 566      $(element).focus();
 567    },
 568    
 569    present: function() {
 570      for (var i = 0; i < arguments.length; i++)
 571        if ($(arguments[i]).value == '') return false;
 572      return true;
 573    },
 574    
 575    select: function(element) {
 576      $(element).select();
 577    },
 578     
 579    activate: function(element) {
 580      $(element).focus();
 581      $(element).select();
 582    }
 583  }
 584  
 585  /*--------------------------------------------------------------------------*/

 586  
 587  var Form = {
 588    serialize: function(form) {
 589      var elements = Form.getElements($(form));
 590      var queryComponents = new Array();
 591      
 592      for (var i = 0; i < elements.length; i++) {
 593        var queryComponent = Form.Element.serialize(elements[i]);
 594        if (queryComponent)
 595          queryComponents.push(queryComponent);
 596      }
 597      
 598      return queryComponents.join('&');
 599    },
 600    
 601    getElements: function(form) {
 602      var form = $(form);
 603      var elements = new Array();
 604  
 605      for (tagName in Form.Element.Serializers) {
 606        var tagElements = form.getElementsByTagName(tagName);
 607        for (var j = 0; j < tagElements.length; j++)
 608          elements.push(tagElements[j]);
 609      }
 610      return elements;
 611    },
 612    
 613    getInputs: function(form, typeName, name) {
 614      var form = $(form);
 615      var inputs = form.getElementsByTagName('input');
 616      
 617      if (!typeName && !name)
 618        return inputs;
 619        
 620      var matchingInputs = new Array();
 621      for (var i = 0; i < inputs.length; i++) {
 622        var input = inputs[i];
 623        if ((typeName && input.type != typeName) ||
 624            (name && input.name != name)) 
 625          continue;
 626        matchingInputs.push(input);
 627      }
 628  
 629      return matchingInputs;
 630    },
 631  
 632    disable: function(form) {
 633      var elements = Form.getElements(form);
 634      for (var i = 0; i < elements.length; i++) {
 635        var element = elements[i];
 636        element.blur();
 637        element.disabled = 'true';
 638      }
 639    },
 640  
 641    enable: function(form) {
 642      var elements = Form.getElements(form);
 643      for (var i = 0; i < elements.length; i++) {
 644        var element = elements[i];
 645        element.disabled = '';
 646      }
 647    },
 648  
 649    focusFirstElement: function(form) {
 650      var form = $(form);
 651      var elements = Form.getElements(form);
 652      for (var i = 0; i < elements.length; i++) {
 653        var element = elements[i];
 654        if (element.type != 'hidden' && !element.disabled) {
 655          Field.activate(element);
 656          break;
 657        }
 658      }
 659    },
 660  
 661    reset: function(form) {
 662      $(form).reset();
 663    }
 664  }
 665  
 666  Form.Element = {
 667    serialize: function(element) {
 668      var element = $(element);
 669      var method = element.tagName.toLowerCase();
 670      var parameter = Form.Element.Serializers[method](element);
 671      
 672      if (parameter)
 673        return encodeURIComponent(parameter[0]) + '=' + 
 674          encodeURIComponent(parameter[1]);                   
 675    },
 676    
 677    getValue: function(element) {
 678      var element = $(element);
 679      var method = element.tagName.toLowerCase();
 680      var parameter = Form.Element.Serializers[method](element);
 681      
 682      if (parameter) 
 683        return parameter[1];
 684    }
 685  }
 686  
 687  Form.Element.Serializers = {
 688    input: function(element) {
 689      switch (element.type.toLowerCase()) {
 690        case 'submit':
 691        case 'hidden':
 692        case 'password':
 693        case 'text':
 694          return Form.Element.Serializers.textarea(element);
 695        case 'checkbox':  
 696        case 'radio':
 697          return Form.Element.Serializers.inputSelector(element);
 698      }
 699      return false;
 700    },
 701  
 702    inputSelector: function(element) {
 703      if (element.checked)
 704        return [element.name, element.value];
 705    },
 706  
 707    textarea: function(element) {
 708      return [element.name, element.value];
 709    },
 710  
 711    select: function(element) {
 712      var value = '';
 713      if (element.type == 'select-one') {
 714        var index = element.selectedIndex;
 715        if (index >= 0)
 716          value = element.options[index].value || element.options[index].text;
 717      } else {
 718        value = new Array();
 719        for (var i = 0; i < element.length; i++) {
 720          var opt = element.options[i];
 721          if (opt.selected)
 722            value.push(opt.value || opt.text);
 723        }
 724      }
 725      return [element.name, value];
 726    }
 727  }
 728  
 729  /*--------------------------------------------------------------------------*/

 730  
 731  var $F = Form.Element.getValue;
 732  
 733  /*--------------------------------------------------------------------------*/

 734  
 735  Abstract.TimedObserver = function() {}
 736  Abstract.TimedObserver.prototype = {
 737    initialize: function(element, frequency, callback) {
 738      this.frequency = frequency;
 739      this.element   = $(element);
 740      this.callback  = callback;
 741      
 742      this.lastValue = this.getValue();
 743      this.registerCallback();
 744    },
 745    
 746    registerCallback: function() {
 747      setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
 748    },
 749    
 750    onTimerEvent: function() {
 751      var value = this.getValue();
 752      if (this.lastValue != value) {
 753        this.callback(this.element, value);
 754        this.lastValue = value;
 755      }
 756    }
 757  }
 758  
 759  Form.Element.Observer = Class.create();
 760  Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
 761    getValue: function() {
 762      return Form.Element.getValue(this.element);
 763    }
 764  });
 765  
 766  Form.Observer = Class.create();
 767  Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
 768    getValue: function() {
 769      return Form.serialize(this.element);
 770    }
 771  });
 772  
 773  /*--------------------------------------------------------------------------*/

 774  
 775  Abstract.EventObserver = function() {}
 776  Abstract.EventObserver.prototype = {
 777    initialize: function(element, callback) {
 778      this.element  = $(element);
 779      this.callback = callback;
 780      
 781      this.lastValue = this.getValue();
 782      if (this.element.tagName.toLowerCase() == 'form')
 783        this.registerFormCallbacks();
 784      else
 785        this.registerCallback(this.element);
 786    },
 787    
 788    onElementEvent: function() {
 789      var value = this.getValue();
 790      if (this.lastValue != value) {
 791        this.callback(this.element, value);
 792        this.lastValue = value;
 793      }
 794    },
 795    
 796    registerFormCallbacks: function() {
 797      var elements = Form.getElements(this.element);
 798      for (var i = 0; i < elements.length; i++)
 799        this.registerCallback(elements[i]);
 800    },
 801    
 802    registerCallback: function(element) {
 803      if (element.type) {
 804        switch (element.type.toLowerCase()) {
 805          case 'checkbox':  
 806          case 'radio':
 807            element.target = this;
 808            element.prev_onclick = element.onclick || Prototype.emptyFunction;
 809            element.onclick = function() {
 810              this.prev_onclick(); 
 811              this.target.onElementEvent();
 812            }
 813            break;
 814          case 'password':
 815          case 'text':
 816          case 'textarea':
 817          case 'select-one':
 818          case 'select-multiple':
 819            element.target = this;
 820            element.prev_onchange = element.onchange || Prototype.emptyFunction;
 821            element.onchange = function() {
 822              this.prev_onchange(); 
 823              this.target.onElementEvent();
 824            }
 825            break;
 826        }
 827      }    
 828    }
 829  }
 830  
 831  Form.Element.EventObserver = Class.create();
 832  Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
 833    getValue: function() {
 834      return Form.Element.getValue(this.element);
 835    }
 836  });
 837  
 838  Form.EventObserver = Class.create();
 839  Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
 840    getValue: function() {
 841      return Form.serialize(this.element);
 842    }
 843  });
 844  
 845  
 846  if (!window.Event) {
 847    var Event = new Object();
 848  }
 849  
 850  Object.extend(Event, {
 851    KEY_BACKSPACE: 8,
 852    KEY_TAB:       9,
 853    KEY_RETURN:   13,
 854    KEY_ESC:      27,
 855    KEY_LEFT:     37,
 856    KEY_UP:       38,
 857    KEY_RIGHT:    39,
 858    KEY_DOWN:     40,
 859    KEY_DELETE:   46,
 860  
 861    element: function(event) {
 862      return event.target || event.srcElement;
 863    },
 864  
 865    isLeftClick: function(event) {
 866      return (((event.which) && (event.which == 1)) ||
 867              ((event.button) && (event.button == 1)));
 868    },
 869  
 870    pointerX: function(event) {
 871      return event.pageX || (event.clientX + 
 872        (document.documentElement.scrollLeft || document.body.scrollLeft));
 873    },
 874  
 875    pointerY: function(event) {
 876      return event.pageY || (event.clientY + 
 877        (document.documentElement.scrollTop || document.body.scrollTop));
 878    },
 879  
 880    stop: function(event) {
 881      if (event.preventDefault) { 
 882        event.preventDefault(); 
 883        event.stopPropagation(); 
 884      } else {
 885        event.returnValue = false;
 886      }
 887    },
 888  
 889    // find the first node with the given tagName, starting from the

 890    // node the event was triggered on; traverses the DOM upwards

 891    findElement: function(event, tagName) {
 892      var element = Event.element(event);
 893      while (element.parentNode && (!element.tagName ||
 894          (element.tagName.toUpperCase() != tagName.toUpperCase())))
 895        element = element.parentNode;
 896      return element;
 897    },
 898  
 899    observers: false,
 900    
 901    _observeAndCache: function(element, name, observer, useCapture) {
 902      if (!this.observers) this.observers = [];
 903      if (element.addEventListener) {
 904        this.observers.push([element, name, observer, useCapture]);
 905        element.addEventListener(name, observer, useCapture);
 906      } else if (element.attachEvent) {
 907        this.observers.push([element, name, observer, useCapture]);
 908        element.attachEvent('on' + name, observer);
 909      }
 910    },
 911    
 912    unloadCache: function() {
 913      if (!Event.observers) return;
 914      for (var i = 0; i < Event.observers.length; i++) {
 915        Event.stopObserving.apply(this, Event.observers[i]);
 916        Event.observers[i][0] = null;
 917      }
 918      Event.observers = false;
 919    },
 920  
 921    observe: function(element, name, observer, useCapture) {
 922      var element = $(element);
 923      useCapture = useCapture || false;
 924      
 925      if (name == 'keypress' &&
 926          ((navigator.appVersion.indexOf('AppleWebKit') > 0) 
 927          || element.attachEvent))
 928        name = 'keydown';
 929      
 930      this._observeAndCache(element, name, observer, useCapture);
 931    },
 932  
 933    stopObserving: function(element, name, observer, useCapture) {
 934      var element = $(element);
 935      useCapture = useCapture || false;
 936      
 937      if (name == 'keypress' &&
 938          ((navigator.appVersion.indexOf('AppleWebKit') > 0) 
 939          || element.detachEvent))
 940        name = 'keydown';
 941      
 942      if (element.removeEventListener) {
 943        element.removeEventListener(name, observer, useCapture);
 944      } else if (element.detachEvent) {
 945        element.detachEvent('on' + name, observer);
 946      }
 947    }
 948  });
 949  
 950  /* prevent memory leaks in IE */

 951  Event.observe(window, 'unload', Event.unloadCache, false);
 952  
 953  var Position = {
 954  
 955    // set to true if needed, warning: firefox performance problems

 956    // NOT neeeded for page scrolling, only if draggable contained in

 957    // scrollable elements

 958    includeScrollOffsets: false, 
 959  
 960    // must be called before calling withinIncludingScrolloffset, every time the

 961    // page is scrolled

 962    prepare: function() {
 963      this.deltaX =  window.pageXOffset 
 964                  || document.documentElement.scrollLeft 
 965                  || document.body.scrollLeft 
 966                  || 0;
 967      this.deltaY =  window.pageYOffset 
 968                  || document.documentElement.scrollTop 
 969                  || document.body.scrollTop 
 970                  || 0;
 971    },
 972  
 973    realOffset: function(element) {
 974      var valueT = 0, valueL = 0;
 975      do {
 976        valueT += element.scrollTop  || 0;
 977        valueL += element.scrollLeft || 0; 
 978        element = element.parentNode;
 979      } while (element);
 980      return [valueL, valueT];
 981    },
 982  
 983    cumulativeOffset: function(element) {
 984      var valueT = 0, valueL = 0;
 985      do {
 986        valueT += element.offsetTop  || 0;
 987        valueL += element.offsetLeft || 0;
 988        element = element.offsetParent;
 989      } while (element);
 990      return [valueL, valueT];
 991    },
 992  
 993    // caches x/y coordinate pair to use with overlap

 994    within: function(element, x, y) {
 995      if (this.includeScrollOffsets)
 996        return this.withinIncludingScrolloffsets(element, x, y);
 997      this.xcomp = x;
 998      this.ycomp = y;
 999      this.offset = this.cumulativeOffset(element);
1000  
1001      return (y >= this.offset[1] &&
1002              y <  this.offset[1] + element.offsetHeight &&
1003              x >= this.offset[0] && 
1004              x <  this.offset[0] + element.offsetWidth);
1005    },
1006  
1007    withinIncludingScrolloffsets: function(element, x, y) {
1008      var offsetcache = this.realOffset(element);
1009  
1010      this.xcomp = x + offsetcache[0] - this.deltaX;
1011      this.ycomp = y + offsetcache[1] - this.deltaY;
1012      this.offset = this.cumulativeOffset(element);
1013  
1014      return (this.ycomp >= this.offset[1] &&
1015              this.ycomp <  this.offset[1] + element.offsetHeight &&
1016              this.xcomp >= this.offset[0] && 
1017              this.xcomp <  this.offset[0] + element.offsetWidth);
1018    },
1019  
1020    // within must be called directly before

1021    overlap: function(mode, element) {  
1022      if (!mode) return 0;  
1023      if (mode == 'vertical') 
1024        return ((this.offset[1] + element.offsetHeight) - this.ycomp) / 
1025          element.offsetHeight;
1026      if (mode == 'horizontal')
1027        return ((this.offset[0] + element.offsetWidth) - this.xcomp) / 
1028          element.offsetWidth;
1029    },
1030  
1031    clone: function(source, target) {
1032      source = $(source);
1033      target = $(target);
1034      target.style.position = 'absolute';
1035      var offsets = this.cumulativeOffset(source);
1036      target.style.top    = offsets[1] + 'px';
1037      target.style.left   = offsets[0] + 'px';
1038      target.style.width  = source.offsetWidth + 'px';
1039      target.style.height = source.offsetHeight + 'px';
1040    }
1041  }


Généré le : Tue Apr 3 18:50:37 2007 par Balluche grâce à PHPXref 0.7