/*  Prototype JavaScript framework, version 1.5.0_rc2
 *  (c) 2005, 2006 Sam Stephenson <sam@conio.net>
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.5.0_rc2',
  BrowserFeatures: {
    XPath: !!document.evaluate
  },

  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
  emptyFunction: function() {},
  K: function(x) { return x }
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (object === undefined) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({}, object);
  }
});

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
  }
}

Object.extend(Number.prototype, {
  toColorPart: function() {
    var digits = this.toString(16);
    if (this < 16) return '0' + digits;
    return digits;
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator) {
    $R(0, this, true).each(iterator);
    return this;
  }
});

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.callback(this);
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
}
String.interpret = function(value){
  return value == null ? '' : String(value);
}

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = count === undefined ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return this;
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = truncation === undefined ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : this;
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var div = document.createElement('div');
    var text = document.createTextNode(this);
    div.appendChild(text);
    return div.innerHTML;
  },

  unescapeHTML: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return {};

    return match[1].split(separator || '&').inject({}, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var name = decodeURIComponent(pair[0]);
        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;

        if (hash[name] !== undefined) {
          if (hash[name].constructor != Array)
            hash[name] = [hash[name]];
          if (value) hash[name].push(value);
        }
        else hash[name] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function(){
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.replace(/\\/g, '\\\\');
    if (useDoubleQuotes)
      return '"' + escapedString.replace(/"/g, '\\"') + '"';
    else
      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (typeof replacement == 'function') return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
}

String.prototype.parseQuery = String.prototype.toQueryParams;

var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern  = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    return this.template.gsub(this.pattern, function(match) {
      var before = match[1];
      if (before == '\\') return match[2];
      return before + String.interpret(object[match[3]]);
    });
  }
}

var $break    = new Object();
var $continue = new Object();

var Enumerable = {
  each: function(iterator) {
    var index = 0;
    try {
      this._each(function(value) {
        try {
          iterator(value, index++);
        } catch (e) {
          if (e != $continue) throw e;
        }
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator) {
    var index = -number, slices = [], array = this.toArray();
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.map(iterator);
  },

  all: function(iterator) {
    var result = true;
    this.each(function(value, index) {
      result = result && !!(iterator || Prototype.K)(value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator) {
    var result = false;
    this.each(function(value, index) {
      if (result = !!(iterator || Prototype.K)(value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      results.push((iterator || Prototype.K)(value, index));
    });
    return results;
  },

  detect: function(iterator) {
    var result;
    this.each(function(value, index) {
      if (iterator(value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (iterator(value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(pattern, iterator) {
    var results = [];
    this.each(function(value, index) {
      var stringValue = value.toString();
      if (stringValue.match(pattern))
        results.push((iterator || Prototype.K)(value, index));
    })
    return results;
  },

  include: function(object) {
    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = fillWith === undefined ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator) {
    this.each(function(value, index) {
      memo = iterator(memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator) {
    var trues = [], falses = [];
    this.each(function(value, index) {
      ((iterator || Prototype.K)(value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value, index) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator(value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator) {
    return this.map(function(value, index) {
      return {value: value, criteria: iterator(value, index)};
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

  size: function() {
    return this.toArray().length;
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
}

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse)
  Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(value && value.constructor == Array ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  indexOf: function(object) {
    for (var i = 0, length = this.length; i < length; i++)
      if (this[i] == object) return i;
    return -1;
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function() {
    return this.inject([], function(array, value) {
      return array.include(value) ? array : array.concat([value]);
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  }
});

Array.prototype.toArray = Array.prototype.clone;

function $w(string){
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if(window.opera){
  Array.prototype.concat = function(){
    var array = [];
    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for(var i = 0, length = arguments.length; i < length; i++) {
      if(arguments[i].constructor == Array) {
        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  }
}
var Hash = {
  _each: function(iterator) {
    for (var key in this) {
      var value = this[key];
      if (typeof value == 'function') continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },

  keys: function() {
    return this.pluck('key');
  },

  values: function() {
    return this.pluck('value');
  },

  merge: function(hash) {
    return $H(hash).inject(this, function(mergedHash, pair) {
      mergedHash[pair.key] = pair.value;
      return mergedHash;
    });
  },

  toQueryString: function() {
    return this.map(function(pair) {
      if (!pair.key) return null;

      if (pair.value && pair.value.constructor == Array) {
        pair.value = pair.value.compact();

        if (pair.value.length < 2) {
          pair.value = pair.value.reduce();
        } else {
          var key = encodeURIComponent(pair.key);
          return pair.value.map(function(value) {
            return key + '=' + encodeURIComponent(value);
		  	  }).join('&');
        }
      }

      if (pair.value == undefined) pair[1] = '';
      return pair.map(encodeURIComponent).join('=');
    }).join('&');
  },

  inspect: function() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  }
}

function $H(object) {
  var hash = Object.extend({}, object || {});
  Object.extend(hash, Enumerable);
  Object.extend(hash, Hash);
  return hash;
}
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
}

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
}

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (typeof responder[callback] == 'function') {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) {}
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});

Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   ''
    }
    Object.extend(this.options, options || {});

    this.options.method = this.options.method.toLowerCase();
    this.options.parameters = $H(typeof this.options.parameters == 'string' ?
      this.options.parameters.toQueryParams() : this.options.parameters);
  }
}

Ajax.Request = Class.create();
Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
  _complete: false,

  initialize: function(url, options) {
    this.transport = Ajax.getTransport();
    this.setOptions(options);
    this.request(url);
  },

  request: function(url) {
    var params = this.options.parameters;
    if (params.any()) params['_'] = '';

    if (!['get', 'post'].include(this.options.method)) {
      // simulate other verbs over post
      params['_method'] = this.options.method;
      this.options.method = 'post';
    }

    this.url = url;

    // when GET, append parameters to URL
    if (this.options.method == 'get' && params.any())
      this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') +
        params.toQueryString();

    try {
      Ajax.Responders.dispatch('onCreate', this, this.transport);

      this.transport.open(this.options.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous)
        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      var body = this.options.method == 'post' ?
        (this.options.postBody || params.toQueryString()) : null;

      this.transport.send(body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.options.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (typeof extras.push == 'function')
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    return !this.transport.status
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState];
    var transport = this.transport, json = this.evalJSON();

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + this.transport.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(transport, json);
      } catch (e) {
        this.dispatchException(e);
      }
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
      Ajax.Responders.dispatch('on' + state, this, transport, json);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      if ((this.getHeader('Content-type') || '').strip().
        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
          this.evalResponse();

      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name);
    } catch (e) { return null }
  },

  evalJSON: function() {
    try {
      var json = this.getHeader('X-JSON');
      return json ? eval('(' + json + ')') : null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval(this.transport.responseText);
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Updater = Class.create();

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
  initialize: function(container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    }

    this.transport = Ajax.getTransport();
    this.setOptions(options);

    var onComplete = this.options.onComplete || Prototype.emptyFunction;
    this.options.onComplete = (function(transport, param) {
      this.updateContent();
      onComplete(transport, param);
    }).bind(this);

    this.request(url);
  },

  updateContent: function() {
    var receiver = this.container[this.success() ? 'success' : 'failure'];
    var response = this.transport.responseText;

    if (!this.options.evalScripts) response = response.stripScripts();

    if (receiver = $(receiver)) {
      if (this.options.insertion)
        new this.options.insertion(receiver, response);
      else
        receiver.update(response);
    }

    if (this.success()) {
      if (this.onComplete)
        setTimeout(this.onComplete.bind(this), 10);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
  initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = {};
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = request.responseText;
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this),
      this.decay * this.frequency * 1000);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(query.snapshotItem(i));
    return results;
  }
}

document.getElementsByClassName = function(className, parentElement) {
  if (Prototype.BrowserFeatures.XPath) {
    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    return document._getElementsByXPath(q, parentElement);
  } else {
    var children = ($(parentElement) || document.body).getElementsByTagName('*');
    var elements = [], child;
    for (var i = 0, length = children.length; i < length; i++) {
      child = children[i];
      if (Element.hasClassName(child, className))
        elements.push(Element.extend(child));
    }
    return elements;
  }
}

/*--------------------------------------------------------------------------*/

if (!window.Element)
  var Element = new Object();

Element.extend = function(element) {
  if (!element || _nativeExtensions || element.nodeType == 3) return element;

  if (!element._extended && element.tagName && element != window) {
    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;

    if (element.tagName == 'FORM')
      Object.extend(methods, Form.Methods);
    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
      Object.extend(methods, Form.Element.Methods);

    Object.extend(methods, Element.Methods.Simulated);

    for (var property in methods) {
      var value = methods[property];
      if (typeof value == 'function' && !(property in element))
        element[property] = cache.findOrStore(value);
    }
  }

  element._extended = true;
  return element;
}

Element.extend.cache = {
  findOrStore: function(value) {
    return this[value] = this[value] || function() {
      return value.apply(null, [this].concat($A(arguments)));
    }
  }
}

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

  hide: function(element) {
    $(element).style.display = 'none';
    return element;
  },

  show: function(element) {
    $(element).style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, html) {
    html = typeof html == 'undefined' ? '' : html.toString();
    $(element).innerHTML = html.stripScripts();
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  replace: function(element, html) {
    element = $(element);
    if (element.outerHTML) {
      element.outerHTML = html.stripScripts();
    } else {
      var range = element.ownerDocument.createRange();
      range.selectNodeContents(element);
      element.parentNode.replaceChild(
        range.createContextualFragment(html.stripScripts()), element);
    }
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $A($(element).getElementsByTagName('*'));
  },

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (typeof selector == 'string')
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    return Selector.findElement($(element).ancestors(), expression, index);
  },

  down: function(element, expression, index) {
    return Selector.findElement($(element).descendants(), expression, index);
  },

  previous: function(element, expression, index) {
    return Selector.findElement($(element).previousSiblings(), expression, index);
  },

  next: function(element, expression, index) {
    return Selector.findElement($(element).nextSiblings(), expression, index);
  },

  getElementsBySelector: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element, args);
  },

  getElementsByClassName: function(element, className) {
    return document.getElementsByClassName(className, element);
  },

  readAttribute: function(element, name) {
    return $(element).getAttribute(name);
  },

  getHeight: function(element) {
    return $(element).offsetHeight;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    if (elementClassName.length == 0) return false;
    if (elementClassName == className ||
        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      return true;
    return false;
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element).add(className);
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element).remove(className);
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
    return element;
  },

  observe: function() {
    Event.observe.apply(Event, arguments);
    return $A(arguments).first();
  },

  stopObserving: function() {
    Event.stopObserving.apply(Event, arguments);
    return $A(arguments).first();
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.match(/^\s*$/);
  },

  childOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);
    while (element = element.parentNode)
      if (element == ancestor) return true;
    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = Position.cumulativeOffset(element);
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    var camelizedStyle = (style == 'float' ?
      (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat') : style).camelize();
    var value = element.style[camelizedStyle];
    if (!value) {
      if (document.defaultView && document.defaultView.getComputedStyle) {
        var css = document.defaultView.getComputedStyle(element, null);
        value = css ? css[camelizedStyle] : null;
      } else if (element.currentStyle) {
        value = element.currentStyle[camelizedStyle];
      }
    }

    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
      value = element['offset'+style.capitalize()] + 'px';

    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
    if(style == 'opacity') {
      if(value) return parseFloat(value);
      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if(value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }
    return value == 'auto' ? null : value;
  },

  setStyle: function(element, style) {
    element = $(element);
    for (var name in style) {
      var value = style[name];
      if(name == 'opacity') {
        if (value == 1) {
          value = (/Gecko/.test(navigator.userAgent) &&
            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
          if(/MSIE/.test(navigator.userAgent) && !window.opera)
            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
        } else {
          if(value < 0.00001) value = 0;
          if(/MSIE/.test(navigator.userAgent) && !window.opera)
            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
              'alpha(opacity='+value*100+')';
        }
      } else if(name == 'float') name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
      element.style[name.camelize()] = value;
    }
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    if (Element.getStyle(element, 'display') != 'none')
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = '';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = 'none';
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (window.opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = element.style.overflow || 'auto';
    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  }
}

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    return $(element).getAttributeNode(attribute).specified;
  }
}

// IE is missing .innerHTML support for TABLE-related elements
if(document.all){
  Element.Methods.update = function(element, html) {
    element = $(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    var tagName = element.tagName.toUpperCase();
    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
      var div = document.createElement('div');
      switch (tagName) {
        case 'THEAD':
        case 'TBODY':
          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
          depth = 2;
          break;
        case 'TR':
          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
          depth = 3;
          break;
        case 'TD':
          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
          depth = 4;
      }
      $A(element.childNodes).each(function(node){
        element.removeChild(node)
      });
      depth.times(function(){ div = div.firstChild });

      $A(div.childNodes).each(
        function(node){ element.appendChild(node) });
    } else {
      element.innerHTML = html.stripScripts();
    }
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  }
}

Object.extend(Element, Element.Methods);

var _nativeExtensions = false;

if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
    var className = 'HTML' + tag + 'Element';
    if(window[className]) return;
    var klass = window[className] = {};
    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
  });

Element.addMethods = function(methods) {
  Object.extend(Element.Methods, methods || {});

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    var cache = Element.extend.cache;
    for (var property in methods) {
      var value = methods[property];
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = cache.findOrStore(value);
    }
  }

  if (typeof HTMLElement != 'undefined') {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
    copy(Form.Methods, HTMLFormElement.prototype);
    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
      copy(Form.Element.Methods, klass.prototype);
    });
    _nativeExtensions = true;
  }
}

var Toggle = new Object();
Toggle.display = Element.toggle;

/*--------------------------------------------------------------------------*/

Abstract.Insertion = function(adjacency) {
  this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $(element);
    this.content = content.stripScripts();

    if (this.adjacency && this.element.insertAdjacentHTML) {
      try {
        this.element.insertAdjacentHTML(this.adjacency, this.content);
      } catch (e) {
        var tagName = this.element.tagName.toUpperCase();
        if (['TBODY', 'TR'].include(tagName)) {
          this.insertContent(this.contentFromAnonymousTable());
        } else {
          throw e;
        }
      }
    } else {
      this.range = this.element.ownerDocument.createRange();
      if (this.initializeRange) this.initializeRange();
      this.insertContent([this.range.createContextualFragment(this.content)]);
    }

    setTimeout(function() {content.evalScripts()}, 10);
  },

  contentFromAnonymousTable: function() {
    var div = document.createElement('div');
    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
    return $A(div.childNodes[0].childNodes[0].childNodes);
  }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment, this.element);
    }).bind(this));
  }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(true);
  },

  insertContent: function(fragments) {
    fragments.reverse(false).each((function(fragment) {
      this.element.insertBefore(fragment, this.element.firstChild);
    }).bind(this));
  }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.appendChild(fragment);
    }).bind(this));
  }
});

Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
  initializeRange: function() {
    this.range.setStartAfter(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment,
        this.element.nextSibling);
    }).bind(this));
  }
});

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $A(this).join(' ');
  }
}

Object.extend(Element.ClassNames.prototype, Enumerable);
var Selector = Class.create();
Selector.prototype = {
  initialize: function(expression) {
    this.params = {classNames: []};
    this.expression = expression.toString().strip();
    this.parseExpression();
    this.compileMatcher();
  },

  parseExpression: function() {
    function abort(message) { throw 'Parse error in selector: ' + message; }

    if (this.expression == '')  abort('empty expression');

    var params = this.params, expr = this.expression, match, modifier, clause, rest;
    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
      params.attributes = params.attributes || [];
      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
      expr = match[1];
    }

    if (expr == '*') return this.params.wildcard = true;

    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
      modifier = match[1], clause = match[2], rest = match[3];
      switch (modifier) {
        case '#':       params.id = clause; break;
        case '.':       params.classNames.push(clause); break;
        case '':
        case undefined: params.tagName = clause.toUpperCase(); break;
        default:        abort(expr.inspect());
      }
      expr = rest;
    }

    if (expr.length > 0) abort(expr.inspect());
  },

  buildMatchExpression: function() {
    var params = this.params, conditions = [], clause;

    if (params.wildcard)
      conditions.push('true');
    if (clause = params.id)
      conditions.push('element.id == ' + clause.inspect());
    if (clause = params.tagName)
      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
    if ((clause = params.classNames).length > 0)
      for (var i = 0, length = clause.length; i < length; i++)
        conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
    if (clause = params.attributes) {
      clause.each(function(attribute) {
        var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
        var splitValueBy = function(delimiter) {
          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
        }

        switch (attribute.operator) {
          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
          case '|=':      conditions.push(
                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
                          ); break;
          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
          case '':
          case undefined: conditions.push(value + ' != null'); break;
          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
        }
      });
    }

    return conditions.join(' && ');
  },

  compileMatcher: function() {
    this.match = new Function('element', 'if (!element.tagName) return false; \
      return ' + this.buildMatchExpression());
  },

  findElements: function(scope) {
    var element;

    if (element = $(this.params.id))
      if (this.match(element))
        if (!scope || Element.childOf(element, scope))
          return [element];

    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');

    var results = [];
    for (var i = 0, length = scope.length; i < length; i++)
      if (this.match(element = scope[i]))
        results.push(Element.extend(element));

    return results;
  },

  toString: function() {
    return this.expression;
  }
}

Object.extend(Selector, {
  matchElements: function(elements, expression) {
    var selector = new Selector(expression);
    return elements.select(selector.match.bind(selector)).map(Element.extend);
  },

  findElement: function(elements, expression, index) {
    if (typeof expression == 'number') index = expression, expression = false;
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    return expressions.map(function(expression) {
      return expression.strip().split(/\s+/).inject([null], function(results, expr) {
        var selector = new Selector(expr);
        return results.inject([], function(elements, result) {
          return elements.concat(selector.findElements(result || element));
        });
      });
    }).flatten();
  }
});

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(form).reset();
    return form;
  },

  serializeElements: function(elements) {
    return elements.inject([], function(queryComponents, element) {
      var queryComponent = Form.Element.serialize(element);
      if (queryComponent) queryComponents.push(queryComponent);
      return queryComponents;
    }).join('&');
  }
};

Form.Methods = {
  serialize: function(form) {
    return Form.serializeElements($(form).getElements());
  },

  getElements: function(form) {
    return $A($(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input'), matchingInputs = [];

    if (!typeName && !name)
      return $A(inputs).map(Element.extend);

    for (var i = 0, length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) ||
          (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $(form);
    form.getElements().each(function(element) {
      element.blur();
      element.disabled = 'true';
    });
    return form;
  },

  enable: function(form) {
    form = $(form);
    form.getElements().each(function(element) {
      element.disabled = '';
    });
    return form;
  },

  findFirstElement: function(form) {
    return $(form).getElements().find(function(element) {
      return element.type != 'hidden' && !element.disabled &&
        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  }
}

Object.extend(Form, Form.Methods);

/*--------------------------------------------------------------------------*/

Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
}

Form.Element.Methods = {
  serialize: function(element) {
    element = $(element);
    if (element.disabled) return '';
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);

    if (parameter) {
      var key = encodeURIComponent(parameter[0]);
      if (key.length == 0) return;

      if (parameter[1].constructor != Array)
        parameter[1] = [parameter[1]];

      return parameter[1].map(function(value) {
        return key + '=' + encodeURIComponent(value);
      }).join('&');
    }
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);

    if (parameter)
      return parameter[1];
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    element.focus();
    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
      !['button', 'reset', 'submit'].include(element.type) ) )
      element.select();
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.blur();
    element.disabled = false;
    return element;
  }
}

Object.extend(Form.Element, Form.Element.Methods);
var Field = Form.Element;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
      default:
        return Form.Element.Serializers.textarea(element);
    }
    return false;
  },

  inputSelector: function(element) {
    if (element.checked)
      return [element.name, element.value];
  },

  textarea: function(element) {
    return [element.name, element.value];
  },

  select: function(element) {
    return Form.Element.Serializers[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var value = '', opt, index = element.selectedIndex;
    if (index >= 0) {
      opt = Element.extend(element.options[index]);
      // Uses the new potential extension if hasAttribute isn't native.
      value = opt.hasAttribute('value') ? opt.value : opt.text;
    }
    return [element.name, value];
  },

  selectMany: function(element) {
    var value = [];
    for (var i = 0, length = element.length; i < length; i++) {
      var opt = Element.extend(element.options[i]);
      if (opt.selected)
        // Uses the new potential extension if hasAttribute isn't native.
        value.push(opt.hasAttribute('value') ? opt.value : opt.text);
    }
    return [element.name, value];
  }
}

/*--------------------------------------------------------------------------*/

var $F = Form.Element.getValue;

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
  initialize: function(element, frequency, callback) {
    this.frequency = frequency;
    this.element   = $(element);
    this.callback  = callback;

    this.lastValue = this.getValue();
    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    var value = this.getValue();
    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
      ? this.lastValue != value : String(this.lastValue) != String(value));
    if (changed) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback.bind(this));
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,

  element: function(event) {
    return event.target || event.srcElement;
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0, length = Event.observers.length; i < length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.attachEvent))
      name = 'keydown';

    Event._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.detachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      try {
        element.detachEvent('on' + name, observer);
      } catch (e) {}
    }
  }
});

/* prevent memory leaks in IE */
if (navigator.appVersion.match(/\bMSIE\b/))
  Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if(element.tagName=='BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  page: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent==document.body)
        if (Element.getStyle(element,'position')=='absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!window.opera || element.tagName=='BODY') {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return [valueL, valueT];
  },

  clone: function(source, target) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || {})

    // find page position of source
    source = $(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $(target);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(target,'position') == 'absolute') {
      parent = Position.offsetParent(target);
      delta = Position.page(parent);
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
  },

  absolutize: function(element) {
    element = $(element);
    if (element.style.position == 'absolute') return;
    Position.prepare();

    var offsets = Position.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';;
    element.style.left   = left + 'px';;
    element.style.width  = width + 'px';;
    element.style.height = height + 'px';;
  },

  relativize: function(element) {
    element = $(element);
    if (element.style.position == 'relative') return;
    Position.prepare();

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
  }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned.  For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
  Position.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }
}

Element.addMethods();
// EventSelectors 
// Copyright (c) 2005-2006 Justin Palmer (http://encytemedia.com)
// Examples and documentation (http://encytemedia.com/event-selectors)
// 
// EventSelectors allow you access to Javascript events using a CSS style syntax.
// It goes one step beyond Javascript events to also give you :loaded, which allows 
// you to wait until an item is loaded in the document before you begin to interact
// with it.
//
// Inspired by the work of Ben Nolan's Behaviour (http://bennolan.com/behaviour)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

// Probably want to remove these and create your own.
var Rules = {
  
  '#icons a:mouseover': function(element) {
    var app = element.id;
    new Effect.BlindDown(app + '-content', {queue: 'end', duration: 0.2});
  },
  
  '#icons a:mouseout': function(element) {
    var app = element.id;
    new Effect.BlindUp(app + '-content', {queue: 'end', duration: 0.2});
  },
  
  '#features:mouseover': function(element) {
    //alert('wee mouse');
  },
  
  '#features': function(element) {
    Sortable.create(element);
  },
  
  '#features li:click': function(element, event) {
    new Ajax.Updater('features', 'item.html', {
      asynchronous:true, 
      method: 'get', 
      evalScripts: true, 
      insertion: Insertion.Bottom
    });
  }
}

var EventSelectors = {
  version: '1.0_pre',
  cache: [],
  
  start: function(rules) {
    this.rules = rules || {};
    this.timer = new Array();
    this._extendRules();
    this.assign(this.rules);
  },
  
  assign: function(rules) {
    var observer = null;
    this._unloadCache();
    rules._each(function(rule) {
      var selectors = $A(rule.key.split(','));
      selectors.each(function(selector) {        
        var pair = selector.split(':');
        var event = pair[1];
        $$(pair[0]).each(function(element) {
          if(pair[1] == '' || pair.length == 1) return rule.value(element);
          if(event.toLowerCase() == 'loaded') {
            this.timer[pair[0]] = setInterval(this._checkLoaded.bind(this, element, pair[0], rule), 15);
          } else {
            observer = function(event) {
              var element = Event.element(event);
              if (element.nodeType == 3) // Safari Bug (Fixed in Webkit)
            		element = element.parentNode;
              rule.value($(element), event);
            }
            this.cache.push([element, event, observer]);
            Event.observe(element, event, observer);
          }
        }.bind(this));
      }.bind(this));
    }.bind(this));
  },
  
  // Scoped caches would rock.
  _unloadCache: function() {
    if (!this.cache) return;
    for (var i = 0; i < this.cache.length; i++) {
      Event.stopObserving.apply(this, this.cache[i]);
      this.cache[i][0] = null;
    }
    this.cache = [];
  },
  
  _checkLoaded: function(element, timer, rule) {
    var node = $(element);
    if(element.tagName != 'undefined') {
      clearInterval(this.timer[timer]);
      rule.value(node);
    }
  },
  
  _extendRules: function() {
    Object.extend(this.rules, {
     _each: function(iterator) {
       for (key in this) {
         if(key == '_each') continue;         
         var value = this[key];
         var pair = [key, value];
         pair.key = key;
         pair.value = value;
         iterator(pair);
       }
     }  
    });
  }
}

// Remove/Comment this if you do not wish to reapply Rules automatically
// on Ajax request.
Ajax.Responders.register({
  onComplete: function() { EventSelectors.assign(Rules);}
})
// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// For details, see the script.aculo.us web site: http://script.aculo.us/
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('l 3O={di:{dd:"1W",dc:"3P",db:"3P",da:"3P",d9:"hr",d8:"4k",9s:"4k",d7:"5k",d6:"3P",d5:"3P",d4:"3P",d3:"3P",d2:"3P",d1:"3P"},1L:(g(2u){2u=2u.42();l dh=6.di[2u]||"6j";l 5s=19.2v(dh);a7{5s.37="<"+2u+"></"+2u+">"}a6(e){}l 8=5s.78||14;j(8&&(8.2V.42()!=2u)){8=8.95(2u)[0]}j(!8){8=19.2v(2u)}j(!8){q}j(Y[1]){j(6.7U(Y[1])||(Y[1]4h 34)){6.aa(8,Y[1])}Z{l 5r=6.df(Y[1]);j(5r.12){a7{5s.37="<"+2u+" "+5r+"></"+2u+">"}a6(e){}8=5s.78||14;j(!8){8=19.2v(2u);2l(7V 6k Y[1]){8[7V=="dg"?"3y":7V]=Y[1][7V]}}j(8.2V.42()!=2u){8=5s.95(2u)[0]}}}}j(Y[2]){6.aa(8,Y[2])}q 8}),a9:(g(3z){q 19.6L(3z)}),ac:{3y:"dg",hq:"2l"},df:(g(ab){l 5r=[];2l(6w 6k ab){5r.1J((6w 6k 6.ac?6.ac[6w]:6w)+"=\\""+ab[6w].hp().ho()+"\\"")}q 5r.59(" ")}),aa:(g(8,1B){j(1t 1B=="5k"){1B.3D().1h((g(e){j(1t e=="5k"){8.2h(e)}Z{j(3O.7U(e)){8.2h(3O.a9(e))}}}))}Z{j(3O.7U(1B)){8.2h(3O.a9(1B))}}}),7U:(g(a8){q(1t a8=="2w"||1t a8=="bX")}),hn:(g(de){l 8=6.1L("6j");$(8).11(de.hm());q 8.23()}),hl:(g(3h){j(1t 3h!="5k"&&1t 3h!="g"){3h=1u}l d0=("A hk hj hi hh dd B hg hf he hd hc bF hb bP dc ha h9 h8 db da h7 h6 h5 h4 bt h3 h2 h1 h0 gZ gY gX gW gV gU gT gS gR gQ gP gO gN I gM gL bR gK gJ gI gH d9 8K gG gF gE gD gC gB gA gz d8 9s P d7 gy Q S gx gw bQ gv gu gt gs gr gq gp go d6 d5 bO d4 d3 d2 gn d1 gm U gl gk").cZ(/\\s+/);d0.1h((g(3E){3h[3E]=(g(){q 3O.1L.cY(3O,[3E].8w($A(Y)))})}))})};9D.1d.4a=(g(){l 1G="#";j(6.4p(0,4)=="gj("){l 5L=6.4p(4,6.12-1).cZ(",");l i=0;do{1G+=35(5L[i]).9F()}5y(++i<3)}Z{j(6.4p(0,1)=="#"){j(6.12==4){2l(l i=1;i<4;i++){1G+=(6.9A(i)+6.9A(i)).4q()}}j(6.12==7){1G=6.4q()}}}q(1G.12==7?1G:(Y[0]||6))});D.7a=(g(8){q $A($(8).3Y).89((g(1L){q(1L.a5==3?1L.a4:(1L.91()?D.7a(1L):""))})).3D().59("")});D.79=(g(8,3y){q $A($(8).3Y).89((g(1L){q(1L.a5==3?1L.a4:((1L.91()&&!D.gh(1L,3y))?D.79(1L,3y):""))})).3D().59("")});D.c8=(g(8,7O){8=$(8);8.1f({3j:(7O/3p)+"em"});j(2C.4d.1T("4M")>0){1u.80(0,0)}q 8});D.5h=(g(8){q $(8).1w("1Z")});D.7z=(g(8,O){q $(8).1f({1Z:O})});D.3J=(g(8){q $(8).E.1Z||""});D.9B=(g(8){a7{8=$(8);l n=19.6L(" ");8.2h(n);8.bo(n)}a6(e){}});34.1d.gg=(g(){l cX=Y;6.1h((g(f){f.cY(6,cX)}))});l u={5l:{38:"gf",ge:"gd gc gb 8 ga g9 g8, g7 g6 g5 2l 6 t 2k g4"},cW:(g(8){j(1t 3O=="51"){3c("u.cW 8W 8V 8U.8T.8S\' g3.62 8R")}l a3="13:cI";j(/61/.3V(2C.5Z)&&!1u.2Z){a3+=";9H:1"}8=$(8);$A(8.3Y).1h((g(1Q){j(1Q.a5==3){1Q.a4.g2().1h((g(a2){8.57(3O.1L("4S",{E:a3},a2==" "?9D.g1(g0):a2),1Q)}));D.4m(1Q)}}))}),fZ:(g(8,t){l 2U;j(((1t 8=="5k")||(1t 8=="g"))&&(8.12)){2U=8}Z{2U=$(8).3Y}l b=N.M({2x:0.1,27:0},Y[2]||{});l cV=b.27;$A(2U).1h((g(8,1e){X t(8,N.M(b,{27:1e*b.2x+cV}))}))}),a1:{fY:["cs","cr"],fX:["cv","cw"],cU:["7f","8Q"]},fW:(g(8,t){8=$(8);t=(t||"cU").4q();l b=N.M({2z:{13:"2P",3h:(8.1z||"7P"),9Y:1}},Y[2]||{});u[8.fV()?u.a1[t][1]:u.a1[t][0]](8,b)})};l fU=u;u.31={fT:4T.K,4E:(g(18){q(-1s.a0(18*1s.9Z)/ 2) + 0.5;}), 9K:(g (18) {q 1 - 18;}), cu:(g (18) {q ((-1s.a0(18 * 1s.9Z) /4)+0.75)+1s.fS()/ 4;}), fR:(g (18) {q (-1s.a0(18 * 1s.9Z * (9 * 18)) /2)+0.5}),cn:(g(18,3o){3o=3o||5;q(1s.2D((18%(1/3o))*3o)==0?((18*3o*2)-1s.cT(18*3o*2)):1-((18*3o*2)-1s.cT(18*3o*2)))}),41:(g(18){q 0}),cp:(g(18){q 1})};u.9X=1U.1O();N.M(N.M(u.9X.1d,fQ),{1X:(g(){6.1q=[];6.6v=14}),cS:(g(cR){6.1q.cS(cR)}),5c:(g(t){l 4K=(X 7p()).cP();l 13=(1t t.b.2z=="2w")?t.b.2z:t.b.2z.13;7d(13){1K"fP":6.1q.fO((g(e){q e.5o=="9U"})).1h((g(e){e.4b+=t.4c;e.4c+=t.4c}));1P;1K"5P-fN":4K=6.1q.cQ("4b").3s()||4K;1P;1K"2P":4K=6.1q.cQ("4c").3s()||4K;1P;7c:}t.4b+=4K;t.4c+=4K;j(!t.b.2z.9Y||(6.1q.12<t.b.2z.9Y)){6.1q.1J(t)}j(!6.6v){6.6v=bH(6.7S.1l(6),15)}}),4m:(g(t){6.1q=6.1q.6e((g(e){q e==t}));j(6.1q.12==0){bJ(6.6v);6.6v=14}}),7S:(g(){l 5p=(X 7p()).cP();2l(l i=0,cO=6.1q.12;i<cO;i++){j(6.1q[i]){6.1q[i].7S(5p)}}})});u.7R={7T:$H(),7Q:(g(5q){j(1t 5q!="2w"){q 5q}j(!6.7T[5q]){6.7T[5q]=X u.9X()}q 6.7T[5q]})};u.fM=u.7R.7Q("7P");u.cN={2b:u.31.4E,1I:1,cM:60,2r:J,2y:0,2k:1,27:0,2z:"fL"};u.2m=(g(){});u.2m.1d={13:14,1D:(g(b){6.b=N.M(N.M({},u.cN),b||{});6.9W=0;6.5o="9U";6.4b=6.b.27*2H;6.4c=6.4b+(6.b.1I*2H);6.C("fK");j(!6.b.2r){u.7R.7Q(1t 6.b.2z=="2w"?"7P":6.b.2z.3h).5c(6)}}),7S:(g(5p){j(5p>=6.4b){j(5p>=6.4c){6.3a(1);6.54();6.C("cJ");j(6.4J){6.4J()}6.C("9u");q}l 18=(5p-6.4b)/(6.4c-6.4b);l 9V=1s.2D(18*6.b.cM*6.b.1I);j(9V>6.9W){6.3a(18);6.9W=9V}}}),3a:(g(18){j(6.5o=="9U"){6.5o="cL";6.C("4F");j(6.4D){6.4D()}6.C("9O")}j(6.5o=="cL"){j(6.b.2b){18=6.b.2b(18)}18*=(6.b.2k-6.b.2y);18+=6.b.2y;6.13=18;6.C("fJ");j(6.11){6.11(18)}6.C("fI")}}),54:(g(){j(!6.b.2r){u.7R.7Q(1t 6.b.2z=="2w"?"7P":6.b.2z.3h).4m(6)}6.5o="fH"}),C:(g(29){j(6.b[29+"cK"]){6.b[29+"cK"](6)}j(6.b[29]){6.b[29](6)}}),6g:(g(){l 6m=$H();2l(2N 6k 6){j(1t 6[2N]!="g"){6m[2N]=6[2N]}}q"#<u:"+6m.6g()+",b:"+$H(6.b).6g()+">"})};u.4C=1U.1O();N.M(N.M(u.4C.1d,u.2m.1d),{1X:(g(1q){6.1q=1q||[];6.1D(Y[1])}),11:(g(13){6.1q.bC("3a",13)}),4J:(g(13){6.1q.1h((g(t){t.3a(1);t.54();t.C("cJ");j(t.4J){t.4J(13)}t.C("9u")}))})});u.G=1U.1O();N.M(N.M(u.G.1d,u.2m.1d),{1X:(g(){l b=N.M({1I:0},Y[0]||{});6.1D(b)}),11:4T.9d});u.2W=1U.1O();N.M(N.M(u.2W.1d,u.2m.1d),{1X:(g(8){6.8=$(8);j(!6.8){3c(u.5l)}j(/61/.3V(2C.5Z)&&!1u.2Z&&(!6.8.ci.ch)){6.8.1f({9H:1})}l b=N.M({2y:6.8.5h()||0,2k:1},Y[1]||{});6.1D(b)}),11:(g(13){6.8.7z(13)})});u.2p=1U.1O();N.M(N.M(u.2p.1d,u.2m.1d),{1X:(g(8){6.8=$(8);j(!6.8){3c(u.5l)}l b=N.M({x:0,y:0,cH:"cI"},Y[1]||{});6.1D(b)}),4D:(g(){6.8.2G();6.6s=4i(6.8.1w("1c")||"0");6.6t=4i(6.8.1w("1b")||"0");j(6.b.cH=="4t"){6.b.x=6.b.x-6.6s;6.b.y=6.b.y-6.6t}}),11:(g(13){6.8.1f({1c:1s.2D(6.b.x*13+6.6s)+"1E",1b:1s.2D(6.b.y*13+6.6t)+"1E"})})});u.fG=(g(8,cF,cG){q X u.2p(8,N.M({x:cG,y:cF},Y[3]||{}))});u.2A=1U.1O();N.M(N.M(u.2A.1d,u.2m.1d),{1X:(g(8,7O){6.8=$(8);j(!6.8){3c(u.5l)}l b=N.M({3n:V,6r:V,3m:V,7M:J,3N:"9N",4G:3p,cE:7O},Y[2]||{});6.1D(b)}),4D:(g(){6.2O=6.b.2O||J;6.cB=6.8.1w("13");6.9T={};["1b","1c","1k","1a","3j"].1h((g(k){6.9T[k]=6.8.E[k]}).1l(6));6.6t=6.8.bi;6.6s=6.8.fF;l 3j=6.8.1w("fE-56")||"3p%";["em","1E","%","ca"].1h((g(6u){j(3j.1T(6u)>0){6.3j=4i(3j);6.6u=6u}}).1l(6));6.cD=(6.b.cE-6.b.4G)/ 3p;6.1i = 14;j (6.b.3N == "9N") {6.1i = [6.8.3S, 6.8.4g];}j (/^fD/.3V(6.b.3N)){6.1i=[6.8.cx,6.8.fC]}j(!6.1i){6.1i=[6.b.3N.7K,6.b.3N.7J]}}),11:(g(13){l 7N=(6.b.4G/ 3p) + (6.cD * 13);j (6.b.3m && 6.3j) {6.8.1f({3j:6.3j * 7N + 6.6u});}6.cC(6.1i[0] * 7N, 6.1i[1] * 7N);}), 4J:(g (13) {j (6.2O) {6.8.1f(6.9T);}}), cC:(g (1a, 1k) {l d = {};j (6.b.3n) {d.1k = 1s.2D(1k) + "1E";}j (6.b.6r) {d.1a = 1s.2D(1a) + "1E";}j (6.b.7M) {l 9S = (1a - 6.1i[0]) /2;l 9R=(1k-6.1i[1])/2;j(6.cB=="4t"){j(6.b.6r){d.1b=6.6t-9S+"1E"}j(6.b.3n){d.1c=6.6s-9R+"1E"}}Z{j(6.b.6r){d.1b=-9S+"1E"}j(6.b.3n){d.1c=-9R+"1E"}}}6.8.1f(d)})});u.6S=1U.1O();N.M(N.M(u.6S.1d,u.2m.1d),{1X:(g(8){6.8=$(8);j(!6.8){3c(u.5l)}l b=N.M({6R:"#fB"},Y[1]||{});6.1D(b)}),4D:(g(){j(6.8.1w("5X")=="41"){6.54();q}6.2a={};j(!6.b.fA){6.2a.cA=6.8.1w("6Y-fz");6.8.1f({cA:"41"})}j(!6.b.6Q){6.b.6Q=6.8.1w("6Y-1G").4a("#ck")}j(!6.b.6P){6.b.6P=6.8.1w("6Y-1G")}6.9Q=$R(0,2).1W((g(i){q 35(6.b.6R.4p(i*2+1,i*2+3),16)}).1l(6));6.cz=$R(0,2).1W((g(i){q 35(6.b.6Q.4p(i*2+1,i*2+3),16)-6.9Q[i]}).1l(6))}),11:(g(13){6.8.1f({3v:$R(0,2).cf("#",(g(m,v,i){q m+(1s.2D(6.9Q[i]+(6.cz[i]*13)).9F())}).1l(6))})}),4J:(g(){6.8.1f(N.M(6.2a,{3v:6.b.6P}))})});u.cy=1U.1O();N.M(N.M(u.cy.1d,u.2m.1d),{1X:(g(8){6.8=$(8);6.1D(Y[1]||{})}),4D:(g(){1o.6b();l 1H=1o.3R(6.8);j(6.b.2e){1H[1]+=6.b.2e}l 3s=1u.9g?1u.1a-1u.9g:19.45.cx-(19.3f.4u?19.3f.4u:19.45.4u);6.9P=1o.9p;6.2f=(1H[1]>3s?3s:1H[1])-6.9P}),11:(g(13){1o.6b();1u.9j(1o.9q,6.9P+(13*6.2f))})});u.8Q=(g(8){8=$(8);l 5m=8.3J();l b=N.M({2y:8.5h()||1,2k:0,1C:(g(t){j(t.b.2k!=0){q}t.8.1A().1f({1Z:5m})})},Y[1]||{});q X u.2W(8,b)});u.7f=(g(8){8=$(8);l b=N.M({2y:(8.1w("5X")=="41"?0:8.5h()||0),2k:1,1C:(g(t){t.8.9B()}),4F:(g(t){t.8.7z(t.b.2y).22()})},Y[1]||{});q X u.2W(8,b)});u.fy=(g(8){8=$(8);l 2a={1Z:8.3J(),13:8.1w("13"),1b:8.E.1b,1c:8.E.1c,1k:8.E.1k,1a:8.E.1a};q X u.4C([X u.2A(8,fx,{2r:V,7M:V,3m:V,2O:V}),X u.2W(8,{2r:V,2k:0})],N.M({1I:1,fw:(g(t){1o.bN(t.1q[0].8)}),1C:(g(t){t.1q[0].8.1A().1f(2a)})},Y[1]||{}))});u.cw=(g(8){8=$(8);8.3L();q X u.2A(8,0,N.M({3m:J,3n:J,2O:V,1C:(g(t){t.8.1A().3K()})},Y[1]||{}))});u.cv=(g(8){8=$(8);l 5n=8.7I();q X u.2A(8,3p,N.M({3m:J,3n:J,4G:0,3N:{7K:5n.1a,7J:5n.1k},2O:V,9O:(g(t){t.8.3L().1f({1a:"9M"}).22()}),1C:(g(t){t.8.3K()})},Y[1]||{}))});u.fv=(g(8){8=$(8);l 5m=8.3J();q X u.7f(8,N.M({1I:0.4,2y:0,2b:u.31.cu,1C:(g(t){X u.2A(t.8,1,{1I:0.3,7M:V,3n:J,3m:J,2O:V,4F:(g(t){t.8.2G().3L()}),1C:(g(t){t.8.1A().3K().3M().1f({1Z:5m})})})})},Y[1]||{}))});u.fu=(g(8){8=$(8);l 2a={1b:8.1w("1b"),1c:8.1w("1c"),1Z:8.3J()};q X u.4C([X u.2p(8,{x:0,y:3p,2r:V}),X u.2W(8,{2r:V,2k:0})],N.M({1I:0.5,4F:(g(t){t.1q[0].8.2G()}),1C:(g(t){t.1q[0].8.1A().3M().1f(2a)})},Y[1]||{}))});u.ft=(g(8){8=$(8);l 2a={1b:8.1w("1b"),1c:8.1w("1c")};q X u.2p(8,{x:20,y:0,1I:0.ct,1C:(g(t){X u.2p(t.8,{x:-40,y:0,1I:0.1,1C:(g(t){X u.2p(t.8,{x:40,y:0,1I:0.1,1C:(g(t){X u.2p(t.8,{x:-40,y:0,1I:0.1,1C:(g(t){X u.2p(t.8,{x:40,y:0,1I:0.1,1C:(g(t){X u.2p(t.8,{x:-20,y:0,1I:0.ct,1C:(g(t){t.8.3M().1f(2a)})})})})})})})})})})})})});u.cs=(g(8){8=$(8).5U();l 7L=8.23().1w("30");l 5n=8.7I();q X u.2A(8,3p,N.M({3m:J,3n:J,4G:1u.2Z?0:1,3N:{7K:5n.1a,7J:5n.1k},2O:V,9O:(g(t){t.8.2G();t.8.23().2G();j(1u.2Z){t.8.1f({1b:""})}t.8.3L().1f({1a:"9M"}).22()}),cq:(g(t){t.8.23().1f({30:(t.1i[0]-t.8.4u)+"1E"})}),1C:(g(t){t.8.3K().3M();t.8.23().3M().1f({30:7L})})},Y[1]||{}))});u.cr=(g(8){8=$(8).5U();l 7L=8.23().1w("30");q X u.2A(8,1u.2Z?0:1,N.M({3m:J,3n:J,3N:"9N",4G:3p,2O:V,co:(g(t){t.8.2G();t.8.23().2G();j(1u.2Z){t.8.1f({1b:""})}t.8.3L().22()}),cq:(g(t){t.8.23().1f({30:(t.1i[0]-t.8.4u)+"1E"})}),1C:(g(t){t.8.1A().3K().3M().1f({30:7L});t.8.23().3M()})},Y[1]||{}))});u.fs=(g(8){q X u.2A(8,1u.2Z?1:0,{2O:V,4F:(g(t){t.8.3L()}),1C:(g(t){t.8.1A().3K()})})});u.fr=(g(8){8=$(8);l b=N.M({7H:"7G",7D:u.31.4E,7E:u.31.4E,7F:u.31.cp},Y[1]||{});l 2a={1b:8.E.1b,1c:8.E.1c,1a:8.E.1a,1k:8.E.1k,1Z:8.3J()};l 1i=8.7I();l 4I,4H;l 2t,2s;7d(b.7H){1K"1b-1c":4I=4H=2t=2s=0;1P;1K"1b-6l":4I=1i.1k;4H=2s=0;2t=-1i.1k;1P;1K"30-1c":4I=2t=0;4H=1i.1a;2s=-1i.1a;1P;1K"30-6l":4I=1i.1k;4H=1i.1a;2t=-1i.1k;2s=-1i.1a;1P;1K"7G":4I=1i.1k/ 2;4H = 1i.1a /2;2t=-1i.1k/ 2;2s = -1i.1a /2;1P;7c:}q X u.2p(8,{x:4I,y:4H,1I:0.fq,4F:(g(t){t.8.1A().3L().2G()}),1C:(g(t){X u.4C([X u.2W(t.8,{2r:V,2k:1,2y:0,2b:b.7F}),X u.2p(t.8,{x:2t,y:2s,2r:V,2b:b.7D}),X u.2A(t.8,3p,{3N:{7K:1i.1a,7J:1i.1k},2r:V,4G:1u.2Z?1:0,2b:b.7E,2O:V})],N.M({4F:(g(t){t.1q[0].8.1f({1a:"9M"}).22()}),1C:(g(t){t.1q[0].8.3K().3M().1f(2a)})},b))})})});u.fp=(g(8){8=$(8);l b=N.M({7H:"7G",7D:u.31.4E,7E:u.31.4E,7F:u.31.41},Y[1]||{});l 2a={1b:8.E.1b,1c:8.E.1c,1a:8.E.1a,1k:8.E.1k,1Z:8.3J()};l 1i=8.7I();l 2t,2s;7d(b.7H){1K"1b-1c":2t=2s=0;1P;1K"1b-6l":2t=1i.1k;2s=0;1P;1K"30-1c":2t=0;2s=1i.1a;1P;1K"30-6l":2t=1i.1k;2s=1i.1a;1P;1K"7G":2t=1i.1k/ 2;2s = 1i.1a /2;1P;7c:}q X u.4C([X u.2W(8,{2r:V,2k:0,2y:1,2b:b.7F}),X u.2A(8,1u.2Z?1:0,{2r:V,2b:b.7E,2O:V}),X u.2p(8,{x:2t,y:2s,2r:V,2b:b.7D})],N.M({co:(g(t){t.1q[0].8.2G().3L()}),1C:(g(t){t.1q[0].8.1A().3K().3M().1f(2a)})},b))});u.fo=(g(8){8=$(8);l b=Y[1]||{};l 5m=8.3J();l 2b=b.2b||u.31.4E;l 9L=(g(18){q 2b(1-u.31.cn(18,b.3o))});9L.1l(2b);q X u.2W(8,N.M(N.M({1I:2,2y:0,1C:(g(t){t.8.1f({1Z:5m})})},b),{2b:9L}))});u.fn=(g(8){8=$(8);l 2a={1b:8.E.1b,1c:8.E.1c,1k:8.E.1k,1a:8.E.1a};8.3L();q X u.2A(8,5,N.M({3m:J,3n:J,1C:(g(t){X u.2A(8,1,{3m:J,6r:J,1C:(g(t){t.8.1A().3K().1f(2a)})})})},Y[1]||{}))});u.7A=1U.1O();N.M(N.M(u.7A.1d,u.2m.1d),{1X:(g(8){6.8=$(8);j(!6.8){3c(u.5l)}l b=N.M({E:{}},Y[1]||{});j(1t b.E=="2w"){j(b.E.1T(":")==-1){l 6o="",73="."+b.E;$A(19.fm).9K().1h((g(6q){j(6q.6p){6p=6q.6p}Z{j(6q.cl){6p=6q.cl}}$A(6p).9K().1h((g(9J){j(73==9J.fl){6o=9J.E.6o;3c $1P}}));j(6o){3c $1P}}));6.E=6o.9C();b.1C=(g(t){t.8.3r(t.b.E);t.9G.1h((g(1R){j(1R.E!="1Z"){t.8.E[1R.E.c5()]=""}}))})}Z{6.E=b.E.9C()}}Z{6.E=$H(b.E)}6.1D(b)}),4D:(g(){g 4a(1G){j(!1G||["fk(0, 0, 0, 0)","aQ"].8Z(1G)){1G="#ck"}1G=1G.4a();q $R(0,2).1W((g(i){q 35(1G.4p(i*2+1,i*2+3),16)}))}6.9G=6.E.1W((g(9I){l 2N=9I[0].fj().fi(),O=9I[1],3k=14;j(O.4a("#cj")!="#cj"){O=O.4a();3k="1G"}Z{j(2N=="1Z"){O=4i(O);j(/61/.3V(2C.5Z)&&!1u.2Z&&(!6.8.ci.ch)){6.8.1f({9H:1})}}Z{j(D.cb.3V(O)){l 7C=O.2j(/^([\\+\\-]?[0-9\\.]+)(.*)$/),O=4i(7C[1]),3k=(7C.12==3)?7C[2]:14}}}l 3l=6.8.1w(2N);q $H({E:2N,3l:3k=="1G"?4a(3l):4i(3l||0),6n:3k=="1G"?4a(O):O,3k:3k})}).1l(6)).6e((g(1R){q((1R.3l==1R.6n)||(1R.3k!="1G"&&(cg(1R.3l)||cg(1R.6n))))}))}),11:(g(13){l E=$H(),O=14;6.9G.1h((g(1R){O=1R.3k=="1G"?$R(0,2).cf("#",(g(m,v,i){q m+(1s.2D(1R.3l[i]+(1R.6n[i]-1R.3l[i])*13)).9F()})):1R.3l+1s.2D(((1R.6n-1R.3l)*13)*2H)/2H+1R.3k;E[1R.E]=O}));6.8.1f(E)})});u.ce=1U.1O();N.M(u.ce.1d,{1X:(g(4B){6.4B=[];6.b=Y[1]||{};6.cd(4B)}),cd:(g(4B){4B.1h((g(1y){l 6m=$H(1y).1S().cc();6.4B.1J($H({9E:$H(1y).fh().cc(),t:u.7A,b:{E:6m}}))}).1l(6));q 6}),fg:(g(){q X u.4C(6.4B.1W((g(1y){l 2U=[$(1y.9E)||$$(1y.9E)].3D();q 2U.1W((g(e){q X 1y.t(e,N.M({2r:V},1y.b))}))})).3D(),6.b)})});D.c9=$w("3v ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 30 f1 1G 3j f0 1a 1c eZ eY eX eW eV eU eT eS eR eQ eP 1Z eO eN eM eL eK eJ eI 6l eH 1b 1k eG 5Y");D.cb=/^(([\\+\\-]?[0-9\\.]+)(em|ex|1E|6k|cm|eF|ca|eE|\\%))|0$/;9D.1d.9C=(g(){l 8=D.M(19.2v("6j"));8.37="<6j E=\\""+6+"\\"></6j>";l E=8.23().E,7B=$H();D.c9.1h((g(2N){j(E[2N]){7B[2N]=E[2N]}}));j(/61/.3V(2C.5Z)&&!1u.2Z&&6.1T("1Z")>-1){7B.1Z=6.2j(/1Z:\\s*((?:0|1)?(?:\\.\\d*)?)/)[1]}q 7B});D.c7=(g(8,E){X u.7A(8,N.M({E:E},Y[2]||{}));q 8});["7z","5h","3J","9B","c8","7a","79","c7"].1h((g(f){D.c6[f]=D[f]}));D.c6.eD=(g(8,t,b){s=t.eC(/7m/,"-").c5();c4=s.9A(0).42()+s.eB(1);X u[c4](8,b);q $(8)});D.eA();j(1t u=="51"){3c("ez.62 8W 8V 8U.8T.8S\' 1q.62 8R")}l 2K={2Y:[],4m:(g(8){6.2Y=6.2Y.6e((g(d){q d.8==$(8)}))}),5c:(g(8){8=$(8);l b=N.M({ey:V,3e:14,2o:J},Y[1]||{});j(b.2L){b.6i=[];l 2L=b.2L;j((1t 2L=="5k")&&(2L.ew==34)){2L.1h((g(c){b.6i.1J($(c))}))}Z{b.6i.1J($(2L))}}j(b.6h){b.6h=[b.6h].3D()}D.2G(8);b.8=8;6.2Y.1J(b)}),c2:(g(2Y){7y=2Y[0];2l(i=1;i<2Y.12;++i){j(D.64(2Y[i].8,7y.8)){7y=2Y[i]}}q 7y}),c3:(g(8,1m){l 7x;j(1m.2o){7x=8.9a}Z{7x=8.1F}q 1m.6i.90((g(c){q 7x==c}))}),9z:(g(3I,8,1m){q((1m.8!=8)&&((!1m.6i)||6.c3(8,1m))&&((!1m.6h)||(D.bj(8).90((g(v){q 1m.6h.8Z(v)}))))&&1o.c1(1m.8,3I[0],3I[1]))}),6c:(g(1m){j(1m.3e){D.4Q(1m.8,1m.3e)}6.2X=14}),58:(g(1m){j(1m.3e){D.3r(1m.8,1m.3e)}6.2X=1m}),22:(g(3I,8){j(!6.2Y.12){q}l 7w=[];j(6.2X){6.6c(6.2X)}6.2Y.1h((g(1m){j(2K.9z(3I,8,1m)){7w.1J(1m)}}));j(7w.12>0){1m=2K.c2(7w);1o.c1(1m.8,3I[0],3I[1]);j(1m.3X){1m.3X(8,1m.8,1o.1V(1m.1V,1m.8))}2K.58(1m)}}),bM:(g(C,8){j(!6.2X){q}1o.6b();j(6.9z([G.5w(C),G.5v(C)],8,6.2X)){j(6.2X.c0){6.2X.c0(8,6.2X.8,C)}}}),bK:(g(){j(6.2X){6.6c(6.2X)}})};l 1r={5j:[],5i:[],bU:(g(2q){j(6.5j.12==0){6.4X=6.4L.26(6);6.4W=6.7u.26(6);6.9y=6.7s.26(6);G.1N(19,"6J",6.4X);G.1N(19,"6I",6.4W);G.1N(19,"8P",6.9y)}6.5j.1J(2q)}),bT:(g(2q){6.5j=6.5j.6e((g(d){q d==2q}));j(6.5j.12==0){G.2g(19,"6J",6.4X);G.2g(19,"6I",6.4W);G.2g(19,"8P",6.9y)}}),58:(g(2q){j(2q.b.27){6.6f=4Z((g(){1r.6f=14;1u.8H();1r.3i=2q}).1l(6),2q.b.27)}Z{1u.8H();6.3i=2q}}),6c:(g(){6.3i=14}),7u:(g(C){j(!6.3i){q}l 1n=[G.5w(C),G.5v(C)];j(6.5f&&(6.5f.6g()==1n.6g())){q}6.5f=1n;6.3i.7u(C,1n)}),4L:(g(C){j(6.6f){8a(6.6f);6.6f=14}j(!6.3i){q}6.5f=14;6.3i.4L(C);6.3i=14}),7s:(g(C){j(6.3i){6.3i.7s(C)}}),by:(g(3b){6.5i.1J(3b);6.9x()}),bD:(g(8){6.5i=6.5i.6e((g(o){q o.8==8}));6.9x()}),6a:(g(29,2q,C){j(6[29+"bZ"]>0){6.5i.1h((g(o){j(o[29]){o[29](29,2q,C)}}))}j(2q.b[29]){2q.b[29](2q,C)}}),9x:(g(){["9f","9e","9i"].1h((g(29){1r[29+"bZ"]=1r.5i.4k((g(o){q o[29]})).12}))})};l 49=1U.1O();49.6d={};49.1d={1X:(g(8){l 9t={1j:J,4y:(g(8,9v,9w){l bY=1s.ev(1s.6H(9v^2)+1s.6H(9w^2))*0.eu;X u.2p(8,{x:-9w,y:-9v,1I:bY,2z:{3h:"bV",13:"2P"}})}),4x:(g(8){l bW=1t 8.7v=="bX"?8.7v:1;X u.2W(8,{1I:0.2,2y:0.7,2k:bW,2z:{3h:"bV",13:"2P"},9u:(g(){49.6d[8]=J})})}),4w:2H,3G:J,1g:J,2M:20,28:15,3H:J,27:0};j(!Y[1]||1t Y[1].4x=="51"){N.M(9t,{5d:(g(8){8.7v=D.5h(8);49.6d[8]=V;X u.2W(8,{1I:0.2,2y:8.7v,2k:0.7})})})}l b=N.M(9t,Y[1]||{});6.8=$(8);j(b.1j&&(1t b.1j=="2w")){6.1j=6.8.23("."+b.1j,0)}j(!6.1j){6.1j=$(b.1j)}j(!6.1j){6.1j=6.8}j(b.1g&&!b.1g.9j&&!b.1g.et){b.1g=$(b.1g);6.9h=D.es(6.8,b.1g)}D.2G(6.8);6.2f=6.7r();6.b=b;6.2B=J;6.3T=6.bS.26(6);G.1N(6.1j,"4V",6.3T);1r.bU(6)}),7l:(g(){G.2g(6.1j,"4V",6.3T);1r.bT(6)}),7r:(g(){q([35(D.1w(6.8,"1c")||"0"),35(D.1w(6.8,"1b")||"0")])}),bS:(g(C){j(1t 49.6d[6.8]!="51"&&49.6d[6.8]){q}j(G.ae(C)){l 8N=G.8(C);j((5g=8N.2V.42())&&(5g=="bR"||5g=="bQ"||5g=="9s"||5g=="bP"||5g=="bO")){q}l 1n=[G.5w(C),G.5v(C)];l 18=1o.3R(6.8);6.2e=[0,1].1W((g(i){q(1n[i]-18[i])}));1r.58(6);G.2c(C)}}),6A:(g(C){6.2B=V;j(6.b.4w){6.bL=35(D.1w(6.8,"z-1e")||0);6.8.E.5Y=6.b.4w}j(6.b.46){6.7t=6.8.er(V);1o.bN(6.8);6.8.1F.57(6.7t,6.8)}j(6.b.1g){j(6.b.1g==1u){l 9r=6.7n(6.b.1g);6.9o=9r.1c;6.9n=9r.1b}Z{6.9o=6.b.1g.5e;6.9n=6.b.1g.4A}}1r.6a("9f",6,C);j(6.b.5d){6.b.5d(6.8)}}),7u:(g(C,1n){j(!6.2B){6.6A(C)}1o.6b();2K.22(1n,6.8);1r.6a("9i",6,C);6.5x(1n);j(6.b.7o){6.b.7o(6)}j(6.b.1g){6.9m();l p;j(6.b.1g==1u){5P(6.7n(6.b.1g)){p=[1c,1b,1c+1k,1b+1a]}}Z{p=1o.eq(6.b.1g);p[0]+=6.b.1g.5e+1o.9q;p[1]+=6.b.1g.4A+1o.9p;p.1J(p[0]+6.b.1g.4g);p.1J(p[1]+6.b.1g.3S)}l 2x=[0,0];j(1n[0]<(p[0]+6.b.2M)){2x[0]=1n[0]-(p[0]+6.b.2M)}j(1n[1]<(p[1]+6.b.2M)){2x[1]=1n[1]-(p[1]+6.b.2M)}j(1n[0]>(p[2]-6.b.2M)){2x[0]=1n[0]-(p[2]-6.b.2M)}j(1n[1]>(p[3]-6.b.2M)){2x[1]=1n[1]-(p[3]-6.b.2M)}6.bI(2x)}j(2C.4d.1T("4M")>0){1u.80(0,0)}G.2c(C)}),5t:(g(C,6y){6.2B=J;j(6.b.46){1o.ep(6.8);D.4m(6.7t);6.7t=14}j(6y){2K.bM(C,6.8)}1r.6a("9e",6,C);l 3G=6.b.3G;j(3G&&1t 3G=="g"){3G=3G(6.8)}l d=6.7r();j(3G&&6.b.4y){6.b.4y(6.8,d[1]-6.2f[1],d[0]-6.2f[0])}Z{6.2f=d}j(6.b.4w){6.8.E.5Y=6.bL}j(6.b.4x){6.b.4x(6.8)}1r.6c(6);2K.bK()}),7s:(g(C){j(C.5W!=G.bc){q}6.5t(C,J);G.2c(C)}),4L:(g(C){j(!6.2B){q}6.9m();6.5t(C,V);G.2c(C)}),5x:(g(3I){l 18=1o.3R(6.8);j(6.b.46){l r=1o.eo(6.8);18[0]+=r[0]-1o.9q;18[1]+=r[1]-1o.9p}l d=6.7r();18[0]-=d[0];18[1]-=d[1];j(6.b.1g&&(6.b.1g!=1u&&6.9h)){18[0]-=6.b.1g.5e-6.9o;18[1]-=6.b.1g.4A-6.9n}l p=[0,1].1W((g(i){q(3I[i]-18[i]-6.2e[i])}).1l(6));j(6.b.3H){j(1t 6.b.3H=="g"){p=6.b.3H(p[0],p[1],6)}Z{j(6.b.3H 4h 34){p=p.1W((g(v,i){q 1s.2D(v/ 6.b.3H[i]) * 6.b.3H[i];}).1l(6));} Z {p = p.1W((g (v) {q 1s.2D(v /6.b.3H)*6.b.3H}).1l(6))}}}l E=6.8.E;j((!6.b.4z)||(6.b.4z=="88")){E.1c=p[0]+"1E"}j((!6.b.4z)||(6.b.4z=="5z")){E.1b=p[1]+"1E"}j(E.7k=="98"){E.7k=""}}),9m:(g(){j(6.7q){bJ(6.7q);6.7q=14;1r.3g=14}}),bI:(g(2x){j(!(2x[0]||2x[1])){q}6.28=[2x[0]*6.b.28,2x[1]*6.b.28];6.9l=X 7p();6.7q=bH(6.1g.1l(6),10)}),1g:(g(){l 9k=X 7p();l 2f=9k-6.9l;6.9l=9k;j(6.b.1g==1u){5P(6.7n(6.b.1g)){j(6.28[0]||6.28[1]){l d=2f/ 2H;6.b.1g.9j(1c + d * 6.28[0], 1b + d * 6.28[1]);}}} Z {6.b.1g.5e += 6.28[0] * 2f /2H;6.b.1g.4A+=6.28[1]*2f/ 2H;}1o.6b();2K.22(1r.5f, 6.8);1r.6a("9i", 6);j (6.9h) {1r.3g = 1r.3g || $A(1r.5f);1r.3g[0] += 6.28[0] * 2f /2H;1r.3g[1]+=6.28[1]*2f/2H;j(1r.3g[0]<0){1r.3g[0]=0}j(1r.3g[1]<0){1r.3g[1]=0}6.5x(1r.3g)}j(6.b.7o){6.b.7o(6)}}),7n:(g(w){l T,L,W,H;5P(w.19){j(w.19.3f&&3f.4A){T=3f.4A;L=3f.5e}Z{j(w.19.45){T=45.4A;L=45.5e}}j(w.bG){W=w.bG;H=w.9g}Z{j(w.19.3f&&3f.94){W=3f.94;H=3f.4u}Z{W=45.4g;H=45.3S}}}q{1b:T,1c:L,1k:W,1a:H}})};l 99=1U.1O();99.1d={1X:(g(8,3b){6.8=$(8);6.3b=3b;6.4Y=17.5O(6.8)}),9f:(g(){6.4Y=17.5O(6.8)}),9e:(g(){17.bu();j(6.4Y!=17.5O(6.8)){6.3b(6.8)}})};l 17={bB:/^[^7m\\-](?:[A-en-el-9\\-\\7m]*)[7m](.*)$/,68:{},bE:(g(8){5y(8.2V.42()!="bF"){j(8.1z&&17.68[8.1z]){q 8}8=8.1F}}),b:(g(8){8=17.bE($(8));j(!8){q}q 17.68[8.1z]}),7l:(g(8){l s=17.b(8);j(s){1r.bD(s.8);s.69.1h((g(d){2K.4m(d)}));s.9c.bC("7l");bm 17.68[s.8.1z]}}),1O:(g(8){8=$(8);l b=N.M({8:8,3E:"5R",bA:J,2o:J,67:"8v",1V:"5z",4z:"5z",2L:8,1j:J,2n:J,27:0,3e:14,46:J,1g:J,2M:20,28:15,43:6.bB,3q:4T.9d,bx:4T.9d},Y[1]||{});6.7l(8);l 4v={3G:V,1g:b.1g,28:b.28,2M:b.2M,27:b.27,46:b.46,4z:b.4z,1j:b.1j};j(b.5d){4v.5d=b.5d}j(b.4y){4v.4y=b.4y}Z{j(b.46){4v.4y=(g(8){8.E.1b=0;8.E.1c=0})}}j(b.4x){4v.4x=b.4x}j(b.4w){4v.4w=b.4w}l bz={1V:b.1V,2L:b.2L,2o:b.2o,3e:b.3e,3X:17.3X};l 9b={3X:17.bv,1V:b.1V,2L:b.2L,3e:b.3e};D.5U(8);b.9c=[];b.69=[];j(b.bA||b.2o){2K.5c(8,9b);b.69.1J(8)}(6.5b(8,b)||[]).1h((g(e){l 1j=b.1j?$(e).23("."+b.1j,0):e;b.9c.1J(X 49(e,N.M(4v,{1j:1j})));2K.5c(e,bz);j(b.2o){e.9a=8}b.69.1J(e)}));j(b.2o){(17.bw(8,b)||[]).1h((g(e){2K.5c(e,9b);e.9a=8;b.69.1J(e)}))}6.68[8.1z]=b;1r.by(X 99(8,b.bx))}),5b:(g(8,b){q D.7g(8,b.2n,b.2o?V:J,b.3E)}),bw:(g(8,b){q D.7g(8,b.2n,b.2o?V:J,b.67)}),3X:(g(8,1x,1V){j(D.64(1x,8)){q}j(1V>0.33&&1V<0.66&&17.b(1x).2o){q}Z{j(1V>0.5){17.96(1x,"ek");j(1x.ej!=8){l 48=8.1F;8.E.7k="98";1x.1F.57(8,1x);j(1x.1F!=48){17.b(48).3q(8)}17.b(1x.1F).3q(8)}}Z{17.96(1x,"bq");l 97=1x.ei||14;j(97!=8){l 48=8.1F;8.E.7k="98";1x.1F.57(8,97);j(1x.1F!=48){17.b(48).3q(8)}17.b(1x.1F).3q(8)}}}}),bv:(g(8,1x,1V){l 48=8.1F;l 47=17.b(1x);j(!D.64(1x,8)){l 1e;l 1B=17.5b(1x,{3E:47.3E,2n:47.2n});l 1Q=14;j(1B){l 2e=D.63(1x,47.1V)*(1-1V);2l(1e=0;1e<1B.12;1e+=1){j(2e-D.63(1B[1e],47.1V)>=0){2e-=D.63(1B[1e],47.1V)}Z{j(2e-(D.63(1B[1e],47.1V)/2)>=0){1Q=1e+1<1B.12?1B[1e+1]:14;1P}Z{1Q=1B[1e];1P}}}}1x.57(8,1Q);17.b(48).3q(8);47.3q(8)}}),bu:(g(){j(17.3F){17.3F.1A()}}),96:(g(1x,13){l 7j=17.b(1x.1F);j(7j&&!7j.46){q}j(!17.3F){17.3F=($("bs")||D.M(19.2v("bt"))).1A().3r("bs").1f({13:"4t"});19.95("45").3d(0).2h(17.3F)}l 1H=1o.3R(1x);17.3F.1f({1c:1H[0]+"1E",1b:1H[1]+"1E"});j(13=="bq"){j(7j.1V=="88"){17.3F.1f({1c:(1H[0]+1x.94)+"1E"})}Z{17.3F.1f({1b:(1H[1]+1x.4u)+"1E"})}}17.3F.22()}),93:(g(8,b,44){l 1B=17.5b(8,b)||[];2l(l i=0;i<1B.12;++i){l 2j=1B[i].1z.2j(b.43);j(!2j){eh}l 1Q={1z:4j(2j?2j[1]:14),8:8,44:44,1B:[],13:44.1B.12,7i:$(1B[i]).23(b.67)};j(1Q.7i){6.93(1Q.7i,b,1Q)}44.1B.1J(1Q)}q 44}),2o:(g(8){8=$(8);l 65=6.b(8);l b=N.M({3E:65.3E,67:65.67,2n:65.2n,38:8.1z,43:65.43},Y[1]||{});l bp={1z:14,44:14,1B:[],7i:8,13:0};q 17.93(8,b,bp)}),bl:(g(1L){l 1e="";do{j(1L.1z){1e="["+1L.13+"]"+1e}}5y((1L=1L.44)!=14);q 1e}),bk:(g(8){8=$(8);l b=N.M(6.b(8),Y[1]||{});q $(6.5b(8,b)||[]).1W((g(3d){q 3d.1z.2j(b.43)?3d.1z.2j(b.43)[1]:""}))}),eg:(g(8,bn){8=$(8);l b=N.M(6.b(8),Y[2]||{});l 7h={};6.5b(8,b).1h((g(n){j(n.1z.2j(b.43)){7h[n.1z.2j(b.43)[1]]=[n,n.1F]}n.1F.bo(n)}));bn.1h((g(92){l n=7h[92];j(n){n[1].2h(n[0]);bm 7h[92]}}))}),5O:(g(8){8=$(8);l b=N.M(17.b(8),Y[1]||{});l 38=4j((Y[1]&&Y[1].38)?Y[1].38:8.1z);j(b.2o){q 17.2o(8,Y[1]).1B.1W((g(3d){q[38+17.bl(3d)+"[1z]="+4j(3d.1z)].8w(3d.1B.1W(Y.ef))})).3D().59("&")}Z{q 17.bk(8,Y[1]).1W((g(3d){q 38+"[]="+4j(3d)})).59("&")}})};D.64=(g(1Q,8){j(!1Q.1F||1Q==8){q J}j(1Q.1F==8){q V}q D.64(1Q.1F,8)});D.7g=(g(8,2n,8Y,2V){j(!8.91()){q 14}2V=2V.42();j(2n){2n=[2n].3D()}l 2U=[];$A(8.3Y).1h((g(e){j(e.2V&&e.2V.42()==2V&&(!2n||(D.bj(e).90((g(v){q 2n.8Z(v)}))))){2U.1J(e)}j(8Y){l 8X=D.7g(e,2n,8Y,2V);j(8X){2U.1J(8X)}}}));q(2U.12>0?2U.3D():[])});D.63=(g(8,5M){q 8["2e"+((5M=="5z"||5M=="1a")?"ee":"ed")]});j(1t u=="51"){3c("ec.62 8W 8V 8U.8T.8S\' 1q.62 8R")}l 3B={};3B.2m=(g(){});3B.2m.1d={8A:(g(8,11,b){6.8=$(8);6.11=$(11);6.5a=J;6.5T=J;6.24=J;6.1e=0;6.3C=0;j(6.8y){6.8y(b)}Z{6.b=b||{}}6.b.55=6.b.55||6.8.38;6.b.4r=6.b.4r||[];6.b.8L=6.b.8L||0.4;6.b.8F=6.b.8F||1;6.b.8O=6.b.8O||(g(8,11){j(!11.E.13||11.E.13=="4t"){11.E.13="4t";1o.be(8,11,{eb:J,bi:8.3S})}u.7f(11,{1I:0.15})});6.b.8M=6.b.8M||(g(8,11){X u.8Q(11,{1I:0.15})});j(1t(6.b.4r)=="2w"){6.b.4r=X 34(6.b.4r)}6.3b=14;6.8.ea("e9","e8");D.1A(6.11);G.1N(6.8,"e7",6.b8.26(6));G.1N(6.8,"8P",6.bd.26(6))}),22:(g(){j(D.1w(6.11,"5X")=="41"){6.b.8O(6.8,6.11)}j(!6.3Z&&(2C.4d.1T("61")>0)&&(2C.5Z.1T("e6")<0)&&(D.1w(6.11,"13")=="4t")){X e5.e4(6.11,"<bh 1z=\\""+6.11.1z+"bg\\" "+"E=\\"5X:41;13:4t;e3:e2:e1.e0.dZ(1Z=0);\\" "+"8N=\\"dY:J;\\" dX=\\"0\\" dW=\\"dV\\"></bh>");6.3Z=$(6.11.1z+"bg")}j(6.3Z){4Z(6.bf.1l(6),50)}}),bf:(g(){1o.be(6.11,6.3Z,{dU:(!6.11.E.1a)});6.3Z.E.5Y=1;6.11.E.5Y=2;D.22(6.3Z)}),1A:(g(){6.8G();j(D.1w(6.11,"5X")!="41"){6.b.8M(6.8,6.11)}j(6.3Z){D.1A(6.3Z)}}),aZ:(g(){j(6.b.7e){D.22(6.b.7e)}}),8G:(g(){j(6.b.7e){D.1A(6.b.7e)}}),bd:(g(C){j(6.24){7d(C.5W){1K G.bb:1K G.ba:6.76();G.2c(C);1K G.bc:6.1A();6.24=J;G.2c(C);q;1K G.dT:1K G.dS:q;1K G.dR:6.b7();6.3a();j(2C.4d.1T("4M")>0){G.2c(C)}q;1K G.dQ:7c:6.b6();6.3a();j(2C.4d.1T("4M")>0){G.2c(C)}q}}Z{j(C.5W==G.bb||C.5W==G.ba||(2C.4d.1T("4M")>0&&C.5W==0)){q}}6.5T=V;6.5a=V;j(6.3b){8a(6.3b)}6.3b=4Z(6.b0.1l(6),6.b.8L*2H)}),58:(g(){6.5T=J;6.5a=V;6.74()}),3X:(g(C){l 8=G.b9(C,"8K");j(6.1e!=8.77){6.1e=8.77;6.3a()}G.2c(C)}),b1:(g(C){l 8=G.b9(C,"8K");6.1e=8.77;6.76();6.1A()}),b8:(g(C){4Z(6.1A.1l(6),dP);6.5a=J;6.24=J}),3a:(g(){j(6.3C>0){2l(l i=0;i<6.3C;i++){6.1e==i?D.3r(6.4s(i),"4P"):D.4Q(6.4s(i),"4P")}j(6.5a){6.22();6.24=V}}Z{6.24=J;6.1A()}}),b7:(g(){j(6.1e>0){6.1e--}Z{6.1e=6.3C-1}6.4s(6.1e).b5(V)}),b6:(g(){j(6.1e<6.3C-1){6.1e++}Z{6.1e=0}6.4s(6.1e).b5(J)}),4s:(g(1e){q 6.11.78.3Y[1e]}),b4:(g(){q 6.4s(6.1e)}),76:(g(){6.24=J;6.7b(6.b4())}),7b:(g(5V){j(6.b.7b){6.b.7b(5V);q}l O="";j(6.b.4k){l 8J=19.dO(6.b.4k,5V)||[];j(8J.12>0){O=D.7a(8J[0],6.b.4k)}}Z{O=D.79(5V,"dN")}l 3W=6.8D();j(3W!=-1){l 4U=6.8.O.3A(0,3W+1);l 8I=6.8.O.3A(3W+1).2j(/^\\s+/);j(8I){4U+=8I[0]}6.8.O=4U+O}Z{6.8.O=O}6.8.8H();j(6.b.b3){6.b.b3(6.8,5V)}}),8z:(g(5Q){j(!6.5T&&6.5a){6.11.37=5Q;D.5U(6.11);D.5U(6.11.23());j(6.11.78&&6.11.23().3Y){6.3C=6.11.23().3Y.12;2l(l i=0;i<6.3C;i++){l 1Y=6.4s(i);1Y.77=i;6.b2(1Y)}}Z{6.3C=0}6.8G();6.1e=0;j(6.3C==1&&6.b.dM){6.76();6.1A()}Z{6.3a()}}}),b2:(g(8){G.1N(8,"5G",6.3X.26(6));G.1N(8,"5I",6.b1.26(6))}),b0:(g(){6.5T=J;j(6.72().12>=6.b.8F){6.aZ();6.74()}Z{6.24=J;6.1A()}}),72:(g(){l 8E=6.8D();j(8E!=-1){l 2R=6.8.O.3A(8E+1).32(/^\\s+/,"").32(/\\s+$/,"")}Z{l 2R=6.8.O}q/\\n/.3V(2R)?"":2R}),8D:(g(){l 3W=-1;2l(l i=0;i<6.b.4r.12;i++){l 8C=6.8.O.dL(6.b.4r[i]);j(8C>3W){3W=8C}}q 3W})};2i.3B=1U.1O();N.M(N.M(2i.3B.1d,3B.2m.1d),{1X:(g(8,11,3w,b){6.8A(8,11,b);6.b.8m=V;6.b.2I=6.2I.1l(6);6.b.8B=6.b.5K||14;6.3w=3w}),74:(g(){1Y=4j(6.b.55)+"="+4j(6.72());6.b.5K=6.b.36?6.b.36(6.8,1Y):1Y;j(6.b.8B){6.b.5K+="&"+6.b.8B}X 2i.8n(6.3w,6.b)}),2I:(g(aY){6.8z(aY.8p)})});3B.aX=1U.1O();3B.aX.1d=N.M(X 3B.2m(),{1X:(g(8,11,5S,b){6.8A(8,11,b);6.b.5S=5S}),74:(g(){6.8z(6.b.73(6))}),8y:(g(b){6.b=N.M({5Q:10,aV:V,aW:2,8x:V,aU:J,73:(g(2S){l 2R=[];l 70=[];l 1Y=2S.72();l dK=0;2l(l i=0;i<2S.b.5S.12&&2R.12<2S.b.5Q;i++){l 2J=2S.b.5S[i];l 2T=2S.b.8x?2J.4q().1T(1Y.4q()):2J.1T(1Y);5y(2T!=-1){j(2T==0&&2J.12!=1Y.12){2R.1J("<5R><71>"+2J.3A(0,1Y.12)+"</71>"+2J.3A(1Y.12)+"</5R>");1P}Z{j(1Y.12>=2S.b.aW&&2S.b.aV&&2T!=-1){j(2S.b.aU||/\\s/.3V(2J.3A(2T-1,1))){70.1J("<5R>"+2J.3A(0,2T)+"<71>"+2J.3A(2T,1Y.12)+"</71>"+2J.3A(2T+1Y.12)+"</5R>");1P}}}2T=2S.b.8x?2J.4q().1T(1Y.4q(),2T+1):2J.1T(1Y,2T+1)}}j(70.12){2R=2R.8w(70.4p(0,2S.b.5Q-2R.12))}q"<8v>"+2R.59("")+"</8v>"})},b||{})})});6V.8o=(g(aT){4Z((g(){6V.58(aT)}),1)});2i.5D=1U.1O();2i.5D.aR="#dJ";2i.5D.1d={1X:(g(8,3w,b){6.3w=3w;6.8=$(8);6.b=N.M({55:"O",4o:V,8t:"aS",3U:V,aL:"54",ax:"dI...",aP:"dH 2k dG",8t:"aS",6W:1,2I:(g(3u,8){X u.6S(8,{6R:6.b.5J})}),4n:(g(3u){dF("dE dD 5P dC dB: "+3u.8p.aB())}),36:(g(1v){q 8b.5O(1v)}),aK:V,aJ:"dA...",8k:"6Z-52",8q:"6Z-dz",aM:"6Z-1v",5J:2i.5D.aR,au:"#dy",21:14,8r:J,6T:{},8l:J},b||{});j(!6.b.5N&&6.8.1z){6.b.5N=6.8.1z+"-6Z";j($(6.b.5N)){6.b.5N=14}}j(6.b.21){6.b.21=$(6.b.21)}6.53=D.1w(6.8,"6Y-1G");j(!6.53){6.53="aQ"}6.8.dx=6.b.aP;6.5H=6.aO.26(6);6.5F=6.aw.26(6);6.5E=6.6O.26(6);G.1N(6.8,"5I",6.5H);G.1N(6.8,"5G",6.5F);G.1N(6.8,"6M",6.5E);j(6.b.21){G.1N(6.b.21,"5I",6.5H);G.1N(6.b.21,"5G",6.5F);G.1N(6.b.21,"6M",6.5E)}}),aO:(g(8u){j(6.52){q}j(6.8i){q}6.8i=V;6.at();j(6.b.21){D.1A(6.b.21)}D.1A(6.8);6.aN();6.8.1F.57(6.1v,6.8);j(!6.b.5C){6V.8o(6.2Q)}j(8u){G.2c(8u)}q J}),aN:(g(){6.1v=19.2v("1v");6.1v.1z=6.b.5N;D.3r(6.1v,6.b.aM);6.1v.dw=6.6U.1l(6);6.8g();j(6.b.6X){l br=19.2v("br");6.1v.2h(br)}j(6.b.4o){4o=19.2v("aH");4o.5M="dv";4o.O=6.b.8t;4o.3y="du";6.1v.2h(4o)}j(6.b.3U){3U=19.2v("a");3U.dt="#";3U.2h(19.6L(6.b.aL));3U.ds=6.aA.1l(6);3U.3y="dr";6.1v.2h(3U)}}),aI:(g(2w){j(!6.b.aK){q J}q 2w.2j(/<br/i)||2w.2j(/<p>/i)}),aG:(g(2w){q 2w.32(/<br>/gi,"\\n").32(/<br\\/>/gi,"\\n").32(/<\\/p>/gi,"\\n").32(/<p>/gi,"")}),8g:(g(){l 3z;j(6.b.5C){3z=6.b.aJ}Z{3z=6.aD()}l 8s=6;j(6.b.6W==1&&!6.aI(3z)){6.b.6X=J;l 39=19.2v("aH");39.8s=6;39.5M="3z";39.38=6.b.55;39.O=3z;39.E.3v=6.b.5J;39.3y="aF";l 56=6.b.56||6.b.5L||0;j(56!=0){39.56=56}j(6.b.8r){39.aE=6.6U.1l(6)}6.2Q=39}Z{6.b.6X=V;l 3x=19.2v("6X");3x.8s=6;3x.38=6.b.55;3x.O=6.aG(3z);3x.6W=6.b.6W;3x.5L=6.b.5L||40;3x.3y="aF";j(6.b.8r){3x.aE=6.6U.1l(6)}6.2Q=3x}j(6.b.5C){6.8c()}6.1v.2h(6.2Q)}),aD:(g(){q 6.8.37}),8c:(g(){D.3r(6.1v,6.b.8q);6.2Q.4e=V;X 2i.8n(6.b.5C,N.M({8m:V,2I:6.aC.1l(6)},6.b.6T))}),aC:(g(3u){D.4Q(6.1v,6.b.8q);6.2Q.4e=J;6.2Q.O=3u.8p.aB();6V.8o(6.2Q)}),aA:(g(){6.2I();6.6N();q J}),4n:(g(3u){6.b.4n(3u);j(6.4l){6.8.37=6.4l;6.4l=14}q J}),6U:(g(){l 1v=6.1v;l O=6.2Q.O;6.az();j(6.b.8l){X 2i.8n(6.3w,N.M({5K:6.b.36(1v,O),2I:6.2I.1l(6),4n:6.4n.1l(6),8m:V,8l:V},6.b.6T))}Z{X 2i.dq({6y:6.8,dp:14},6.3w,N.M({5K:6.b.36(1v,O),2I:6.2I.1l(6),4n:6.4n.1l(6)},6.b.6T))}j(Y.12>1){G.2c(Y[0])}q J}),az:(g(){6.52=V;6.8j();6.6O();6.ay()}),ay:(g(){6.4l=6.8.37;6.8.37=6.b.ax;D.3r(6.8,6.b.8k);6.8.E.3v=6.53;D.22(6.8)}),8j:(g(){j(6.1v){j(6.1v.1F){D.4m(6.1v)}6.1v=14}}),aw:(g(){j(6.52){q}6.8.E.3v=6.b.5J;j(6.t){6.t.54()}D.3r(6.8,6.b.av)}),6O:(g(){j(6.b.3v){6.8.E.3v=6.dn}D.4Q(6.8,6.b.av);j(6.52){q}6.t=X u.6S(6.8,{6R:6.b.5J,6Q:6.b.au,6P:6.53})}),6N:(g(){D.4Q(6.8,6.b.8k);6.8j();6.6O();6.8.E.3v=6.53;D.22(6.8);j(6.b.21){D.22(6.b.21)}6.8i=J;6.52=J;6.4l=14;6.as()}),2I:(g(3u){6.6N();6.b.2I.1l(6)(3u,6.8)}),at:(g(){}),as:(g(){}),al:(g(){j(6.4l){6.8.37=6.4l}6.6N();G.2g(6.8,"5I",6.5H);G.2g(6.8,"5G",6.5F);G.2g(6.8,"6M",6.5E);j(6.b.21){G.2g(6.b.21,"5I",6.5H);G.2g(6.b.21,"5G",6.5F);G.2g(6.b.21,"6M",6.5E)}})};2i.8h=1U.1O();N.M(2i.8h.1d,2i.5D.1d);N.M(2i.8h.1d,{8g:(g(){j(!6.8d){l 8e=19.2v("4k");l 8f=6.b.8f||[];l 3t;8f.1h((g(e,i){3t=19.2v("dm");3t.O=(e 4h 34)?e[0]:e;j((1t 6.b.O=="51")&&((e 4h 34)?6.8.37==e[1]:e==3t.O)){3t.4P=V}j(6.b.O==3t.O){3t.4P=V}3t.2h(19.6L((e 4h 34)?e[1]:e));8e.2h(3t)}).1l(6));6.8d=8e}6.2Q=6.8d;j(6.b.5C){6.8c()}6.1v.2h(6.2Q);6.b.36=(g(1v,O){q"O="+4j(O)})})});8b.D.ar=1U.1O();8b.D.ar.1d={1X:(g(8,27,36){6.27=27||0.5;6.8=$(8);6.36=36;6.5B=14;6.4Y=$F(6.8);G.1N(6.8,"dl",6.aq.26(6))}),aq:(g(C){j(6.4Y==$F(6.8)){q}j(6.5B){8a(6.5B)}6.5B=4Z(6.ap.1l(6),6.27*2H);6.4Y=$F(6.8)}),ap:(g(){6.5B=14;6.36(6.8,$F(6.8))})};j(!6K){l 6K={}}6K.ao=1U.1O();6K.ao.1d={1X:(g(1j,1y,b){l 2d=6;j(1j 4h 34){6.1M=1j.89((g(e){q $(e)}))}Z{6.1M=[$(1j)]}6.1y=$(1y);6.b=b||{};6.82=6.b.82||"88";6.an=6.b.an||1;6.am=35(6.b.am||"1");6.1p=6.b.1p||$R(0,1);6.O=0;6.1S=6.1M.1W((g(){q 0}));6.4f=6.b.4f?6.b.4f.1W((g(s){q $(s)})):J;6.b.6G=$(6.b.6G||14);6.b.6E=$(6.b.6E||14);6.85=6.b.85||J;6.6C=6.b.6C||6.1p.2P;6.87=6.b.87||6.1p.1D;6.83=35(6.b.83||"0");6.5A=35(6.b.5A||"0");6.84=6.ag()-6.ah();6.6z=6.3Q()?(6.1M[0].3S!=0?6.1M[0].3S:6.1M[0].E.1a.32(/1E$/,"")):(6.1M[0].4g!=0?6.1M[0].4g:6.1M[0].E.1k.32(/1E$/,""));6.24=J;6.2B=J;6.4e=J;j(6.b.4e){6.ak()}6.2F=6.b.1S?6.b.1S.ai(4T.K):J;j(6.2F){6.87=6.2F.6F();6.6C=6.2F.3s()}6.3T=6.6A.26(6);6.4X=6.4L.26(6);6.4W=6.11.26(6);6.1M.1h((g(h,i){i=2d.1M.12-1-i;2d.5u(4i((2d.b.2E 4h 34?2d.b.2E[i]:2d.b.2E)||2d.1p.1D),i);D.2G(h);G.1N(h,"4V",2d.3T)}));G.1N(6.1y,"4V",6.3T);G.1N(19,"6J",6.4X);G.1N(19,"6I",6.4W);6.6x=V}),al:(g(){l 2d=6;G.2g(6.1y,"4V",6.3T);G.2g(19,"6J",6.4X);G.2g(19,"6I",6.4W);6.1M.1h((g(h){G.2g(h,"4V",2d.3T)}))}),ak:(g(){6.4e=V}),dk:(g(){6.4e=J}),aj:(g(O){j(6.2F){j(O>=6.2F.3s()){q(6.2F.3s())}j(O<=6.2F.6F()){q(6.2F.6F())}l 2e=1s.6H(6.2F[0]-O);l 4U=6.2F[0];6.2F.1h((g(v){l 86=1s.6H(v-O);j(86<=2e){4U=v;2e=86}}));q 4U}j(O>6.1p.2P){q 6.1p.2P}j(O<6.1p.1D){q 6.1p.1D}q O}),5u:(g(2E,25){j(!6.24){6.4O=25||0;6.4N=6.1M[6.4O];6.81()}25=25||6.4O||0;j(6.6x&&6.85){j((25>0)&&(2E<6.1S[25-1])){2E=6.1S[25-1]}j((25<(6.1M.12-1))&&(2E>6.1S[25+1])){2E=6.1S[25+1]}}2E=6.aj(2E);6.1S[25]=2E;6.O=6.1S[0];6.1M[25].E[6.3Q()?"1b":"1c"]=6.4R(2E);6.af();j(!6.2B||!6.C){6.7W()}}),dj:(g(2f,25){6.5u(6.1S[25||6.4O||0]+2f,25||6.4O||0)}),4R:(g(O){q 1s.2D(((6.84-6.6z)/ (6.1p.2P - 6.1p.1D)) * (O - 6.1p.1D)) + "1E";}), 7X:(g (2e) {q ((2e /(6.84-6.6z)*(6.1p.2P-6.1p.1D))+6.1p.1D)}),6D:(g(1p){l v=6.1S.ai(4T.K);1p=1p||0;q $R(v[1p],v[1p+1])}),ah:(g(){q(6.3Q()?6.5A:6.83)}),ag:(g(){q(6.3Q()?(6.1y.3S!=0?6.1y.3S:6.1y.E.1a.32(/1E$/,""))-6.5A:(6.1y.4g!=0?6.1y.4g:6.1y.E.1k.32(/1E$/,""))-6.5A)}),3Q:(g(){q(6.82=="5z")}),af:(g(){l 2d=6;j(6.4f){$R(0,6.4f.12-1).1h((g(r){2d.6B(2d.4f[r],2d.6D(r))}))}j(6.b.6G){6.6B(6.b.6G,$R(0,6.1S.12>1?6.6D(0).6F():6.O))}j(6.b.6E){6.6B(6.b.6E,$R(6.1S.12>1?6.6D(6.4f.12-1).3s():6.O,6.6C))}}),6B:(g(4S,1p){j(6.3Q()){4S.E.1b=6.4R(1p.1D);4S.E.1a=6.4R(1p.2P-1p.1D+6.1p.1D)}Z{4S.E.1c=6.4R(1p.1D);4S.E.1k=6.4R(1p.2P-1p.1D+6.1p.1D)}}),81:(g(){6.1M.1h((g(h){D.4Q(h,"4P")}));D.3r(6.4N,"4P")}),6A:(g(C){j(G.ae(C)){j(!6.4e){6.24=V;l 1j=G.8(C);l 1n=[G.5w(C),G.5v(C)];l 1y=1j;j(1y==6.1y){l 1H=1o.3R(6.1y);6.C=C;6.5u(6.7X((6.3Q()?1n[1]-1H[1]:1n[0]-1H[0])-(6.6z/2)));l 1H=1o.3R(6.4N);6.7Z=(1n[0]-1H[0]);6.7Y=(1n[1]-1H[1])}Z{5y((6.1M.1T(1j)==-1)&&1j.1F){1j=1j.1F}j(6.1M.1T(1j)!=-1){6.4N=1j;6.4O=6.1M.1T(6.4N);6.81();l 1H=1o.3R(6.4N);6.7Z=(1n[0]-1H[0]);6.7Y=(1n[1]-1H[1])}}}G.2c(C)}}),11:(g(C){j(6.24){j(!6.2B){6.2B=V}6.5x(C);j(2C.4d.1T("4M")>0){1u.80(0,0)}G.2c(C)}}),5x:(g(C){l 1n=[G.5w(C),G.5v(C)];l 1H=1o.3R(6.1y);1n[0]-=6.7Z+1H[0];1n[1]-=6.7Y+1H[1];6.C=C;6.5u(6.7X(6.3Q()?1n[1]:1n[0]));j(6.6x&&6.b.ad){6.b.ad(6.1S.12>1?6.1S:6.O,6)}}),4L:(g(C){j(6.24&&6.2B){6.5t(C,V);G.2c(C)}6.24=J;6.2B=J}),5t:(g(C,6y){6.24=J;6.2B=J;6.7W()}),7W:(g(){j(6.6x&&6.b.3q){6.b.3q(6.1S.12>1?6.1S:6.O,6)}6.C=14})};',62,1082,'||||||this||element|||options|||||function|||if||var|||||return|||effect|Effect||||||||event|Element|style||Event|||false|||extend|Object|value|||||||true||new|arguments|else||update|length|position|null|||Sortable|pos|document|height|top|left|prototype|index|setStyle|scroll|each|dims|handle|width|bind|drop|pointer|Position|range|effects|Draggables|Math|typeof|window|form|getStyle|dropon|track|id|hide|children|afterFinishInternal|start|px|parentNode|color|offsets|duration|push|case|node|handles|observe|create|break|child|transform|values|indexOf|Class|overlap|map|initialize|entry|opacity||externalControl|show|down|active|handleIdx|bindAsEventListener|delay|scrollSpeed|eventName|oldStyle|transition|stop|slider|offset|delta|stopObserving|appendChild|Ajax|match|to|for|Base|only|tree|Move|draggable|sync|moveY|moveX|elementName|createElement|string|speed|from|queue|Scale|dragging|navigator|round|sliderValue|allowedValues|makePositioned|1000|onComplete|elem|Droppables|containment|scrollSensitivity|property|restoreAfterFinish|end|editField|ret|instance|foundPos|elements|tagName|Opacity|last_active|drops|opera|bottom|Transitions|replace||Array|parseInt|callback|innerHTML|name|textField|render|observer|throw|item|hoverclass|documentElement|_lastScrollPointer|scope|activeDraggable|fontSize|unit|originalValue|scaleContent|scaleX|pulses|100|onChange|addClassName|max|optionTag|transport|backgroundColor|url|textArea|className|text|substr|Autocompleter|entryCount|flatten|tag|_marker|revert|snap|point|getInlineOpacity|undoClipping|makeClipping|undoPositioned|scaleMode|Builder|table|isVertical|cumulativeOffset|offsetHeight|eventMouseDown|cancelLink|test|lastTokenPos|onHover|childNodes|iefix||none|toUpperCase|format|parent|body|ghosting|droponOptions|oldParentNode|Draggable|parseColor|startOn|finishOn|appVersion|disabled|spans|offsetWidth|instanceof|parseFloat|encodeURIComponent|select|oldInnerHTML|remove|onFailure|okButton|slice|toLowerCase|tokens|getEntry|absolute|clientHeight|options_for_draggable|zindex|endeffect|reverteffect|constraint|scrollTop|tracks|Parallel|setup|sinoidal|beforeSetup|scaleFrom|initialMoveY|initialMoveX|finish|timestamp|endDrag|AppleWebKit|activeHandle|activeHandleIdx|selected|removeClassName|translateToPx|span|Prototype|newValue|mousedown|eventMouseMove|eventMouseUp|lastValue|setTimeout||undefined|saving|originalBackground|cancel|paramName|size|insertBefore|activate|join|hasFocus|findElements|add|starteffect|scrollLeft|_lastPointer|tag_name|getOpacity|observers|drags|object|_elementDoesNotExistError|oldOpacity|elementDimensions|state|timePos|queueName|attrs|parentElement|finishDrag|setValue|pointerY|pointerX|draw|while|vertical|alignY|timer|loadTextURL|InPlaceEditor|mouseoutListener|mouseoverListener|mouseover|onclickListener|click|highlightcolor|parameters|cols|type|formId|serialize|with|choices|li|array|changed|cleanWhitespace|selectedElement|keyCode|display|zIndex|userAgent||MSIE|js|offsetSize|isParent|sortableOptions||treeTag|sortables|droppables|notify|prepare|deactivate|_dragging|reject|_timeout|inspect|accept|_containers|div|in|right|data|targetValue|cssText|cssRules|styleSheet|scaleY|originalLeft|originalTop|fontSizeType|interval|attribute|initialized|success|handleLength|startDrag|setSpan|maximum|getRange|endSpan|min|startSpan|abs|mousemove|mouseup|Control|createTextNode|mouseout|leaveEditMode|leaveHover|restorecolor|endcolor|startcolor|Highlight|ajaxOptions|onSubmit|Field|rows|textarea|background|inplaceeditor|partial|strong|getToken|selector|getUpdatedChoices||selectEntry|autocompleteIndex|firstChild|collectTextNodesIgnoreClass|collectTextNodes|updateElement|default|switch|indicator|Appear|findChildren|nodeMap|container|sortable|visibility|destroy|_|_getWindowScroll|change|Date|scrollInterval|currentDelta|keyPress|_clone|updateDrag|_opacity|affected|containmentNode|deepest|setOpacity|Morph|styleRules|components|moveTransition|scaleTransition|opacityTransition|center|direction|getDimensions|originalWidth|originalHeight|oldInnerBottom|scaleFromCenter|currentScale|percent|global|get|Queues|loop|instances|_isStringOrNumber|attr|updateFinished|translateToValue|offsetY|offsetX|scrollBy|updateStyles|axis|alignX|trackLength|restricted|currentOffset|minimum|horizontal|collect|clearTimeout|Form|loadExternalText|cached_selectTag|selectTag|collection|createEditField|InPlaceCollectionEditor|editing|removeForm|savingClassName|evalScripts|asynchronous|Request|scrollFreeActivate|responseText|loadingClassName|submitOnBlur|obj|okText|evt|ul|concat|ignoreCase|setOptions|updateChoices|baseInitialize|defaultParams|thisTokenPos|findLastToken|tokenPos|minChars|stopIndicator|focus|whitespace|nodes|LI|frequency|onHide|src|onShow|keypress|Fade|library|us|aculo|script|including|requires|grandchildren|recursive|include|detect|hasChildNodes|ident|_tree|clientWidth|getElementsByTagName|mark|nextElement|hidden|SortableObserver|treeNode|options_for_tree|draggables|emptyFunction|onEnd|onStart|innerHeight|_isScrollChild|onDrag|scrollTo|current|lastScrolled|stopScrolling|originalScrollTop|originalScrollLeft|deltaY|deltaX|where|OPTION|defaults|afterFinish|top_offset|left_offset|_cacheObserverCallbacks|eventKeypress|isAffected|charAt|forceRerendering|parseStyle|String|ids|toColorPart|transforms|zoom|pair|rule|reverse|reverser|0px|box|afterSetup|scrollStart|_base|leftd|topd|originalStyle|idle|frame|currentFrame|ScopedQueue|limit|PI|cos|PAIRS|character|tagifyStyle|nodeValue|nodeType|catch|try|param|_text|_children|attributes|ATTR_MAP|onSlide|isLeftClick|drawSpans|maximumOffset|minimumOffset|sortBy|getNearestValue|setDisabled|dispose|step|increment|Slider|onTimerEvent|delayedListener|DelayedObserver|onLeaveEditMode|onEnterEditMode|highlightendcolor|hoverClassName|enterHover|savingText|showSaving|onLoading|onclickCancel|stripTags|onLoadedExternalText|getText|onblur|editor_field|convertHTMLLineBreaks|input|hasHTMLLineBreaks|loadingText|handleLineBreaks|cancelText|formClassName|createForm|enterEditMode|clickToEditText|transparent|defaultHighlightColor|ok|field|fullSearch|partialSearch|partialChars|Local|request|startIndicator|onObserverEvent|onClick|addObservers|afterUpdateElement|getCurrentEntry|scrollIntoView|markNext|markPrevious|onBlur|findElement|KEY_RETURN|KEY_TAB|KEY_ESC|onKeyPress|clone|fixIEOverlapping|_iefix|iframe|offsetTop|classNames|sequence|_constructIndex|delete|new_sequence|removeChild|root|after||dropmarker|DIV|unmark|onEmptyHover|findTreeElements|onUpdate|addObserver|options_for_droppable|dropOnEmpty|SERIALIZE_RULE|invoke|removeObserver|_findRootElement|BODY|innerWidth|setInterval|startScrolling|clearInterval|reset|originalZ|fire|absolutize|TEXTAREA|BUTTON|SELECT|INPUT|initDrag|unregister|register|_draggable|toOpacity|number|dur|Count|onDrop|within|findDeepestChild|isContained|effect_class|camelize|Methods|morph|setContentZoom|CSS_PROPERTIES|pt|CSS_LENGTH|first|addTracks|Transform|inject|isNaN|hasLayout|currentStyle|zzzzzz|ffffff|rules||pulse|beforeStartInternal|full|afterUpdateInternal|SlideUp|SlideDown|05|flicker|BlindDown|BlindUp|scrollHeight|ScrollTo|_delta|backgroundImage|elementPositioning|setDimensions|factor|scaleTo|toTop|toLeft|mode|relative|beforeFinish|Internal|running|fps|DefaultOptions|len|getTime|pluck|iterator|_each|floor|appear|masterDelay|tagifyText|args|apply|split|tags|TR|THEAD|TH|TFOOT|TD|TBODY|PARAM|OPTGROUP|LEGEND|COLGROUP|COL|CAPTION|AREA|html|_attributes|class|parentTag|NODEMAP|setValueBy|setEnabled|keyup|option|oldBackground||failure|Updater|editor_cancel|onclick|href|editor_ok_button|submit|onsubmit|title|FFFFFF|loading|Loading|server|the|communicating|Error|alert|edit|Click|Saving|FFFF99|count|lastIndexOf|autoSelect|informal|getElementsByClassName|250|KEY_DOWN|KEY_UP|KEY_RIGHT|KEY_LEFT|setTop|no|scrolling|frameborder|javascript|Alpha|Microsoft|DXImageTransform|progid|filter|After|Insertion|Opera|blur|off|autocomplete|setAttribute|setHeight|controls|Width|Height|callee|setSequence|continue|nextSibling|previousSibling|before|z0||Za|realOffset|relativize|page|cloneNode|childOf|outerHTML|02|sqrt|constructor||greedy|dragdrop|addMethods|substring|gsub|visualEffect|pc|mm|wordSpacing|textIndent|paddingTop|paddingRight|paddingLeft|paddingBottom|outlineWidth|outlineOffset|outlineColor|minWidth|minHeight|maxWidth|maxHeight|markerOffset|marginTop|marginRight|marginLeft|marginBottom|lineHeight|letterSpacing|fontWeight|clip|borderTopWidth|borderTopStyle|borderTopColor|borderSpacing|borderRightWidth|borderRightStyle|borderRightColor|borderLeftWidth|borderLeftStyle|borderLeftColor|borderBottomWidth|borderBottomStyle|borderBottomColor|backgroundPosition|play|keys|dasherize|underscore|rgba|selectorText|styleSheets|Fold|Pulsate|Shrink|01|Grow|Squish|Shake|DropOut|SwitchOff|beforeSetupInternal|200|Puff|image|keepBackgroundImage|ffff99|scrollWidth|content|font|offsetLeft|MoveBy|finished|afterUpdate|beforeUpdate|beforeStart|parallel|Queue|last|findAll|front|Enumerable|wobble|random|linear|Effect2|visible|toggle|blind|slide|multiple|160|fromCharCode|toArray|builder|operate|required|is|but|exist|not|does|DOM|specified|The|message|ElementDoesNotExistError|call|hasClassName||rgb|VAR|UL|TT|TITLE|TABLE|SUP|SUB|STYLE|STRONG|STRIKE|SPAN|SMALL|SCRIPT|SAMP|PRE|OL|OBJECT|NOSCRIPT|NOFRAMES|META|MENU|MAP|LINK|LABEL|KBD|ISINDEX|INS|IMG|IFRAME|HTML|HR|HEAD|H6|H5|H4|H3|H2|H1|FRAMESET|FRAME|FORM|FONT|FIELDSET|EM|DT|DL|DIR|DFN|DEL|DD|CODE|CITE|CENTER|BR|BLOCKQUOTE|BIG|BDO|BASEFONT|BASE|APPLET|ADDRESS|ACRONYM|ABBR|dump|strip|build|escapeHTML|toString|htmlFor|fieldset'.split('|'),0,{}))



/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* (Version 1.5.4.1 (2007-01-05) - original version)
* Version 1.5.4.1unic2
* 
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* 
*/

/*
 * @changelog 1.5.4.1unic1/AlR	Added support for error messages in label element.
 * @changelog 1.5.4.1unic2/AlR	Bugfix: Error messages in label are now properly removed if validated.
 */
var Validator = Class.create();

Validator.prototype = {
	initialize : function(className, error, test, options) {
		if(typeof test == 'function'){
			this.options = $H(options);
			this._test = test;
		} else {
			this.options = $H(test);
			this._test = function(){return true};
		}
		this.error = error || 'Validation failed.';
		this.className = className;
	},
	test : function(v, elm) {
		return (this._test(v,elm) && this.options.all(function(p){
			return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
		}));
	}
}
Validator.methods = {
	pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
	minLength : function(v,elm,opt) {return v.length >= opt},
	maxLength : function(v,elm,opt) {return v.length <= opt},
	min : function(v,elm,opt) {return v >= parseFloat(opt)}, 
	max : function(v,elm,opt) {return v <= parseFloat(opt)},
	notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
		return v != value;
	})},
	oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
		return v == value;
	})},
	is : function(v,elm,opt) {return v == opt},
	isNot : function(v,elm,opt) {return v != opt},
	equalToField : function(v,elm,opt) {return v == $F(opt)},
	notEqualToField : function(v,elm,opt) {return v != $F(opt)},
	include : function(v,elm,opt) {return $A(opt).all(function(value) {
		return Validation.get(value).test(v,elm);
	})}
}

var Validation = Class.create();

Validation.prototype = {
	initialize : function(form, options){
		this.options = Object.extend({
			onSubmit : true,
			stopOnFirst : false,
			immediate : false,
			focusOnError : true,
			useTitles : false,
			onFormValidate : function(result, form) {},
			onElementValidate : function(result, elm) {}
		}, options || {});
		this.form = $(form);
		if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		if(this.options.immediate) {
			var useTitles = this.options.useTitles;
			var callback = this.options.onElementValidate;
			Form.getElements(this.form).each(function(input) { // Thanks Mike!
				Event.observe(input, 'blur', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback}); });
			});
		}
	},
	onSubmit :  function(ev){
		if(!this.validate()) Event.stop(ev);
	},
	validate : function() {
		var result = false;
		var useTitles = this.options.useTitles;
		var callback = this.options.onElementValidate;
		if(this.options.stopOnFirst) {
			result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); });
		} else {
			result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all();
		}
		if(!result && this.options.focusOnError) {
			Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
		}
		this.options.onFormValidate(result, this.form);
		return result;
	},
	reset : function() {
		Form.getElements(this.form).each(Validation.reset);
	}
}

Object.extend(Validation, {
	validate : function(elm, options){
		options = Object.extend({
			useTitle : false,
			onElementValidate : function(result, elm) {}
		}, options || {});
		elm = $(elm);
		var cn = elm.classNames();
		return result = cn.all(function(value) {
			var test = Validation.test(value,elm,options.useTitle);
			options.onElementValidate(test, elm);
			return test;
		});
	},
	test : function(name, elm, useTitle) {
		var v = Validation.get(name);
		var prop = '__advice'+name.camelize();
		try {
		if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
			if(!elm[prop]) {
				var advice = Validation.getAdvice(name, elm);
				if(advice == null) {
					var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
					advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'
					switch (elm.type.toLowerCase()) {
						case 'checkbox':
						case 'radio':
							var p = elm.parentNode;
							if(p) {
								new Insertion.Bottom(p, advice);
							} else {
								new Insertion.After(elm, advice);
							}
							break;
						default:
							new Insertion.After(elm, advice);
				    }
					advice = Validation.getAdvice(name, elm);
					
					/* validation advice into label*/
					var labels = document.getElementsByTagName('label');
					var idOrName = (elm? elm.getAttribute('id') : name);
					
					for (var i = 0; i < labels.length; ++i){
						var currentNode = labels[i];
						if (currentNode.getAttributeNode('for').nodeValue == idOrName){
							var errorMessageLabel = '<span class="validation-advice-hidden">' + errorMsg + '</span>';
							currentNode.innerHTML += errorMessageLabel;
							break;
						}
					}
					
					
				}
				if(typeof Effect == 'undefined') {
					advice.style.display = 'block';
				} else {
					new Effect.Appear(advice, {duration : 1 });
				}
			}
			elm[prop] = true;
			elm.removeClassName('validation-passed');
			elm.addClassName('validation-failed');
			
			return false;
		} else {
			var advice = Validation.getAdvice(name, elm);
			if(advice != null) advice.hide();
			
			/* remove validation advice from label */
			var labels = document.getElementsByTagName('label');
			var idOrName = (elm? elm.getAttribute('id') : name);
			
			for (var i = 0; i < labels.length; ++i){
				var currentNode = labels[i];
				if (currentNode.getAttributeNode('for').nodeValue == idOrName){
					var childNodes = currentNode.childNodes;
					if (childNodes){
						for (var j = 0; j < childNodes.length; ++j){
							//alert(childNodes[j].nodeName);
							if (childNodes[j].nodeName.toLowerCase() == 'span'){
								currentNode.removeChild(childNodes[j]);
								break;
							}
						}
					}
					//alert(currentNode.innerHTML);
					break;
				}
			}
			
			elm[prop] = '';
			elm.removeClassName('validation-failed');
			elm.addClassName('validation-passed');
			return true;
		}
		} catch(e) {
			throw(e)
		}
	},
	isVisible : function(elm) {
		while(elm.tagName != 'BODY') {
			if(!$(elm).visible()) return false;
			elm = elm.parentNode;
		}
		return true;
	},
	getAdvice : function(name, elm) {
		return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
	},
	getElmID : function(elm) {
		return elm.id ? elm.id : elm.name;
	},
	reset : function(elm) {
		elm = $(elm);
		var cn = elm.classNames();
		cn.each(function(value) {
			var prop = '__advice'+value.camelize();
			if(elm[prop]) {
				var advice = Validation.getAdvice(value, elm);
				advice.hide();
				elm[prop] = '';
			}
			elm.removeClassName('validation-failed');
			elm.removeClassName('validation-passed');
		});
	},
	add : function(className, error, test, options) {
		var nv = {};
		nv[className] = new Validator(className, error, test, options);
		Object.extend(Validation.methods, nv);
	},
	addAllThese : function(validators) {
		var nv = {};
		$A(validators).each(function(value) {
				nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
			});
		Object.extend(Validation.methods, nv);
	},
	get : function(name) {
		return  Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
	},
	methods : {
		'_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
	}
});



var sRequired = "This is a required field.";
var sValidateNumber = "Please enter a valid number in this field.";
var sValidateDigits = "Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.";
var sValidateAlpha = "Please use letters only (a-z) in this field.";
var sValidateAlphanum = "Please use only letters (a-z) or numbers (0-9) only in this field. No spaces or other characters are allowed.";
var sValidateDate = "Please enter a valid date.";
var sValidateTime = "Please enter a valid time.";
var sValidatePhone = "Please enter a valid phone number.";
var sValidateEmail = "Please enter a valid email address. For example fred@domain.com .";
var sValidateUrl = "Please enter a valid URL.";
var sValidateDateAu = "Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.";
var sValidateCurrencyDollar = "Please enter a valid $ amount. For example $100.00 .";
var sValidateSelection = "Please make a selection";
var sValidateOneRequired = "Please select one of the above options.";
var sValidatePasswordConfirm = "Your confirmation password does not match your first password.";

/*
 * Really easy field validation with Prototype
 * http://tetlaw.id.au/view/javascript/really-easy-field-validation
 * Andrew Tetlaw
 * (Original Version 1.5.4.1 (2007-01-05))
 * @version 1.5.4.1unic1
 * 
 * @changelog 1.5.4.1unic1/AlR:		validate-one-required: added check for serverside functioning.
 *									and clientside validation by name instead of by parent element.<br/>
 *									validate-selection: added check for serverside functioning.
 *
 * Copyright (c) 2007 Andrew Tetlaw
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 * 
 */

Validation.add('IsEmpty', '', function(v) {
				return  ((v == null) || (v.length == 0)); // || /^\s+$/.test(v));
			});

Validation.addAllThese([
	['required', sRequired, function(v) {
				return !Validation.get('IsEmpty').test(v);
			}],
	['validate-number', sValidateNumber, function(v) {
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
			}],
	['validate-digits', sValidateDigits, function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
			}],
	['validate-alpha', sValidateAlpha, function (v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
			}],
	['validate-alphanum', sValidateAlphanum, function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/\W/.test(v)
			}],
	['validate-date', sValidateDate, function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex_slash = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				var regex_dot = /^(\d{2})\.(\d{2})\.(\d{4})$/;
				var regex_dash = /^(\d{2})\-(\d{2})\-(\d{4})$/;
				if(!regex_slash.test(v) && !regex_dot.test(v) && !regex_dash.test(v)) return false;
				var d;
				if(v.indexOf("/") > -1) {
					
					d = new Date(v.replace(regex_slash, '$2/$1/$3'));
				}
				else if(v.indexOf(".") > -1) {
					
					d = new Date(v.replace(regex_dot, '$2/$1/$3'));
				}
				else if(v.indexOf("-") > -1) {
					
					d = new Date(v.replace(regex_dash, '$2/$1/$3'));
				}
				return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && 
							(parseInt(RegExp.$1, 10) == d.getDate()) && 
							(parseInt(RegExp.$3, 10) == d.getFullYear() );
			}],
	['validate-time', sValidateTime, function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex_double = /^(\d{2})\:(\d{2})$/;
				var regex_dot = /^(\d{2})\.(\d{2})$/;
				var regex_dash = /^(\d{2})\-(\d{2})$/;
				if(!regex_double.test(v) && !regex_dot.test(v) && !regex_dash.test(v)) return false;
				var d;
				if(v.indexOf(":") > -1) {
					
					d = new Date(v.replace(regex_double, '01/01/1970 $1:$2'));
				}
				else if(v.indexOf(".") > -1) {
					
					d = new Date(v.replace(regex_dot, '01/01/1970 $1:$2'));
				}
				else if(v.indexOf("-") > -1) {
					
					d = new Date(v.replace(regex_dash, '01/01/1970 $1:$2'));
				}
				return ( ( parseInt(RegExp.$2, 10) == (d.getMinutes()) ) && 
							(parseInt(RegExp.$1, 10) == d.getHours()) );
			}],
	['validate-phone', sValidatePhone, function (v) {
				return Validation.get('IsEmpty').test(v) || /(0|\+){1}(\d|\ |\-|\(|\)){1,}(\d|\ ){1}$/.test(v)
			}],
	['validate-email', sValidateEmail, function (v) {
                return Validation.get('IsEmpty').test(v) || /^[\w\.\-\_]{1,}[@][\w\.\-\_]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
            }],
	['validate-url', sValidateUrl, function (v) {
				return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
			}],
	['validate-date-au', sValidateDateAu, function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(v)) return false;
				var d = new Date(v.replace(regex, '$2/$1/$3'));
				return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && 
							(parseInt(RegExp.$1, 10) == d.getDate()) && 
							(parseInt(RegExp.$3, 10) == d.getFullYear() );
			}],
	['validate-currency-dollar', sValidateCurrencyDollar, function(v) {
				// [$]1[##][,###]+[.##]
				// [$]1###+[.##]
				// [$]0.##
				// [$].##
				return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
			}],
			
	/* dropdownlists */
	['validate-selection', sValidateSelection, function(v,elm){
				/* clientside javascript */
				if (elm){
					return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
				}
				/* serverside ll script */
				else{
					return !Validation.get('IsEmpty').test(v);
				}
			}],
	
	/* checkboxes, radiobuttons */
	['validate-one-required', sValidateOneRequired, function (v,elm) {
				/* clientside javascript */
				if(elm){
					var sName = elm.getAttribute('name');
					var options = document.getElementsByName(sName);
					return $A(options).any(function(elm) {
						return $F(elm);
					});
				}
				/* serverside ll script */
				else{
					return !Validation.get('IsEmpty').test(v);
				}
			}]
			
			
	/* custom */
	// ...
]);
var oDefaultValues = new Object();

var Rules = { 
  	rules: "1.0",
   
	'a.popup:click': function(element, event) {
		var sHref = getHref(element);
		window.open(sHref, "popup", 'height=500,width=550,toolbar=no,status=no,resizable=yes,scrollbars=yes');
		Event.stop(event);
	},
	
	'a.print:click': function(element, event) {
		window.print();
		Event.stop(event);
	},
		
	'a.dcs:click' : function(element, event) {
		
		var title = element.getAttribute('title') || '';
		var href = element.getAttribute('href');
		
		//alert("dcsMultiTrack(): " + href + ", " + title);
		
		if( href && dcsMultiTrack) {
			dcsMultiTrack('DCS.dcsuri', href, 'WT.ti', title);
		}
	},
	
	'a.back:click': function(element, event) {
		history.back();		
		Event.stop(event);
	},

	'a.delete:click': function(element, event) {
		if (!confirmDelete()) {
			Event.stop(event);
		}
	},
		
	'.hideonloaded:loaded' : function(element, event) {
		element.hide();
	},
	
	'a.showhidehreftarget:click' : function(element, event) {
		var oMyElement = element;

		if(element.tagName.toLowerCase() == 'img' && element.parentNode.tagName.toLowerCase() == 'a'){
			oMyElement = element.parentNode;
		}

		var href = oMyElement.getAttribute('href');
		var iContentId = href.match(/#(\w.+)/)[1];
		var oContentElement = $(iContentId);
		if(oContentElement.style.display == 'none') {
			oContentElement.style.display = 'block';
		} else {
			oContentElement.style.display = 'none';
		}
		Event.stop(event);
	},
	
	'input.replace-value:focus' : function(element, event) {

		if (!oDefaultValues[element.id]) {
		
			oDefaultValues[element.id] = element.value;
		}
		if (element.value == oDefaultValues[element.id]) {
		
			element.value = "";
		}
	},

	'input.replace-value:blur' : function(element, event) {

		if (element.value == "") {
		
			element.value = oDefaultValues[element.id];
		}
	},
	
	'a.small:click': function(element, event) {
		changeTextSize(element, 'small');
		Event.stop(event);
	},
	
	'a.normal:click': function(element, event) {
		changeTextSize(element, 'normal');
		Event.stop(event);
	},
	
	'a.large:click': function(element, event) {
		changeTextSize(element, 'large');
		Event.stop(event);
	},
	
	'a.yellow:click': function(element, event) {
		changeColorSheme(element, 'yellow');
		Event.stop(event);
	},
	
	'a.color:click': function(element, event) {
		changeColorSheme(element, 'color');
		Event.stop(event);
	},
	
	'a.red:click': function(element, event) {
		changeColorSheme(element, 'red');
		Event.stop(event);
	},
	
	'a.white:click': function(element, event) {
		changeColorSheme(element, 'white');
		Event.stop(event);
	},
	
	'a.blue:click': function(element, event) {
		changeColorSheme(element, 'blue');
		Event.stop(event);
	},
	'ul.alphabet li a:click': function(element, event) {
		updateGlossaryList(element);
		Event.stop(event);
	},
	'#glossarylang:change': function(element, event) {
		updateGlossaryList(element);
		Event.stop(event);
	}
};



// Fallback / Debug
if(!dcsMultiTrack) {
	var dcsMultiTrack = function(v1, href, v2, title) {
		//alert("dcsMultiTrack(): " + href + ", " + title);
	}
}

// Get the href of the element (recursive)
function getHref(element) {
    var sHref="";      
	while (element) {
	    if (element.tagName.toLowerCase() == 'a' && element.href) {
			sHref = element.href;
			break;
	    }
	    else {
	    	element = element.parentNode;
	    }
	}
    return sHref;
}

function confirmDelete() {
	if (!confirm("Wollen Sie den Datensatz wirklich loeschen?\r\nACHTUNG: Alle referenzierten Inhalte werden unwiderruflich entfernt!")) {
		return false;
	} else {
		return true;
	}
}

function focusFirstFormField() {

	var oForm = $("col3").getElementsByTagName("FORM")[0];

	// if id of forms has a prefix of "_nofocus" don't set the focus
	if(oForm && oForm.id.lastIndexOf("_nofocus") == -1) {
		
		for (var iElementCount = 0; iElementCount < oForm.elements.length; ++iElementCount) {

			var oCurrentElem = oForm.elements[iElementCount];
			if (((((oCurrentElem.nodeName == "INPUT") && ((oCurrentElem.type == "text") || (oCurrentElem.type == "password") || (oCurrentElem.type == "radio") || (oCurrentElem.type == "checkbox"))) || (oCurrentElem.nodeName == "TEXTAREA")) && 
				(oCurrentElem.value == "")) || oCurrentElem.nodeName == "SELECT") {
			
				oCurrentElem.focus();
				break;
			}
		}
	}	
}

function changeTextSize(element, sClassName) {
	
	var sName = "fontsize";
	var sPath = "/";
	var sDomain = "www.bankzweiplus.ch";
	
	//clean up first
	if($(document.body).hasClassName('small')) {
		$(document.body).removeClassName('small');
	}
	if($(document.body).hasClassName('large')) {
		$(document.body).removeClassName('large');
	}
	
	setCookie (sName, sClassName, 360, sPath, sDomain);
	$(document.body).addClassName(sClassName);

}

function changeColorSheme(element, sClassName) {
	
	var sName = "color";
	var sPath = "/";
	var sDomain = "www.bankzweiplus.ch";
	
	//clean up first
	if($(document.body).hasClassName('yellow')) {
		$(document.body).removeClassName('yellow');
	}
	if($(document.body).hasClassName('red')) {
		$(document.body).removeClassName('red');
	}
	if($(document.body).hasClassName('white')) {
		$(document.body).removeClassName('white');
	}
	if($(document.body).hasClassName('blue')) {
		$(document.body).removeClassName('blue');
	}
	
	setCookie (sName, sClassName, 360, sPath, sDomain);
	$(document.body).addClassName(sClassName);

}


// bakes a cookie
function setCookie (sName, sValue, iExpires, sPath, sDomain, bSecure ) {
	
	// set time in milliseconds
	var dtToday = new Date();
	dtToday.setTime (dtToday.getTime());
	
	if (iExpires) {	
		iExpires = iExpires * 1000 * 60 * 60 * 24;
	}
	
	var dtExpiresDate = new Date (dtToday.getTime() + (iExpires));
	var sUrl = "http://www.bankzweiplus.ch//internet/bziech"+"/cookiesetter";
	var sPars = "cookiedata=" + sName + ";" + sValue + ";" + sPath + ";" + dtExpiresDate.toGMTString() + ";false";
	
	new Ajax.Request(sUrl, {
  		method: 'post',
		parameters: sPars,
  		onSuccess: function(transport) {
  		}
	});
	
	document.cookie = sName+'=' + sValue + ';path=/';
}

// gets the cookie, if it exists
function getCookie(sName) {
	
	var cookie = document.cookie.match(new RegExp('(^|;)\s*' + escape(sName) + '=([^;\s]*)'));
   
	return (cookie ? unescape(cookie[2]) : null);
}

// deletes a cookie
function deleteCookie (sName, sPath, sDomain) {
	
	var sUrl = "http://www.bankzweiplus.ch/internet/bziech/cookiesetter";
	var sPars = "cookiedata=" + sName + ";-;" + sPath + ";-;true";
		
	new Ajax.Request(sUrl, {
		method: 'post',
		parameters: sPars,
		onSuccess: function(transport) {
		}
	});
	
	document.cookie = name + '=-' + '; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/';
}

// sarasin specific 
function hasCookieSupport() 
{
	if(getCookie('SARA_SESS') || getCookie('SARA_SESS-S')) 
	{
		return true;
	}
	return false;
}

function get_cookie(name) {
	var dcookie = document.cookie;
	var cname = name + "=";
	var clen = dcookie.length;
	var cbegin = 0;
	while (cbegin < clen) {
		var vbegin = cbegin + cname.length;
		if (dcookie.substring(cbegin, vbegin) == cname) {
			var vend = dcookie.indexOf (";", vbegin);
			if (vend == -1) vend = clen;
			return unescape(dcookie.substring(vbegin, vend));
		}
		cbegin = dcookie.indexOf(" ", cbegin) + 1;
		if (cbegin == 0) break;
	}
	return null;
} 

function openWindow (address,w,h) {
  x = screen.availWidth/2-w/2;
  y = screen.availHeight/2-h/2;	
  myWindow = window.open(address,'','width='+w+',height='+h+',left='+x+',top='+y+',screenX='+x+',screenY='+y);
  myWindow.focus();
}

Event.observe(window, 'load', function() { 
        
	var sClassName = get_cookie('fontsize');
	if(sClassName && sClassName!="" && sClassName!='-') {
		$('body').addClassName(sClassName);
	}
	
	sClassName = null;
	sClassName = get_cookie('color');
 	if(sClassName && sClassName!="" && sClassName!='-') {
		$('body').addClassName(sClassName);
	}
});
