web/wp-includes/js/prototype.js
author ymh <ymh.work@gmail.com>
Mon, 22 Mar 2010 16:36:28 +0100
changeset 5 ac511f1ccc8e
parent 1 0d28b7c10758
permissions -rw-r--r--
add hgignore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
0d28b7c10758 First commit
ymh
parents:
diff changeset
     1
/*  Prototype JavaScript framework, version 1.6.0
0d28b7c10758 First commit
ymh
parents:
diff changeset
     2
 *  (c) 2005-2007 Sam Stephenson
0d28b7c10758 First commit
ymh
parents:
diff changeset
     3
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     4
 *  Prototype is freely distributable under the terms of an MIT-style license.
0d28b7c10758 First commit
ymh
parents:
diff changeset
     5
 *  For details, see the Prototype web site: http://www.prototypejs.org/
0d28b7c10758 First commit
ymh
parents:
diff changeset
     6
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     7
 *--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
     8
0d28b7c10758 First commit
ymh
parents:
diff changeset
     9
var Prototype = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    10
  Version: '1.6.0',
0d28b7c10758 First commit
ymh
parents:
diff changeset
    11
0d28b7c10758 First commit
ymh
parents:
diff changeset
    12
  Browser: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    13
    IE:     !!(window.attachEvent && !window.opera),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    14
    Opera:  !!window.opera,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    15
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    16
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    17
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    18
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
    19
0d28b7c10758 First commit
ymh
parents:
diff changeset
    20
  BrowserFeatures: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    21
    XPath: !!document.evaluate,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    22
    ElementExtensions: !!window.HTMLElement,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    23
    SpecificElementExtensions:
0d28b7c10758 First commit
ymh
parents:
diff changeset
    24
      document.createElement('div').__proto__ &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
    25
      document.createElement('div').__proto__ !==
0d28b7c10758 First commit
ymh
parents:
diff changeset
    26
        document.createElement('form').__proto__
0d28b7c10758 First commit
ymh
parents:
diff changeset
    27
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
    28
0d28b7c10758 First commit
ymh
parents:
diff changeset
    29
  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
0d28b7c10758 First commit
ymh
parents:
diff changeset
    30
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    31
0d28b7c10758 First commit
ymh
parents:
diff changeset
    32
  emptyFunction: function() { },
0d28b7c10758 First commit
ymh
parents:
diff changeset
    33
  K: function(x) { return x }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    34
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
    35
0d28b7c10758 First commit
ymh
parents:
diff changeset
    36
if (Prototype.Browser.MobileSafari)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    37
  Prototype.BrowserFeatures.SpecificElementExtensions = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    38
0d28b7c10758 First commit
ymh
parents:
diff changeset
    39
if (Prototype.Browser.WebKit)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    40
  Prototype.BrowserFeatures.XPath = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    41
0d28b7c10758 First commit
ymh
parents:
diff changeset
    42
/* Based on Alex Arnell's inheritance implementation. */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    43
var Class = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    44
  create: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    45
    var parent = null, properties = $A(arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    46
    if (Object.isFunction(properties[0]))
0d28b7c10758 First commit
ymh
parents:
diff changeset
    47
      parent = properties.shift();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    48
0d28b7c10758 First commit
ymh
parents:
diff changeset
    49
    function klass() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    50
      this.initialize.apply(this, arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    51
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    52
0d28b7c10758 First commit
ymh
parents:
diff changeset
    53
    Object.extend(klass, Class.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    54
    klass.superclass = parent;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    55
    klass.subclasses = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    56
0d28b7c10758 First commit
ymh
parents:
diff changeset
    57
    if (parent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    58
      var subclass = function() { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
    59
      subclass.prototype = parent.prototype;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    60
      klass.prototype = new subclass;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    61
      parent.subclasses.push(klass);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    62
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    63
0d28b7c10758 First commit
ymh
parents:
diff changeset
    64
    for (var i = 0; i < properties.length; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    65
      klass.addMethods(properties[i]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    66
0d28b7c10758 First commit
ymh
parents:
diff changeset
    67
    if (!klass.prototype.initialize)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    68
      klass.prototype.initialize = Prototype.emptyFunction;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    69
0d28b7c10758 First commit
ymh
parents:
diff changeset
    70
    klass.prototype.constructor = klass;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    71
0d28b7c10758 First commit
ymh
parents:
diff changeset
    72
    return klass;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    73
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    74
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
    75
0d28b7c10758 First commit
ymh
parents:
diff changeset
    76
Class.Methods = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    77
  addMethods: function(source) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    78
    var ancestor   = this.superclass && this.superclass.prototype;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    79
    var properties = Object.keys(source);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    80
0d28b7c10758 First commit
ymh
parents:
diff changeset
    81
    if (!Object.keys({ toString: true }).length)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    82
      properties.push("toString", "valueOf");
0d28b7c10758 First commit
ymh
parents:
diff changeset
    83
0d28b7c10758 First commit
ymh
parents:
diff changeset
    84
    for (var i = 0, length = properties.length; i < length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    85
      var property = properties[i], value = source[property];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    86
      if (ancestor && Object.isFunction(value) &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
    87
          value.argumentNames().first() == "$super") {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    88
        var method = value, value = Object.extend((function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    89
          return function() { return ancestor[m].apply(this, arguments) };
0d28b7c10758 First commit
ymh
parents:
diff changeset
    90
        })(property).wrap(method), {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    91
          valueOf:  function() { return method },
0d28b7c10758 First commit
ymh
parents:
diff changeset
    92
          toString: function() { return method.toString() }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    93
        });
0d28b7c10758 First commit
ymh
parents:
diff changeset
    94
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    95
      this.prototype[property] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    96
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    97
0d28b7c10758 First commit
ymh
parents:
diff changeset
    98
    return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    99
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   100
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   101
0d28b7c10758 First commit
ymh
parents:
diff changeset
   102
var Abstract = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   103
0d28b7c10758 First commit
ymh
parents:
diff changeset
   104
Object.extend = function(destination, source) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   105
  for (var property in source)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   106
    destination[property] = source[property];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   107
  return destination;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   108
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   109
0d28b7c10758 First commit
ymh
parents:
diff changeset
   110
Object.extend(Object, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   111
  inspect: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   112
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   113
      if (object === undefined) return 'undefined';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   114
      if (object === null) return 'null';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   115
      return object.inspect ? object.inspect() : object.toString();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   116
    } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   117
      if (e instanceof RangeError) return '...';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   118
      throw e;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   119
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   120
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   121
0d28b7c10758 First commit
ymh
parents:
diff changeset
   122
  toJSON: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   123
    var type = typeof object;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   124
    switch (type) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   125
      case 'undefined':
0d28b7c10758 First commit
ymh
parents:
diff changeset
   126
      case 'function':
0d28b7c10758 First commit
ymh
parents:
diff changeset
   127
      case 'unknown': return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   128
      case 'boolean': return object.toString();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   129
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   130
0d28b7c10758 First commit
ymh
parents:
diff changeset
   131
    if (object === null) return 'null';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   132
    if (object.toJSON) return object.toJSON();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   133
    if (Object.isElement(object)) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   134
0d28b7c10758 First commit
ymh
parents:
diff changeset
   135
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   136
    for (var property in object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   137
      var value = Object.toJSON(object[property]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   138
      if (value !== undefined)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   139
        results.push(property.toJSON() + ': ' + value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   140
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   141
0d28b7c10758 First commit
ymh
parents:
diff changeset
   142
    return '{' + results.join(', ') + '}';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   143
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   144
0d28b7c10758 First commit
ymh
parents:
diff changeset
   145
  toQueryString: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   146
    return $H(object).toQueryString();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   147
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   148
0d28b7c10758 First commit
ymh
parents:
diff changeset
   149
  toHTML: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   150
    return object && object.toHTML ? object.toHTML() : String.interpret(object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   151
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   152
0d28b7c10758 First commit
ymh
parents:
diff changeset
   153
  keys: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   154
    var keys = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   155
    for (var property in object)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   156
      keys.push(property);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   157
    return keys;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   158
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   159
0d28b7c10758 First commit
ymh
parents:
diff changeset
   160
  values: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   161
    var values = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   162
    for (var property in object)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   163
      values.push(object[property]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   164
    return values;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   165
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   166
0d28b7c10758 First commit
ymh
parents:
diff changeset
   167
  clone: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   168
    return Object.extend({ }, object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   169
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   170
0d28b7c10758 First commit
ymh
parents:
diff changeset
   171
  isElement: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   172
    return object && object.nodeType == 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   173
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   174
0d28b7c10758 First commit
ymh
parents:
diff changeset
   175
  isArray: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   176
    return object && object.constructor === Array;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   177
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   178
0d28b7c10758 First commit
ymh
parents:
diff changeset
   179
  isHash: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   180
    return object instanceof Hash;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   181
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   182
0d28b7c10758 First commit
ymh
parents:
diff changeset
   183
  isFunction: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   184
    return typeof object == "function";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   185
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   186
0d28b7c10758 First commit
ymh
parents:
diff changeset
   187
  isString: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   188
    return typeof object == "string";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   189
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   190
0d28b7c10758 First commit
ymh
parents:
diff changeset
   191
  isNumber: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   192
    return typeof object == "number";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   193
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   194
0d28b7c10758 First commit
ymh
parents:
diff changeset
   195
  isUndefined: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   196
    return typeof object == "undefined";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   197
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   198
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   199
0d28b7c10758 First commit
ymh
parents:
diff changeset
   200
Object.extend(Function.prototype, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   201
  argumentNames: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   202
    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   203
    return names.length == 1 && !names[0] ? [] : names;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   204
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   205
0d28b7c10758 First commit
ymh
parents:
diff changeset
   206
  bind: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   207
    if (arguments.length < 2 && arguments[0] === undefined) return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   208
    var __method = this, args = $A(arguments), object = args.shift();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   209
    return function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   210
      return __method.apply(object, args.concat($A(arguments)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   211
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   212
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   213
0d28b7c10758 First commit
ymh
parents:
diff changeset
   214
  bindAsEventListener: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   215
    var __method = this, args = $A(arguments), object = args.shift();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   216
    return function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   217
      return __method.apply(object, [event || window.event].concat(args));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   218
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   219
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   220
0d28b7c10758 First commit
ymh
parents:
diff changeset
   221
  curry: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   222
    if (!arguments.length) return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   223
    var __method = this, args = $A(arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   224
    return function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   225
      return __method.apply(this, args.concat($A(arguments)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   226
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   227
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   228
0d28b7c10758 First commit
ymh
parents:
diff changeset
   229
  delay: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   230
    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   231
    return window.setTimeout(function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   232
      return __method.apply(__method, args);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   233
    }, timeout);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   234
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   235
0d28b7c10758 First commit
ymh
parents:
diff changeset
   236
  wrap: function(wrapper) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   237
    var __method = this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   238
    return function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   239
      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   240
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   241
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   242
0d28b7c10758 First commit
ymh
parents:
diff changeset
   243
  methodize: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   244
    if (this._methodized) return this._methodized;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   245
    var __method = this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   246
    return this._methodized = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   247
      return __method.apply(null, [this].concat($A(arguments)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   248
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   249
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   250
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   251
0d28b7c10758 First commit
ymh
parents:
diff changeset
   252
Function.prototype.defer = Function.prototype.delay.curry(0.01);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   253
0d28b7c10758 First commit
ymh
parents:
diff changeset
   254
Date.prototype.toJSON = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   255
  return '"' + this.getUTCFullYear() + '-' +
0d28b7c10758 First commit
ymh
parents:
diff changeset
   256
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
0d28b7c10758 First commit
ymh
parents:
diff changeset
   257
    this.getUTCDate().toPaddedString(2) + 'T' +
0d28b7c10758 First commit
ymh
parents:
diff changeset
   258
    this.getUTCHours().toPaddedString(2) + ':' +
0d28b7c10758 First commit
ymh
parents:
diff changeset
   259
    this.getUTCMinutes().toPaddedString(2) + ':' +
0d28b7c10758 First commit
ymh
parents:
diff changeset
   260
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   261
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   262
0d28b7c10758 First commit
ymh
parents:
diff changeset
   263
var Try = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   264
  these: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   265
    var returnValue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   266
0d28b7c10758 First commit
ymh
parents:
diff changeset
   267
    for (var i = 0, length = arguments.length; i < length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   268
      var lambda = arguments[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   269
      try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   270
        returnValue = lambda();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   271
        break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   272
      } catch (e) { }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   273
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   274
0d28b7c10758 First commit
ymh
parents:
diff changeset
   275
    return returnValue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   276
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   277
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   278
0d28b7c10758 First commit
ymh
parents:
diff changeset
   279
RegExp.prototype.match = RegExp.prototype.test;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   280
0d28b7c10758 First commit
ymh
parents:
diff changeset
   281
RegExp.escape = function(str) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   282
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   283
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   284
0d28b7c10758 First commit
ymh
parents:
diff changeset
   285
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
   286
0d28b7c10758 First commit
ymh
parents:
diff changeset
   287
var PeriodicalExecuter = Class.create({
0d28b7c10758 First commit
ymh
parents:
diff changeset
   288
  initialize: function(callback, frequency) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   289
    this.callback = callback;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   290
    this.frequency = frequency;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   291
    this.currentlyExecuting = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   292
0d28b7c10758 First commit
ymh
parents:
diff changeset
   293
    this.registerCallback();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   294
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   295
0d28b7c10758 First commit
ymh
parents:
diff changeset
   296
  registerCallback: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   297
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   298
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   299
0d28b7c10758 First commit
ymh
parents:
diff changeset
   300
  execute: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   301
    this.callback(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   302
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   303
0d28b7c10758 First commit
ymh
parents:
diff changeset
   304
  stop: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   305
    if (!this.timer) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   306
    clearInterval(this.timer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   307
    this.timer = null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   308
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   309
0d28b7c10758 First commit
ymh
parents:
diff changeset
   310
  onTimerEvent: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   311
    if (!this.currentlyExecuting) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   312
      try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   313
        this.currentlyExecuting = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   314
        this.execute();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   315
      } finally {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   316
        this.currentlyExecuting = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   317
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   318
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   319
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   320
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   321
Object.extend(String, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   322
  interpret: function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   323
    return value == null ? '' : String(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   324
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   325
  specialChar: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   326
    '\b': '\\b',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   327
    '\t': '\\t',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   328
    '\n': '\\n',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   329
    '\f': '\\f',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   330
    '\r': '\\r',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   331
    '\\': '\\\\'
0d28b7c10758 First commit
ymh
parents:
diff changeset
   332
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   333
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   334
0d28b7c10758 First commit
ymh
parents:
diff changeset
   335
Object.extend(String.prototype, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   336
  gsub: function(pattern, replacement) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   337
    var result = '', source = this, match;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   338
    replacement = arguments.callee.prepareReplacement(replacement);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   339
0d28b7c10758 First commit
ymh
parents:
diff changeset
   340
    while (source.length > 0) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   341
      if (match = source.match(pattern)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   342
        result += source.slice(0, match.index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   343
        result += String.interpret(replacement(match));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   344
        source  = source.slice(match.index + match[0].length);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   345
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   346
        result += source, source = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   347
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   348
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   349
    return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   350
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   351
0d28b7c10758 First commit
ymh
parents:
diff changeset
   352
  sub: function(pattern, replacement, count) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   353
    replacement = this.gsub.prepareReplacement(replacement);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   354
    count = count === undefined ? 1 : count;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   355
0d28b7c10758 First commit
ymh
parents:
diff changeset
   356
    return this.gsub(pattern, function(match) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   357
      if (--count < 0) return match[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   358
      return replacement(match);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   359
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   360
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   361
0d28b7c10758 First commit
ymh
parents:
diff changeset
   362
  scan: function(pattern, iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   363
    this.gsub(pattern, iterator);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   364
    return String(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   365
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   366
0d28b7c10758 First commit
ymh
parents:
diff changeset
   367
  truncate: function(length, truncation) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   368
    length = length || 30;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   369
    truncation = truncation === undefined ? '...' : truncation;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   370
    return this.length > length ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   371
      this.slice(0, length - truncation.length) + truncation : String(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   372
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   373
0d28b7c10758 First commit
ymh
parents:
diff changeset
   374
  strip: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   375
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   376
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   377
0d28b7c10758 First commit
ymh
parents:
diff changeset
   378
  stripTags: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   379
    return this.replace(/<\/?[^>]+>/gi, '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   380
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   381
0d28b7c10758 First commit
ymh
parents:
diff changeset
   382
  stripScripts: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   383
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   384
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   385
0d28b7c10758 First commit
ymh
parents:
diff changeset
   386
  extractScripts: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   387
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   388
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   389
    return (this.match(matchAll) || []).map(function(scriptTag) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   390
      return (scriptTag.match(matchOne) || ['', ''])[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   391
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   392
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   393
0d28b7c10758 First commit
ymh
parents:
diff changeset
   394
  evalScripts: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   395
    return this.extractScripts().map(function(script) { return eval(script) });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   396
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   397
0d28b7c10758 First commit
ymh
parents:
diff changeset
   398
  escapeHTML: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   399
    var self = arguments.callee;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   400
    self.text.data = this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   401
    return self.div.innerHTML;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   402
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   403
0d28b7c10758 First commit
ymh
parents:
diff changeset
   404
  unescapeHTML: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   405
    var div = new Element('div');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   406
    div.innerHTML = this.stripTags();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   407
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   408
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   409
      div.childNodes[0].nodeValue) : '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   410
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   411
0d28b7c10758 First commit
ymh
parents:
diff changeset
   412
  toQueryParams: function(separator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   413
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   414
    if (!match) return { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   415
0d28b7c10758 First commit
ymh
parents:
diff changeset
   416
    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   417
      if ((pair = pair.split('='))[0]) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   418
        var key = decodeURIComponent(pair.shift());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   419
        var value = pair.length > 1 ? pair.join('=') : pair[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   420
        if (value != undefined) value = decodeURIComponent(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   421
0d28b7c10758 First commit
ymh
parents:
diff changeset
   422
        if (key in hash) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   423
          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   424
          hash[key].push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   425
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   426
        else hash[key] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   427
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   428
      return hash;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   429
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   430
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   431
0d28b7c10758 First commit
ymh
parents:
diff changeset
   432
  toArray: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   433
    return this.split('');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   434
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   435
0d28b7c10758 First commit
ymh
parents:
diff changeset
   436
  succ: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   437
    return this.slice(0, this.length - 1) +
0d28b7c10758 First commit
ymh
parents:
diff changeset
   438
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   439
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   440
0d28b7c10758 First commit
ymh
parents:
diff changeset
   441
  times: function(count) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   442
    return count < 1 ? '' : new Array(count + 1).join(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   443
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   444
0d28b7c10758 First commit
ymh
parents:
diff changeset
   445
  camelize: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   446
    var parts = this.split('-'), len = parts.length;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   447
    if (len == 1) return parts[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   448
0d28b7c10758 First commit
ymh
parents:
diff changeset
   449
    var camelized = this.charAt(0) == '-'
0d28b7c10758 First commit
ymh
parents:
diff changeset
   450
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   451
      : parts[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   452
0d28b7c10758 First commit
ymh
parents:
diff changeset
   453
    for (var i = 1; i < len; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   454
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   455
0d28b7c10758 First commit
ymh
parents:
diff changeset
   456
    return camelized;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   457
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   458
0d28b7c10758 First commit
ymh
parents:
diff changeset
   459
  capitalize: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   460
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   461
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   462
0d28b7c10758 First commit
ymh
parents:
diff changeset
   463
  underscore: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   464
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   465
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   466
0d28b7c10758 First commit
ymh
parents:
diff changeset
   467
  dasherize: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   468
    return this.gsub(/_/,'-');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   469
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   470
0d28b7c10758 First commit
ymh
parents:
diff changeset
   471
  inspect: function(useDoubleQuotes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   472
    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   473
      var character = String.specialChar[match[0]];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   474
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   475
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   476
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   477
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   478
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   479
0d28b7c10758 First commit
ymh
parents:
diff changeset
   480
  toJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   481
    return this.inspect(true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   482
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   483
0d28b7c10758 First commit
ymh
parents:
diff changeset
   484
  unfilterJSON: function(filter) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   485
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   486
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   487
0d28b7c10758 First commit
ymh
parents:
diff changeset
   488
  isJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   489
    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   490
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   491
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   492
0d28b7c10758 First commit
ymh
parents:
diff changeset
   493
  evalJSON: function(sanitize) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   494
    var json = this.unfilterJSON();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   495
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   496
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   497
    } catch (e) { }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   498
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   499
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   500
0d28b7c10758 First commit
ymh
parents:
diff changeset
   501
  include: function(pattern) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   502
    return this.indexOf(pattern) > -1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   503
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   504
0d28b7c10758 First commit
ymh
parents:
diff changeset
   505
  startsWith: function(pattern) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   506
    return this.indexOf(pattern) === 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   507
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   508
0d28b7c10758 First commit
ymh
parents:
diff changeset
   509
  endsWith: function(pattern) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   510
    var d = this.length - pattern.length;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   511
    return d >= 0 && this.lastIndexOf(pattern) === d;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   512
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   513
0d28b7c10758 First commit
ymh
parents:
diff changeset
   514
  empty: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   515
    return this == '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   516
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   517
0d28b7c10758 First commit
ymh
parents:
diff changeset
   518
  blank: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   519
    return /^\s*$/.test(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   520
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   521
0d28b7c10758 First commit
ymh
parents:
diff changeset
   522
  interpolate: function(object, pattern) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   523
    return new Template(this, pattern).evaluate(object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   524
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   525
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   526
0d28b7c10758 First commit
ymh
parents:
diff changeset
   527
if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   528
  escapeHTML: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   529
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   530
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   531
  unescapeHTML: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   532
    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   533
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   534
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   535
0d28b7c10758 First commit
ymh
parents:
diff changeset
   536
String.prototype.gsub.prepareReplacement = function(replacement) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   537
  if (Object.isFunction(replacement)) return replacement;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   538
  var template = new Template(replacement);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   539
  return function(match) { return template.evaluate(match) };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   540
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   541
0d28b7c10758 First commit
ymh
parents:
diff changeset
   542
String.prototype.parseQuery = String.prototype.toQueryParams;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   543
0d28b7c10758 First commit
ymh
parents:
diff changeset
   544
Object.extend(String.prototype.escapeHTML, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   545
  div:  document.createElement('div'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   546
  text: document.createTextNode('')
0d28b7c10758 First commit
ymh
parents:
diff changeset
   547
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   548
0d28b7c10758 First commit
ymh
parents:
diff changeset
   549
with (String.prototype.escapeHTML) div.appendChild(text);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   550
0d28b7c10758 First commit
ymh
parents:
diff changeset
   551
var Template = Class.create({
0d28b7c10758 First commit
ymh
parents:
diff changeset
   552
  initialize: function(template, pattern) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   553
    this.template = template.toString();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   554
    this.pattern = pattern || Template.Pattern;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   555
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   556
0d28b7c10758 First commit
ymh
parents:
diff changeset
   557
  evaluate: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   558
    if (Object.isFunction(object.toTemplateReplacements))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   559
      object = object.toTemplateReplacements();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   560
0d28b7c10758 First commit
ymh
parents:
diff changeset
   561
    return this.template.gsub(this.pattern, function(match) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   562
      if (object == null) return '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   563
0d28b7c10758 First commit
ymh
parents:
diff changeset
   564
      var before = match[1] || '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   565
      if (before == '\\') return match[2];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   566
0d28b7c10758 First commit
ymh
parents:
diff changeset
   567
      var ctx = object, expr = match[3];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   568
      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   569
      if (match == null) return before;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   570
0d28b7c10758 First commit
ymh
parents:
diff changeset
   571
      while (match != null) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   572
        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   573
        ctx = ctx[comp];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   574
        if (null == ctx || '' == match[3]) break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   575
        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   576
        match = pattern.exec(expr);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   577
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   578
0d28b7c10758 First commit
ymh
parents:
diff changeset
   579
      return before + String.interpret(ctx);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   580
    }.bind(this));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   581
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   582
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   583
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   584
0d28b7c10758 First commit
ymh
parents:
diff changeset
   585
var $break = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   586
0d28b7c10758 First commit
ymh
parents:
diff changeset
   587
var Enumerable = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   588
  each: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   589
    var index = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   590
    iterator = iterator.bind(context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   591
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   592
      this._each(function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   593
        iterator(value, index++);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   594
      });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   595
    } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   596
      if (e != $break) throw e;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   597
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   598
    return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   599
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   600
0d28b7c10758 First commit
ymh
parents:
diff changeset
   601
  eachSlice: function(number, iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   602
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   603
    var index = -number, slices = [], array = this.toArray();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   604
    while ((index += number) < array.length)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   605
      slices.push(array.slice(index, index+number));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   606
    return slices.collect(iterator, context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   607
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   608
0d28b7c10758 First commit
ymh
parents:
diff changeset
   609
  all: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   610
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   611
    var result = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   612
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   613
      result = result && !!iterator(value, index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   614
      if (!result) throw $break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   615
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   616
    return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   617
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   618
0d28b7c10758 First commit
ymh
parents:
diff changeset
   619
  any: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   620
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   621
    var result = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   622
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   623
      if (result = !!iterator(value, index))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   624
        throw $break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   625
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   626
    return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   627
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   628
0d28b7c10758 First commit
ymh
parents:
diff changeset
   629
  collect: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   630
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   631
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   632
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   633
      results.push(iterator(value, index));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   634
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   635
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   636
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   637
0d28b7c10758 First commit
ymh
parents:
diff changeset
   638
  detect: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   639
    iterator = iterator.bind(context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   640
    var result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   641
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   642
      if (iterator(value, index)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   643
        result = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   644
        throw $break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   645
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   646
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   647
    return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   648
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   649
0d28b7c10758 First commit
ymh
parents:
diff changeset
   650
  findAll: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   651
    iterator = iterator.bind(context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   652
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   653
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   654
      if (iterator(value, index))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   655
        results.push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   656
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   657
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   658
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   659
0d28b7c10758 First commit
ymh
parents:
diff changeset
   660
  grep: function(filter, iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   661
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   662
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   663
0d28b7c10758 First commit
ymh
parents:
diff changeset
   664
    if (Object.isString(filter))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   665
      filter = new RegExp(filter);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   666
0d28b7c10758 First commit
ymh
parents:
diff changeset
   667
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   668
      if (filter.match(value))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   669
        results.push(iterator(value, index));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   670
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   671
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   672
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   673
0d28b7c10758 First commit
ymh
parents:
diff changeset
   674
  include: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   675
    if (Object.isFunction(this.indexOf))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   676
      if (this.indexOf(object) != -1) return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   677
0d28b7c10758 First commit
ymh
parents:
diff changeset
   678
    var found = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   679
    this.each(function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   680
      if (value == object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   681
        found = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   682
        throw $break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   683
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   684
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   685
    return found;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   686
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   687
0d28b7c10758 First commit
ymh
parents:
diff changeset
   688
  inGroupsOf: function(number, fillWith) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   689
    fillWith = fillWith === undefined ? null : fillWith;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   690
    return this.eachSlice(number, function(slice) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   691
      while(slice.length < number) slice.push(fillWith);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   692
      return slice;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   693
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   694
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   695
0d28b7c10758 First commit
ymh
parents:
diff changeset
   696
  inject: function(memo, iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   697
    iterator = iterator.bind(context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   698
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   699
      memo = iterator(memo, value, index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   700
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   701
    return memo;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   702
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   703
0d28b7c10758 First commit
ymh
parents:
diff changeset
   704
  invoke: function(method) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   705
    var args = $A(arguments).slice(1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   706
    return this.map(function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   707
      return value[method].apply(value, args);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   708
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   709
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   710
0d28b7c10758 First commit
ymh
parents:
diff changeset
   711
  max: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   712
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   713
    var result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   714
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   715
      value = iterator(value, index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   716
      if (result == undefined || value >= result)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   717
        result = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   718
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   719
    return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   720
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   721
0d28b7c10758 First commit
ymh
parents:
diff changeset
   722
  min: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   723
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   724
    var result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   725
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   726
      value = iterator(value, index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   727
      if (result == undefined || value < result)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   728
        result = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   729
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   730
    return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   731
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   732
0d28b7c10758 First commit
ymh
parents:
diff changeset
   733
  partition: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   734
    iterator = iterator ? iterator.bind(context) : Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   735
    var trues = [], falses = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   736
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   737
      (iterator(value, index) ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   738
        trues : falses).push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   739
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   740
    return [trues, falses];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   741
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   742
0d28b7c10758 First commit
ymh
parents:
diff changeset
   743
  pluck: function(property) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   744
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   745
    this.each(function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   746
      results.push(value[property]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   747
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   748
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   749
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   750
0d28b7c10758 First commit
ymh
parents:
diff changeset
   751
  reject: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   752
    iterator = iterator.bind(context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   753
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   754
    this.each(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   755
      if (!iterator(value, index))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   756
        results.push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   757
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   758
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   759
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   760
0d28b7c10758 First commit
ymh
parents:
diff changeset
   761
  sortBy: function(iterator, context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   762
    iterator = iterator.bind(context);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   763
    return this.map(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   764
      return {value: value, criteria: iterator(value, index)};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   765
    }).sort(function(left, right) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   766
      var a = left.criteria, b = right.criteria;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   767
      return a < b ? -1 : a > b ? 1 : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   768
    }).pluck('value');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   769
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   770
0d28b7c10758 First commit
ymh
parents:
diff changeset
   771
  toArray: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   772
    return this.map();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   773
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   774
0d28b7c10758 First commit
ymh
parents:
diff changeset
   775
  zip: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   776
    var iterator = Prototype.K, args = $A(arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   777
    if (Object.isFunction(args.last()))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   778
      iterator = args.pop();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   779
0d28b7c10758 First commit
ymh
parents:
diff changeset
   780
    var collections = [this].concat(args).map($A);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   781
    return this.map(function(value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   782
      return iterator(collections.pluck(index));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   783
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   784
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   785
0d28b7c10758 First commit
ymh
parents:
diff changeset
   786
  size: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   787
    return this.toArray().length;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   788
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   789
0d28b7c10758 First commit
ymh
parents:
diff changeset
   790
  inspect: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   791
    return '#<Enumerable:' + this.toArray().inspect() + '>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   792
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   793
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   794
0d28b7c10758 First commit
ymh
parents:
diff changeset
   795
Object.extend(Enumerable, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   796
  map:     Enumerable.collect,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   797
  find:    Enumerable.detect,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   798
  select:  Enumerable.findAll,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   799
  filter:  Enumerable.findAll,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   800
  member:  Enumerable.include,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   801
  entries: Enumerable.toArray,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   802
  every:   Enumerable.all,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   803
  some:    Enumerable.any
0d28b7c10758 First commit
ymh
parents:
diff changeset
   804
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   805
function $A(iterable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   806
  if (!iterable) return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   807
  if (iterable.toArray) return iterable.toArray();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   808
  var length = iterable.length, results = new Array(length);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   809
  while (length--) results[length] = iterable[length];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   810
  return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   811
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   812
0d28b7c10758 First commit
ymh
parents:
diff changeset
   813
if (Prototype.Browser.WebKit) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   814
  function $A(iterable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   815
    if (!iterable) return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   816
    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
   817
        iterable.toArray) return iterable.toArray();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   818
    var length = iterable.length, results = new Array(length);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   819
    while (length--) results[length] = iterable[length];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   820
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   821
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   822
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   823
0d28b7c10758 First commit
ymh
parents:
diff changeset
   824
Array.from = $A;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   825
0d28b7c10758 First commit
ymh
parents:
diff changeset
   826
Object.extend(Array.prototype, Enumerable);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   827
0d28b7c10758 First commit
ymh
parents:
diff changeset
   828
if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   829
0d28b7c10758 First commit
ymh
parents:
diff changeset
   830
Object.extend(Array.prototype, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   831
  _each: function(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   832
    for (var i = 0, length = this.length; i < length; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   833
      iterator(this[i]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   834
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   835
0d28b7c10758 First commit
ymh
parents:
diff changeset
   836
  clear: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   837
    this.length = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   838
    return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   839
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   840
0d28b7c10758 First commit
ymh
parents:
diff changeset
   841
  first: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   842
    return this[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   843
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   844
0d28b7c10758 First commit
ymh
parents:
diff changeset
   845
  last: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   846
    return this[this.length - 1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   847
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   848
0d28b7c10758 First commit
ymh
parents:
diff changeset
   849
  compact: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   850
    return this.select(function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   851
      return value != null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   852
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   853
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   854
0d28b7c10758 First commit
ymh
parents:
diff changeset
   855
  flatten: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   856
    return this.inject([], function(array, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   857
      return array.concat(Object.isArray(value) ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   858
        value.flatten() : [value]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   859
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   860
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   861
0d28b7c10758 First commit
ymh
parents:
diff changeset
   862
  without: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   863
    var values = $A(arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   864
    return this.select(function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   865
      return !values.include(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   866
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   867
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   868
0d28b7c10758 First commit
ymh
parents:
diff changeset
   869
  reverse: function(inline) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   870
    return (inline !== false ? this : this.toArray())._reverse();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   871
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   872
0d28b7c10758 First commit
ymh
parents:
diff changeset
   873
  reduce: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   874
    return this.length > 1 ? this : this[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   875
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   876
0d28b7c10758 First commit
ymh
parents:
diff changeset
   877
  uniq: function(sorted) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   878
    return this.inject([], function(array, value, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   879
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   880
        array.push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   881
      return array;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   882
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   883
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   884
0d28b7c10758 First commit
ymh
parents:
diff changeset
   885
  intersect: function(array) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   886
    return this.uniq().findAll(function(item) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   887
      return array.detect(function(value) { return item === value });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   888
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   889
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   890
0d28b7c10758 First commit
ymh
parents:
diff changeset
   891
  clone: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   892
    return [].concat(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   893
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   894
0d28b7c10758 First commit
ymh
parents:
diff changeset
   895
  size: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   896
    return this.length;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   897
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   898
0d28b7c10758 First commit
ymh
parents:
diff changeset
   899
  inspect: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   900
    return '[' + this.map(Object.inspect).join(', ') + ']';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   901
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   902
0d28b7c10758 First commit
ymh
parents:
diff changeset
   903
  toJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   904
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   905
    this.each(function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   906
      var value = Object.toJSON(object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   907
      if (value !== undefined) results.push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   908
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   909
    return '[' + results.join(', ') + ']';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   910
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   911
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   912
0d28b7c10758 First commit
ymh
parents:
diff changeset
   913
// use native browser JS 1.6 implementation if available
0d28b7c10758 First commit
ymh
parents:
diff changeset
   914
if (Object.isFunction(Array.prototype.forEach))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   915
  Array.prototype._each = Array.prototype.forEach;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   916
0d28b7c10758 First commit
ymh
parents:
diff changeset
   917
if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   918
  i || (i = 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   919
  var length = this.length;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   920
  if (i < 0) i = length + i;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   921
  for (; i < length; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   922
    if (this[i] === item) return i;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   923
  return -1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   924
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   925
0d28b7c10758 First commit
ymh
parents:
diff changeset
   926
if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   927
  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   928
  var n = this.slice(0, i).reverse().indexOf(item);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   929
  return (n < 0) ? n : i - n - 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   930
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   931
0d28b7c10758 First commit
ymh
parents:
diff changeset
   932
Array.prototype.toArray = Array.prototype.clone;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   933
0d28b7c10758 First commit
ymh
parents:
diff changeset
   934
function $w(string) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   935
  if (!Object.isString(string)) return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   936
  string = string.strip();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   937
  return string ? string.split(/\s+/) : [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   938
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   939
0d28b7c10758 First commit
ymh
parents:
diff changeset
   940
if (Prototype.Browser.Opera){
0d28b7c10758 First commit
ymh
parents:
diff changeset
   941
  Array.prototype.concat = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   942
    var array = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   943
    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   944
    for (var i = 0, length = arguments.length; i < length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   945
      if (Object.isArray(arguments[i])) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   946
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   947
          array.push(arguments[i][j]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   948
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   949
        array.push(arguments[i]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   950
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   951
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   952
    return array;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   953
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   954
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   955
Object.extend(Number.prototype, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   956
  toColorPart: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   957
    return this.toPaddedString(2, 16);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   958
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   959
0d28b7c10758 First commit
ymh
parents:
diff changeset
   960
  succ: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   961
    return this + 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   962
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   963
0d28b7c10758 First commit
ymh
parents:
diff changeset
   964
  times: function(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   965
    $R(0, this, true).each(iterator);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   966
    return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   967
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   968
0d28b7c10758 First commit
ymh
parents:
diff changeset
   969
  toPaddedString: function(length, radix) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   970
    var string = this.toString(radix || 10);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   971
    return '0'.times(length - string.length) + string;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   972
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   973
0d28b7c10758 First commit
ymh
parents:
diff changeset
   974
  toJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   975
    return isFinite(this) ? this.toString() : 'null';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   976
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   977
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   978
0d28b7c10758 First commit
ymh
parents:
diff changeset
   979
$w('abs round ceil floor').each(function(method){
0d28b7c10758 First commit
ymh
parents:
diff changeset
   980
  Number.prototype[method] = Math[method].methodize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   981
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   982
function $H(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   983
  return new Hash(object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   984
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   985
0d28b7c10758 First commit
ymh
parents:
diff changeset
   986
var Hash = Class.create(Enumerable, (function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   987
  if (function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   988
    var i = 0, Test = function(value) { this.key = value };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   989
    Test.prototype.key = 'foo';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   990
    for (var property in new Test('bar')) i++;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   991
    return i > 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   992
  }()) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   993
    function each(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   994
      var cache = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   995
      for (var key in this._object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   996
        var value = this._object[key];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   997
        if (cache.include(key)) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   998
        cache.push(key);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   999
        var pair = [key, value];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1000
        pair.key = key;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1001
        pair.value = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1002
        iterator(pair);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1003
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1004
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1005
  } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1006
    function each(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1007
      for (var key in this._object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1008
        var value = this._object[key], pair = [key, value];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1009
        pair.key = key;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1010
        pair.value = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1011
        iterator(pair);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1012
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1013
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1014
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1015
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1016
  function toQueryPair(key, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1017
    if (Object.isUndefined(value)) return key;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1018
    return key + '=' + encodeURIComponent(String.interpret(value));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1019
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1020
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1021
  return {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1022
    initialize: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1023
      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1024
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1025
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1026
    _each: each,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1027
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1028
    set: function(key, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1029
      return this._object[key] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1030
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1031
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1032
    get: function(key) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1033
      return this._object[key];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1034
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1035
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1036
    unset: function(key) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1037
      var value = this._object[key];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1038
      delete this._object[key];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1039
      return value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1040
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1041
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1042
    toObject: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1043
      return Object.clone(this._object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1044
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1045
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1046
    keys: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1047
      return this.pluck('key');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1048
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1049
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1050
    values: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1051
      return this.pluck('value');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1052
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1053
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1054
    index: function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1055
      var match = this.detect(function(pair) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1056
        return pair.value === value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1057
      });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1058
      return match && match.key;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1059
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1060
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1061
    merge: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1062
      return this.clone().update(object);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1063
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1064
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1065
    update: function(object) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1066
      return new Hash(object).inject(this, function(result, pair) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1067
        result.set(pair.key, pair.value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1068
        return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1069
      });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1070
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1071
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1072
    toQueryString: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1073
      return this.map(function(pair) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1074
        var key = encodeURIComponent(pair.key), values = pair.value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1075
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1076
        if (values && typeof values == 'object') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1077
          if (Object.isArray(values))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1078
            return values.map(toQueryPair.curry(key)).join('&');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1079
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1080
        return toQueryPair(key, values);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1081
      }).join('&');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1082
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1083
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1084
    inspect: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1085
      return '#<Hash:{' + this.map(function(pair) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1086
        return pair.map(Object.inspect).join(': ');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1087
      }).join(', ') + '}>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1088
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1089
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1090
    toJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1091
      return Object.toJSON(this.toObject());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1092
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1093
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1094
    clone: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1095
      return new Hash(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1096
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1097
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1098
})());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1099
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1100
Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1101
Hash.from = $H;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1102
var ObjectRange = Class.create(Enumerable, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1103
  initialize: function(start, end, exclusive) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1104
    this.start = start;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1105
    this.end = end;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1106
    this.exclusive = exclusive;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1107
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1108
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1109
  _each: function(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1110
    var value = this.start;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1111
    while (this.include(value)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1112
      iterator(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1113
      value = value.succ();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1114
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1115
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1116
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1117
  include: function(value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1118
    if (value < this.start)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1119
      return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1120
    if (this.exclusive)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1121
      return value < this.end;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1122
    return value <= this.end;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1123
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1124
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1125
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1126
var $R = function(start, end, exclusive) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1127
  return new ObjectRange(start, end, exclusive);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1128
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1129
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1130
var Ajax = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1131
  getTransport: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1132
    return Try.these(
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1133
      function() {return new XMLHttpRequest()},
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1134
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1135
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1136
    ) || false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1137
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1138
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1139
  activeRequestCount: 0
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1140
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1141
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1142
Ajax.Responders = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1143
  responders: [],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1144
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1145
  _each: function(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1146
    this.responders._each(iterator);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1147
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1148
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1149
  register: function(responder) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1150
    if (!this.include(responder))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1151
      this.responders.push(responder);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1152
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1153
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1154
  unregister: function(responder) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1155
    this.responders = this.responders.without(responder);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1156
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1157
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1158
  dispatch: function(callback, request, transport, json) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1159
    this.each(function(responder) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1160
      if (Object.isFunction(responder[callback])) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1161
        try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1162
          responder[callback].apply(responder, [request, transport, json]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1163
        } catch (e) { }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1164
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1165
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1166
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1167
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1168
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1169
Object.extend(Ajax.Responders, Enumerable);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1170
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1171
Ajax.Responders.register({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1172
  onCreate:   function() { Ajax.activeRequestCount++ },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1173
  onComplete: function() { Ajax.activeRequestCount-- }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1174
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1175
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1176
Ajax.Base = Class.create({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1177
  initialize: function(options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1178
    this.options = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1179
      method:       'post',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1180
      asynchronous: true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1181
      contentType:  'application/x-www-form-urlencoded',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1182
      encoding:     'UTF-8',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1183
      parameters:   '',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1184
      evalJSON:     true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1185
      evalJS:       true
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1186
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1187
    Object.extend(this.options, options || { });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1188
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1189
    this.options.method = this.options.method.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1190
    if (Object.isString(this.options.parameters))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1191
      this.options.parameters = this.options.parameters.toQueryParams();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1192
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1193
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1194
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1195
Ajax.Request = Class.create(Ajax.Base, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1196
  _complete: false,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1197
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1198
  initialize: function($super, url, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1199
    $super(options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1200
    this.transport = Ajax.getTransport();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1201
    this.request(url);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1202
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1203
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1204
  request: function(url) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1205
    this.url = url;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1206
    this.method = this.options.method;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1207
    var params = Object.clone(this.options.parameters);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1208
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1209
    if (!['get', 'post'].include(this.method)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1210
      // simulate other verbs over post
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1211
      params['_method'] = this.method;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1212
      this.method = 'post';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1213
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1214
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1215
    this.parameters = params;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1216
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1217
    if (params = Object.toQueryString(params)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1218
      // when GET, append parameters to URL
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1219
      if (this.method == 'get')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1220
        this.url += (this.url.include('?') ? '&' : '?') + params;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1221
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1222
        params += '&_=';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1223
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1224
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1225
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1226
      var response = new Ajax.Response(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1227
      if (this.options.onCreate) this.options.onCreate(response);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1228
      Ajax.Responders.dispatch('onCreate', this, response);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1229
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1230
      this.transport.open(this.method.toUpperCase(), this.url,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1231
        this.options.asynchronous);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1232
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1233
      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1234
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1235
      this.transport.onreadystatechange = this.onStateChange.bind(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1236
      this.setRequestHeaders();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1237
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1238
      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1239
      this.transport.send(this.body);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1240
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1241
      /* Force Firefox to handle ready state 4 for synchronous requests */
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1242
      if (!this.options.asynchronous && this.transport.overrideMimeType)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1243
        this.onStateChange();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1244
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1245
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1246
    catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1247
      this.dispatchException(e);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1248
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1249
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1250
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1251
  onStateChange: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1252
    var readyState = this.transport.readyState;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1253
    if (readyState > 1 && !((readyState == 4) && this._complete))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1254
      this.respondToReadyState(this.transport.readyState);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1255
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1256
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1257
  setRequestHeaders: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1258
    var headers = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1259
      'X-Requested-With': 'XMLHttpRequest',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1260
      'X-Prototype-Version': Prototype.Version,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1261
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1262
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1263
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1264
    if (this.method == 'post') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1265
      headers['Content-type'] = this.options.contentType +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1266
        (this.options.encoding ? '; charset=' + this.options.encoding : '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1267
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1268
      /* Force "Connection: close" for older Mozilla browsers to work
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1269
       * around a bug where XMLHttpRequest sends an incorrect
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1270
       * Content-length header. See Mozilla Bugzilla #246651.
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1271
       */
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1272
      if (this.transport.overrideMimeType &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1273
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1274
            headers['Connection'] = 'close';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1275
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1276
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1277
    // user-defined headers
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1278
    if (typeof this.options.requestHeaders == 'object') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1279
      var extras = this.options.requestHeaders;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1280
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1281
      if (Object.isFunction(extras.push))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1282
        for (var i = 0, length = extras.length; i < length; i += 2)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1283
          headers[extras[i]] = extras[i+1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1284
      else
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1285
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1286
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1287
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1288
    for (var name in headers)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1289
      this.transport.setRequestHeader(name, headers[name]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1290
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1291
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1292
  success: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1293
    var status = this.getStatus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1294
    return !status || (status >= 200 && status < 300);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1295
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1296
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1297
  getStatus: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1298
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1299
      return this.transport.status || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1300
    } catch (e) { return 0 }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1301
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1302
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1303
  respondToReadyState: function(readyState) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1304
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1305
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1306
    if (state == 'Complete') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1307
      try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1308
        this._complete = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1309
        (this.options['on' + response.status]
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1310
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1311
         || Prototype.emptyFunction)(response, response.headerJSON);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1312
      } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1313
        this.dispatchException(e);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1314
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1315
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1316
      var contentType = response.getHeader('Content-type');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1317
      if (this.options.evalJS == 'force'
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1318
          || (this.options.evalJS && contentType
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1319
          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1320
        this.evalResponse();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1321
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1322
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1323
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1324
      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1325
      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1326
    } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1327
      this.dispatchException(e);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1328
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1329
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1330
    if (state == 'Complete') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1331
      // avoid memory leak in MSIE: clean up
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1332
      this.transport.onreadystatechange = Prototype.emptyFunction;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1333
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1334
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1335
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1336
  getHeader: function(name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1337
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1338
      return this.transport.getResponseHeader(name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1339
    } catch (e) { return null }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1340
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1341
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1342
  evalResponse: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1343
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1344
      return eval((this.transport.responseText || '').unfilterJSON());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1345
    } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1346
      this.dispatchException(e);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1347
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1348
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1349
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1350
  dispatchException: function(exception) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1351
    (this.options.onException || Prototype.emptyFunction)(this, exception);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1352
    Ajax.Responders.dispatch('onException', this, exception);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1353
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1354
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1355
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1356
Ajax.Request.Events =
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1357
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1358
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1359
Ajax.Response = Class.create({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1360
  initialize: function(request){
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1361
    this.request = request;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1362
    var transport  = this.transport  = request.transport,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1363
        readyState = this.readyState = transport.readyState;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1364
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1365
    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1366
      this.status       = this.getStatus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1367
      this.statusText   = this.getStatusText();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1368
      this.responseText = String.interpret(transport.responseText);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1369
      this.headerJSON   = this._getHeaderJSON();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1370
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1371
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1372
    if(readyState == 4) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1373
      var xml = transport.responseXML;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1374
      this.responseXML  = xml === undefined ? null : xml;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1375
      this.responseJSON = this._getResponseJSON();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1376
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1377
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1378
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1379
  status:      0,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1380
  statusText: '',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1381
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1382
  getStatus: Ajax.Request.prototype.getStatus,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1383
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1384
  getStatusText: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1385
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1386
      return this.transport.statusText || '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1387
    } catch (e) { return '' }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1388
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1389
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1390
  getHeader: Ajax.Request.prototype.getHeader,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1391
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1392
  getAllHeaders: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1393
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1394
      return this.getAllResponseHeaders();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1395
    } catch (e) { return null }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1396
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1397
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1398
  getResponseHeader: function(name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1399
    return this.transport.getResponseHeader(name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1400
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1401
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1402
  getAllResponseHeaders: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1403
    return this.transport.getAllResponseHeaders();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1404
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1405
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1406
  _getHeaderJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1407
    var json = this.getHeader('X-JSON');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1408
    if (!json) return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1409
    json = decodeURIComponent(escape(json));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1410
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1411
      return json.evalJSON(this.request.options.sanitizeJSON);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1412
    } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1413
      this.request.dispatchException(e);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1414
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1415
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1416
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1417
  _getResponseJSON: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1418
    var options = this.request.options;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1419
    if (!options.evalJSON || (options.evalJSON != 'force' &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1420
      !(this.getHeader('Content-type') || '').include('application/json')))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1421
        return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1422
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1423
      return this.transport.responseText.evalJSON(options.sanitizeJSON);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1424
    } catch (e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1425
      this.request.dispatchException(e);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1426
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1427
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1428
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1429
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1430
Ajax.Updater = Class.create(Ajax.Request, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1431
  initialize: function($super, container, url, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1432
    this.container = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1433
      success: (container.success || container),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1434
      failure: (container.failure || (container.success ? null : container))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1435
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1436
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1437
    options = options || { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1438
    var onComplete = options.onComplete;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1439
    options.onComplete = (function(response, param) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1440
      this.updateContent(response.responseText);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1441
      if (Object.isFunction(onComplete)) onComplete(response, param);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1442
    }).bind(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1443
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1444
    $super(url, options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1445
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1446
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1447
  updateContent: function(responseText) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1448
    var receiver = this.container[this.success() ? 'success' : 'failure'],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1449
        options = this.options;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1450
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1451
    if (!options.evalScripts) responseText = responseText.stripScripts();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1452
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1453
    if (receiver = $(receiver)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1454
      if (options.insertion) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1455
        if (Object.isString(options.insertion)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1456
          var insertion = { }; insertion[options.insertion] = responseText;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1457
          receiver.insert(insertion);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1458
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1459
        else options.insertion(receiver, responseText);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1460
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1461
      else receiver.update(responseText);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1462
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1463
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1464
    if (this.success()) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1465
      if (this.onComplete) this.onComplete.bind(this).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1466
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1467
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1468
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1469
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1470
Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1471
  initialize: function($super, container, url, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1472
    $super(options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1473
    this.onComplete = this.options.onComplete;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1474
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1475
    this.frequency = (this.options.frequency || 2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1476
    this.decay = (this.options.decay || 1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1477
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1478
    this.updater = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1479
    this.container = container;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1480
    this.url = url;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1481
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1482
    this.start();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1483
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1484
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1485
  start: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1486
    this.options.onComplete = this.updateComplete.bind(this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1487
    this.onTimerEvent();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1488
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1489
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1490
  stop: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1491
    this.updater.options.onComplete = undefined;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1492
    clearTimeout(this.timer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1493
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1494
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1495
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1496
  updateComplete: function(response) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1497
    if (this.options.decay) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1498
      this.decay = (response.responseText == this.lastText ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1499
        this.decay * this.options.decay : 1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1500
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1501
      this.lastText = response.responseText;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1502
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1503
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1504
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1505
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1506
  onTimerEvent: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1507
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1508
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1509
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1510
function $(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1511
  if (arguments.length > 1) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1512
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1513
      elements.push($(arguments[i]));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1514
    return elements;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1515
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1516
  if (Object.isString(element))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1517
    element = document.getElementById(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1518
  return Element.extend(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1519
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1520
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1521
if (Prototype.BrowserFeatures.XPath) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1522
  document._getElementsByXPath = function(expression, parentElement) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1523
    var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1524
    var query = document.evaluate(expression, $(parentElement) || document,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1525
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1526
    for (var i = 0, length = query.snapshotLength; i < length; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1527
      results.push(Element.extend(query.snapshotItem(i)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1528
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1529
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1530
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1531
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1532
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1533
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1534
if (!window.Node) var Node = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1535
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1536
if (!Node.ELEMENT_NODE) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1537
  // DOM level 2 ECMAScript Language Binding
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1538
  Object.extend(Node, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1539
    ELEMENT_NODE: 1,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1540
    ATTRIBUTE_NODE: 2,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1541
    TEXT_NODE: 3,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1542
    CDATA_SECTION_NODE: 4,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1543
    ENTITY_REFERENCE_NODE: 5,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1544
    ENTITY_NODE: 6,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1545
    PROCESSING_INSTRUCTION_NODE: 7,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1546
    COMMENT_NODE: 8,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1547
    DOCUMENT_NODE: 9,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1548
    DOCUMENT_TYPE_NODE: 10,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1549
    DOCUMENT_FRAGMENT_NODE: 11,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1550
    NOTATION_NODE: 12
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1551
  });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1552
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1553
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1554
(function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1555
  var element = this.Element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1556
  this.Element = function(tagName, attributes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1557
    attributes = attributes || { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1558
    tagName = tagName.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1559
    var cache = Element.cache;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1560
    if (Prototype.Browser.IE && attributes.name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1561
      tagName = '<' + tagName + ' name="' + attributes.name + '">';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1562
      delete attributes.name;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1563
      return Element.writeAttribute(document.createElement(tagName), attributes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1564
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1565
    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1566
    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1567
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1568
  Object.extend(this.Element, element || { });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1569
}).call(window);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1570
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1571
Element.cache = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1572
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1573
Element.Methods = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1574
  visible: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1575
    return $(element).style.display != 'none';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1576
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1577
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1578
  toggle: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1579
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1580
    Element[Element.visible(element) ? 'hide' : 'show'](element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1581
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1582
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1583
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1584
  hide: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1585
    $(element).style.display = 'none';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1586
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1587
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1588
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1589
  show: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1590
    $(element).style.display = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1591
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1592
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1593
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1594
  remove: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1595
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1596
    element.parentNode.removeChild(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1597
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1598
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1599
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1600
  update: function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1601
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1602
    if (content && content.toElement) content = content.toElement();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1603
    if (Object.isElement(content)) return element.update().insert(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1604
    content = Object.toHTML(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1605
    element.innerHTML = content.stripScripts();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1606
    content.evalScripts.bind(content).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1607
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1608
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1609
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1610
  replace: function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1611
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1612
    if (content && content.toElement) content = content.toElement();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1613
    else if (!Object.isElement(content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1614
      content = Object.toHTML(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1615
      var range = element.ownerDocument.createRange();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1616
      range.selectNode(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1617
      content.evalScripts.bind(content).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1618
      content = range.createContextualFragment(content.stripScripts());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1619
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1620
    element.parentNode.replaceChild(content, element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1621
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1622
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1623
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1624
  insert: function(element, insertions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1625
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1626
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1627
    if (Object.isString(insertions) || Object.isNumber(insertions) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1628
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1629
          insertions = {bottom:insertions};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1630
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1631
    var content, t, range;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1632
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1633
    for (position in insertions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1634
      content  = insertions[position];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1635
      position = position.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1636
      t = Element._insertionTranslations[position];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1637
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1638
      if (content && content.toElement) content = content.toElement();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1639
      if (Object.isElement(content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1640
        t.insert(element, content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1641
        continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1642
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1643
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1644
      content = Object.toHTML(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1645
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1646
      range = element.ownerDocument.createRange();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1647
      t.initializeRange(element, range);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1648
      t.insert(element, range.createContextualFragment(content.stripScripts()));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1649
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1650
      content.evalScripts.bind(content).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1651
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1652
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1653
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1654
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1655
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1656
  wrap: function(element, wrapper, attributes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1657
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1658
    if (Object.isElement(wrapper))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1659
      $(wrapper).writeAttribute(attributes || { });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1660
    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1661
    else wrapper = new Element('div', wrapper);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1662
    if (element.parentNode)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1663
      element.parentNode.replaceChild(wrapper, element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1664
    wrapper.appendChild(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1665
    return wrapper;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1666
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1667
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1668
  inspect: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1669
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1670
    var result = '<' + element.tagName.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1671
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1672
      var property = pair.first(), attribute = pair.last();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1673
      var value = (element[property] || '').toString();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1674
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1675
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1676
    return result + '>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1677
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1678
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1679
  recursivelyCollect: function(element, property) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1680
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1681
    var elements = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1682
    while (element = element[property])
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1683
      if (element.nodeType == 1)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1684
        elements.push(Element.extend(element));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1685
    return elements;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1686
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1687
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1688
  ancestors: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1689
    return $(element).recursivelyCollect('parentNode');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1690
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1691
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1692
  descendants: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1693
    return $A($(element).getElementsByTagName('*')).each(Element.extend);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1694
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1695
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1696
  firstDescendant: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1697
    element = $(element).firstChild;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1698
    while (element && element.nodeType != 1) element = element.nextSibling;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1699
    return $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1700
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1701
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1702
  immediateDescendants: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1703
    if (!(element = $(element).firstChild)) return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1704
    while (element && element.nodeType != 1) element = element.nextSibling;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1705
    if (element) return [element].concat($(element).nextSiblings());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1706
    return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1707
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1708
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1709
  previousSiblings: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1710
    return $(element).recursivelyCollect('previousSibling');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1711
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1712
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1713
  nextSiblings: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1714
    return $(element).recursivelyCollect('nextSibling');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1715
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1716
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1717
  siblings: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1718
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1719
    return element.previousSiblings().reverse().concat(element.nextSiblings());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1720
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1721
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1722
  match: function(element, selector) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1723
    if (Object.isString(selector))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1724
      selector = new Selector(selector);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1725
    return selector.match($(element));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1726
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1727
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1728
  up: function(element, expression, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1729
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1730
    if (arguments.length == 1) return $(element.parentNode);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1731
    var ancestors = element.ancestors();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1732
    return expression ? Selector.findElement(ancestors, expression, index) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1733
      ancestors[index || 0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1734
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1735
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1736
  down: function(element, expression, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1737
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1738
    if (arguments.length == 1) return element.firstDescendant();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1739
    var descendants = element.descendants();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1740
    return expression ? Selector.findElement(descendants, expression, index) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1741
      descendants[index || 0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1742
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1743
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1744
  previous: function(element, expression, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1745
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1746
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1747
    var previousSiblings = element.previousSiblings();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1748
    return expression ? Selector.findElement(previousSiblings, expression, index) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1749
      previousSiblings[index || 0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1750
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1751
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1752
  next: function(element, expression, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1753
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1754
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1755
    var nextSiblings = element.nextSiblings();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1756
    return expression ? Selector.findElement(nextSiblings, expression, index) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1757
      nextSiblings[index || 0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1758
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1759
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1760
  select: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1761
    var args = $A(arguments), element = $(args.shift());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1762
    return Selector.findChildElements(element, args);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1763
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1764
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1765
  adjacent: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1766
    var args = $A(arguments), element = $(args.shift());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1767
    return Selector.findChildElements(element.parentNode, args).without(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1768
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1769
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1770
  identify: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1771
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1772
    var id = element.readAttribute('id'), self = arguments.callee;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1773
    if (id) return id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1774
    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1775
    element.writeAttribute('id', id);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1776
    return id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1777
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1778
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1779
  readAttribute: function(element, name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1780
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1781
    if (Prototype.Browser.IE) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1782
      var t = Element._attributeTranslations.read;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1783
      if (t.values[name]) return t.values[name](element, name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1784
      if (t.names[name]) name = t.names[name];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1785
      if (name.include(':')) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1786
        return (!element.attributes || !element.attributes[name]) ? null :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1787
         element.attributes[name].value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1788
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1789
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1790
    return element.getAttribute(name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1791
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1792
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1793
  writeAttribute: function(element, name, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1794
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1795
    var attributes = { }, t = Element._attributeTranslations.write;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1796
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1797
    if (typeof name == 'object') attributes = name;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1798
    else attributes[name] = value === undefined ? true : value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1799
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1800
    for (var attr in attributes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1801
      var name = t.names[attr] || attr, value = attributes[attr];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1802
      if (t.values[attr]) name = t.values[attr](element, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1803
      if (value === false || value === null)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1804
        element.removeAttribute(name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1805
      else if (value === true)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1806
        element.setAttribute(name, name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1807
      else element.setAttribute(name, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1808
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1809
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1810
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1811
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1812
  getHeight: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1813
    return $(element).getDimensions().height;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1814
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1815
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1816
  getWidth: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1817
    return $(element).getDimensions().width;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1818
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1819
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1820
  classNames: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1821
    return new Element.ClassNames(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1822
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1823
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1824
  hasClassName: function(element, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1825
    if (!(element = $(element))) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1826
    var elementClassName = element.className;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1827
    return (elementClassName.length > 0 && (elementClassName == className ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1828
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1829
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1830
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1831
  addClassName: function(element, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1832
    if (!(element = $(element))) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1833
    if (!element.hasClassName(className))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1834
      element.className += (element.className ? ' ' : '') + className;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1835
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1836
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1837
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1838
  removeClassName: function(element, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1839
    if (!(element = $(element))) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1840
    element.className = element.className.replace(
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1841
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1842
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1843
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1844
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1845
  toggleClassName: function(element, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1846
    if (!(element = $(element))) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1847
    return element[element.hasClassName(className) ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1848
      'removeClassName' : 'addClassName'](className);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1849
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1850
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1851
  // removes whitespace-only text node children
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1852
  cleanWhitespace: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1853
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1854
    var node = element.firstChild;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1855
    while (node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1856
      var nextNode = node.nextSibling;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1857
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1858
        element.removeChild(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1859
      node = nextNode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1860
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1861
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1862
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1863
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1864
  empty: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1865
    return $(element).innerHTML.blank();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1866
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1867
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1868
  descendantOf: function(element, ancestor) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1869
    element = $(element), ancestor = $(ancestor);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1870
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1871
    if (element.compareDocumentPosition)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1872
      return (element.compareDocumentPosition(ancestor) & 8) === 8;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1873
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1874
    if (element.sourceIndex && !Prototype.Browser.Opera) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1875
      var e = element.sourceIndex, a = ancestor.sourceIndex,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1876
       nextAncestor = ancestor.nextSibling;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1877
      if (!nextAncestor) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1878
        do { ancestor = ancestor.parentNode; }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1879
        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1880
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1881
      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1882
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1883
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1884
    while (element = element.parentNode)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1885
      if (element == ancestor) return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1886
    return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1887
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1888
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1889
  scrollTo: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1890
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1891
    var pos = element.cumulativeOffset();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1892
    window.scrollTo(pos[0], pos[1]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1893
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1894
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1895
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1896
  getStyle: function(element, style) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1897
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1898
    style = style == 'float' ? 'cssFloat' : style.camelize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1899
    var value = element.style[style];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1900
    if (!value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1901
      var css = document.defaultView.getComputedStyle(element, null);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1902
      value = css ? css[style] : null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1903
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1904
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1905
    return value == 'auto' ? null : value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1906
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1907
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1908
  getOpacity: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1909
    return $(element).getStyle('opacity');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1910
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1911
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1912
  setStyle: function(element, styles) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1913
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1914
    var elementStyle = element.style, match;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1915
    if (Object.isString(styles)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1916
      element.style.cssText += ';' + styles;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1917
      return styles.include('opacity') ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1918
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1919
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1920
    for (var property in styles)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1921
      if (property == 'opacity') element.setOpacity(styles[property]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1922
      else
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1923
        elementStyle[(property == 'float' || property == 'cssFloat') ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1924
          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1925
            property] = styles[property];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1926
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1927
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1928
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1929
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1930
  setOpacity: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1931
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1932
    element.style.opacity = (value == 1 || value === '') ? '' :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1933
      (value < 0.00001) ? 0 : value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1934
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1935
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1936
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1937
  getDimensions: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1938
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1939
    var display = $(element).getStyle('display');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1940
    if (display != 'none' && display != null) // Safari bug
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1941
      return {width: element.offsetWidth, height: element.offsetHeight};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1942
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1943
    // All *Width and *Height properties give 0 on elements with display none,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1944
    // so enable the element temporarily
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1945
    var els = element.style;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1946
    var originalVisibility = els.visibility;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1947
    var originalPosition = els.position;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1948
    var originalDisplay = els.display;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1949
    els.visibility = 'hidden';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1950
    els.position = 'absolute';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1951
    els.display = 'block';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1952
    var originalWidth = element.clientWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1953
    var originalHeight = element.clientHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1954
    els.display = originalDisplay;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1955
    els.position = originalPosition;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1956
    els.visibility = originalVisibility;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1957
    return {width: originalWidth, height: originalHeight};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1958
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1959
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1960
  makePositioned: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1961
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1962
    var pos = Element.getStyle(element, 'position');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1963
    if (pos == 'static' || !pos) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1964
      element._madePositioned = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1965
      element.style.position = 'relative';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1966
      // Opera returns the offset relative to the positioning context, when an
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1967
      // element is position relative but top and left have not been defined
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1968
      if (window.opera) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1969
        element.style.top = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1970
        element.style.left = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1971
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1972
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1973
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1974
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1975
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1976
  undoPositioned: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1977
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1978
    if (element._madePositioned) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1979
      element._madePositioned = undefined;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1980
      element.style.position =
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1981
        element.style.top =
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1982
        element.style.left =
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1983
        element.style.bottom =
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1984
        element.style.right = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1985
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1986
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1987
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1988
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1989
  makeClipping: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1990
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1991
    if (element._overflow) return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1992
    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1993
    if (element._overflow !== 'hidden')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1994
      element.style.overflow = 'hidden';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1995
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1996
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1997
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1998
  undoClipping: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1999
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2000
    if (!element._overflow) return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2001
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2002
    element._overflow = null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2003
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2004
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2005
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2006
  cumulativeOffset: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2007
    var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2008
    do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2009
      valueT += element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2010
      valueL += element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2011
      element = element.offsetParent;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2012
    } while (element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2013
    return Element._returnOffset(valueL, valueT);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2014
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2015
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2016
  positionedOffset: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2017
    var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2018
    do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2019
      valueT += element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2020
      valueL += element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2021
      element = element.offsetParent;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2022
      if (element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2023
        if (element.tagName == 'BODY') break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2024
        var p = Element.getStyle(element, 'position');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2025
        if (p == 'relative' || p == 'absolute') break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2026
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2027
    } while (element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2028
    return Element._returnOffset(valueL, valueT);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2029
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2030
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2031
  absolutize: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2032
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2033
    if (element.getStyle('position') == 'absolute') return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2034
    // Position.prepare(); // To be done manually by Scripty when it needs it.
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2035
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2036
    var offsets = element.positionedOffset();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2037
    var top     = offsets[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2038
    var left    = offsets[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2039
    var width   = element.clientWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2040
    var height  = element.clientHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2041
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2042
    element._originalLeft   = left - parseFloat(element.style.left  || 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2043
    element._originalTop    = top  - parseFloat(element.style.top || 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2044
    element._originalWidth  = element.style.width;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2045
    element._originalHeight = element.style.height;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2046
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2047
    element.style.position = 'absolute';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2048
    element.style.top    = top + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2049
    element.style.left   = left + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2050
    element.style.width  = width + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2051
    element.style.height = height + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2052
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2053
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2054
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2055
  relativize: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2056
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2057
    if (element.getStyle('position') == 'relative') return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2058
    // Position.prepare(); // To be done manually by Scripty when it needs it.
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2059
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2060
    element.style.position = 'relative';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2061
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2062
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2063
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2064
    element.style.top    = top + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2065
    element.style.left   = left + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2066
    element.style.height = element._originalHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2067
    element.style.width  = element._originalWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2068
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2069
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2070
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2071
  cumulativeScrollOffset: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2072
    var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2073
    do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2074
      valueT += element.scrollTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2075
      valueL += element.scrollLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2076
      element = element.parentNode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2077
    } while (element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2078
    return Element._returnOffset(valueL, valueT);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2079
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2080
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2081
  getOffsetParent: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2082
    if (element.offsetParent) return $(element.offsetParent);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2083
    if (element == document.body) return $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2084
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2085
    while ((element = element.parentNode) && element != document.body)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2086
      if (Element.getStyle(element, 'position') != 'static')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2087
        return $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2088
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2089
    return $(document.body);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2090
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2091
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2092
  viewportOffset: function(forElement) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2093
    var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2094
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2095
    var element = forElement;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2096
    do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2097
      valueT += element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2098
      valueL += element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2099
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2100
      // Safari fix
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2101
      if (element.offsetParent == document.body &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2102
        Element.getStyle(element, 'position') == 'absolute') break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2103
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2104
    } while (element = element.offsetParent);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2105
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2106
    element = forElement;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2107
    do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2108
      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2109
        valueT -= element.scrollTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2110
        valueL -= element.scrollLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2111
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2112
    } while (element = element.parentNode);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2113
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2114
    return Element._returnOffset(valueL, valueT);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2115
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2116
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2117
  clonePosition: function(element, source) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2118
    var options = Object.extend({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2119
      setLeft:    true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2120
      setTop:     true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2121
      setWidth:   true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2122
      setHeight:  true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2123
      offsetTop:  0,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2124
      offsetLeft: 0
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2125
    }, arguments[2] || { });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2126
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2127
    // find page position of source
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2128
    source = $(source);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2129
    var p = source.viewportOffset();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2130
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2131
    // find coordinate system to use
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2132
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2133
    var delta = [0, 0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2134
    var parent = null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2135
    // delta [0,0] will do fine with position: fixed elements,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2136
    // position:absolute needs offsetParent deltas
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2137
    if (Element.getStyle(element, 'position') == 'absolute') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2138
      parent = element.getOffsetParent();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2139
      delta = parent.viewportOffset();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2140
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2141
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2142
    // correct by body offsets (fixes Safari)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2143
    if (parent == document.body) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2144
      delta[0] -= document.body.offsetLeft;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2145
      delta[1] -= document.body.offsetTop;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2146
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2147
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2148
    // set position
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2149
    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2150
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2151
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2152
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2153
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2154
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2155
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2156
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2157
Element.Methods.identify.counter = 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2158
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2159
Object.extend(Element.Methods, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2160
  getElementsBySelector: Element.Methods.select,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2161
  childElements: Element.Methods.immediateDescendants
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2162
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2163
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2164
Element._attributeTranslations = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2165
  write: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2166
    names: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2167
      className: 'class',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2168
      htmlFor:   'for'
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2169
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2170
    values: { }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2171
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2172
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2173
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2174
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2175
if (!document.createRange || Prototype.Browser.Opera) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2176
  Element.Methods.insert = function(element, insertions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2177
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2178
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2179
    if (Object.isString(insertions) || Object.isNumber(insertions) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2180
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2181
          insertions = { bottom: insertions };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2182
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2183
    var t = Element._insertionTranslations, content, position, pos, tagName;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2184
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2185
    for (position in insertions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2186
      content  = insertions[position];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2187
      position = position.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2188
      pos      = t[position];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2189
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2190
      if (content && content.toElement) content = content.toElement();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2191
      if (Object.isElement(content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2192
        pos.insert(element, content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2193
        continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2194
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2195
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2196
      content = Object.toHTML(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2197
      tagName = ((position == 'before' || position == 'after')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2198
        ? element.parentNode : element).tagName.toUpperCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2199
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2200
      if (t.tags[tagName]) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2201
        var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2202
        if (position == 'top' || position == 'after') fragments.reverse();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2203
        fragments.each(pos.insert.curry(element));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2204
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2205
      else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2206
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2207
      content.evalScripts.bind(content).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2208
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2209
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2210
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2211
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2212
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2213
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2214
if (Prototype.Browser.Opera) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2215
  Element.Methods._getStyle = Element.Methods.getStyle;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2216
  Element.Methods.getStyle = function(element, style) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2217
    switch(style) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2218
      case 'left':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2219
      case 'top':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2220
      case 'right':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2221
      case 'bottom':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2222
        if (Element._getStyle(element, 'position') == 'static') return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2223
      default: return Element._getStyle(element, style);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2224
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2225
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2226
  Element.Methods._readAttribute = Element.Methods.readAttribute;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2227
  Element.Methods.readAttribute = function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2228
    if (attribute == 'title') return element.title;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2229
    return Element._readAttribute(element, attribute);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2230
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2231
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2232
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2233
else if (Prototype.Browser.IE) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2234
  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2235
    Element.Methods[method] = Element.Methods[method].wrap(
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2236
      function(proceed, element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2237
        element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2238
        var position = element.getStyle('position');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2239
        if (position != 'static') return proceed(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2240
        element.setStyle({ position: 'relative' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2241
        var value = proceed(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2242
        element.setStyle({ position: position });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2243
        return value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2244
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2245
    );
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2246
  });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2247
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2248
  Element.Methods.getStyle = function(element, style) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2249
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2250
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2251
    var value = element.style[style];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2252
    if (!value && element.currentStyle) value = element.currentStyle[style];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2253
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2254
    if (style == 'opacity') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2255
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2256
        if (value[1]) return parseFloat(value[1]) / 100;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2257
      return 1.0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2258
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2259
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2260
    if (value == 'auto') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2261
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2262
        return element['offset' + style.capitalize()] + 'px';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2263
      return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2264
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2265
    return value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2266
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2267
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2268
  Element.Methods.setOpacity = function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2269
    function stripAlpha(filter){
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2270
      return filter.replace(/alpha\([^\)]*\)/gi,'');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2271
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2272
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2273
    var currentStyle = element.currentStyle;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2274
    if ((currentStyle && !currentStyle.hasLayout) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2275
      (!currentStyle && element.style.zoom == 'normal'))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2276
        element.style.zoom = 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2277
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2278
    var filter = element.getStyle('filter'), style = element.style;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2279
    if (value == 1 || value === '') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2280
      (filter = stripAlpha(filter)) ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2281
        style.filter = filter : style.removeAttribute('filter');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2282
      return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2283
    } else if (value < 0.00001) value = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2284
    style.filter = stripAlpha(filter) +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2285
      'alpha(opacity=' + (value * 100) + ')';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2286
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2287
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2288
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2289
  Element._attributeTranslations = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2290
    read: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2291
      names: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2292
        'class': 'className',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2293
        'for':   'htmlFor'
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2294
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2295
      values: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2296
        _getAttr: function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2297
          return element.getAttribute(attribute, 2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2298
        },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2299
        _getAttrNode: function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2300
          var node = element.getAttributeNode(attribute);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2301
          return node ? node.value : "";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2302
        },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2303
        _getEv: function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2304
          var attribute = element.getAttribute(attribute);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2305
          return attribute ? attribute.toString().slice(23, -2) : null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2306
        },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2307
        _flag: function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2308
          return $(element).hasAttribute(attribute) ? attribute : null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2309
        },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2310
        style: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2311
          return element.style.cssText.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2312
        },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2313
        title: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2314
          return element.title;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2315
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2316
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2317
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2318
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2319
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2320
  Element._attributeTranslations.write = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2321
    names: Object.clone(Element._attributeTranslations.read.names),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2322
    values: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2323
      checked: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2324
        element.checked = !!value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2325
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2326
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2327
      style: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2328
        element.style.cssText = value ? value : '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2329
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2330
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2331
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2332
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2333
  Element._attributeTranslations.has = {};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2334
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2335
  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2336
      'encType maxLength readOnly longDesc').each(function(attr) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2337
    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2338
    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2339
  });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2340
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2341
  (function(v) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2342
    Object.extend(v, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2343
      href:        v._getAttr,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2344
      src:         v._getAttr,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2345
      type:        v._getAttr,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2346
      action:      v._getAttrNode,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2347
      disabled:    v._flag,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2348
      checked:     v._flag,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2349
      readonly:    v._flag,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2350
      multiple:    v._flag,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2351
      onload:      v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2352
      onunload:    v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2353
      onclick:     v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2354
      ondblclick:  v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2355
      onmousedown: v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2356
      onmouseup:   v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2357
      onmouseover: v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2358
      onmousemove: v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2359
      onmouseout:  v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2360
      onfocus:     v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2361
      onblur:      v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2362
      onkeypress:  v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2363
      onkeydown:   v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2364
      onkeyup:     v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2365
      onsubmit:    v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2366
      onreset:     v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2367
      onselect:    v._getEv,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2368
      onchange:    v._getEv
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2369
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2370
  })(Element._attributeTranslations.read.values);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2371
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2372
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2373
else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2374
  Element.Methods.setOpacity = function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2375
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2376
    element.style.opacity = (value == 1) ? 0.999999 :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2377
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2378
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2379
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2380
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2381
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2382
else if (Prototype.Browser.WebKit) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2383
  Element.Methods.setOpacity = function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2384
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2385
    element.style.opacity = (value == 1 || value === '') ? '' :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2386
      (value < 0.00001) ? 0 : value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2387
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2388
    if (value == 1)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2389
      if(element.tagName == 'IMG' && element.width) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2390
        element.width++; element.width--;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2391
      } else try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2392
        var n = document.createTextNode(' ');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2393
        element.appendChild(n);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2394
        element.removeChild(n);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2395
      } catch (e) { }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2396
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2397
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2398
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2399
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2400
  // Safari returns margins on body which is incorrect if the child is absolutely
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2401
  // positioned.  For performance reasons, redefine Position.cumulativeOffset for
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2402
  // KHTML/WebKit only.
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2403
  Element.Methods.cumulativeOffset = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2404
    var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2405
    do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2406
      valueT += element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2407
      valueL += element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2408
      if (element.offsetParent == document.body)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2409
        if (Element.getStyle(element, 'position') == 'absolute') break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2410
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2411
      element = element.offsetParent;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2412
    } while (element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2413
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2414
    return Element._returnOffset(valueL, valueT);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2415
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2416
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2417
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2418
if (Prototype.Browser.IE || Prototype.Browser.Opera) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2419
  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2420
  Element.Methods.update = function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2421
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2422
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2423
    if (content && content.toElement) content = content.toElement();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2424
    if (Object.isElement(content)) return element.update().insert(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2425
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2426
    content = Object.toHTML(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2427
    var tagName = element.tagName.toUpperCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2428
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2429
    if (tagName in Element._insertionTranslations.tags) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2430
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2431
      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2432
        .each(function(node) { element.appendChild(node) });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2433
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2434
    else element.innerHTML = content.stripScripts();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2435
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2436
    content.evalScripts.bind(content).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2437
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2438
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2439
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2440
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2441
if (document.createElement('div').outerHTML) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2442
  Element.Methods.replace = function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2443
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2444
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2445
    if (content && content.toElement) content = content.toElement();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2446
    if (Object.isElement(content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2447
      element.parentNode.replaceChild(content, element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2448
      return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2449
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2450
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2451
    content = Object.toHTML(content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2452
    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2453
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2454
    if (Element._insertionTranslations.tags[tagName]) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2455
      var nextSibling = element.next();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2456
      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2457
      parent.removeChild(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2458
      if (nextSibling)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2459
        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2460
      else
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2461
        fragments.each(function(node) { parent.appendChild(node) });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2462
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2463
    else element.outerHTML = content.stripScripts();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2464
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2465
    content.evalScripts.bind(content).defer();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2466
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2467
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2468
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2469
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2470
Element._returnOffset = function(l, t) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2471
  var result = [l, t];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2472
  result.left = l;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2473
  result.top = t;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2474
  return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2475
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2476
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2477
Element._getContentFromAnonymousElement = function(tagName, html) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2478
  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2479
  div.innerHTML = t[0] + html + t[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2480
  t[2].times(function() { div = div.firstChild });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2481
  return $A(div.childNodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2482
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2483
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2484
Element._insertionTranslations = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2485
  before: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2486
    adjacency: 'beforeBegin',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2487
    insert: function(element, node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2488
      element.parentNode.insertBefore(node, element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2489
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2490
    initializeRange: function(element, range) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2491
      range.setStartBefore(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2492
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2493
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2494
  top: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2495
    adjacency: 'afterBegin',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2496
    insert: function(element, node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2497
      element.insertBefore(node, element.firstChild);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2498
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2499
    initializeRange: function(element, range) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2500
      range.selectNodeContents(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2501
      range.collapse(true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2502
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2503
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2504
  bottom: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2505
    adjacency: 'beforeEnd',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2506
    insert: function(element, node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2507
      element.appendChild(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2508
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2509
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2510
  after: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2511
    adjacency: 'afterEnd',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2512
    insert: function(element, node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2513
      element.parentNode.insertBefore(node, element.nextSibling);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2514
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2515
    initializeRange: function(element, range) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2516
      range.setStartAfter(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2517
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2518
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2519
  tags: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2520
    TABLE:  ['<table>',                '</table>',                   1],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2521
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2522
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2523
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2524
    SELECT: ['<select>',               '</select>',                  1]
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2525
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2526
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2527
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2528
(function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2529
  this.bottom.initializeRange = this.top.initializeRange;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2530
  Object.extend(this.tags, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2531
    THEAD: this.tags.TBODY,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2532
    TFOOT: this.tags.TBODY,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2533
    TH:    this.tags.TD
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2534
  });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2535
}).call(Element._insertionTranslations);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2536
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2537
Element.Methods.Simulated = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2538
  hasAttribute: function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2539
    attribute = Element._attributeTranslations.has[attribute] || attribute;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2540
    var node = $(element).getAttributeNode(attribute);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2541
    return node && node.specified;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2542
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2543
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2544
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2545
Element.Methods.ByTag = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2546
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2547
Object.extend(Element, Element.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2548
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2549
if (!Prototype.BrowserFeatures.ElementExtensions &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2550
    document.createElement('div').__proto__) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2551
  window.HTMLElement = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2552
  window.HTMLElement.prototype = document.createElement('div').__proto__;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2553
  Prototype.BrowserFeatures.ElementExtensions = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2554
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2555
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2556
Element.extend = (function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2557
  if (Prototype.BrowserFeatures.SpecificElementExtensions)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2558
    return Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2559
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2560
  var Methods = { }, ByTag = Element.Methods.ByTag;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2561
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2562
  var extend = Object.extend(function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2563
    if (!element || element._extendedByPrototype ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2564
        element.nodeType != 1 || element == window) return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2565
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2566
    var methods = Object.clone(Methods),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2567
      tagName = element.tagName, property, value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2568
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2569
    // extend methods for specific tags
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2570
    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2571
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2572
    for (property in methods) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2573
      value = methods[property];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2574
      if (Object.isFunction(value) && !(property in element))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2575
        element[property] = value.methodize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2576
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2577
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2578
    element._extendedByPrototype = Prototype.emptyFunction;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2579
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2580
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2581
  }, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2582
    refresh: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2583
      // extend methods for all tags (Safari doesn't need this)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2584
      if (!Prototype.BrowserFeatures.ElementExtensions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2585
        Object.extend(Methods, Element.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2586
        Object.extend(Methods, Element.Methods.Simulated);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2587
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2588
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2589
  });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2590
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2591
  extend.refresh();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2592
  return extend;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2593
})();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2594
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2595
Element.hasAttribute = function(element, attribute) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2596
  if (element.hasAttribute) return element.hasAttribute(attribute);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2597
  return Element.Methods.Simulated.hasAttribute(element, attribute);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2598
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2599
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2600
Element.addMethods = function(methods) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2601
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2602
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2603
  if (!methods) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2604
    Object.extend(Form, Form.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2605
    Object.extend(Form.Element, Form.Element.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2606
    Object.extend(Element.Methods.ByTag, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2607
      "FORM":     Object.clone(Form.Methods),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2608
      "INPUT":    Object.clone(Form.Element.Methods),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2609
      "SELECT":   Object.clone(Form.Element.Methods),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2610
      "TEXTAREA": Object.clone(Form.Element.Methods)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2611
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2612
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2613
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2614
  if (arguments.length == 2) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2615
    var tagName = methods;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2616
    methods = arguments[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2617
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2618
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2619
  if (!tagName) Object.extend(Element.Methods, methods || { });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2620
  else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2621
    if (Object.isArray(tagName)) tagName.each(extend);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2622
    else extend(tagName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2623
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2624
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2625
  function extend(tagName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2626
    tagName = tagName.toUpperCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2627
    if (!Element.Methods.ByTag[tagName])
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2628
      Element.Methods.ByTag[tagName] = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2629
    Object.extend(Element.Methods.ByTag[tagName], methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2630
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2631
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2632
  function copy(methods, destination, onlyIfAbsent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2633
    onlyIfAbsent = onlyIfAbsent || false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2634
    for (var property in methods) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2635
      var value = methods[property];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2636
      if (!Object.isFunction(value)) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2637
      if (!onlyIfAbsent || !(property in destination))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2638
        destination[property] = value.methodize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2639
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2640
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2641
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2642
  function findDOMClass(tagName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2643
    var klass;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2644
    var trans = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2645
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2646
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2647
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2648
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2649
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2650
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2651
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2652
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2653
      "FrameSet", "IFRAME": "IFrame"
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2654
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2655
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2656
    if (window[klass]) return window[klass];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2657
    klass = 'HTML' + tagName + 'Element';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2658
    if (window[klass]) return window[klass];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2659
    klass = 'HTML' + tagName.capitalize() + 'Element';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2660
    if (window[klass]) return window[klass];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2661
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2662
    window[klass] = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2663
    window[klass].prototype = document.createElement(tagName).__proto__;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2664
    return window[klass];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2665
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2666
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2667
  if (F.ElementExtensions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2668
    copy(Element.Methods, HTMLElement.prototype);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2669
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2670
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2671
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2672
  if (F.SpecificElementExtensions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2673
    for (var tag in Element.Methods.ByTag) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2674
      var klass = findDOMClass(tag);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2675
      if (Object.isUndefined(klass)) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2676
      copy(T[tag], klass.prototype);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2677
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2678
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2679
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2680
  Object.extend(Element, Element.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2681
  delete Element.ByTag;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2682
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2683
  if (Element.extend.refresh) Element.extend.refresh();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2684
  Element.cache = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2685
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2686
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2687
document.viewport = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2688
  getDimensions: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2689
    var dimensions = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2690
    $w('width height').each(function(d) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2691
      var D = d.capitalize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2692
      dimensions[d] = self['inner' + D] ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2693
       (document.documentElement['client' + D] || document.body['client' + D]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2694
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2695
    return dimensions;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2696
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2697
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2698
  getWidth: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2699
    return this.getDimensions().width;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2700
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2701
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2702
  getHeight: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2703
    return this.getDimensions().height;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2704
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2705
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2706
  getScrollOffsets: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2707
    return Element._returnOffset(
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2708
      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2709
      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2710
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2711
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2712
/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2713
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2714
 * license.  Please see http://www.yui-ext.com/ for more information. */
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2715
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2716
var Selector = Class.create({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2717
  initialize: function(expression) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2718
    this.expression = expression.strip();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2719
    this.compileMatcher();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2720
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2721
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2722
  compileMatcher: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2723
    // Selectors with namespaced attributes can't use the XPath version
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2724
    if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2725
      return this.compileXPathMatcher();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2726
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2727
    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2728
        c = Selector.criteria, le, p, m;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2729
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2730
    if (Selector._cache[e]) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2731
      this.matcher = Selector._cache[e];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2732
      return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2733
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2734
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2735
    this.matcher = ["this.matcher = function(root) {",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2736
                    "var r = root, h = Selector.handlers, c = false, n;"];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2737
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2738
    while (e && le != e && (/\S/).test(e)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2739
      le = e;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2740
      for (var i in ps) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2741
        p = ps[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2742
        if (m = e.match(p)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2743
          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2744
    	      new Template(c[i]).evaluate(m));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2745
          e = e.replace(m[0], '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2746
          break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2747
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2748
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2749
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2750
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2751
    this.matcher.push("return h.unique(n);\n}");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2752
    eval(this.matcher.join('\n'));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2753
    Selector._cache[this.expression] = this.matcher;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2754
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2755
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2756
  compileXPathMatcher: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2757
    var e = this.expression, ps = Selector.patterns,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2758
        x = Selector.xpath, le, m;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2759
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2760
    if (Selector._cache[e]) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2761
      this.xpath = Selector._cache[e]; return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2762
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2763
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2764
    this.matcher = ['.//*'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2765
    while (e && le != e && (/\S/).test(e)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2766
      le = e;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2767
      for (var i in ps) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2768
        if (m = e.match(ps[i])) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2769
          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2770
            new Template(x[i]).evaluate(m));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2771
          e = e.replace(m[0], '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2772
          break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2773
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2774
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2775
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2776
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2777
    this.xpath = this.matcher.join('');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2778
    Selector._cache[this.expression] = this.xpath;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2779
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2780
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2781
  findElements: function(root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2782
    root = root || document;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2783
    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2784
    return this.matcher(root);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2785
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2786
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2787
  match: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2788
    this.tokens = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2789
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2790
    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2791
    var le, p, m;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2792
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2793
    while (e && le !== e && (/\S/).test(e)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2794
      le = e;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2795
      for (var i in ps) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2796
        p = ps[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2797
        if (m = e.match(p)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2798
          // use the Selector.assertions methods unless the selector
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2799
          // is too complex.
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2800
          if (as[i]) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2801
            this.tokens.push([i, Object.clone(m)]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2802
            e = e.replace(m[0], '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2803
          } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2804
            // reluctantly do a document-wide search
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2805
            // and look for a match in the array
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2806
            return this.findElements(document).include(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2807
          }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2808
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2809
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2810
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2811
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2812
    var match = true, name, matches;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2813
    for (var i = 0, token; token = this.tokens[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2814
      name = token[0], matches = token[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2815
      if (!Selector.assertions[name](element, matches)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2816
        match = false; break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2817
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2818
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2819
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2820
    return match;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2821
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2822
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2823
  toString: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2824
    return this.expression;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2825
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2826
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2827
  inspect: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2828
    return "#<Selector:" + this.expression.inspect() + ">";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2829
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2830
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2831
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2832
Object.extend(Selector, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2833
  _cache: { },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2834
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2835
  xpath: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2836
    descendant:   "//*",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2837
    child:        "/*",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2838
    adjacent:     "/following-sibling::*[1]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2839
    laterSibling: '/following-sibling::*',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2840
    tagName:      function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2841
      if (m[1] == '*') return '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2842
      return "[local-name()='" + m[1].toLowerCase() +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2843
             "' or local-name()='" + m[1].toUpperCase() + "']";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2844
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2845
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2846
    id:           "[@id='#{1}']",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2847
    attrPresence: "[@#{1}]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2848
    attr: function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2849
      m[3] = m[5] || m[6];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2850
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2851
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2852
    pseudo: function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2853
      var h = Selector.xpath.pseudos[m[1]];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2854
      if (!h) return '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2855
      if (Object.isFunction(h)) return h(m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2856
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2857
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2858
    operators: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2859
      '=':  "[@#{1}='#{3}']",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2860
      '!=': "[@#{1}!='#{3}']",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2861
      '^=': "[starts-with(@#{1}, '#{3}')]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2862
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2863
      '*=': "[contains(@#{1}, '#{3}')]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2864
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2865
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2866
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2867
    pseudos: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2868
      'first-child': '[not(preceding-sibling::*)]',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2869
      'last-child':  '[not(following-sibling::*)]',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2870
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2871
      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2872
      'checked':     "[@checked]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2873
      'disabled':    "[@disabled]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2874
      'enabled':     "[not(@disabled)]",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2875
      'not': function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2876
        var e = m[6], p = Selector.patterns,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2877
            x = Selector.xpath, le, m, v;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2878
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2879
        var exclusion = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2880
        while (e && le != e && (/\S/).test(e)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2881
          le = e;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2882
          for (var i in p) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2883
            if (m = e.match(p[i])) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2884
              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2885
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2886
              e = e.replace(m[0], '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2887
              break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2888
            }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2889
          }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2890
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2891
        return "[not(" + exclusion.join(" and ") + ")]";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2892
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2893
      'nth-child':      function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2894
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2895
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2896
      'nth-last-child': function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2897
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2898
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2899
      'nth-of-type':    function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2900
        return Selector.xpath.pseudos.nth("position() ", m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2901
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2902
      'nth-last-of-type': function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2903
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2904
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2905
      'first-of-type':  function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2906
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2907
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2908
      'last-of-type':   function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2909
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2910
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2911
      'only-of-type':   function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2912
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2913
      },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2914
      nth: function(fragment, m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2915
        var mm, formula = m[6], predicate;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2916
        if (formula == 'even') formula = '2n+0';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2917
        if (formula == 'odd')  formula = '2n+1';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2918
        if (mm = formula.match(/^(\d+)$/)) // digit only
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2919
          return '[' + fragment + "= " + mm[1] + ']';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2920
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2921
          if (mm[1] == "-") mm[1] = -1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2922
          var a = mm[1] ? Number(mm[1]) : 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2923
          var b = mm[2] ? Number(mm[2]) : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2924
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2925
          "((#{fragment} - #{b}) div #{a} >= 0)]";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2926
          return new Template(predicate).evaluate({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2927
            fragment: fragment, a: a, b: b });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2928
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2929
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2930
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2931
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2932
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2933
  criteria: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2934
    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2935
    className:    'n = h.className(n, r, "#{1}", c); c = false;',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2936
    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2937
    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2938
    attr: function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2939
      m[3] = (m[5] || m[6]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2940
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2941
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2942
    pseudo: function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2943
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2944
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2945
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2946
    descendant:   'c = "descendant";',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2947
    child:        'c = "child";',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2948
    adjacent:     'c = "adjacent";',
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2949
    laterSibling: 'c = "laterSibling";'
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2950
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2951
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2952
  patterns: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2953
    // combinators must be listed first
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2954
    // (and descendant needs to be last combinator)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2955
    laterSibling: /^\s*~\s*/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2956
    child:        /^\s*>\s*/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2957
    adjacent:     /^\s*\+\s*/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2958
    descendant:   /^\s/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2959
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2960
    // selectors follow
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2961
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2962
    id:           /^#([\w\-\*]+)(\b|$)/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2963
    className:    /^\.([\w\-\*]+)(\b|$)/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2964
    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2965
    attrPresence: /^\[([\w]+)\]/,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2966
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2967
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2968
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2969
  // for Selector.match and Element#match
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2970
  assertions: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2971
    tagName: function(element, matches) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2972
      return matches[1].toUpperCase() == element.tagName.toUpperCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2973
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2974
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2975
    className: function(element, matches) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2976
      return Element.hasClassName(element, matches[1]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2977
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2978
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2979
    id: function(element, matches) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2980
      return element.id === matches[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2981
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2982
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2983
    attrPresence: function(element, matches) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2984
      return Element.hasAttribute(element, matches[1]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2985
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2986
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2987
    attr: function(element, matches) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2988
      var nodeValue = Element.readAttribute(element, matches[1]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2989
      return Selector.operators[matches[2]](nodeValue, matches[3]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2990
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2991
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2992
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2993
  handlers: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2994
    // UTILITY FUNCTIONS
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2995
    // joins two collections
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2996
    concat: function(a, b) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2997
      for (var i = 0, node; node = b[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2998
        a.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  2999
      return a;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3000
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3001
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3002
    // marks an array of nodes for counting
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3003
    mark: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3004
      for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3005
        node._counted = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3006
      return nodes;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3007
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3008
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3009
    unmark: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3010
      for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3011
        node._counted = undefined;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3012
      return nodes;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3013
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3014
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3015
    // mark each child node with its position (for nth calls)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3016
    // "ofType" flag indicates whether we're indexing for nth-of-type
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3017
    // rather than nth-child
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3018
    index: function(parentNode, reverse, ofType) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3019
      parentNode._counted = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3020
      if (reverse) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3021
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3022
          var node = nodes[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3023
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3024
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3025
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3026
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3027
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3028
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3029
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3030
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3031
    // filters out duplicates and extends all nodes
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3032
    unique: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3033
      if (nodes.length == 0) return nodes;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3034
      var results = [], n;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3035
      for (var i = 0, l = nodes.length; i < l; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3036
        if (!(n = nodes[i])._counted) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3037
          n._counted = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3038
          results.push(Element.extend(n));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3039
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3040
      return Selector.handlers.unmark(results);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3041
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3042
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3043
    // COMBINATOR FUNCTIONS
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3044
    descendant: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3045
      var h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3046
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3047
        h.concat(results, node.getElementsByTagName('*'));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3048
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3049
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3050
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3051
    child: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3052
      var h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3053
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3054
        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3055
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3056
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3057
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3058
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3059
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3060
    adjacent: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3061
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3062
        var next = this.nextElementSibling(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3063
        if (next) results.push(next);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3064
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3065
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3066
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3067
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3068
    laterSibling: function(nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3069
      var h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3070
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3071
        h.concat(results, Element.nextSiblings(node));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3072
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3073
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3074
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3075
    nextElementSibling: function(node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3076
      while (node = node.nextSibling)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3077
	      if (node.nodeType == 1) return node;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3078
      return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3079
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3080
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3081
    previousElementSibling: function(node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3082
      while (node = node.previousSibling)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3083
        if (node.nodeType == 1) return node;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3084
      return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3085
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3086
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3087
    // TOKEN FUNCTIONS
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3088
    tagName: function(nodes, root, tagName, combinator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3089
      tagName = tagName.toUpperCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3090
      var results = [], h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3091
      if (nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3092
        if (combinator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3093
          // fastlane for ordinary descendant combinators
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3094
          if (combinator == "descendant") {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3095
            for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3096
              h.concat(results, node.getElementsByTagName(tagName));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3097
            return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3098
          } else nodes = this[combinator](nodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3099
          if (tagName == "*") return nodes;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3100
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3101
        for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3102
          if (node.tagName.toUpperCase() == tagName) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3103
        return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3104
      } else return root.getElementsByTagName(tagName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3105
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3106
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3107
    id: function(nodes, root, id, combinator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3108
      var targetNode = $(id), h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3109
      if (!targetNode) return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3110
      if (!nodes && root == document) return [targetNode];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3111
      if (nodes) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3112
        if (combinator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3113
          if (combinator == 'child') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3114
            for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3115
              if (targetNode.parentNode == node) return [targetNode];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3116
          } else if (combinator == 'descendant') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3117
            for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3118
              if (Element.descendantOf(targetNode, node)) return [targetNode];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3119
          } else if (combinator == 'adjacent') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3120
            for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3121
              if (Selector.handlers.previousElementSibling(targetNode) == node)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3122
                return [targetNode];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3123
          } else nodes = h[combinator](nodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3124
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3125
        for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3126
          if (node == targetNode) return [targetNode];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3127
        return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3128
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3129
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3130
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3131
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3132
    className: function(nodes, root, className, combinator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3133
      if (nodes && combinator) nodes = this[combinator](nodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3134
      return Selector.handlers.byClassName(nodes, root, className);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3135
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3136
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3137
    byClassName: function(nodes, root, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3138
      if (!nodes) nodes = Selector.handlers.descendant([root]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3139
      var needle = ' ' + className + ' ';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3140
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3141
        nodeClassName = node.className;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3142
        if (nodeClassName.length == 0) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3143
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3144
          results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3145
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3146
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3147
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3148
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3149
    attrPresence: function(nodes, root, attr) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3150
      if (!nodes) nodes = root.getElementsByTagName("*");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3151
      var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3152
      for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3153
        if (Element.hasAttribute(node, attr)) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3154
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3155
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3156
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3157
    attr: function(nodes, root, attr, value, operator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3158
      if (!nodes) nodes = root.getElementsByTagName("*");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3159
      var handler = Selector.operators[operator], results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3160
      for (var i = 0, node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3161
        var nodeValue = Element.readAttribute(node, attr);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3162
        if (nodeValue === null) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3163
        if (handler(nodeValue, value)) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3164
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3165
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3166
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3167
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3168
    pseudo: function(nodes, name, value, root, combinator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3169
      if (nodes && combinator) nodes = this[combinator](nodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3170
      if (!nodes) nodes = root.getElementsByTagName("*");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3171
      return Selector.pseudos[name](nodes, value, root);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3172
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3173
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3174
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3175
  pseudos: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3176
    'first-child': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3177
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3178
        if (Selector.handlers.previousElementSibling(node)) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3179
          results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3180
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3181
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3182
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3183
    'last-child': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3184
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3185
        if (Selector.handlers.nextElementSibling(node)) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3186
          results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3187
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3188
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3189
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3190
    'only-child': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3191
      var h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3192
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3193
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3194
          results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3195
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3196
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3197
    'nth-child':        function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3198
      return Selector.pseudos.nth(nodes, formula, root);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3199
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3200
    'nth-last-child':   function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3201
      return Selector.pseudos.nth(nodes, formula, root, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3202
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3203
    'nth-of-type':      function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3204
      return Selector.pseudos.nth(nodes, formula, root, false, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3205
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3206
    'nth-last-of-type': function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3207
      return Selector.pseudos.nth(nodes, formula, root, true, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3208
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3209
    'first-of-type':    function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3210
      return Selector.pseudos.nth(nodes, "1", root, false, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3211
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3212
    'last-of-type':     function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3213
      return Selector.pseudos.nth(nodes, "1", root, true, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3214
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3215
    'only-of-type':     function(nodes, formula, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3216
      var p = Selector.pseudos;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3217
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3218
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3219
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3220
    // handles the an+b logic
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3221
    getIndices: function(a, b, total) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3222
      if (a == 0) return b > 0 ? [b] : [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3223
      return $R(1, total).inject([], function(memo, i) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3224
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3225
        return memo;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3226
      });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3227
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3228
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3229
    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3230
    nth: function(nodes, formula, root, reverse, ofType) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3231
      if (nodes.length == 0) return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3232
      if (formula == 'even') formula = '2n+0';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3233
      if (formula == 'odd')  formula = '2n+1';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3234
      var h = Selector.handlers, results = [], indexed = [], m;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3235
      h.mark(nodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3236
      for (var i = 0, node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3237
        if (!node.parentNode._counted) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3238
          h.index(node.parentNode, reverse, ofType);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3239
          indexed.push(node.parentNode);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3240
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3241
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3242
      if (formula.match(/^\d+$/)) { // just a number
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3243
        formula = Number(formula);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3244
        for (var i = 0, node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3245
          if (node.nodeIndex == formula) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3246
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3247
        if (m[1] == "-") m[1] = -1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3248
        var a = m[1] ? Number(m[1]) : 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3249
        var b = m[2] ? Number(m[2]) : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3250
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3251
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3252
          for (var j = 0; j < l; j++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3253
            if (node.nodeIndex == indices[j]) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3254
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3255
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3256
      h.unmark(nodes);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3257
      h.unmark(indexed);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3258
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3259
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3260
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3261
    'empty': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3262
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3263
        // IE treats comments as element nodes
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3264
        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3265
        results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3266
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3267
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3268
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3269
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3270
    'not': function(nodes, selector, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3271
      var h = Selector.handlers, selectorType, m;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3272
      var exclusions = new Selector(selector).findElements(root);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3273
      h.mark(exclusions);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3274
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3275
        if (!node._counted) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3276
      h.unmark(exclusions);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3277
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3278
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3279
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3280
    'enabled': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3281
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3282
        if (!node.disabled) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3283
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3284
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3285
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3286
    'disabled': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3287
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3288
        if (node.disabled) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3289
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3290
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3291
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3292
    'checked': function(nodes, value, root) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3293
      for (var i = 0, results = [], node; node = nodes[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3294
        if (node.checked) results.push(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3295
      return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3296
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3297
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3298
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3299
  operators: {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3300
    '=':  function(nv, v) { return nv == v; },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3301
    '!=': function(nv, v) { return nv != v; },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3302
    '^=': function(nv, v) { return nv.startsWith(v); },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3303
    '$=': function(nv, v) { return nv.endsWith(v); },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3304
    '*=': function(nv, v) { return nv.include(v); },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3305
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3306
    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3307
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3308
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3309
  matchElements: function(elements, expression) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3310
    var matches = new Selector(expression).findElements(), h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3311
    h.mark(matches);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3312
    for (var i = 0, results = [], element; element = elements[i]; i++)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3313
      if (element._counted) results.push(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3314
    h.unmark(matches);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3315
    return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3316
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3317
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3318
  findElement: function(elements, expression, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3319
    if (Object.isNumber(expression)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3320
      index = expression; expression = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3321
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3322
    return Selector.matchElements(elements, expression || '*')[index || 0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3323
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3324
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3325
  findChildElements: function(element, expressions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3326
    var exprs = expressions.join(','), expressions = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3327
    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3328
      expressions.push(m[1].strip());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3329
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3330
    var results = [], h = Selector.handlers;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3331
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3332
      selector = new Selector(expressions[i].strip());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3333
      h.concat(results, selector.findElements(element));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3334
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3335
    return (l > 1) ? h.unique(results) : results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3336
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3337
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3338
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3339
function $$() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3340
  return Selector.findChildElements(document, $A(arguments));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3341
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3342
var Form = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3343
  reset: function(form) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3344
    $(form).reset();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3345
    return form;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3346
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3347
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3348
  serializeElements: function(elements, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3349
    if (typeof options != 'object') options = { hash: !!options };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3350
    else if (options.hash === undefined) options.hash = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3351
    var key, value, submitted = false, submit = options.submit;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3352
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3353
    var data = elements.inject({ }, function(result, element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3354
      if (!element.disabled && element.name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3355
        key = element.name; value = $(element).getValue();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3356
        if (value != null && (element.type != 'submit' || (!submitted &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3357
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3358
          if (key in result) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3359
            // a key is already present; construct an array of values
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3360
            if (!Object.isArray(result[key])) result[key] = [result[key]];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3361
            result[key].push(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3362
          }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3363
          else result[key] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3364
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3365
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3366
      return result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3367
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3368
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3369
    return options.hash ? data : Object.toQueryString(data);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3370
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3371
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3372
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3373
Form.Methods = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3374
  serialize: function(form, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3375
    return Form.serializeElements(Form.getElements(form), options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3376
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3377
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3378
  getElements: function(form) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3379
    return $A($(form).getElementsByTagName('*')).inject([],
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3380
      function(elements, child) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3381
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3382
          elements.push(Element.extend(child));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3383
        return elements;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3384
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3385
    );
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3386
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3387
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3388
  getInputs: function(form, typeName, name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3389
    form = $(form);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3390
    var inputs = form.getElementsByTagName('input');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3391
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3392
    if (!typeName && !name) return $A(inputs).map(Element.extend);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3393
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3394
    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3395
      var input = inputs[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3396
      if ((typeName && input.type != typeName) || (name && input.name != name))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3397
        continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3398
      matchingInputs.push(Element.extend(input));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3399
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3400
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3401
    return matchingInputs;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3402
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3403
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3404
  disable: function(form) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3405
    form = $(form);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3406
    Form.getElements(form).invoke('disable');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3407
    return form;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3408
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3409
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3410
  enable: function(form) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3411
    form = $(form);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3412
    Form.getElements(form).invoke('enable');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3413
    return form;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3414
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3415
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3416
  findFirstElement: function(form) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3417
    var elements = $(form).getElements().findAll(function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3418
      return 'hidden' != element.type && !element.disabled;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3419
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3420
    var firstByIndex = elements.findAll(function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3421
      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3422
    }).sortBy(function(element) { return element.tabIndex }).first();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3423
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3424
    return firstByIndex ? firstByIndex : elements.find(function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3425
      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3426
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3427
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3428
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3429
  focusFirstElement: function(form) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3430
    form = $(form);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3431
    form.findFirstElement().activate();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3432
    return form;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3433
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3434
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3435
  request: function(form, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3436
    form = $(form), options = Object.clone(options || { });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3437
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3438
    var params = options.parameters, action = form.readAttribute('action') || '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3439
    if (action.blank()) action = window.location.href;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3440
    options.parameters = form.serialize(true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3441
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3442
    if (params) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3443
      if (Object.isString(params)) params = params.toQueryParams();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3444
      Object.extend(options.parameters, params);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3445
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3446
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3447
    if (form.hasAttribute('method') && !options.method)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3448
      options.method = form.method;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3449
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3450
    return new Ajax.Request(action, options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3451
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3452
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3453
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3454
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3455
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3456
Form.Element = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3457
  focus: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3458
    $(element).focus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3459
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3460
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3461
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3462
  select: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3463
    $(element).select();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3464
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3465
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3466
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3467
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3468
Form.Element.Methods = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3469
  serialize: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3470
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3471
    if (!element.disabled && element.name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3472
      var value = element.getValue();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3473
      if (value != undefined) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3474
        var pair = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3475
        pair[element.name] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3476
        return Object.toQueryString(pair);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3477
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3478
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3479
    return '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3480
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3481
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3482
  getValue: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3483
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3484
    var method = element.tagName.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3485
    return Form.Element.Serializers[method](element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3486
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3487
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3488
  setValue: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3489
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3490
    var method = element.tagName.toLowerCase();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3491
    Form.Element.Serializers[method](element, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3492
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3493
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3494
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3495
  clear: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3496
    $(element).value = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3497
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3498
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3499
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3500
  present: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3501
    return $(element).value != '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3502
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3503
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3504
  activate: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3505
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3506
    try {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3507
      element.focus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3508
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3509
          !['button', 'reset', 'submit'].include(element.type)))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3510
        element.select();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3511
    } catch (e) { }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3512
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3513
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3514
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3515
  disable: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3516
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3517
    element.blur();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3518
    element.disabled = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3519
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3520
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3521
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3522
  enable: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3523
    element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3524
    element.disabled = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3525
    return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3526
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3527
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3528
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3529
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3530
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3531
var Field = Form.Element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3532
var $F = Form.Element.Methods.getValue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3533
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3534
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3535
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3536
Form.Element.Serializers = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3537
  input: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3538
    switch (element.type.toLowerCase()) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3539
      case 'checkbox':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3540
      case 'radio':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3541
        return Form.Element.Serializers.inputSelector(element, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3542
      default:
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3543
        return Form.Element.Serializers.textarea(element, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3544
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3545
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3546
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3547
  inputSelector: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3548
    if (value === undefined) return element.checked ? element.value : null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3549
    else element.checked = !!value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3550
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3551
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3552
  textarea: function(element, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3553
    if (value === undefined) return element.value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3554
    else element.value = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3555
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3556
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3557
  select: function(element, index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3558
    if (index === undefined)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3559
      return this[element.type == 'select-one' ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3560
        'selectOne' : 'selectMany'](element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3561
    else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3562
      var opt, value, single = !Object.isArray(index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3563
      for (var i = 0, length = element.length; i < length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3564
        opt = element.options[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3565
        value = this.optionValue(opt);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3566
        if (single) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3567
          if (value == index) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3568
            opt.selected = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3569
            return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3570
          }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3571
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3572
        else opt.selected = index.include(value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3573
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3574
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3575
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3576
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3577
  selectOne: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3578
    var index = element.selectedIndex;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3579
    return index >= 0 ? this.optionValue(element.options[index]) : null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3580
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3581
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3582
  selectMany: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3583
    var values, length = element.length;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3584
    if (!length) return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3585
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3586
    for (var i = 0, values = []; i < length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3587
      var opt = element.options[i];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3588
      if (opt.selected) values.push(this.optionValue(opt));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3589
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3590
    return values;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3591
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3592
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3593
  optionValue: function(opt) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3594
    // extend element because hasAttribute may not be native
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3595
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3596
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3597
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3598
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3599
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3600
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3601
Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3602
  initialize: function($super, element, frequency, callback) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3603
    $super(callback, frequency);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3604
    this.element   = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3605
    this.lastValue = this.getValue();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3606
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3607
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3608
  execute: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3609
    var value = this.getValue();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3610
    if (Object.isString(this.lastValue) && Object.isString(value) ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3611
        this.lastValue != value : String(this.lastValue) != String(value)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3612
      this.callback(this.element, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3613
      this.lastValue = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3614
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3615
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3616
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3617
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3618
Form.Element.Observer = Class.create(Abstract.TimedObserver, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3619
  getValue: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3620
    return Form.Element.getValue(this.element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3621
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3622
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3623
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3624
Form.Observer = Class.create(Abstract.TimedObserver, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3625
  getValue: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3626
    return Form.serialize(this.element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3627
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3628
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3629
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3630
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3631
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3632
Abstract.EventObserver = Class.create({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3633
  initialize: function(element, callback) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3634
    this.element  = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3635
    this.callback = callback;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3636
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3637
    this.lastValue = this.getValue();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3638
    if (this.element.tagName.toLowerCase() == 'form')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3639
      this.registerFormCallbacks();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3640
    else
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3641
      this.registerCallback(this.element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3642
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3643
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3644
  onElementEvent: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3645
    var value = this.getValue();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3646
    if (this.lastValue != value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3647
      this.callback(this.element, value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3648
      this.lastValue = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3649
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3650
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3651
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3652
  registerFormCallbacks: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3653
    Form.getElements(this.element).each(this.registerCallback, this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3654
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3655
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3656
  registerCallback: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3657
    if (element.type) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3658
      switch (element.type.toLowerCase()) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3659
        case 'checkbox':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3660
        case 'radio':
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3661
          Event.observe(element, 'click', this.onElementEvent.bind(this));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3662
          break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3663
        default:
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3664
          Event.observe(element, 'change', this.onElementEvent.bind(this));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3665
          break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3666
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3667
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3668
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3669
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3670
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3671
Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3672
  getValue: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3673
    return Form.Element.getValue(this.element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3674
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3675
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3676
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3677
Form.EventObserver = Class.create(Abstract.EventObserver, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3678
  getValue: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3679
    return Form.serialize(this.element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3680
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3681
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3682
if (!window.Event) var Event = { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3683
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3684
Object.extend(Event, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3685
  KEY_BACKSPACE: 8,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3686
  KEY_TAB:       9,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3687
  KEY_RETURN:   13,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3688
  KEY_ESC:      27,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3689
  KEY_LEFT:     37,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3690
  KEY_UP:       38,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3691
  KEY_RIGHT:    39,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3692
  KEY_DOWN:     40,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3693
  KEY_DELETE:   46,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3694
  KEY_HOME:     36,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3695
  KEY_END:      35,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3696
  KEY_PAGEUP:   33,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3697
  KEY_PAGEDOWN: 34,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3698
  KEY_INSERT:   45,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3699
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3700
  cache: { },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3701
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3702
  relatedTarget: function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3703
    var element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3704
    switch(event.type) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3705
      case 'mouseover': element = event.fromElement; break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3706
      case 'mouseout':  element = event.toElement;   break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3707
      default: return null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3708
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3709
    return Element.extend(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3710
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3711
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3712
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3713
Event.Methods = (function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3714
  var isButton;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3715
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3716
  if (Prototype.Browser.IE) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3717
    var buttonMap = { 0: 1, 1: 4, 2: 2 };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3718
    isButton = function(event, code) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3719
      return event.button == buttonMap[code];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3720
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3721
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3722
  } else if (Prototype.Browser.WebKit) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3723
    isButton = function(event, code) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3724
      switch (code) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3725
        case 0: return event.which == 1 && !event.metaKey;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3726
        case 1: return event.which == 1 && event.metaKey;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3727
        default: return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3728
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3729
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3730
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3731
  } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3732
    isButton = function(event, code) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3733
      return event.which ? (event.which === code + 1) : (event.button === code);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3734
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3735
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3736
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3737
  return {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3738
    isLeftClick:   function(event) { return isButton(event, 0) },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3739
    isMiddleClick: function(event) { return isButton(event, 1) },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3740
    isRightClick:  function(event) { return isButton(event, 2) },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3741
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3742
    element: function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3743
      var node = Event.extend(event).target;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3744
      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3745
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3746
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3747
    findElement: function(event, expression) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3748
      var element = Event.element(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3749
      return element.match(expression) ? element : element.up(expression);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3750
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3751
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3752
    pointer: function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3753
      return {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3754
        x: event.pageX || (event.clientX +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3755
          (document.documentElement.scrollLeft || document.body.scrollLeft)),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3756
        y: event.pageY || (event.clientY +
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3757
          (document.documentElement.scrollTop || document.body.scrollTop))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3758
      };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3759
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3760
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3761
    pointerX: function(event) { return Event.pointer(event).x },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3762
    pointerY: function(event) { return Event.pointer(event).y },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3763
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3764
    stop: function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3765
      Event.extend(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3766
      event.preventDefault();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3767
      event.stopPropagation();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3768
      event.stopped = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3769
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3770
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3771
})();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3772
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3773
Event.extend = (function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3774
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3775
    m[name] = Event.Methods[name].methodize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3776
    return m;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3777
  });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3778
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3779
  if (Prototype.Browser.IE) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3780
    Object.extend(methods, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3781
      stopPropagation: function() { this.cancelBubble = true },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3782
      preventDefault:  function() { this.returnValue = false },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3783
      inspect: function() { return "[object Event]" }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3784
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3785
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3786
    return function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3787
      if (!event) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3788
      if (event._extendedByPrototype) return event;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3789
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3790
      event._extendedByPrototype = Prototype.emptyFunction;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3791
      var pointer = Event.pointer(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3792
      Object.extend(event, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3793
        target: event.srcElement,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3794
        relatedTarget: Event.relatedTarget(event),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3795
        pageX:  pointer.x,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3796
        pageY:  pointer.y
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3797
      });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3798
      return Object.extend(event, methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3799
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3800
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3801
  } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3802
    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3803
    Object.extend(Event.prototype, methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3804
    return Prototype.K;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3805
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3806
})();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3807
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3808
Object.extend(Event, (function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3809
  var cache = Event.cache;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3810
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3811
  function getEventID(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3812
    if (element._eventID) return element._eventID;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3813
    arguments.callee.id = arguments.callee.id || 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3814
    return element._eventID = ++arguments.callee.id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3815
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3816
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3817
  function getDOMEventName(eventName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3818
    if (eventName && eventName.include(':')) return "dataavailable";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3819
    return eventName;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3820
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3821
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3822
  function getCacheForID(id) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3823
    return cache[id] = cache[id] || { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3824
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3825
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3826
  function getWrappersForEventName(id, eventName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3827
    var c = getCacheForID(id);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3828
    return c[eventName] = c[eventName] || [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3829
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3830
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3831
  function createWrapper(element, eventName, handler) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3832
    var id = getEventID(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3833
    var c = getWrappersForEventName(id, eventName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3834
    if (c.pluck("handler").include(handler)) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3835
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3836
    var wrapper = function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3837
      if (!Event || !Event.extend ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3838
        (event.eventName && event.eventName != eventName))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3839
          return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3840
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3841
      Event.extend(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3842
      handler.call(element, event)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3843
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3844
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3845
    wrapper.handler = handler;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3846
    c.push(wrapper);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3847
    return wrapper;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3848
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3849
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3850
  function findWrapper(id, eventName, handler) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3851
    var c = getWrappersForEventName(id, eventName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3852
    return c.find(function(wrapper) { return wrapper.handler == handler });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3853
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3854
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3855
  function destroyWrapper(id, eventName, handler) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3856
    var c = getCacheForID(id);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3857
    if (!c[eventName]) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3858
    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3859
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3860
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3861
  function destroyCache() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3862
    for (var id in cache)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3863
      for (var eventName in cache[id])
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3864
        cache[id][eventName] = null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3865
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3866
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3867
  if (window.attachEvent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3868
    window.attachEvent("onunload", destroyCache);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3869
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3870
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3871
  return {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3872
    observe: function(element, eventName, handler) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3873
      element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3874
      var name = getDOMEventName(eventName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3875
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3876
      var wrapper = createWrapper(element, eventName, handler);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3877
      if (!wrapper) return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3878
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3879
      if (element.addEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3880
        element.addEventListener(name, wrapper, false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3881
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3882
        element.attachEvent("on" + name, wrapper);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3883
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3884
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3885
      return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3886
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3887
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3888
    stopObserving: function(element, eventName, handler) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3889
      element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3890
      var id = getEventID(element), name = getDOMEventName(eventName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3891
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3892
      if (!handler && eventName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3893
        getWrappersForEventName(id, eventName).each(function(wrapper) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3894
          element.stopObserving(eventName, wrapper.handler);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3895
        });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3896
        return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3897
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3898
      } else if (!eventName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3899
        Object.keys(getCacheForID(id)).each(function(eventName) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3900
          element.stopObserving(eventName);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3901
        });
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3902
        return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3903
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3904
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3905
      var wrapper = findWrapper(id, eventName, handler);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3906
      if (!wrapper) return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3907
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3908
      if (element.removeEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3909
        element.removeEventListener(name, wrapper, false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3910
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3911
        element.detachEvent("on" + name, wrapper);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3912
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3913
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3914
      destroyWrapper(id, eventName, handler);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3915
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3916
      return element;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3917
    },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3918
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3919
    fire: function(element, eventName, memo) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3920
      element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3921
      if (element == document && document.createEvent && !element.dispatchEvent)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3922
        element = document.documentElement;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3923
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3924
      if (document.createEvent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3925
        var event = document.createEvent("HTMLEvents");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3926
        event.initEvent("dataavailable", true, true);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3927
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3928
        var event = document.createEventObject();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3929
        event.eventType = "ondataavailable";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3930
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3931
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3932
      event.eventName = eventName;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3933
      event.memo = memo || { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3934
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3935
      if (document.createEvent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3936
        element.dispatchEvent(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3937
      } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3938
        element.fireEvent(event.eventType, event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3939
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3940
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3941
      return event;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3942
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3943
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3944
})());
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3945
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3946
Object.extend(Event, Event.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3947
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3948
Element.addMethods({
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3949
  fire:          Event.fire,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3950
  observe:       Event.observe,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3951
  stopObserving: Event.stopObserving
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3952
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3953
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3954
Object.extend(document, {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3955
  fire:          Element.Methods.fire.methodize(),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3956
  observe:       Element.Methods.observe.methodize(),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3957
  stopObserving: Element.Methods.stopObserving.methodize()
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3958
});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3959
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3960
(function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3961
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3962
     Matthias Miller, Dean Edwards and John Resig. */
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3963
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3964
  var timer, fired = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3965
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3966
  function fireContentLoadedEvent() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3967
    if (fired) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3968
    if (timer) window.clearInterval(timer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3969
    document.fire("dom:loaded");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3970
    fired = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3971
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3972
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3973
  if (document.addEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3974
    if (Prototype.Browser.WebKit) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3975
      timer = window.setInterval(function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3976
        if (/loaded|complete/.test(document.readyState))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3977
          fireContentLoadedEvent();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3978
      }, 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3979
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3980
      Event.observe(window, "load", fireContentLoadedEvent);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3981
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3982
    } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3983
      document.addEventListener("DOMContentLoaded",
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3984
        fireContentLoadedEvent, false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3985
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3986
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3987
  } else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3988
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3989
    $("__onDOMContentLoaded").onreadystatechange = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3990
      if (this.readyState == "complete") {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3991
        this.onreadystatechange = null;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3992
        fireContentLoadedEvent();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3993
      }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3994
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3995
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3996
})();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3997
/*------------------------------- DEPRECATED -------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3998
0d28b7c10758 First commit
ymh
parents:
diff changeset
  3999
Hash.toQueryString = Object.toQueryString;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4000
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4001
var Toggle = { display: Element.toggle };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4002
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4003
Element.Methods.childOf = Element.Methods.descendantOf;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4004
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4005
var Insertion = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4006
  Before: function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4007
    return Element.insert(element, {before:content});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4008
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4009
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4010
  Top: function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4011
    return Element.insert(element, {top:content});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4012
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4013
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4014
  Bottom: function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4015
    return Element.insert(element, {bottom:content});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4016
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4017
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4018
  After: function(element, content) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4019
    return Element.insert(element, {after:content});
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4020
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4021
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4022
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4023
var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4024
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4025
// This should be moved to script.aculo.us; notice the deprecated methods
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4026
// further below, that map to the newer Element methods.
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4027
var Position = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4028
  // set to true if needed, warning: firefox performance problems
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4029
  // NOT neeeded for page scrolling, only if draggable contained in
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4030
  // scrollable elements
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4031
  includeScrollOffsets: false,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4032
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4033
  // must be called before calling withinIncludingScrolloffset, every time the
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4034
  // page is scrolled
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4035
  prepare: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4036
    this.deltaX =  window.pageXOffset
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4037
                || document.documentElement.scrollLeft
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4038
                || document.body.scrollLeft
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4039
                || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4040
    this.deltaY =  window.pageYOffset
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4041
                || document.documentElement.scrollTop
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4042
                || document.body.scrollTop
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4043
                || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4044
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4045
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4046
  // caches x/y coordinate pair to use with overlap
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4047
  within: function(element, x, y) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4048
    if (this.includeScrollOffsets)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4049
      return this.withinIncludingScrolloffsets(element, x, y);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4050
    this.xcomp = x;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4051
    this.ycomp = y;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4052
    this.offset = Element.cumulativeOffset(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4053
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4054
    return (y >= this.offset[1] &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4055
            y <  this.offset[1] + element.offsetHeight &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4056
            x >= this.offset[0] &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4057
            x <  this.offset[0] + element.offsetWidth);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4058
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4059
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4060
  withinIncludingScrolloffsets: function(element, x, y) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4061
    var offsetcache = Element.cumulativeScrollOffset(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4062
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4063
    this.xcomp = x + offsetcache[0] - this.deltaX;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4064
    this.ycomp = y + offsetcache[1] - this.deltaY;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4065
    this.offset = Element.cumulativeOffset(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4066
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4067
    return (this.ycomp >= this.offset[1] &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4068
            this.ycomp <  this.offset[1] + element.offsetHeight &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4069
            this.xcomp >= this.offset[0] &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4070
            this.xcomp <  this.offset[0] + element.offsetWidth);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4071
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4072
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4073
  // within must be called directly before
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4074
  overlap: function(mode, element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4075
    if (!mode) return 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4076
    if (mode == 'vertical')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4077
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4078
        element.offsetHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4079
    if (mode == 'horizontal')
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4080
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4081
        element.offsetWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4082
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4083
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4084
  // Deprecation layer -- use newer Element methods now (1.5.2).
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4085
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4086
  cumulativeOffset: Element.Methods.cumulativeOffset,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4087
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4088
  positionedOffset: Element.Methods.positionedOffset,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4089
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4090
  absolutize: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4091
    Position.prepare();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4092
    return Element.absolutize(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4093
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4094
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4095
  relativize: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4096
    Position.prepare();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4097
    return Element.relativize(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4098
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4099
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4100
  realOffset: Element.Methods.cumulativeScrollOffset,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4101
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4102
  offsetParent: Element.Methods.getOffsetParent,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4103
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4104
  page: Element.Methods.viewportOffset,
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4105
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4106
  clone: function(source, target, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4107
    options = options || { };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4108
    return Element.clonePosition(target, source, options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4109
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4110
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4111
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4112
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4113
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4114
if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4115
  function iter(name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4116
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4117
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4118
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4119
  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4120
  function(element, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4121
    className = className.toString().strip();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4122
    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4123
    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4124
  } : function(element, className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4125
    className = className.toString().strip();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4126
    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4127
    if (!classNames && !className) return elements;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4128
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4129
    var nodes = $(element).getElementsByTagName('*');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4130
    className = ' ' + className + ' ';
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4131
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4132
    for (var i = 0, child, cn; child = nodes[i]; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4133
      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4134
          (classNames && classNames.all(function(name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4135
            return !name.toString().blank() && cn.include(' ' + name + ' ');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4136
          }))))
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4137
        elements.push(Element.extend(child));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4138
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4139
    return elements;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4140
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4141
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4142
  return function(className, parentElement) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4143
    return $(parentElement || document.body).getElementsByClassName(className);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4144
  };
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4145
}(Element.Methods);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4146
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4147
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4148
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4149
Element.ClassNames = Class.create();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4150
Element.ClassNames.prototype = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4151
  initialize: function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4152
    this.element = $(element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4153
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4154
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4155
  _each: function(iterator) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4156
    this.element.className.split(/\s+/).select(function(name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4157
      return name.length > 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4158
    })._each(iterator);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4159
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4160
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4161
  set: function(className) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4162
    this.element.className = className;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4163
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4164
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4165
  add: function(classNameToAdd) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4166
    if (this.include(classNameToAdd)) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4167
    this.set($A(this).concat(classNameToAdd).join(' '));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4168
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4169
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4170
  remove: function(classNameToRemove) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4171
    if (!this.include(classNameToRemove)) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4172
    this.set($A(this).without(classNameToRemove).join(' '));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4173
  },
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4174
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4175
  toString: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4176
    return $A(this).join(' ');
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4177
  }
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4178
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4179
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4180
Object.extend(Element.ClassNames.prototype, Enumerable);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4181
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4182
/*--------------------------------------------------------------------------*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4183
0d28b7c10758 First commit
ymh
parents:
diff changeset
  4184
Element.addMethods();