/*  Prototype JavaScript framework, version 1.6.0.3
 *  (c) 2005-2008 Sam Stephenson
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://www.prototypejs.org/
 *
 *--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.6.0.3',

  Browser: {
    IE:     !!(window.attachEvent &&
      navigator.userAgent.indexOf('Opera') === -1),
    Opera:  navigator.userAgent.indexOf('Opera') > -1,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 &&
      navigator.userAgent.indexOf('KHTML') === -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    SelectorsAPI: !!document.querySelector,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      document.createElement('div')['__proto__'] &&
      document.createElement('div')['__proto__'] !==
        document.createElement('form')['__proto__']
  },

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
};

if (Prototype.Browser.MobileSafari)
  Prototype.BrowserFeatures.SpecificElementExtensions = false;


/* Based on Alex Arnell's inheritance implementation. */
var Class = {
  create: function() {
    var parent = null, properties = $A(arguments);
    if (Object.isFunction(properties[0]))
      parent = properties.shift();

    function klass() {
      this.initialize.apply(this, arguments);
    }

    Object.extend(klass, Class.Methods);
    klass.superclass = parent;
    klass.subclasses = [];

    if (parent) {
      var subclass = function() { };
      subclass.prototype = parent.prototype;
      klass.prototype = new subclass;
      parent.subclasses.push(klass);
    }

    for (var i = 0; i < properties.length; i++)
      klass.addMethods(properties[i]);

    if (!klass.prototype.initialize)
      klass.prototype.initialize = Prototype.emptyFunction;

    klass.prototype.constructor = klass;

    return klass;
  }
};

Class.Methods = {
  addMethods: function(source) {
    var ancestor   = this.superclass && this.superclass.prototype;
    var properties = Object.keys(source);

    if (!Object.keys({ toString: true }).length)
      properties.push("toString", "valueOf");

    for (var i = 0, length = properties.length; i < length; i++) {
      var property = properties[i], value = source[property];
      if (ancestor && Object.isFunction(value) &&
          value.argumentNames().first() == "$super") {
        var method = value;
        value = (function(m) {
          return function() { return ancestor[m].apply(this, arguments) };
        })(property).wrap(method);

        value.valueOf = method.valueOf.bind(method);
        value.toString = method.toString.bind(method);
      }
      this.prototype[property] = value;
    }

    return this;
  }
};

var Abstract = { };

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.isUndefined(object)) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : String(object);
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch (type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }

    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (Object.isElement(object)) return;

    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (!Object.isUndefined(value))
        results.push(property.toJSON() + ': ' + value);
    }

    return '{' + results.join(', ') + '}';
  },

  toQueryString: function(object) {
    return $H(object).toQueryString();
  },

  toHTML: function(object) {
    return object && object.toHTML ? object.toHTML() : String.interpret(object);
  },

  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);
  },

  isElement: function(object) {
    return !!(object && object.nodeType == 1);
  },

  isArray: function(object) {
    return object != null && typeof object == "object" &&
      'splice' in object && 'join' in object;
  },

  isHash: function(object) {
    return object instanceof Hash;
  },

  isFunction: function(object) {
    return typeof object == "function";
  },

  isString: function(object) {
    return typeof object == "string";
  },

  isNumber: function(object) {
    return typeof object == "number";
  },

  isUndefined: function(object) {
    return typeof object == "undefined";
  }
});

Object.extend(Function.prototype, {
  argumentNames: function() {
    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
      .replace(/\s+/g, '').split(',');
    return names.length == 1 && !names[0] ? [] : names;
  },

  bind: function() {
    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
  },

  bindAsEventListener: function() {
    var __method = this, args = $A(arguments), object = args.shift();
    return function(event) {
      return __method.apply(object, [event || window.event].concat(args));
    }
  },

  curry: function() {
    if (!arguments.length) return this;
    var __method = this, args = $A(arguments);
    return function() {
      return __method.apply(this, args.concat($A(arguments)));
    }
  },

  delay: function() {
    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  },

  defer: function() {
    var args = [0.01].concat($A(arguments));
    return this.delay.apply(this, args);
  },

  wrap: function(wrapper) {
    var __method = this;
    return function() {
      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
    }
  },

  methodize: function() {
    if (this._methodized) return this._methodized;
    var __method = this;
    return this._methodized = function() {
      return __method.apply(null, [this].concat($A(arguments)));
    };
  }
});

Date.prototype.toJSON = function() {
  return '"' + this.getUTCFullYear() + '-' +
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
    this.getUTCDate().toPaddedString(2) + 'T' +
    this.getUTCHours().toPaddedString(2) + ':' +
    this.getUTCMinutes().toPaddedString(2) + ':' +
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
};

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;
  }
};

RegExp.prototype.match = RegExp.prototype.test;

RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create({
  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);
  },

  execute: function() {
    this.callback(this);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
});
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

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 = Object.isUndefined(count) ? 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 String(this);
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = Object.isUndefined(truncation) ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : String(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 self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

  unescapeHTML: function() {
    var div = new Element('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 key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = 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);
  },

  times: function(count) {
    return count < 1 ? '' : new Array(count + 1).join(this);
  },

  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.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
  },

  isJSON: function() {
    var str = this;
    if (str.blank()) return false;
    str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  },

  interpolate: function(object, pattern) {
    return new Template(this, pattern).evaluate(object);
  }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  },
  unescapeHTML: function() {
    return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (Object.isFunction(replacement)) return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
};

String.prototype.parseQuery = String.prototype.toQueryParams;

Object.extend(String.prototype.escapeHTML, {
  div:  document.createElement('div'),
  text: document.createTextNode('')
});

String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);

var Template = Class.create({
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    if (Object.isFunction(object.toTemplateReplacements))
      object = object.toTemplateReplacements();

    return this.template.gsub(this.pattern, function(match) {
      if (object == null) return '';

      var before = match[1] || '';
      if (before == '\\') return match[2];

      var ctx = object, expr = match[3];
      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
      match = pattern.exec(expr);
      if (match == null) return before;

      while (match != null) {
        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
        ctx = ctx[comp];
        if (null == ctx || '' == match[3]) break;
        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
        match = pattern.exec(expr);
      }

      return before + String.interpret(ctx);
    });
  }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

var $break = { };

var Enumerable = {
  each: function(iterator, context) {
    var index = 0;
    try {
      this._each(function(value) {
        iterator.call(context, value, index++);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator, context) {
    var index = -number, slices = [], array = this.toArray();
    if (number < 1) return array;
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.collect(iterator, context);
  },

  all: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = true;
    this.each(function(value, index) {
      result = result && !!iterator.call(context, value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = false;
    this.each(function(value, index) {
      if (result = !!iterator.call(context, value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var results = [];
    this.each(function(value, index) {
      results.push(iterator.call(context, value, index));
    });
    return results;
  },

  detect: function(iterator, context) {
    var result;
    this.each(function(value, index) {
      if (iterator.call(context, value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator, context) {
    var results = [];
    this.each(function(value, index) {
      if (iterator.call(context, value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(filter, iterator, context) {
    iterator = iterator || Prototype.K;
    var results = [];

    if (Object.isString(filter))
      filter = new RegExp(filter);

    this.each(function(value, index) {
      if (filter.match(value))
        results.push(iterator.call(context, value, index));
    });
    return results;
  },

  include: function(object) {
    if (Object.isFunction(this.indexOf))
      if (this.indexOf(object) != -1) return true;

    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator, context) {
    this.each(function(value, index) {
      memo = iterator.call(context, 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, context) {
    iterator = iterator || Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator.call(context, value, index);
      if (result == null || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator.call(context, value, index);
      if (result == null || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var trues = [], falses = [];
    this.each(function(value, index) {
      (iterator.call(context, value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator, context) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator.call(context, value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator, context) {
    return this.map(function(value, index) {
      return {
        value: value,
        criteria: iterator.call(context, 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 (Object.isFunction(args.last()))
      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,
  filter:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray,
  every:   Enumerable.all,
  some:    Enumerable.any
});
function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

if (Prototype.Browser.WebKit) {
  $A = function(iterable) {
    if (!iterable) return [];
    // In Safari, only use the `toArray` method if it's not a NodeList.
    // A NodeList is a function, has an function `item` property, and a numeric
    // `length` property. Adapted from Google Doctype.
    if (!(typeof iterable === 'function' && typeof iterable.length ===
        'number' && typeof iterable.item === 'function') && iterable.toArray)
      return iterable.toArray();
    var length = iterable.length || 0, results = new Array(length);
    while (length--) results[length] = iterable[length];
    return results;
  };
}

Array.from = $A;

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(Object.isArray(value) ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  },

  intersect: function(array) {
    return this.uniq().findAll(function(item) {
      return array.detect(function(value) { return item === value });
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  },

  toJSON: function() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (!Object.isUndefined(value)) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

// use native browser JS 1.6 implementation if available
if (Object.isFunction(Array.prototype.forEach))
  Array.prototype._each = Array.prototype.forEach;

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
  i || (i = 0);
  var length = this.length;
  if (i < 0) i = length + i;
  for (; i < length; i++)
    if (this[i] === item) return i;
  return -1;
};

if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
  var n = this.slice(0, i).reverse().indexOf(item);
  return (n < 0) ? n : i - n - 1;
};

Array.prototype.toArray = Array.prototype.clone;

function $w(string) {
  if (!Object.isString(string)) return [];
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if (Prototype.Browser.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 (Object.isArray(arguments[i])) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  };
}
Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator, context) {
    $R(0, this, true).each(iterator, context);
    return this;
  },

  toPaddedString: function(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  },

  toJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});

$w('abs round ceil floor').each(function(method){
  Number.prototype[method] = Math[method].methodize();
});
function $H(object) {
  return new Hash(object);
};

var Hash = Class.create(Enumerable, (function() {

  function toQueryPair(key, value) {
    if (Object.isUndefined(value)) return key;
    return key + '=' + encodeURIComponent(String.interpret(value));
  }

  return {
    initialize: function(object) {
      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
    },

    _each: function(iterator) {
      for (var key in this._object) {
        var value = this._object[key], pair = [key, value];
        pair.key = key;
        pair.value = value;
        iterator(pair);
      }
    },

    set: function(key, value) {
      return this._object[key] = value;
    },

    get: function(key) {
      // simulating poorly supported hasOwnProperty
      if (this._object[key] !== Object.prototype[key])
        return this._object[key];
    },

    unset: function(key) {
      var value = this._object[key];
      delete this._object[key];
      return value;
    },

    toObject: function() {
      return Object.clone(this._object);
    },

    keys: function() {
      return this.pluck('key');
    },

    values: function() {
      return this.pluck('value');
    },

    index: function(value) {
      var match = this.detect(function(pair) {
        return pair.value === value;
      });
      return match && match.key;
    },

    merge: function(object) {
      return this.clone().update(object);
    },

    update: function(object) {
      return new Hash(object).inject(this, function(result, pair) {
        result.set(pair.key, pair.value);
        return result;
      });
    },

    toQueryString: function() {
      return this.inject([], function(results, pair) {
        var key = encodeURIComponent(pair.key), values = pair.value;

        if (values && typeof values == 'object') {
          if (Object.isArray(values))
            return results.concat(values.map(toQueryPair.curry(key)));
        } else results.push(toQueryPair(key, values));
        return results;
      }).join('&');
    },

    inspect: function() {
      return '#<Hash:{' + this.map(function(pair) {
        return pair.map(Object.inspect).join(': ');
      }).join(', ') + '}>';
    },

    toJSON: function() {
      return Object.toJSON(this.toObject());
    },

    clone: function() {
      return new Hash(this);
    }
  }
})());

Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
Hash.from = $H;
var ObjectRange = Class.create(Enumerable, {
  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 (Object.isFunction(responder[callback])) {
        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 = Class.create({
  initialize: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

    this.options.method = this.options.method.toLowerCase();

    if (Object.isString(this.options.parameters))
      this.options.parameters = this.options.parameters.toQueryParams();
    else if (Object.isHash(this.options.parameters))
      this.options.parameters = this.options.parameters.toObject();
  }
});

Ajax.Request = Class.create(Ajax.Base, {
  _complete: false,

  initialize: function($super, url, options) {
    $super(options);
    this.transport = Ajax.getTransport();
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.clone(this.options.parameters);

    if (!['get', 'post'].include(this.method)) {
      // simulate other verbs over post
      params['_method'] = this.method;
      this.method = 'post';
    }

    this.parameters = params;

    if (params = Object.toQueryString(params)) {
      // when GET, append parameters to URL
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      var response = new Ajax.Response(this);
      if (this.options.onCreate) this.options.onCreate(response);
      Ajax.Responders.dispatch('onCreate', this, response);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.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.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 (Object.isFunction(extras.push))
        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() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

  getStatus: function() {
    try {
      return this.transport.status || 0;
    } catch (e) { return 0 }
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + response.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(response, response.headerJSON);
      } catch (e) {
        this.dispatchException(e);
      }

      var contentType = response.getHeader('Content-type');
      if (this.options.evalJS == 'force'
          || (this.options.evalJS && this.isSameOrigin() && contentType
          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
        this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  isSameOrigin: function() {
    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
      protocol: location.protocol,
      domain: document.domain,
      port: location.port ? ':' + location.port : ''
    }));
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name) || null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Response = Class.create({
  initialize: function(request){
    this.request = request;
    var transport  = this.transport  = request.transport,
        readyState = this.readyState = transport.readyState;

    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
      this.status       = this.getStatus();
      this.statusText   = this.getStatusText();
      this.responseText = String.interpret(transport.responseText);
      this.headerJSON   = this._getHeaderJSON();
    }

    if(readyState == 4) {
      var xml = transport.responseXML;
      this.responseXML  = Object.isUndefined(xml) ? null : xml;
      this.responseJSON = this._getResponseJSON();
    }
  },

  status:      0,
  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

  getStatusText: function() {
    try {
      return this.transport.statusText || '';
    } catch (e) { return '' }
  },

  getHeader: Ajax.Request.prototype.getHeader,

  getAllHeaders: function() {
    try {
      return this.getAllResponseHeaders();
    } catch (e) { return null }
  },

  getResponseHeader: function(name) {
    return this.transport.getResponseHeader(name);
  },

  getAllResponseHeaders: function() {
    return this.transport.getAllResponseHeaders();
  },

  _getHeaderJSON: function() {
    var json = this.getHeader('X-JSON');
    if (!json) return null;
    json = decodeURIComponent(escape(json));
    try {
      return json.evalJSON(this.request.options.sanitizeJSON ||
        !this.request.isSameOrigin());
    } catch (e) {
      this.request.dispatchException(e);
    }
  },

  _getResponseJSON: function() {
    var options = this.request.options;
    if (!options.evalJSON || (options.evalJSON != 'force' &&
      !(this.getHeader('Content-type') || '').include('application/json')) ||
        this.responseText.blank())
          return null;
    try {
      return this.responseText.evalJSON(options.sanitizeJSON ||
        !this.request.isSameOrigin());
    } catch (e) {
      this.request.dispatchException(e);
    }
  }
});

Ajax.Updater = Class.create(Ajax.Request, {
  initialize: function($super, container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    };

    options = Object.clone(options);
    var onComplete = options.onComplete;
    options.onComplete = (function(response, json) {
      this.updateContent(response.responseText);
      if (Object.isFunction(onComplete)) onComplete(response, json);
    }).bind(this);

    $super(url, options);
  },

  updateContent: function(responseText) {
    var receiver = this.container[this.success() ? 'success' : 'failure'],
        options = this.options;

    if (!options.evalScripts) responseText = responseText.stripScripts();

    if (receiver = $(receiver)) {
      if (options.insertion) {
        if (Object.isString(options.insertion)) {
          var insertion = { }; insertion[options.insertion] = responseText;
          receiver.insert(insertion);
        }
        else options.insertion(receiver, responseText);
      }
      else receiver.update(responseText);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  initialize: function($super, container, url, options) {
    $super(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(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  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 (Object.isString(element))
    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(Element.extend(query.snapshotItem(i)));
    return results;
  };
}

/*--------------------------------------------------------------------------*/

if (!window.Node) var Node = { };

if (!Node.ELEMENT_NODE) {
  // DOM level 2 ECMAScript Language Binding
  Object.extend(Node, {
    ELEMENT_NODE: 1,
    ATTRIBUTE_NODE: 2,
    TEXT_NODE: 3,
    CDATA_SECTION_NODE: 4,
    ENTITY_REFERENCE_NODE: 5,
    ENTITY_NODE: 6,
    PROCESSING_INSTRUCTION_NODE: 7,
    COMMENT_NODE: 8,
    DOCUMENT_NODE: 9,
    DOCUMENT_TYPE_NODE: 10,
    DOCUMENT_FRAGMENT_NODE: 11,
    NOTATION_NODE: 12
  });
}

(function() {
  var element = this.Element;
  this.Element = function(tagName, attributes) {
    attributes = attributes || { };
    tagName = tagName.toLowerCase();
    var cache = Element.cache;
    if (Prototype.Browser.IE && attributes.name) {
      tagName = '<' + tagName + ' name="' + attributes.name + '">';
      delete attributes.name;
      return Element.writeAttribute(document.createElement(tagName), attributes);
    }
    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
  };
  Object.extend(this.Element, element || { });
  if (element) this.Element.prototype = element.prototype;
}).call(window);

Element.cache = { };

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 = $(element);
    element.style.display = 'none';
    return element;
  },

  show: function(element) {
    element = $(element);
    element.style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);
    content = Object.toHTML(content);
    element.innerHTML = content.stripScripts();
    content.evalScripts.bind(content).defer();
    return element;
  },

  replace: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    else if (!Object.isElement(content)) {
      content = Object.toHTML(content);
      var range = element.ownerDocument.createRange();
      range.selectNode(element);
      content.evalScripts.bind(content).defer();
      content = range.createContextualFragment(content.stripScripts());
    }
    element.parentNode.replaceChild(content, element);
    return element;
  },

  insert: function(element, insertions) {
    element = $(element);

    if (Object.isString(insertions) || Object.isNumber(insertions) ||
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
          insertions = {bottom:insertions};

    var content, insert, tagName, childNodes;

    for (var position in insertions) {
      content  = insertions[position];
      position = position.toLowerCase();
      insert = Element._insertionTranslations[position];

      if (content && content.toElement) content = content.toElement();
      if (Object.isElement(content)) {
        insert(element, content);
        continue;
      }

      content = Object.toHTML(content);

      tagName = ((position == 'before' || position == 'after')
        ? element.parentNode : element).tagName.toUpperCase();

      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());

      if (position == 'top' || position == 'after') childNodes.reverse();
      childNodes.each(insert.curry(element));

      content.evalScripts.bind(content).defer();
    }

    return element;
  },

  wrap: function(element, wrapper, attributes) {
    element = $(element);
    if (Object.isElement(wrapper))
      $(wrapper).writeAttribute(attributes || { });
    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
    else wrapper = new Element('div', wrapper);
    if (element.parentNode)
      element.parentNode.replaceChild(wrapper, element);
    wrapper.appendChild(element);
    return wrapper;
  },

  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 $(element).select("*");
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

  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 (Object.isString(selector))
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = element.ancestors();
    return Object.isNumber(expression) ? ancestors[expression] :
      Selector.findElement(ancestors, expression, index);
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return element.firstDescendant();
    return Object.isNumber(expression) ? element.descendants()[expression] :
      Element.select(element, expression)[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = element.previousSiblings();
    return Object.isNumber(expression) ? previousSiblings[expression] :
      Selector.findElement(previousSiblings, expression, index);
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = element.nextSiblings();
    return Object.isNumber(expression) ? nextSiblings[expression] :
      Selector.findElement(nextSiblings, expression, index);
  },

  select: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element, args);
  },

  adjacent: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element.parentNode, args).without(element);
  },

  identify: function(element) {
    element = $(element);
    var id = element.readAttribute('id'), self = arguments.callee;
    if (id) return id;
    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
    element.writeAttribute('id', id);
    return id;
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      var t = Element._attributeTranslations.read;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name]) name = t.names[name];
      if (name.include(':')) {
        return (!element.attributes || !element.attributes[name]) ? null :
         element.attributes[name].value;
      }
    }
    return element.getAttribute(name);
  },

  writeAttribute: function(element, name, value) {
    element = $(element);
    var attributes = { }, t = Element._attributeTranslations.write;

    if (typeof name == 'object') attributes = name;
    else attributes[name] = Object.isUndefined(value) ? true : value;

    for (var attr in attributes) {
      name = t.names[attr] || attr;
      value = attributes[attr];
      if (t.values[attr]) name = t.values[attr](element, value);
      if (value === false || value === null)
        element.removeAttribute(name);
      else if (value === true)
        element.setAttribute(name, name);
      else element.setAttribute(name, value);
    }
    return element;
  },

  getHeight: function(element) {
    return $(element).getDimensions().height;
  },

  getWidth: function(element) {
    return $(element).getDimensions().width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    return (elementClassName.length > 0 && (elementClassName == className ||
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    if (!element.hasClassName(className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    element.className = element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    return element[element.hasClassName(className) ?
      'removeClassName' : 'addClassName'](className);
  },

  // 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.blank();
  },

  descendantOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);

    if (element.compareDocumentPosition)
      return (element.compareDocumentPosition(ancestor) & 8) === 8;

    if (ancestor.contains)
      return ancestor.contains(element) && ancestor !== element;

    while (element = element.parentNode)
      if (element == ancestor) return true;

    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = element.cumulativeOffset();
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value || value == 'auto') {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles) {
    element = $(element);
    var elementStyle = element.style, match;
    if (Object.isString(styles)) {
      element.style.cssText += ';' + styles;
      return styles.include('opacity') ?
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
    }
    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property]);
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
            property] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = element.getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      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;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    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 (Prototype.Browser.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.getStyle(element, 'overflow') || 'auto';
    if (element._overflow !== '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;
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return Element._returnOffset(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.toUpperCase() == 'BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p !== 'static') break;
      }
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  absolutize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'absolute') return element;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    var offsets = element.positionedOffset();
    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';
    return element;
  },

  relativize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'relative') return element;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    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;
    return element;
  },

  cumulativeScrollOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  getOffsetParent: 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);
  },

  viewportOffset: 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 &&
        Element.getStyle(element, 'position') == 'absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return Element._returnOffset(valueL, valueT);
  },

  clonePosition: function(element, source) {
    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 = source.viewportOffset();

    // find coordinate system to use
    element = $(element);
    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(element, 'position') == 'absolute') {
      parent = element.getOffsetParent();
      delta = parent.viewportOffset();
    }

    // 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)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
    return element;
  }
};

Element.Methods.identify.counter = 1;

Object.extend(Element.Methods, {
  getElementsBySelector: Element.Methods.select,
  childElements: Element.Methods.immediateDescendants
});

Element._attributeTranslations = {
  write: {
    names: {
      className: 'class',
      htmlFor:   'for'
    },
    values: { }
  }
};

if (Prototype.Browser.Opera) {
  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
    function(proceed, element, style) {
      switch (style) {
        case 'left': case 'top': case 'right': case 'bottom':
          if (proceed(element, 'position') === 'static') return null;
        case 'height': case 'width':
          // returns '0px' for hidden elements; we want it to return null
          if (!Element.visible(element)) return null;

          // returns the border-box dimensions rather than the content-box
          // dimensions, so we subtract padding and borders from the value
          var dim = parseInt(proceed(element, style), 10);

          if (dim !== element['offset' + style.capitalize()])
            return dim + 'px';

          var properties;
          if (style === 'height') {
            properties = ['border-top-width', 'padding-top',
             'padding-bottom', 'border-bottom-width'];
          }
          else {
            properties = ['border-left-width', 'padding-left',
             'padding-right', 'border-right-width'];
          }
          return properties.inject(dim, function(memo, property) {
            var val = proceed(element, property);
            return val === null ? memo : memo - parseInt(val, 10);
          }) + 'px';
        default: return proceed(element, style);
      }
    }
  );

  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
    function(proceed, element, attribute) {
      if (attribute === 'title') return element.title;
      return proceed(element, attribute);
    }
  );
}

else if (Prototype.Browser.IE) {
  // IE doesn't report offsets correctly for static elements, so we change them
  // to "relative" to get the values, then change them back.
  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
    function(proceed, element) {
      element = $(element);
      // IE throws an error if element is not in document
      try { element.offsetParent }
      catch(e) { return $(document.body) }
      var position = element.getStyle('position');
      if (position !== 'static') return proceed(element);
      element.setStyle({ position: 'relative' });
      var value = proceed(element);
      element.setStyle({ position: position });
      return value;
    }
  );

  $w('positionedOffset viewportOffset').each(function(method) {
    Element.Methods[method] = Element.Methods[method].wrap(
      function(proceed, element) {
        element = $(element);
        try { element.offsetParent }
        catch(e) { return Element._returnOffset(0,0) }
        var position = element.getStyle('position');
        if (position !== 'static') return proceed(element);
        // Trigger hasLayout on the offset parent so that IE6 reports
        // accurate offsetTop and offsetLeft values for position: fixed.
        var offsetParent = element.getOffsetParent();
        if (offsetParent && offsetParent.getStyle('position') === 'fixed')
          offsetParent.setStyle({ zoom: 1 });
        element.setStyle({ position: 'relative' });
        var value = proceed(element);
        element.setStyle({ position: position });
        return value;
      }
    );
  });

  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
    function(proceed, element) {
      try { element.offsetParent }
      catch(e) { return Element._returnOffset(0,0) }
      return proceed(element);
    }
  );

  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset' + style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    function stripAlpha(filter){
      return filter.replace(/alpha\([^\)]*\)/gi,'');
    }
    element = $(element);
    var currentStyle = element.currentStyle;
    if ((currentStyle && !currentStyle.hasLayout) ||
      (!currentStyle && element.style.zoom == 'normal'))
        element.style.zoom = 1;

    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      (filter = stripAlpha(filter)) ?
        style.filter = filter : style.removeAttribute('filter');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = stripAlpha(filter) +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  Element._attributeTranslations = {
    read: {
      names: {
        'class': 'className',
        'for':   'htmlFor'
      },
      values: {
        _getAttr: function(element, attribute) {
          return element.getAttribute(attribute, 2);
        },
        _getAttrNode: function(element, attribute) {
          var node = element.getAttributeNode(attribute);
          return node ? node.value : "";
        },
        _getEv: function(element, attribute) {
          attribute = element.getAttribute(attribute);
          return attribute ? attribute.toString().slice(23, -2) : null;
        },
        _flag: function(element, attribute) {
          return $(element).hasAttribute(attribute) ? attribute : null;
        },
        style: function(element) {
          return element.style.cssText.toLowerCase();
        },
        title: function(element) {
          return element.title;
        }
      }
    }
  };

  Element._attributeTranslations.write = {
    names: Object.extend({
      cellpadding: 'cellPadding',
      cellspacing: 'cellSpacing'
    }, Element._attributeTranslations.read.names),
    values: {
      checked: function(element, value) {
        element.checked = !!value;
      },

      style: function(element, value) {
        element.style.cssText = value ? value : '';
      }
    }
  };

  Element._attributeTranslations.has = {};

  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
  });

  (function(v) {
    Object.extend(v, {
      href:        v._getAttr,
      src:         v._getAttr,
      type:        v._getAttr,
      action:      v._getAttrNode,
      disabled:    v._flag,
      checked:     v._flag,
      readonly:    v._flag,
      multiple:    v._flag,
      onload:      v._getEv,
      onunload:    v._getEv,
      onclick:     v._getEv,
      ondblclick:  v._getEv,
      onmousedown: v._getEv,
      onmouseup:   v._getEv,
      onmouseover: v._getEv,
      onmousemove: v._getEv,
      onmouseout:  v._getEv,
      onfocus:     v._getEv,
      onblur:      v._getEv,
      onkeypress:  v._getEv,
      onkeydown:   v._getEv,
      onkeyup:     v._getEv,
      onsubmit:    v._getEv,
      onreset:     v._getEv,
      onselect:    v._getEv,
      onchange:    v._getEv
    });
  })(Element._attributeTranslations.read.values);
}

else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

else if (Prototype.Browser.WebKit) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;

    if (value == 1)
      if(element.tagName.toUpperCase() == 'IMG' && element.width) {
        element.width++; element.width--;
      } else try {
        var n = document.createTextNode(' ');
        element.appendChild(n);
        element.removeChild(n);
      } catch (e) { }

    return element;
  };

  // Safari returns margins on body which is incorrect if the child is absolutely
  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
  // KHTML/WebKit only.
  Element.Methods.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 Element._returnOffset(valueL, valueT);
  };
}

if (Prototype.Browser.IE || Prototype.Browser.Opera) {
  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
  Element.Methods.update = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);

    content = Object.toHTML(content);
    var tagName = element.tagName.toUpperCase();

    if (tagName in Element._insertionTranslations.tags) {
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
        .each(function(node) { element.appendChild(node) });
    }
    else element.innerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

if ('outerHTML' in document.createElement('div')) {
  Element.Methods.replace = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) {
      element.parentNode.replaceChild(content, element);
      return element;
    }

    content = Object.toHTML(content);
    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();

    if (Element._insertionTranslations.tags[tagName]) {
      var nextSibling = element.next();
      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
      parent.removeChild(element);
      if (nextSibling)
        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
      else
        fragments.each(function(node) { parent.appendChild(node) });
    }
    else element.outerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

Element._returnOffset = function(l, t) {
  var result = [l, t];
  result.left = l;
  result.top = t;
  return result;
};

Element._getContentFromAnonymousElement = function(tagName, html) {
  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
  if (t) {
    div.innerHTML = t[0] + html + t[1];
    t[2].times(function() { div = div.firstChild });
  } else div.innerHTML = html;
  return $A(div.childNodes);
};

Element._insertionTranslations = {
  before: function(element, node) {
    element.parentNode.insertBefore(node, element);
  },
  top: function(element, node) {
    element.insertBefore(node, element.firstChild);
  },
  bottom: function(element, node) {
    element.appendChild(node);
  },
  after: function(element, node) {
    element.parentNode.insertBefore(node, element.nextSibling);
  },
  tags: {
    TABLE:  ['<table>',                '</table>',                   1],
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
    SELECT: ['<select>',               '</select>',                  1]
  }
};

(function() {
  Object.extend(this.tags, {
    THEAD: this.tags.TBODY,
    TFOOT: this.tags.TBODY,
    TH:    this.tags.TD
  });
}).call(Element._insertionTranslations);

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    attribute = Element._attributeTranslations.has[attribute] || attribute;
    var node = $(element).getAttributeNode(attribute);
    return !!(node && node.specified);
  }
};

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
    document.createElement('div')['__proto__']) {
  window.HTMLElement = { };
  window.HTMLElement.prototype = document.createElement('div')['__proto__'];
  Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.extend = (function() {
  if (Prototype.BrowserFeatures.SpecificElementExtensions)
    return Prototype.K;

  var Methods = { }, ByTag = Element.Methods.ByTag;

  var extend = Object.extend(function(element) {
    if (!element || element._extendedByPrototype ||
        element.nodeType != 1 || element == window) return element;

    var methods = Object.clone(Methods),
      tagName = element.tagName.toUpperCase(), property, value;

    // extend methods for specific tags
    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);

    for (property in methods) {
      value = methods[property];
      if (Object.isFunction(value) && !(property in element))
        element[property] = value.methodize();
    }

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

  }, {
    refresh: function() {
      // extend methods for all tags (Safari doesn't need this)
      if (!Prototype.BrowserFeatures.ElementExtensions) {
        Object.extend(Methods, Element.Methods);
        Object.extend(Methods, Element.Methods.Simulated);
      }
    }
  });

  extend.refresh();
  return extend;
})();

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

  if (!methods) {
    Object.extend(Form, Form.Methods);
    Object.extend(Form.Element, Form.Element.Methods);
    Object.extend(Element.Methods.ByTag, {
      "FORM":     Object.clone(Form.Methods),
      "INPUT":    Object.clone(Form.Element.Methods),
      "SELECT":   Object.clone(Form.Element.Methods),
      "TEXTAREA": Object.clone(Form.Element.Methods)
    });
  }

  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || { });
  else {
    if (Object.isArray(tagName)) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = { };
    Object.extend(Element.Methods.ByTag[tagName], methods);
  }

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    for (var property in methods) {
      var value = methods[property];
      if (!Object.isFunction(value)) continue;
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = value.methodize();
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    window[klass] = { };
    window[klass].prototype = document.createElement(tagName)['__proto__'];
    return window[klass];
  }

  if (F.ElementExtensions) {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (Object.isUndefined(klass)) continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;

  if (Element.extend.refresh) Element.extend.refresh();
  Element.cache = { };
};

document.viewport = {
  getDimensions: function() {
    var dimensions = { }, B = Prototype.Browser;
    $w('width height').each(function(d) {
      var D = d.capitalize();
      if (B.WebKit && !document.evaluate) {
        // Safari <3.0 needs self.innerWidth/Height
        dimensions[d] = self['inner' + D];
      } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
        // Opera <9.5 needs document.body.clientWidth/Height
        dimensions[d] = document.body['client' + D]
      } else {
        dimensions[d] = document.documentElement['client' + D];
      }
    });
    return dimensions;
  },

  getWidth: function() {
    return this.getDimensions().width;
  },

  getHeight: function() {
    return this.getDimensions().height;
  },

  getScrollOffsets: function() {
    return Element._returnOffset(
      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
  }
};
/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license.  Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create({
  initialize: function(expression) {
    this.expression = expression.strip();

    if (this.shouldUseSelectorsAPI()) {
      this.mode = 'selectorsAPI';
    } else if (this.shouldUseXPath()) {
      this.mode = 'xpath';
      this.compileXPathMatcher();
    } else {
      this.mode = "normal";
      this.compileMatcher();
    }

  },

  shouldUseXPath: function() {
    if (!Prototype.BrowserFeatures.XPath) return false;

    var e = this.expression;

    // Safari 3 chokes on :*-of-type and :empty
    if (Prototype.Browser.WebKit &&
     (e.include("-of-type") || e.include(":empty")))
      return false;

    // XPath can't do namespaced attributes, nor can it read
    // the "checked" property from DOM nodes
    if ((/(\[[\w-]*?:|:checked)/).test(e))
      return false;

    return true;
  },

  shouldUseSelectorsAPI: function() {
    if (!Prototype.BrowserFeatures.SelectorsAPI) return false;

    if (!Selector._div) Selector._div = new Element('div');

    // Make sure the browser treats the selector as valid. Test on an
    // isolated element to minimize cost of this check.
    try {
      Selector._div.querySelector(this.expression);
    } catch(e) {
      return false;
    }

    return true;
  },

  compileMatcher: function() {
    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e];
      return;
    }

    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
            new Template(c[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le, m;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        if (m = e.match(ps[i])) {
          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
            new Template(x[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    var e = this.expression, results;

    switch (this.mode) {
      case 'selectorsAPI':
        // querySelectorAll queries document-wide, then filters to descendants
        // of the context element. That's not what we want.
        // Add an explicit context to the selector if necessary.
        if (root !== document) {
          var oldId = root.id, id = $(root).identify();
          e = "#" + id + " " + e;
        }

        results = $A(root.querySelectorAll(e)).map(Element.extend);
        root.id = oldId;

        return results;
      case 'xpath':
        return document._getElementsByXPath(this.xpath, root);
      default:
       return this.matcher(root);
    }
  },

  match: function(element) {
    this.tokens = [];

    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
    var le, p, m;

    while (e && le !== e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          // use the Selector.assertions methods unless the selector
          // is too complex.
          if (as[i]) {
            this.tokens.push([i, Object.clone(m)]);
            e = e.replace(m[0], '');
          } else {
            // reluctantly do a document-wide search
            // and look for a match in the array
            return this.findElements(document).include(element);
          }
        }
      }
    }

    var match = true, name, matches;
    for (var i = 0, token; token = this.tokens[i]; i++) {
      name = token[0], matches = token[1];
      if (!Selector.assertions[name](element, matches)) {
        match = false; break;
      }
    }

    return match;
  },

  toString: function() {
    return this.expression;
  },

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
});

Object.extend(Selector, {
  _cache: { },

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: function(m) {
      m[1] = m[1].toLowerCase();
      return new Template("[@#{1}]").evaluate(m);
    },
    attr: function(m) {
      m[1] = m[1].toLowerCase();
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (Object.isFunction(h)) return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0)]",
      'checked':     "[@checked]",
      'disabled':    "[(@disabled) and (@type!='hidden')]",
      'enabled':     "[not(@disabled) and (@type!='hidden')]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);      c = false;',
    className:    'n = h.className(n, r, "#{1}", c);    c = false;',
    id:           'n = h.id(n, r, "#{1}", c);           c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
    },
    pseudo: function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: {
    // combinators must be listed first
    // (and descendant needs to be last combinator)
    laterSibling: /^\s*~\s*/,
    child:        /^\s*>\s*/,
    adjacent:     /^\s*\+\s*/,
    descendant:   /^\s/,

    // selectors follow
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
    id:           /^#([\w\-\*]+)(\b|$)/,
    className:    /^\.([\w\-\*]+)(\b|$)/,
    pseudo:
/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
    attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
  },

  // for Selector.match and Element#match
  assertions: {
    tagName: function(element, matches) {
      return matches[1].toUpperCase() == element.tagName.toUpperCase();
    },

    className: function(element, matches) {
      return Element.hasClassName(element, matches[1]);
    },

    id: function(element, matches) {
      return element.id === matches[1];
    },

    attrPresence: function(element, matches) {
      return Element.hasAttribute(element, matches[1]);
    },

    attr: function(element, matches) {
      var nodeValue = Element.readAttribute(element, matches[1]);
      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
    }
  },

  handlers: {
    // UTILITY FUNCTIONS
    // joins two collections
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    // marks an array of nodes for counting
    mark: function(nodes) {
      var _true = Prototype.emptyFunction;
      for (var i = 0, node; node = nodes[i]; i++)
        node._countedByPrototype = _true;
      return nodes;
    },

    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._countedByPrototype = undefined;
      return nodes;
    },

    // mark each child node with its position (for nth calls)
    // "ofType" flag indicates whether we're indexing for nth-of-type
    // rather than nth-child
    index: function(parentNode, reverse, ofType) {
      parentNode._countedByPrototype = Prototype.emptyFunction;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          var node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
      }
    },

    // filters out duplicates and extends all nodes
    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (!(n = nodes[i])._countedByPrototype) {
          n._countedByPrototype = Prototype.emptyFunction;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    // COMBINATOR FUNCTIONS
    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    // TOKEN FUNCTIONS
    tagName: function(nodes, root, tagName, combinator) {
      var uTagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          // fastlane for ordinary descendant combinators
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() === uTagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!targetNode) return [];
      if (!nodes && root == document) return [targetNode];
      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr, combinator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      if (nodes && combinator) nodes = this[combinator](nodes);
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator, combinator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      if (nodes && combinator) nodes = this[combinator](nodes);
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    // handles the an+b logic
    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._countedByPrototype) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        // IE treats comments as element nodes
        if (node.tagName == '!' || node.firstChild) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._countedByPrototype) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled && (!node.type || node.type !== 'hidden'))
          results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
    '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
    '$=': function(nv, v) { return nv.endsWith(v); },
    '*=': function(nv, v) { return nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
     '-').include('-' + (v || "").toUpperCase() + '-'); }
  },

  split: function(expression) {
    var expressions = [];
    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    return expressions;
  },

  matchElements: function(elements, expression) {
    var matches = $$(expression), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._countedByPrototype) results.push(element);
    h.unmark(matches);
    return results;
  },

  findElement: function(elements, expression, index) {
    if (Object.isNumber(expression)) {
      index = expression; expression = false;
    }
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    expressions = Selector.split(expressions.join(','));
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

if (Prototype.Browser.IE) {
  Object.extend(Selector.handlers, {
    // IE returns comment nodes on getElementsByTagName("*").
    // Filter them out.
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        if (node.tagName !== "!") a.push(node);
      return a;
    },

    // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node.removeAttribute('_countedByPrototype');
      return nodes;
    }
  });
}

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(form).reset();
    return form;
  },

  serializeElements: function(elements, options) {
    if (typeof options != 'object') options = { hash: !!options };
    else if (Object.isUndefined(options.hash)) options.hash = true;
    var key, value, submitted = false, submit = options.submit;

    var data = elements.inject({ }, function(result, element) {
      if (!element.disabled && element.name) {
        key = element.name; value = $(element).getValue();
        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
          if (key in result) {
            // a key is already present; construct an array of values
            if (!Object.isArray(result[key])) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return options.hash ? data : Object.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, options) {
    return Form.serializeElements(Form.getElements(form), options);
  },

  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');

    if (!typeName && !name) return $A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], 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(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

  findFirstElement: function(form) {
    var elements = $(form).getElements().findAll(function(element) {
      return 'hidden' != element.type && !element.disabled;
    });
    var firstByIndex = elements.findAll(function(element) {
      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
    }).sortBy(function(element) { return element.tabIndex }).first();

    return firstByIndex ? firstByIndex : elements.find(function(element) {
      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  },

  request: function(form, options) {
    form = $(form), options = Object.clone(options || { });

    var params = options.parameters, action = form.readAttribute('action') || '';
    if (action.blank()) action = window.location.href;
    options.parameters = form.serialize(true);

    if (params) {
      if (Object.isString(params)) params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(action, options);
  }
};

/*--------------------------------------------------------------------------*/

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 && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = { };
        pair[element.name] = value;
        return Object.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  setValue: function(element, value) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    Form.Element.Serializers[method](element, value);
    return element;
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    try {
      element.focus();
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
          !['button', 'reset', 'submit'].include(element.type)))
        element.select();
    } catch (e) { }
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.disabled = false;
    return element;
  }
};

/*--------------------------------------------------------------------------*/

var Field = Form.Element;
var $F = Form.Element.Methods.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element, value) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element, value);
      default:
        return Form.Element.Serializers.textarea(element, value);
    }
  },

  inputSelector: function(element, value) {
    if (Object.isUndefined(value)) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  textarea: function(element, value) {
    if (Object.isUndefined(value)) return element.value;
    else element.value = value;
  },

  select: function(element, value) {
    if (Object.isUndefined(value))
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, currentValue, single = !Object.isArray(value);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        currentValue = this.optionValue(opt);
        if (single) {
          if (currentValue == value) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = value.include(currentValue);
      }
    }
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    // extend element because hasAttribute may not be native
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
};

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
  initialize: function($super, element, frequency, callback) {
    $super(callback, frequency);
    this.element   = $(element);
    this.lastValue = this.getValue();
  },

  execute: function() {
    var value = this.getValue();
    if (Object.isString(this.lastValue) && Object.isString(value) ?
        this.lastValue != value : String(this.lastValue) != String(value)) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
});

Form.Element.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = Class.create({
  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, 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(Abstract.EventObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) var Event = { };

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,
  KEY_INSERT:   45,

  cache: { },

  relatedTarget: function(event) {
    var element;
    switch(event.type) {
      case 'mouseover': element = event.fromElement; break;
      case 'mouseout':  element = event.toElement;   break;
      default: return null;
    }
    return Element.extend(element);
  }
});

Event.Methods = (function() {
  var isButton;

  if (Prototype.Browser.IE) {
    var buttonMap = { 0: 1, 1: 4, 2: 2 };
    isButton = function(event, code) {
      return event.button == buttonMap[code];
    };

  } else if (Prototype.Browser.WebKit) {
    isButton = function(event, code) {
      switch (code) {
        case 0: return event.which == 1 && !event.metaKey;
        case 1: return event.which == 1 && event.metaKey;
        default: return false;
      }
    };

  } else {
    isButton = function(event, code) {
      return event.which ? (event.which === code + 1) : (event.button === code);
    };
  }

  return {
    isLeftClick:   function(event) { return isButton(event, 0) },
    isMiddleClick: function(event) { return isButton(event, 1) },
    isRightClick:  function(event) { return isButton(event, 2) },

    element: function(event) {
      event = Event.extend(event);

      var node          = event.target,
          type          = event.type,
          currentTarget = event.currentTarget;

      if (currentTarget && currentTarget.tagName) {
        // Firefox screws up the "click" event when moving between radio buttons
        // via arrow keys. It also screws up the "load" and "error" events on images,
        // reporting the document as the target instead of the original image.
        if (type === 'load' || type === 'error' ||
          (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
            && currentTarget.type === 'radio'))
              node = currentTarget;
      }
      if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
      return Element.extend(node);
    },

    findElement: function(event, expression) {
      var element = Event.element(event);
      if (!expression) return element;
      var elements = [element].concat(element.ancestors());
      return Selector.findElement(elements, expression, 0);
    },

    pointer: function(event) {
      var docElement = document.documentElement,
      body = document.body || { scrollLeft: 0, scrollTop: 0 };
      return {
        x: event.pageX || (event.clientX +
          (docElement.scrollLeft || body.scrollLeft) -
          (docElement.clientLeft || 0)),
        y: event.pageY || (event.clientY +
          (docElement.scrollTop || body.scrollTop) -
          (docElement.clientTop || 0))
      };
    },

    pointerX: function(event) { return Event.pointer(event).x },
    pointerY: function(event) { return Event.pointer(event).y },

    stop: function(event) {
      Event.extend(event);
      event.preventDefault();
      event.stopPropagation();
      event.stopped = true;
    }
  };
})();

Event.extend = (function() {
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
    m[name] = Event.Methods[name].methodize();
    return m;
  });

  if (Prototype.Browser.IE) {
    Object.extend(methods, {
      stopPropagation: function() { this.cancelBubble = true },
      preventDefault:  function() { this.returnValue = false },
      inspect: function() { return "[object Event]" }
    });

    return function(event) {
      if (!event) return false;
      if (event._extendedByPrototype) return event;

      event._extendedByPrototype = Prototype.emptyFunction;
      var pointer = Event.pointer(event);
      Object.extend(event, {
        target: event.srcElement,
        relatedTarget: Event.relatedTarget(event),
        pageX:  pointer.x,
        pageY:  pointer.y
      });
      return Object.extend(event, methods);
    };

  } else {
    Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
    Object.extend(Event.prototype, methods);
    return Prototype.K;
  }
})();

Object.extend(Event, (function() {
  var cache = Event.cache;

  function getEventID(element) {
    if (element._prototypeEventID) return element._prototypeEventID[0];
    arguments.callee.id = arguments.callee.id || 1;
    return element._prototypeEventID = [++arguments.callee.id];
  }

  function getDOMEventName(eventName) {
    if (eventName && eventName.include(':')) return "dataavailable";
    return eventName;
  }

  function getCacheForID(id) {
    return cache[id] = cache[id] || { };
  }

  function getWrappersForEventName(id, eventName) {
    var c = getCacheForID(id);
    return c[eventName] = c[eventName] || [];
  }

  function createWrapper(element, eventName, handler) {
    var id = getEventID(element);
    var c = getWrappersForEventName(id, eventName);
    if (c.pluck("handler").include(handler)) return false;

    var wrapper = function(event) {
      if (!Event || !Event.extend ||
        (event.eventName && event.eventName != eventName))
          return false;

      Event.extend(event);
      handler.call(element, event);
    };

    wrapper.handler = handler;
    c.push(wrapper);
    return wrapper;
  }

  function findWrapper(id, eventName, handler) {
    var c = getWrappersForEventName(id, eventName);
    return c.find(function(wrapper) { return wrapper.handler == handler });
  }

  function destroyWrapper(id, eventName, handler) {
    var c = getCacheForID(id);
    if (!c[eventName]) return false;
    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
  }

  function destroyCache() {
    for (var id in cache)
      for (var eventName in cache[id])
        cache[id][eventName] = null;
  }


  // Internet Explorer needs to remove event handlers on page unload
  // in order to avoid memory leaks.
  if (window.attachEvent) {
    window.attachEvent("onunload", destroyCache);
  }

  // Safari has a dummy event handler on page unload so that it won't
  // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
  // object when page is returned to via the back button using its bfcache.
  if (Prototype.Browser.WebKit) {
    window.addEventListener('unload', Prototype.emptyFunction, false);
  }

  return {
    observe: function(element, eventName, handler) {
      element = $(element);
      var name = getDOMEventName(eventName);

      var wrapper = createWrapper(element, eventName, handler);
      if (!wrapper) return element;

      if (element.addEventListener) {
        element.addEventListener(name, wrapper, false);
      } else {
        element.attachEvent("on" + name, wrapper);
      }

      return element;
    },

    stopObserving: function(element, eventName, handler) {
      element = $(element);
      var id = getEventID(element), name = getDOMEventName(eventName);

      if (!handler && eventName) {
        getWrappersForEventName(id, eventName).each(function(wrapper) {
          element.stopObserving(eventName, wrapper.handler);
        });
        return element;

      } else if (!eventName) {
        Object.keys(getCacheForID(id)).each(function(eventName) {
          element.stopObserving(eventName);
        });
        return element;
      }

      var wrapper = findWrapper(id, eventName, handler);
      if (!wrapper) return element;

      if (element.removeEventListener) {
        element.removeEventListener(name, wrapper, false);
      } else {
        element.detachEvent("on" + name, wrapper);
      }

      destroyWrapper(id, eventName, handler);

      return element;
    },

    fire: function(element, eventName, memo) {
      element = $(element);
      if (element == document && document.createEvent && !element.dispatchEvent)
        element = document.documentElement;

      var event;
      if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent("dataavailable", true, true);
      } else {
        event = document.createEventObject();
        event.eventType = "ondataavailable";
      }

      event.eventName = eventName;
      event.memo = memo || { };

      if (document.createEvent) {
        element.dispatchEvent(event);
      } else {
        element.fireEvent(event.eventType, event);
      }

      return Event.extend(event);
    }
  };
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
  fire:          Event.fire,
  observe:       Event.observe,
  stopObserving: Event.stopObserving
});

Object.extend(document, {
  fire:          Element.Methods.fire.methodize(),
  observe:       Element.Methods.observe.methodize(),
  stopObserving: Element.Methods.stopObserving.methodize(),
  loaded:        false
});

(function() {
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
     Matthias Miller, Dean Edwards and John Resig. */

  var timer;

  function fireContentLoadedEvent() {
    if (document.loaded) return;
    if (timer) window.clearInterval(timer);
    document.fire("dom:loaded");
    document.loaded = true;
  }

  if (document.addEventListener) {
    if (Prototype.Browser.WebKit) {
      timer = window.setInterval(function() {
        if (/loaded|complete/.test(document.readyState))
          fireContentLoadedEvent();
      }, 0);

      Event.observe(window, "load", fireContentLoadedEvent);

    } else {
      document.addEventListener("DOMContentLoaded",
        fireContentLoadedEvent, false);
    }

  } else {
    // Hack für IE "1 element waiting", fischefa 23.06.2009  
    // https://prototype.lighthouseapp.com/projects/8886/tickets/125-explorer-no-firing-window-load-or-dom-loaded
    document.write("<script id=__onDOMContentLoaded defer src=templates/shared/js/prototype/dummy.txt><\/script>");

    $("__onDOMContentLoaded").onreadystatechange = function() {
      if (this.readyState == "complete") {
        this.onreadystatechange = null;
        fireContentLoadedEvent();
      }
    };
  }
})();
/*------------------------------- DEPRECATED -------------------------------*/

Hash.toQueryString = Object.toQueryString;

var Toggle = { display: Element.toggle };

Element.Methods.childOf = Element.Methods.descendantOf;

var Insertion = {
  Before: function(element, content) {
    return Element.insert(element, {before:content});
  },

  Top: function(element, content) {
    return Element.insert(element, {top:content});
  },

  Bottom: function(element, content) {
    return Element.insert(element, {bottom:content});
  },

  After: function(element, content) {
    return Element.insert(element, {after:content});
  }
};

var $continue = new Error('"throw $continue" is deprecated, use "return" instead');

// This should be moved to script.aculo.us; notice the deprecated methods
// further below, that map to the newer Element methods.
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;
  },

  // 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 = Element.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 = Element.cumulativeScrollOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = Element.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;
  },

  // Deprecation layer -- use newer Element methods now (1.5.2).

  cumulativeOffset: Element.Methods.cumulativeOffset,

  positionedOffset: Element.Methods.positionedOffset,

  absolutize: function(element) {
    Position.prepare();
    return Element.absolutize(element);
  },

  relativize: function(element) {
    Position.prepare();
    return Element.relativize(element);
  },

  realOffset: Element.Methods.cumulativeScrollOffset,

  offsetParent: Element.Methods.getOffsetParent,

  page: Element.Methods.viewportOffset,

  clone: function(source, target, options) {
    options = options || { };
    return Element.clonePosition(target, source, options);
  }
};

/*--------------------------------------------------------------------------*/

if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
  function iter(name) {
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
  }

  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
  function(element, className) {
    className = className.toString().strip();
    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
  } : function(element, className) {
    className = className.toString().strip();
    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
    if (!classNames && !className) return elements;

    var nodes = $(element).getElementsByTagName('*');
    className = ' ' + className + ' ';

    for (var i = 0, child, cn; child = nodes[i]; i++) {
      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
          (classNames && classNames.all(function(name) {
            return !name.toString().blank() && cn.include(' ' + name + ' ');
          }))))
        elements.push(Element.extend(child));
    }
    return elements;
  };

  return function(className, parentElement) {
    return $(parentElement || document.body).getElementsByClassName(className);
  };
}(Element.Methods);

/*--------------------------------------------------------------------------*/

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);

/*--------------------------------------------------------------------------*/

Element.addMethods();/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/****************************************** javascript common lib: *****/
/*************************** - Info class for browser and os tests *****/
/*************************** - Fix Flickering Background Images    *****/
/*************************** - sIFR 2.0.7                          *****/
/*************************** - Prototype extensions                *****/
/*************************** - SWFObject v1.5.1                    *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-01-13 10:53:52 +0100 (Di, 13 Jan 2009) $ *****/

/***********************************************************************/
/* START: browser detection                                            */

var Info = new function() {
	var userAgent = navigator.userAgent.toLowerCase();
	var b = {};
	b.isIE         = userAgent.indexOf("msie") != -1;
	b.isIE7        = b.isIE && (typeof window.XMLHttpRequest != "undefined");
	b.isIEpre7     = b.isIE && !b.isIE7;
	b.isIEpre6     = b.isIE && !document.compatMode;
	b.isSafari     = userAgent.indexOf("safari") != - 1;
	b.isSafariGte3 = b.isSafari && (userAgent.indexOf("version") > -1);
	b.isMozilla    = userAgent.indexOf("gecko") != -1 && b.isSafari == false;
	b.isFirefox    = b.isMozilla == true && userAgent.indexOf("firefox") != -1;
	b.isOpera      = typeof window.opera != "undefined";
	b.isKonqueror  = navigator.product != null && navigator.product.toLowerCase().indexOf("konqueror") > -1;
	this.browser = b;
	this.os = {
		isLinux: (navigator.platform.indexOf("Linux") == 0),
		isMac:   (navigator.platform.indexOf("Mac") == 0),
		isWin:   (navigator.platform.indexOf("Win") == 0)
	};
	this.hasTransparencySupport = true;
	if(this.os.isLinux || this.browser.isKonqueror || (this.os.isMac && !this.browser.isSafariGte3)) {
		this.hasTransparencySupport = false;
	}
}

/* END: browser detection                                              */
/***********************************************************************/
/* START: Fix Flickering Background Images                             */

if (window.createPopup && document.compatMode && document.compatMode=="CSS1Compat" && !window.XMLHttpRequest) {
	try{
		document.execCommand("BackgroundImageCache", false, true);
	} catch(e) {}
}

/* END: Fix Flickering Background Images                               */
/***********************************************************************/
/* START sIFR v2.0.7                                                   */
/*
	Copyright 2004 - 2008 Mark Wubben and Mike Davidson. Prior contributions by Shaun Inman and Tomas Jogin.
	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/

var hasFlash=function(){var a=6;if(navigator.appVersion.indexOf("MSIE")!=-1&&navigator.appVersion.indexOf("Windows")>-1){document.write('<script language="VBScript"\> \non error resume next \nhasFlash = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & '+a+'))) \n</script\> \n');if(window.hasFlash!=null)return window.hasFlash}if(navigator.mimeTypes&&navigator.mimeTypes["application/x-shockwave-flash"]&&navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){var b=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description;return parseInt(b.substr(b.indexOf(".")-2,2),10)>=a}return false}();String.prototype.normalize=function(){return this.replace(/\s+/g," ")};if(Array.prototype.push==null){Array.prototype.push=function(){var i=0,a=this.length,b=arguments.length;while(i<b){this[a++]=arguments[i++]}return this.length}}if(!Function.prototype.apply){Function.prototype.apply=function(a,b){var c=[];var d,e;if(!a)a=window;if(!b)b=[];for(var i=0;i<b.length;i++){c[i]="b["+i+"]"}e="a.__applyTemp__("+c.join(",")+");";a.__applyTemp__=this;d=eval(e);a.__applyTemp__=null;return d}}function named(a){return new named.Arguments(a)}named.Arguments=function(a){this.oArgs=a};named.Arguments.prototype.constructor=named.Arguments;named.extract=function(a,b){var c,d;var i=a.length;while(i--){d=a[i];if(d!=null&&d.constructor!=null&&d.constructor==named.Arguments){c=a[i].oArgs;break}}if(c==null)return;for(e in c)if(b[e]!=null)b[e](c[e]);return};var parseSelector=function(){var a=/^([^#.>`]*)(#|\.|\>|\`)(.+)$/;function r(s,t){var u=s.split(/\s*\,\s*/);var v=[];for(var i=0;i<u.length;i++)v=v.concat(b(u[i],t));return v}function b(c,d,e){c=c.normalize().replace(" ","`");var f=c.match(a);var g,h,i,j,k,n;var l=[];if(f==null)f=[c,c];if(f[1]=="")f[1]="*";if(e==null)e="`";if(d==null)d=document;switch(f[2]){case "#":k=f[3].match(a);if(k==null)k=[null,f[3]];g=document.getElementById(k[1]);if(g==null||(f[1]!="*"&&!o(g,f[1])))return l;if(k.length==2){l.push(g);return l}return b(k[3],g,k[2]);case ".":if(e!=">")h=m(d,f[1]);else h=d.childNodes;for(i=0,n=h.length;i<n;i++){g=h[i];if(g.nodeType!=1)continue;k=f[3].match(a);if(k!=null){if(g.className==null||g.className.match("(\\s|^)"+k[1]+"(\\s|$)")==null)continue;j=b(k[3],g,k[2]);l=l.concat(j)}else if(g.className!=null&&g.className.match("(\\s|^)"+f[3]+"(\\s|$)")!=null)l.push(g)}return l;case ">":if(e!=">")h=m(d,f[1]);else h=d.childNodes;for(i=0,n=h.length;i<n;i++){g=h[i];if(g.nodeType!=1)continue;if(!o(g,f[1]))continue;j=b(f[3],g,">");l=l.concat(j)}return l;case "`":h=m(d,f[1]);for(i=0,n=h.length;i<n;i++){g=h[i];j=b(f[3],g,"`");l=l.concat(j)}return l;default:if(e!=">")h=m(d,f[1]);else h=d.childNodes;for(i=0,n=h.length;i<n;i++){g=h[i];if(g.nodeType!=1)continue;if(!o(g,f[1]))continue;l.push(g)}return l}}function m(d,o){if(o=="*"&&d.all!=null)return d.all;return d.getElementsByTagName(o)}function o(p,q){return q=="*"?true:p.nodeName.toLowerCase().replace("html:", "")==q.toLowerCase()}return r}();var sIFR=function(){var a="http://www.w3.org/1999/xhtml";var b=false;var c=false;var d;var ah=[];var al=document;var ak=al.documentElement;var am=window;var au=al.addEventListener;var av=am.addEventListener;var f=function(){var g=navigator.userAgent.toLowerCase();var f={a:g.indexOf("applewebkit")>-1,b:g.indexOf("safari")>-1,c:navigator.product!=null&&navigator.product.toLowerCase().indexOf("konqueror")>-1,d:g.indexOf("opera")>-1,e:al.contentType!=null&&al.contentType.indexOf("xml")>-1,f:true,g:true,h:null,i:null,j:null,k:null};f.l=f.a||f.c;f.m=!f.a&&navigator.product!=null&&navigator.product.toLowerCase()=="gecko";if(f.m&&g.match(/.*gecko\/(\d{8}).*/))f.j=new Number(g.match(/.*gecko\/(\d{8}).*/)[1]);f.n=g.indexOf("msie")>-1&&!f.d&&!f.l&&!f.m;f.o=f.n&&g.match(/.*mac.*/)!=null;if(f.d&&g.match(/.*opera(\s|\/)(\d+\.\d+)/))f.i=new Number(g.match(/.*opera(\s|\/)(\d+\.\d+)/)[2]);if(f.n||(f.d&&f.i<7.6))f.g=false;if(f.a&&g.match(/.*applewebkit\/(\d+).*/))f.k=new Number(g.match(/.*applewebkit\/(\d+).*/)[1]);if(am.hasFlash&&(!f.n||f.o)){var aj=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description;f.h=parseInt(aj.substr(aj.indexOf(".")-2,2),10)}if(g.match(/.*(windows|mac).*/)==null||f.o||f.c||(f.d&&(g.match(/.*mac.*/)!=null||f.i<7.6))||(f.b&&f.h<7)||(!f.b&&f.a&&f.k<312)||(f.m&&f.j<20020523))f.f=false;if(!f.o&&!f.m&&al.createElementNS)try{al.createElementNS(a,"i").innerHTML=""}catch(e){f.e=true}f.p=f.c||(f.a&&f.k<312);return f}();function at(){return{bIsWebKit:f.a,bIsSafari:f.b,bIsKonq:f.c,bIsOpera:f.d,bIsXML:f.e,bHasTransparencySupport:f.f,bUseDOM:f.g,nFlashVersion:f.h,nOperaVersion:f.i,nGeckoBuildDate:f.j,nWebKitVersion:f.k,bIsKHTML:f.l,bIsGecko:f.m,bIsIE:f.n,bIsIEMac:f.o,bUseInnerHTMLHack:f.p}}if(am.hasFlash==false||!al.getElementsByTagName||!al.getElementById||(f.e&&(f.p||f.n)))return{UA:at()};function af(e){if((!k.bAutoInit&&(am.event||e)!=null)||!l(e))return;b=true;for(var i=0,h=ah.length;i<h;i++)j.apply(null,ah[i]);ah=[]}var k=af;function l(e){if(c==false||k.bIsDisabled==true||((f.e&&f.m||f.l)&&e==null&&b==false)||al.getElementsByTagName("body").length==0)return false;return true}function m(n){if(f.n)return n.replace(new RegExp("%\d{0}","g"),"%25");return n.replace(new RegExp("%(?!\d)","g"),"%25")}function as(p,q){return q=="*"?true:p.nodeName.toLowerCase().replace("html:", "")==q.toLowerCase()}function o(p,q,r,s,t){var u="";var v=p.firstChild;var w,x,y,z;if(s==null)s=0;if(t==null)t="";while(v){if(v.nodeType==3){z=v.nodeValue.replace("<","&lt;");switch(r){case "lower":u+=z.toLowerCase();break;case "upper":u+=z.toUpperCase();break;default:u+=z}}else if(v.nodeType==1){if(as(v,"a")&&!v.getAttribute("href")==false){if(v.getAttribute("target"))t+="&sifr_url_"+s+"_target="+v.getAttribute("target");t+="&sifr_url_"+s+"="+m(v.getAttribute("href")).replace(/&/g,"%26");u+='<a href="asfunction:_root.launchURL,'+s+'">';s++}else if(as(v,"br"))u+="<br/>";if(v.hasChildNodes()){y=o(v,null,r,s,t);u+=y.u;s=y.s;t=y.t}if(as(v,"a"))u+="</a>"}w=v;v=v.nextSibling;if(q!=null){x=w.parentNode.removeChild(w);q.appendChild(x)}}return{"u":u,"s":s,"t":t}}function A(B){if(al.createElementNS&&f.g)return al.createElementNS(a,B);return al.createElement(B)}function C(D,E,z){var p=A("param");p.setAttribute("name",E);p.setAttribute("value",z);D.appendChild(p)}function F(p,G){var H=p.className;if(H==null)H=G;else H=H.normalize()+(H==""?"":" ")+G;p.className=H}function aq(ar){var a=ak;if(k.bHideBrowserText==false)a=al.getElementsByTagName("body")[0];if((k.bHideBrowserText==false||ar)&&a)if(a.className==null||a.className.match(/\bsIFR\-hasFlash\b/)==null)F(a, "sIFR-hasFlash")}function j(I,J,K,L,M,N,O,P,Q,R,S,r,T){if(!l())return ah.push(arguments);aq();named.extract(arguments,{sSelector:function(ap){I=ap},sFlashSrc:function(ap){J=ap},sColor:function(ap){K=ap},sLinkColor:function(ap){L=ap},sHoverColor:function(ap){M=ap},sBgColor:function(ap){N=ap},nPaddingTop:function(ap){O=ap},nPaddingRight:function(ap){P=ap},nPaddingBottom:function(ap){Q=ap},nPaddingLeft:function(ap){R=ap},sFlashVars:function(ap){S=ap},sCase:function(ap){r=ap},sWmode:function(ap){T=ap}});var U=parseSelector(I);if(U.length==0)return false;if(S!=null)S="&"+S.normalize();else S="";if(K!=null)S+="&textcolor="+K;if(M!=null)S+="&hovercolor="+M;if(M!=null||L!=null)S+="&linkcolor="+(L||K);if(O==null)O=0;if(P==null)P=0;if(Q==null)Q=0;if(R==null)R=0;if(N==null)N="#FFFFFF";if(T=="transparent")if(!f.f)T="opaque";else N="transparent";if(T==null)T="";var p,V,W,X,Y,Z,aa,ab,ac;var ad=null;for(var i=0,h=U.length;i<h;i++){p=U[i];if(p.className!=null&&p.className.match(/\bsIFR\-replaced\b/)!=null)continue;V=p.offsetWidth-R-P;W=p.offsetHeight-O-Q;aa=A("span");aa.className="sIFR-alternate";ac=o(p,aa,r);Z="txt="+m(ac.u).replace(/\+/g,"%2B").replace(/&/g,"%26").replace(/\"/g, "%22").normalize() + S + "&w=" + V + "&h=" + W + ac.t;F(p,"sIFR-replaced");if(ad==null||!f.g){if(!f.g){if(!f.n)p.innerHTML=['<embed class="sIFR-flash" type="application/x-shockwave-flash" src="',J,'" quality="best" wmode="',T,'" bgcolor="',N,'" flashvars="',Z,'" width="',V,'" height="',W,'" sifr="true"></embed>'].join("");else p.innerHTML=['<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" sifr="true" width="',V,'" height="',W,'" class="sIFR-flash"><param name="movie" value="',J,'"></param><param name="flashvars" value="',Z,'"></param><param name="quality" value="best"></param><param name="wmode" value="',T,'"></param><param name="bgcolor" value="',N,'"></param> </object>'].join('')}else{if(f.d){ab=A("object");ab.setAttribute("data",J);C(ab,"quality","best");C(ab,"wmode",T);C(ab,"bgcolor",N)}else{ab=A("embed");ab.setAttribute("src",J);ab.setAttribute("quality","best");ab.setAttribute("flashvars",Z);ab.setAttribute("wmode",T);ab.setAttribute("bgcolor",N)}ab.setAttribute("sifr","true");ab.setAttribute("type","application/x-shockwave-flash");ab.className="sIFR-flash";if(!f.l||!f.e)ad=ab.cloneNode(true)}}else ab=ad.cloneNode(true);if(f.g){if(f.d)C(ab,"flashvars",Z);else ab.setAttribute("flashvars",Z);ab.setAttribute("width",V);ab.setAttribute("height",W);ab.style.width=V+"px";ab.style.height=W+"px";p.appendChild(ab)}p.appendChild(aa);if(f.p)p.innerHTML+=""}if(f.n&&k.bFixFragIdBug)setTimeout(function(){al.title=d},0)}function ai(){d=al.title}function ae(){if(k.bIsDisabled==true)return;c=true;if(k.bHideBrowserText)aq(true);if(am.attachEvent)am.attachEvent("onload",af);else if(!f.c&&(al.addEventListener||am.addEventListener)){if(f.a&&f.k>=132&&am.addEventListener)am.addEventListener("load",function(){setTimeout("sIFR({})",1)},false);else{if(al.addEventListener)al.addEventListener("load",af,false);if(am.addEventListener)am.addEventListener("load",af,false)}}else if(typeof am.onload=="function"){var ag=am.onload;am.onload=function(){ag();af()}}else am.onload=af;if(!f.n||am.location.hash=="")k.bFixFragIdBug=false;else ai()}k.UA=at();k.bAutoInit=true;k.bFixFragIdBug=true;k.replaceElement=j;k.updateDocumentTitle=ai;k.appendToClassName=F;k.setup=ae;k.debug=function(){aq(true)};k.debug.replaceNow=function(){ae();k()};k.bIsDisabled=false;k.bHideBrowserText=true;return k}();

function setup_sifr() {
	if(typeof sIFR == "function" && !sIFR.UA.bIsIEMac && !sIFR.UA.bIsOpera && (!sIFR.UA.bIsWebKit || sIFR.UA.nWebKitVersion >= 100) && USE_SIFR) {
		sIFR.setup();
	};
}

/* END: sIFR 2.0.7                                                     */
/***********************************************************************/
/* START: Prototype extensions                                         */

Object.extend(Event, {
	_domReady : function() {
		if (arguments.callee.done) return;
		arguments.callee.done = true;

		if (this._timer)  clearInterval(this._timer);

		this._readyCallbacks.each(function(f) { f() });
		this._readyCallbacks = null;
	},
	onDOMReady : function(f) {
		if (!this._readyCallbacks) {
			var domReady = this._domReady.bind(this);

			if (document.addEventListener)
				document.addEventListener("DOMContentLoaded", domReady, false);

				/*@cc_on @*/
				/*@if (@_win32)
					document.write("<script id=__ie_onload defer src=//:><\/script>");
					document.getElementById("__ie_onload").onreadystatechange = function() {
						if (this.readyState == "complete") domReady();
					};
				/*@end @*/

				if (/WebKit/i.test(navigator.userAgent)) {
					this._timer = setInterval(function() {
						if (/loaded|complete/.test(document.readyState)) domReady();
					}, 10);
				}

				Event.observe(window, "load", domReady);
				Event._readyCallbacks =  [];
			}
		Event._readyCallbacks.push(f);
	}
});

Position.getWindowSize = function(w)
{
	var width, height;
	w = w ? w : window;
	width = w.innerWidth || (w.document.documentElement.clientWidth || w.document.body.clientWidth);
	height = w.innerHeight || (w.document.documentElement.clientHeight || w.document.body.clientHeight);
	return { width: width, height: height };
}

// script.aculo.us builder.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

var Builder = {
	NODEMAP: {
		AREA: 'map',
		CAPTION: 'table',
		COL: 'table',
		COLGROUP: 'table',
		LEGEND: 'fieldset',
		OPTGROUP: 'select',
		OPTION: 'select',
		PARAM: 'object',
		TBODY: 'table',
		TD: 'table',
		TFOOT: 'table',
		TH: 'table',
		THEAD: 'table',
		TR: 'table'
	},
	// note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
	// due to a Firefox bug
	node: function(elementName) {
		elementName = elementName.toUpperCase();

		// try innerHTML approach
		var parentTag = this.NODEMAP[elementName] || 'div';
		var parentElement = document.createElement(parentTag);
		try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
			parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
		} catch(e) {}
		var element = parentElement.firstChild || null;

		// see if browser added wrapping tags
		if(element && (element.tagName.toUpperCase() != elementName))
			element = element.getElementsByTagName(elementName)[0];

		// fallback to createElement approach
		if(!element) element = document.createElement(elementName);

		// abort if nothing could be created
		if(!element) return;

		// attributes (or text)
		if(arguments[1])
			if(this._isStringOrNumber(arguments[1]) ||
				(arguments[1] instanceof Array) ||
				arguments[1].tagName) {
					this._children(element, arguments[1]);
				} else {
					var attrs = this._attributes(arguments[1]);
					if(attrs.length) {
						try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
							parentElement.innerHTML = "<" +elementName + " " +
								attrs + "></" + elementName + ">";
						} catch(e) {}
						element = parentElement.firstChild || null;
						// workaround firefox 1.0.X bug
						if(!element) {
							element = document.createElement(elementName);
							for(attr in arguments[1])
								element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
						}
						if(element.tagName.toUpperCase() != elementName)
							element = parentElement.getElementsByTagName(elementName)[0];
					}
				}

		// text, or array of children
		if(arguments[2])
			this._children(element, arguments[2]);

		return element;
	},
	_text: function(text) {
		return document.createTextNode(text);
	},

	ATTR_MAP: {
		'className': 'class',
		'htmlFor': 'for'
	},

	_attributes: function(attributes) {
		var attrs = [];
		for(attribute in attributes)
			attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
					'="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
		return attrs.join(" ");
	},
	_children: function(element, children) {
		if(children.tagName) {
			element.appendChild(children);
			return;
		}
		if(typeof children=='object') { // array can hold nodes and text
			children.flatten().each( function(e) {
				if(typeof e=='object')
					element.appendChild(e)
				else
					if(Builder._isStringOrNumber(e))
						element.appendChild(Builder._text(e));
			});
		} else
			if(Builder._isStringOrNumber(children))
				element.appendChild(Builder._text(children));
	},
	_isStringOrNumber: function(param) {
		return(typeof param=='string' || typeof param=='number');
	},
	build: function(html) {
		var element = this.node('div');
		$(element).update(html.strip());
		return element.down();
	},
	dump: function(scope) {
		if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope

		var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
			"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
			"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
			"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
			"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
			"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);

		tags.each( function(tag){
			scope[tag] = function() {
				return Builder.node.apply(Builder, [tag].concat($A(arguments)));
			}
		});
	}
}
/* END: Prototype extensions                                           */
/***********************************************************************/
/* START: SWFObject v1.5.1 (http://blog.deconcept.com/swfobject/)      */

if(typeof deconcept=="undefined"){var deconcept={};}if(typeof deconcept.util=="undefined"){deconcept.util={};}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil={};}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params={};this.variables={};this.attributes=[];if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10]||"";},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15]||"";},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=[];var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+(this.getAttribute("style")||"")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+(this.getAttribute("style")||"")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;

/* END: SWFObject v1.5.1                                               */
/***********************************************************************/
/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/************************************************* javascript core *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-01-13 10:53:52 +0100 (Di, 13 Jan 2009) $ *****/

// constants

var USE_FLASH_IN_HEADER = false; // could be overwritten in template

var SAFARI_STYLESHEET_REFERENCE = RESOURCES_PATH + "css/styles-safari.css";
var MACOS_STYLESHEET_REFERENCE  = RESOURCES_PATH + "css/styles-macos.css";
var SIFR_SLAB_PATH              = RESOURCES_PATH + "sifr/siemensslab.swf";

var LINK_REL_REGEX = /^jump-to-(.+)$/;

// global vars

var zone     = {};   // global hash for standard zones
var pageType = null; // page type, set in initGlobals()

// serve special styles for Safari and Mac OS

if (Info.browser.isSafari) document.write ("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + SAFARI_STYLESHEET_REFERENCE + "\" />");
if (Info.os.isMac)         document.write ("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + MACOS_STYLESHEET_REFERENCE + "\" />");

/********************************************************************/
/* START: layout initalisation                                      */

// inits global vars as std zones and page type

function initGlobals() {
	var ptReg = /^page-type-/;
	pageType = $(document.body).classNames().find(function(className) {
		return ptReg.test(className);
	}).replace(ptReg, "");

	$A(["content", "header"]).each(function(zoneId) {
		try {
			var _zone = $(zoneId + "-zone");
			if (!_zone) {
				throw ("Implementation Exception: Zone " + zoneId + " is missing.");
			}
			zone[zoneId] = _zone;
		} catch (e) {
			alert(e);
			return false;
		}
	});
	return true;
}

// provides min-width/max-width for IE < 7

function initLayout_IEPre7() {

	var innerWidth = Position.getWindowSize().width;
	if ($("toolbar-zone")) {
		if (innerWidth <= 996 && innerWidth > 982) {
			$("toolbar-zone").setStyle({"width": (innerWidth - 56) + "px"});
		} else if (innerWidth > 996) {
			$("toolbar-zone").setStyle({"width": "940px"});
		} else {
			$("toolbar-zone").setStyle({"width": "926px"});
		}
	}

	if (innerWidth > 960) {
		$("content-zone").style.width = "auto";
	} else {
		$("content-zone").style.width = "960px";
	}

	if ($("headervisual-zone") && $("fluid-zone") && pageType != "1" && pageType != "entry") {
		var realHeaderWidth = $("headervisual-zone").getWidth() + $("fluid-zone").getWidth();
		if (innerWidth <= realHeaderWidth) {
			var fluidWidth = $("fluid-zone").getWidth();
			var newWidth = innerWidth;
			newWidth = (newWidth - fluidWidth < 364) ? fluidWidth + 364 : newWidth;
			zone.header.setStyle({"width": newWidth + "px"});
		} else {
			zone.header.setStyle({"width": realHeaderWidth + "px"});
		}
	}
}

// inits sifr

function initLayout_sifr() {
	if (typeof sIFR != "function" || Info.browser.isOpera || Info.os.isLinux) return;

	sIFR.replaceElement(named({sSelector:"div.link-list span.sifr", sFlashSrc: SIFR_SLAB_PATH, sColor:"#666666", sHoverColor:"#990000", sWmode:"transparent"}));
	sIFR.replaceElement(named({sSelector:"div.sifr h3", sFlashSrc: SIFR_SLAB_PATH, sColor:"#333333", sWmode:"transparent"}));
	sIFR.replaceElement(named({sSelector:"div.sifr-h1 h1", sFlashSrc: SIFR_SLAB_PATH, sColor:"#333333", sWmode:"transparent"}));
	sIFR.replaceElement(named({sSelector:"div.sifr-h2 h2", sFlashSrc: SIFR_SLAB_PATH, sColor:"#666666", sWmode:"transparent"}));
	sIFR.replaceElement(named({sSelector:"div.sifr-header h1", sFlashSrc: SIFR_SLAB_PATH, sColor:"#ffffff", sWmode:"transparent"}));
	sIFR.replaceElement(named({sSelector:"div.sifr-header h2", sFlashSrc: SIFR_SLAB_PATH, sColor:"#ffffff", sWmode:"transparent"}));
	sIFR.replaceElement(named({sSelector:"div.sifr-header h3", sFlashSrc: SIFR_SLAB_PATH, sColor:"#ffffff", sHoverColor:"#990000", sWmode:"transparent"}));
}

// replaces search button and generic buttons by a-elements to provide css styled buttons

function initLayout_buttons() {
	$$("button#site-search-button", "button.generic").each(function(elt) {

		if (!elt.form.id) {
			elt.form.id = Helper.getUniqueId();
		}

		var caption      = $(elt).innerHTML;
		var jsCode       = "javascript:submitForm('" + elt.form.id + "');";
		var cssClassName = (elt.id == "site-search-button") ? "search-button" : "generic-button";

		if (elt.id == "site-search-button") {
			linkAsButton = Builder.node('a', { className: cssClassName, href : jsCode}, [caption]);
		} else {
			linkAsButton = Builder.node('a', { className: cssClassName, href : jsCode}, [
				Builder.node('span', [Builder.node('span', [caption])])
			]);
		}
		$(elt).parentNode.replaceChild($(linkAsButton), $(elt));

	});
}
/* END: layout initalisation                                        */
/********************************************************************/
/* START: functional initalisation                                  */

function init_contentLayers() {
	if ($("toolbar-nav")) {
		$A($("toolbar-nav").getElementsByTagName("a")).each(
			function(trigger) {
				trigger = $(trigger);
				if (LINK_REL_REGEX.test(trigger.rel)) { // layer link
					var id = trigger.rel.replace(LINK_REL_REGEX, "$1");
					var node = $("toolbar-layer-" + id);
					new ContentLayer(node, trigger);
				} else { // standard link, probably external
					trigger.observe("click", function() {
						HeaderAnimation.animate = false;
						Layer.closeCurrent();
						HeaderAnimation.animate = true;
					}.bindAsEventListener(this));
				}
			}.bind(this)
		);
	}
}

function init_siteIdLayer() {
	if(Info.browser.isIEpre6) { return; }
	if ($("site-id-layer")) {
		trigger = $($("site-id").getElementsByTagName("a")[0]);
		new SiteIdLayer($("site-id-layer"), trigger);

		//initalize list element hovers
		$$("#site-id-layer a[lang]").each(function(e) {
			Event.observe(e, "mouseover", function() {
				$(e).up("li", 0).addClassName("hover");
			});
			Event.observe(e, "mouseout", function() {
				$(e).up("li", 0).removeClassName("hover");
			});
		});

		//workaround for missing adjacent sibling combinator ("ul.countries li a.c:hover + a" and "ul.countries li a.worldwide:hover + a") support in IE6 and Safari
		if(Info.browser.isIEpre7 || Info.browser.isSafari) {
			$A($("site-id-layer").getElementsByTagName("a")).each(function(e) {
				if($(e).hasClassName("c") || $(e).hasClassName("worldwide")) {
					Event.observe(e, "mouseover", function() {
						$(e).next("a").addClassName("hover");
					});
					Event.observe(e, "mouseout", function() {
						$(e).next("a").removeClassName("hover");
					});
				}
			});
		}
	}
}

function init_siteExplorer() {
	if ($("site-explorer-layer")) {
		trigger = $($("sitemap-link").getElementsByTagName("a")[0]);
		SiteExplorer.layer = new SiteExplorerLayer($("site-explorer-layer"), trigger);
	}
}

/* END: functional initalisation                                    */
/********************************************************************/
/* START: "abstract" layer - do not instantiate                     */

var Layer = Class.create();

Layer.current = null;
Layer.toggle = false;

Layer.initialize = function() {
	Event.observe(document, "click", function(e) {
		if (Layer.current) {
			var element   = $(Event.element(e));
			var layerNode = Layer.current.node;
			if (element != layerNode && !element.descendantOf(layerNode)) {
				Layer.closeCurrent();
			}
		}
	});

	Event.observe(document, 'keypress', function(e) {
		if (Layer.current) {
			var code = e.keyCode;
			if (code == Event.KEY_ESC) {
				Layer.closeCurrent();
			} else {
				if (Layer.current.onkeypress) {
					Layer.current.onkeypress(e);
				}
			}
		}
	});
}

Layer.closeCurrent = function(newLayer) {
    if (Layer.current) {
        return Layer.current.close(newLayer);
        Layer.current = null;
    }
    return true; /* nothing to close, but ok */
}

Layer.prototype = {

    initialize: function() {
    },

    initSuper: function(node, trigger) {
        this.node = node;
        this.isOpen = false;
        this.trigger = trigger || null;

        if (this.trigger) {
            this.trigger.observe("click", function(e) { this.toggle(); Event.stop(e); } .bindAsEventListener(this));
        }

        if (Info.browser.isIEpre7) {
            this.iframeLining = new IframeLining(this.node);
            this.correctIframe();
        }

    },

    open: function() {
        Layer.toggle = !!Layer.current;
        if (Layer.closeCurrent(this)) {
            if (this.beforeOpen()) {
                this.show();
                if (this.iframeLining) {
                    this.iframeLining.show();
                }
                this.isOpen = true;
                Layer.current = this;
                Layer.toggle = false;
                this.afterOpen();
                return true;
            }
        }

        return false;
    },

    close: function(newLayer) {    
        if (this.beforeClose(newLayer)) {
            if (this.iframeLining) {
                this.iframeLining.hide();
            }
            this.hide(newLayer);
            this.isOpen = false;
            Layer.current = null;
            this.afterClose(newLayer);
            try {
                  Cufon.refresh(); // refresh cufon for hover fix
            } catch (e) { } 
            return true;
        }
        try {
            Cufon.refresh(); // refresh cufon for hover fix
        } catch (e) { } 
        return false;
    },

    toggle: function() {
        if (this.isOpen) {
            this.close();
        } else {
            this.open();
        }
    },

    afterClose: function() { },

    afterOpen: function() { },

    beforeClose: function() {
        return true;
    },

    beforeOpen: function() {
        return true;
    },

    correctIframe: function() { },

    hide: function(newLayer) { },

    show: function() { },

    superSetOffset: function(offset) {
        this.setOffset(offset);
        if (this.iframeLining) {
            this.iframeLining.refresh();
        }
    },

    setOffset: function(offset) { }

}

/* END: "abstract" layer                                            */
/********************************************************************/
/* START: content layer e. g. contact layer                         */

var ContentLayer = Class.create();

ContentLayer.prototype = Object.extend(new Layer, {

	initialize: function(node, trigger) {
		this.initSuper(node, trigger);

		var closeButton = Helper.getCloseButton(this.node);

		if (!closeButton) alert("Implementation Error: no close button found");

		closeButton.observe("click",
			function() {
				this.close();
			}.bindAsEventListener(this)
		);
	},

	afterClose: function(newLayer) {
		if (!Layer.toggle) {
			HeaderAnimation.augment();
		}
	},

	afterOpen: function() {
		HeaderAnimation.diminish();
	},

	beforeClose: function() {
		HeaderAnimation.unregisterLayer();
		return true;
	},

	beforeOpen: function() {
		HeaderAnimation.registerLayer(this);
		return true;
	},

	hide: function() {
		this.node.removeClassName("active-layer");
		this.trigger.up().removeClassName("active");
	},

	show: function() {
		this.node.addClassName("active-layer");
		this.trigger.up().addClassName("active");
		this.trigger.addClassName("clicked"); // avoids hover effect (only for the first time)
		this.trigger.observe("mouseout",
			function(e) {
				var elm = Event.findElement(e, "a");
				elm.removeClassName("clicked");
				elm.stopObserving("mouseout");
			}
		);
	},

	setOffset:function(offset) {
		this.node.style.top = offset + "px";
	}

});

/* END: content layer                                               */
/********************************************************************/
/* START: site id                                                   */

var SiteIdLayer = Class.create();

SiteIdLayer.prototype = Object.extend(new Layer, {

	initialize: function(node, trigger) {
		this.initSuper(node, trigger);
		var closeButton = Helper.getCloseButton(this.node);
		closeButton.observe("click", function(){this.close();}.bindAsEventListener(this));
	},

	afterClose: function(newLayer) {
		if (!Layer.toggle) {
			HeaderAnimation.augment();
		}
	},

	afterOpen: function() {
		HeaderAnimation.diminish();
	},

	beforeClose: function() {
		HeaderAnimation.unregisterLayer();
		return true;
	},

	beforeOpen: function() {
		HeaderAnimation.registerLayer(this);
		return true;
	},

	correctIframe: function() {
		this.iframeLining.correction.left = -1;
		this.iframeLining.correction.top = -1;
	},

	hide: function() {
		$("site-id-wrapper").removeClassName("active");
	},

	show: function() {
		$("site-id-wrapper").addClassName("active");
		this.trigger.addClassName("clicked"); // avoids hover effect (only for the first time)
		this.trigger.observe("mouseout",
			function(e) {
				this.trigger.removeClassName("clicked");
				this.trigger.stopObserving("mouseout");
			}.bindAsEventListener(this)
		);
	}

});

/* END: site id                                                     */
/********************************************************************/
/* START: site explorer                                             */

var SiteExplorer = Class.create();

SiteExplorer.getContent = function() {
	// overwrite this to implement a custom method
	alert("Implementation Error: SiteExplorer.getContent is missing");
}

SiteExplorer.registerEvents = function(contentNode) {
	$A(contentNode.getElementsByTagName("a")).each(function(link) {
		link = $(link);
		if (link.hasClassName("page")) {
			link.observe("click", function(e) {
				SiteExplorer.followLink(link);
			});
		} else {
			link.observe("click", function(e) {
				SiteExplorer.toggleSubtree(link);
			});
		}
	});
}

SiteExplorer.toggleSubtree = function(node) {
	if (node.up().hasClassName("expanded")) {
		SiteExplorer.collapseSubtree(node);
	} else {
		SiteExplorer.expandSubtree(node);
	}
}

SiteExplorer.followLink = function(linkNode) {
	// not implemented
}

SiteExplorer.expandSubtree = function(linkNode) {
	// not implemented
}

SiteExplorer.collapseSubtree = function(linkNode) {
	// not implemented
}

/* END: site explorer                                               */
/********************************************************************/
/* START: site explorer layer                                       */
var SiteExplorerLayer = Class.create();

SiteExplorerLayer.prototype = Object.extend(new Layer, {

	initialize: function(node, trigger) {
		this.initSuper(node, trigger);

		var closeButton = Helper.getCloseButton(this.node);

		closeButton.observe("click",
			function() {
				this.close();
			}.bindAsEventListener(this)
		);

		this.content     = null;
		this.contentNode = $(document.createElement("div"));
		this.node.appendChild(this.contentNode);
	},

	afterClose: function(newLayer) {
		if (!Layer.toggle) {
			HeaderAnimation.augment();
		}
		// W2G custom
    if (Info.browser.isIEpre7) {
      if (myIE6iFrame){
        myIE6iFrame.hide();
      }
    }
	},

	afterOpen: function() {
		if (Info.browser.isIE) { // correct float bug in all IE versions
			Helper.getCloseButton(this.node).setStyle(
				{
					position: "absolute",
					left: (this.contentNode.getDimensions().width - 20) + "px"
				}
			);
		}
		HeaderAnimation.diminish();
	},

	beforeClose: function() {
		HeaderAnimation.unregisterLayer();
		return true;
	},

	beforeOpen: function() {
		this.getContent();
		HeaderAnimation.registerLayer(this);
		return true;
	},

	hide: function() {
		$("site-explorer").removeClassName("active");
	},

	show: function() {    
		$("site-explorer").addClassName("active");
		this.trigger.addClassName("clicked"); // avoids hover effect (only for the first time)
		this.trigger.observe("mouseout",
			function(e) {
				this.trigger.removeClassName("clicked");
				this.trigger.stopObserving("mouseout");
			}.bindAsEventListener(this)
		);
	},

	getContent: function() {	  
		if (!this.content) {
      this.content = SiteExplorer.getContent();
      // W2G CUSTOM 
      //	this.contentNode.innerHTML = this.content;
			SiteExplorer.registerEvents(this.contentNode);
		}
	}

});

/* END: site explorer layer                                         */
/********************************************************************/
/* START: header zone animation                                     */

var HeaderAnimation = Class.create();

HeaderAnimation.initialize = function() {
	this.layer         = null;
	this.slide         = {}
	this.animate       = true;
	this.augmented     = true;
	this.listenerQueue = new ListenerQueue('');

	if (pageType == "1" || pageType == "2" || pageType == "entry") {
		if (USE_FLASH_IN_HEADER && !Info.hasTransparencySupport) {
			// deactivate animation on browsers that have problems with wmode=transparent */
			this.diminishable = false;
		} else {
			this.diminishable = true;
		}
	} else {
		this.diminishable = false;
	}

	this.diminish      = (this.diminishable) ? this.diminish_393 : function() {};
	this.augment       = (this.diminishable) ? this.augment_393 : function() {};

	this.toolbarNode   = $("toolbar-nav");
	this.toolbarHeight = (this.toolbarNode) ? this.toolbarNode.up().getHeight() : 0;
}

HeaderAnimation.augment_393 = function() {
	if (!this.augmented) {
		this.listenerQueue.fire('augmentBegin');
		if (this.animate) {
			this._toggleAnimated([154, 174, 204, 244, 284, 324, 354, 385, 393]);
		} else {
			this._toggle(393);
		}
		this.augmented = true;
	}
}

HeaderAnimation.diminish_393 = function() {
	if (this.augmented) {
		this.listenerQueue.fire('diminishBegin');
		if (this.animate) {
			this._toggleAnimated([363, 313, 263, 213, 183, 163, 152, 144]);
		} else {
			this._toggle(144);
		}
		this.augmented = false;
		
	}
}

HeaderAnimation.registerLayer = function(layer) {
	this.layer = layer;
	if (this.layer) {
		this.layer.superSetOffset(this.toolbarHeight + Position.cumulativeOffset(this.toolbarNode)[1]);
	}
}

HeaderAnimation.unregisterLayer = function() {
	this.layer = null;
}

HeaderAnimation._toggle = function(offset) {
	this.diminished = !this.diminished;
	this._setOffsets(offset);
	if (this.diminished) {
		this.listenerQueue.fire('diminishDone');
	} else {
		this.listenerQueue.fire('augmentDone');
	}
}

HeaderAnimation._toggleAnimated = function(offsets) {
	this.slide.offsets = offsets;
	this.slide.length = offsets.length;
	this.slide.index = 1;

	this._toggle(this.slide.offsets[0]);
	new PeriodicalExecuter(function(pe) {
		if (this.slide.index >= this.slide.length) {
			this.diminished = !this.diminished;
			if (this.diminished) {
				this.listenerQueue.fire('diminishDone');
			} else {
				this.listenerQueue.fire('augmentDone');
			}
			pe.stop();
		} else {
			this._setOffsets(this.slide.offsets[this.slide.index]);
			this.slide.index++;
		}
	}.bind(this), .06);
}

HeaderAnimation._setOffsets = function(offset) {
	$(document.body).style.backgroundPosition = "0 " + (offset - 393) + "px";
	zone.header.style.height = offset + "px";
	if (this.layer) {
		this.layer.superSetOffset(this.toolbarHeight + 1 + offset);
	}
}

/* END: header zone animation                                       */
/********************************************************************/
/* START: Listener queue                                            */

ListenerQueue = Class.create();

ListenerQueue.prototype = {
	initialize: function(wildcardHandlerName) {
		this._listeners = [];
		this._wildcardHandlerName = wildcardHandlerName;
	},

	add: function(listener) {
		this._listeners.push(listener);
	},

	remove: function(listener) {
		var listeners = this._listeners;
		for (var i = 0; i < listeners.length; i++) {
			if (listeners[i] == listener) {
				listeners.splice(i, 1);
				break;
			}
		}
	},

	fire: function(handlerName, args) {
		var listeners = [].concat(this._listeners);
		for (var i = 0; i < listeners.length; i++) {
			var listener = listeners[i];
			try {
				listener[handlerName].call()
			} catch(e) {
				//if there is no handler with handlerName
				if (this._wildcardHandlerName)listener[this._wildcardHandlerName].call();
			}
		}
	}
}

/* END: Listener queue                                              */
/********************************************************************/
/* START: iframe to hide select elements in IE<7                    */

var IframeLining = Class.create();

IframeLining.prototype = {

	initialize: function(layer) {
		this.layer = layer;
		this.active = false;
		this.correction = {
			width:  0,
			height: 0,
			left:   0,
			top:    0
		} // since cumulativeOffset doesn't include borders

		this.div = $(document.createElement("div"));
		this.div.innerHTML = '<iframe src="javascript:false" frameborder="0" style="position:absolute; left:0; top:0; width:100%; height:100%; margin:0; padding:0; background:transparent; filter:alpha(opacity=0);"></iframe>';
		this.hide();
		document.body.appendChild(this.div);
	},

	show: function() {
		this.refresh();
		this.div.show();
		this.active = true;
	},

	refresh: function() {
		var dimension = $(this.layer).getDimensions();
		var position  = Position.cumulativeOffset(this.layer);
		this.div.setStyle(
			{
				height: (dimension.height + this.correction.height) + "px",
				left:   (position[0] + this.correction.left)        + "px",
				top:    (position[1] + this.correction.top)         + "px",
				width:  (dimension.width + this.correction.width)   + "px",
				position: "absolute",
				zIndex:   "1"
			}
		);
	},

	setOffset: function(offset) {
		this.div.style.top = offset + "px";
	},

	hide: function() {
		this.div.hide();
		this.active = false;
	}
}

/* END: iframe to hide select elements in IE<7                    */
/********************************************************************/
/* START: misc. helper                                              */

var Location = Class.create();

Location.setMarker = function(id) {
	// not implemented
}

Location.clearMarker = function() {
	// not implemented
}

var Popup = Class.create();

Popup.open = function(url, name, options) {
	options = $H(options).toQueryString().replace(/&/g, ",");
	window.open(url, name, options).focus();
}

var Helper = Class.create();

Helper._uniqueIdInt = 0;

Helper.getUniqueId = function() {
	Helper._uniqueIdInt++;
	return "unique-" + Helper._uniqueIdInt;
}

Helper.getCloseButton = function(layer) {
	var closeButton = layer.down("div.close");
	if (!closeButton) { // could be IE<6
		$A(layer.getElementsByTagName("div")).each(
			function(div) {
				if ($(div).hasClassName("close")) {
					closeButton = $(div);
				}
			}
		);
	}
	return closeButton;
}

// a wrapper to show a nicer function call in the status bar

function submitForm(id) {
	$(id).submit();
}

function init_newWindow(domChunk)
{
	$$(domChunk).each(function(element) {
		element.observe('click', function(e) {
			Event.stop(e);
			window.open(this.href);
			return false;
		}.bindAsEventListener(element))
	});
}

/* END: misc. helper                                                */
/********************************************************************/
/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/********************************************* module HeaderVisual *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-01-13 10:53:52 +0100 (Di, 13 Jan 2009) $ *****/

// swap header visuals

var HeaderVisual = Class.create();

HeaderVisual.initialize = function() {
	if ($("headervisual-zone") && $("headertext-zone")) {
		HeaderVisual.node = $("headervisual-zone");
		HeaderVisual.defaultContentNode = $("headertext-zone").down();

		$A($("content-zone").getElementsByTagName("ul")).findAll(function(elt) {
			return $(elt).hasClassName("js-swap-headervisual");
		}).each(function(elt) {
			$A(elt.getElementsByTagName("li")).each(function(elt) {
				new HeaderVisual($(elt));
			});
		});
	}
}

HeaderVisual.prototype = {
	initialize: function(listItem) {
		this.id     = listItem.id;
		this.source = headerVisualImages[this.id];
		this.loaded = false;
		this.active = false;

		this.initBgImage();
		listItem.observe("mouseover", function() {
			this.show();
		}.bindAsEventListener(this));

		listItem.observe("mouseout", function() {
			this.hide();
		}.bindAsEventListener(this));
	},

	initBgImage: function() {
		this.image  = new Image;

		this.image.onload = function() {
			this.loaded = true;
			if (this.active) {
				this.hideProgress();
				this.show();
			}
		}.bindAsEventListener(this);

		this.image.src = this.source;

		this.imageNode = document.createElement("div");
		this.imageNode.className = "swap-image-container";
		this.imageNode.style.backgroundImage = "url(" + this.source + ")";
		HeaderVisual.node.up().insertBefore(this.imageNode, HeaderVisual.node);
	},

	hide: function() {
		this.active = false;
		HeaderVisual.defaultContentNode.show();
		$("headertext-" + this.id).removeClassName("active");
		if (this.loaded) {
			this.imageNode.style.display = "none";
		} else {
			this.hideProgress();
		}
	},

	hideProgress: function() {
		// not implemented
	},

	show: function() {
		this.active = true;
		HeaderVisual.defaultContentNode.hide();

		/** ff 3.0 mac fix removing headertext-container **/
		if(Info.os.isMac && Info.browser.isMozilla) {
			$$('div.headertext-content').each(function(el) {
				$(el).removeClassName("active");
			});
			$$('div.swap-image-container').each(function(el) {
				$(el).style.display = "none";
			});
		}

		$("headertext-" + this.id).addClassName("active");
		if (this.loaded) {
			this.imageNode.style.display = "block";
		} else {
			this.showProgress();
		}
	},

	showProgress: function() {
		// not implemented
	}
}/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/************************************ module LanguageSelectorLayer *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-01-13 10:53:52 +0100 (Di, 13 Jan 2009) $ *****/

function init_languageSwitchLayer() {
	if ($("multi-language-switch")) {
		var trigger = $($("language-switch").getElementsByTagName("a")[0]);
		new LanguageSelectorLayer($("language-list"), trigger);
	}
}

var LanguageSelectorLayer = Class.create();

LanguageSelectorLayer.prototype = Object.extend(new Layer, {

	initialize: function(node, trigger) {
		this.initSuper(node, trigger);
	},

	afterClose: function(newLayer) {
		if (!Layer.toggle) {
			HeaderAnimation.augment();
		}
	},

	beforeClose: function() {
		HeaderAnimation.unregisterLayer();
		return true;
	},

	beforeOpen: function() {
		HeaderAnimation.registerLayer(this);
		return true;
	},

	correctIframe: function() {
		this.iframeLining.correction.left = -12;
	},

	hide: function() {
		$("multi-language-switch").removeClassName("active");
	},

	show: function() {
		$("multi-language-switch").addClassName("active");
		this.trigger.addClassName("clicked"); // avoids hover effect (only for the first time)
		this.trigger.observe("mouseout",
			function(e) {
				this.trigger.removeClassName("clicked");
				this.trigger.stopObserving("mouseout");
			}.bindAsEventListener(this)
		);
	}

});
/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/************************************************ module Magnifier *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-01-13 10:53:52 +0100 (Di, 13 Jan 2009) $ *****/

var Magnifier = Class.create();

Magnifier.getInstance = function() {
	if (!Magnifier.instance) {
		Magnifier.instance = new Magnifier();
	}
	return Magnifier.instance;
}

Magnifier.prototype = {
	initialize: function() {

		$A(zone.content.getElementsByTagName("a")).findAll( function(link) {
			return $(link).hasClassName("magnifier");
		}).each( function(magnifier) {
			magnifier.observe("click", function(e) {Magnifier.getInstance().open(e); }.bindAsEventListener($(magnifier)));
		});
	},
 
	open: function(e) {
		var mLink     = Event.element(e);
		var smallImg  = mLink.up().previous();

		var miWrapper = $(document.createElement("div")); // mi stands for "magnified image"
		var miImg     = $(document.createElement("img"));
		var miClose   = $(document.createElement("a"));

		miWrapper.className   = "mi-wrapper";
		miImg.src             = mLink.getAttribute("href");
		miClose.href          = location.href;

		if (this.currentMiWrapper) {
			this.closeCurrent(true);
		}

		var offset = Position.cumulativeOffset(smallImg);

		miWrapper.style.left = offset[0] + "px";
		miWrapper.style.top =  offset[1] + "px";

		document.body.appendChild(miWrapper);
		this.currentMiWrapper = miWrapper;

		miWrapper.appendChild(miImg);
		miWrapper.appendChild(miClose);

		if (miImg.complete) {
			miClose.style.display = "block";
		} else {
			miImg.observe("load", function() { miClose.style.display = "block"; });
		}

		$A([miImg, miClose]).each(function (closeElt) {
			closeElt.observe("click", function(e) {
				Magnifier.getInstance().closeCurrent(false);
				Event.stop(e);
			});
		});
		Event.stop(e);
	},

	closeCurrent: function(reopen) {
		document.body.removeChild(this.currentMiWrapper);
		this.currentMiWrapper = null;
	}
}
/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/************************************************* module fontsize *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-04-23 20:47:25 +0200 (Do, 23 Apr 2009) $ *****/

function init_fontsize() {
	if ($('pagetools-fontsize')) {
		var font = new FontSize;
		var title = new Cookie('text-size').read(font.getDefaultStyleSheet());
		font.setActiveStyleSheet(title);
	}
}

var FontSize = Class.create();

FontSize.prototype = {

	initialize: function() {
		$("tools-fontsize-decrease").observe("click", function() {
			this.fontSizeDown();
		}.bindAsEventListener(this));
		$("tools-fontsize-enlarge").observe("click", function() {
			this.fontSizeUp();
		}.bindAsEventListener(this));
	},

	fontSizeUp: function() {
		switch(this.getActiveStyleSheet()) {
			case 'A+':
				this.setActiveStyleSheet('A++');
				break;
			case 'A++':
				break;
			default:
				this.setActiveStyleSheet('A+');
				break;
		}
	},

	fontSizeDown: function() {
		switch(this.getActiveStyleSheet()){
			case 'A+':
				this.setActiveStyleSheet('A');
				break;
			case 'A++':
				this.setActiveStyleSheet('A+');
				break;
		}
	},

	setActiveStyleSheet: function(title) {
		var i, a;
		for(i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
			if (/\bstylesheet\b/.test(a.rel) && a.title) {
				a.disabled = true; /* always set true first for IE7 */
				if (a.title == title) {
					a.disabled = false;
				}
			}
		}

		switch(title) {
			case 'A+':
				$('tools-fontsize-enlarge').removeClassName('deactivated');
				$('tools-fontsize-decrease').removeClassName('deactivated');
				break;
			case 'A++':
				$('tools-fontsize-enlarge').addClassName('deactivated');
				break;
			default:
				$('tools-fontsize-decrease').addClassName('deactivated');
				break;
		}
		
		new Cookie('text-size').write(title, 365 * 24 * 3600);
		
	},

	getActiveStyleSheet: function() {
		var i, a;
		for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
			if (/\bstylesheet\b/.test(a.rel) && a.title && !a.disabled) {
				return a.title;
			}
		}
		return this.getDefaultStyleSheet();
	},

	getDefaultStyleSheet: function() {
		return 'A';
	}
}

Cookie = Class.create();

Cookie.prototype = {

	initialize: function(name) {
		this.name = name;
	},
	
	write: function(value, seconds) {
		
		if (seconds) {
			var date = new Date();
			date.setTime(date.getTime() + (1000 * seconds));
			var expires = "; expires=" + date.toGMTString();
		} else {
			var expires = "";
		}
		document.cookie = this.name + "=" + value + expires + "; path=/";
	},

	read: function(defaultValue) {
		var parts = document.cookie.split(';');
		var reg   = new RegExp('^\\s*' + this.name + '=(.*)$');
		var part;
		while(part = parts.pop()) {
			var matches = part.match(reg);
			if (matches) {
				return matches[1];
			}
		}
		return defaultValue;
	},
	
	remove: function() {
		this.write('', -86400);
	}
}
/*
 * TabbedPane.js v1.0.0 -- Dynamic AJAX Tabs for Prototype
 * Copyright (c) 2007-2008 Jesse Farmer <jesse@20bits.com>
 * Licensed under the MIT license.

Hash.prototype.toObject = Hash.prototype.toObject || function() { return Object.clone(this); }
 */
var TabbedPane = function(pane, page_urls, args) {
	var args = $H({asynchronous: true, method: 'post', evalScripts: true}).merge(args).toObject();	
	this.load_page = function(page_id) {
		new Ajax.Updater(pane, page_urls[page_id], args);
	}
	
	for (page_id in page_urls) {
		Event.observe(page_id, 'click', function(e) {
			if ('function' == typeof(args.onClick))
				args.onClick(e);

			for (page_id in page_urls) $(page_id).removeClassName('active');
			this.load_page(Event.element(e).addClassName('active').id);
			Event.stop(e);
		}.bindAsEventListener(this));

		if ($(page_id).hasClassName('active')) { this.load_page(page_id); }
	}
}/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/******************************************** module LightboxLayer *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-05-05 15:35:37 +0200 (Di, 05 Mai 2009) $ *****/

var LightboxLayer = Class.create();

LightboxLayer.prototype = Object.extend(new Layer, {

    initialize: function(node, trigger) {
        //lightbox layers can not occur in these page types
        //if (pageType == "1" || pageType == "2") return; W2G custom
        this.node = node;
        this.initSuper(node, trigger);
        var closeButton = Helper.getCloseButton(this.node);

        closeButton.observe("click", function() {
            this.close();

            // http://support.microsoft.com/kb/190244/en-us
            try {
                window.event.returnValue = false;
            } catch (e) { }

        } .bindAsEventListener(this));

        trigger.href = "javascript:void(0);";

        //create the curtain
        new Insertion.Before($('header-zone'), "<div id='lightbox-curtain'>&nbsp;</div>");
        this.curtain = $('lightbox-curtain');
        this.resizeCurtain();

        if (Info.browser.isIEpre7) {
            this.iframeLining = new IframeLining(this.curtain);
        }

        //store the listener so it can be accessed by functions add and remove
        this.listener = { 'augmentDone': this.handleOpen.bind(this) };

        //add an event handler to resize the curtain when window is resized
        Event.observe(window, "resize", function() { this.resizeCurtain(); } .bindAsEventListener(this));
    },

    open: function() {
        //DEV NOTE: will not be true in pagetypes 1 and 2 but was implemented for 
        //future use of lightbox layers in these pagetypes
        if (HeaderAnimation.diminishable && !HeaderAnimation.augmented) {
            HeaderAnimation.listenerQueue.add(this.listener);
            HeaderAnimation.augment();
        } else {
            Layer.prototype.open.call(this);
        }
    },

    show: function() {
        this.node.setStyle({ 'display': 'block' });
    },

    // W2G custom -> redirect instead of close
    afterClose: function(newLayer) {
        try {
            var newHash = '';
            if (document.location.href.indexOf('para1=') > -1) {
                document.location.href = document.location.href.replace(/&para1=.*/, ''); // TODO: para1 entfernen
            }

            document.location.hash = document.location.hash.replace(/,?(layer|related|content)-.*/, '');
            
        } catch (e) {
            // nüscht
        }
    },

    hide: function() {
        this.node.setStyle({ 'display': 'none' });
    },

    beforeOpen: function() {
        //calculate header height
        if (!this.headerHeight) this.headerHeight = $('header-zone').getDimensions().height + $('toolbar-zone').getDimensions().height;

        //position the curtain
        this.curtain.setStyle({ 'top': '0px' });

        //calculate layer position
        this.node.setStyle({ 'display': 'block' });
        if (!this.nodeTop) this.nodeTop = parseInt(this.node.getStyle('top'));
        if (!this.nodeLeft) this.nodeLeft = parseInt(this.node.getStyle('left'));
        if (!this.nodeHeight) this.nodeHeight = this.node.getDimensions().height;
        this.node.setStyle({ 'display': 'none' });

        //check whether layer is higher than current page
        var wrapper = $('footer-position-wrapper');
        this.diff = parseInt(wrapper.getDimensions().height) - this.nodeTop - this.nodeHeight;
        if (this.diff < 0) {
            //resize the content zone
            var layerOccupation = this.nodeHeight + this.nodeTop;
            layerOccupation = layerOccupation - this.headerHeight;

            //difference between layer height and content height
            var diff2 = $('content-zone').getDimensions().height - layerOccupation;
            $('content-zone').setStyle({ 'height': $('content-zone').getDimensions().height - diff2 + 'px' });
        }
        this.resizeCurtain();

        this.node.setStyle({ 'top': this.nodeTop + 'px' });
        if (this.iframeLining)
            this.iframeLining.show();
        this.curtain.setStyle({ 'display': 'block' });
        return true;
    },

    beforeClose: function() {
        this.curtain.setStyle({ 'display': 'none' });
        if (this.iframeLining)
            this.iframeLining.hide();
        if (this.diff < 0) {
            if (Info.browser.isIE) {
                $('content-zone').setStyle({ 'height': '1%' });
            } else {
                $('content-zone').setStyle({ 'height': 'auto' });
            }
        }
        return true;
    },

    handleOpen: function() {
        HeaderAnimation.listenerQueue.remove(this.listener);
        Layer.prototype.open.call(this);
    },

    resizeCurtain: function() {
        if (this.curtain) {
            // W2G Custom: if content layer is bigger than original page, take content layer for curtain
            var wrapperFooter = $('footer-position-wrapper').getDimensions();
            var wrapperLayer = $('layer-relatedcontent').getDimensions();

            if (wrapperFooter.height <= wrapperLayer.height) {
                var wrapper = wrapperLayer;
                wrapper.height = wrapper.height + 250;
            } else {
                var wrapper = wrapperFooter;
            }

            this.contentHeight = parseInt(wrapper.height);
            this.contentWidth = $('content-zone').getDimensions().width;
            //982px is toolbar min-width (926px) plus its margins (34px left + 22px right)
            if (this.contentWidth < 982) {
                this.contentWidth = 982;
            }
            this.curtain.setStyle({ 'height': this.contentHeight + 'px', 'width': this.contentWidth + 'px' });
            if (this.iframeLining) {
                this.iframeLining.refresh();
            }
        }
    }
});

var LIGHTBOX_REL_REGEX = /^lightbox-(.+)$/;

function init_lightboxLayers() {
    if ($("content-zone")) {
        $A($("content-zone").getElementsByTagName("a")).each(
			function(trigger) {
			    trigger = $(trigger);
			    if (LIGHTBOX_REL_REGEX.test(trigger.rel)) { // layer link
			        var id = trigger.rel.replace(LIGHTBOX_REL_REGEX, "$1");
			        var node = $("lightbox-layer-" + id);
			        genericLightbox = new LightboxLayer(node, trigger);
			    }
			} .bind(this)
		);
    }
}/*
 * Copyright (c) 2009 Simo Kinnunen.
 * Licensed under the MIT license.
 */
var Cufon=(function(){var M=function(){return M.replace.apply(null,arguments)};var X=M.DOM={ready:(function(){var c=false,e={loaded:1,complete:1};var b=[],d=function(){if(c){return}c=true;for(var f;f=b.shift();f()){}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",d,false);window.addEventListener("pageshow",d,false)}if(!window.opera&&document.readyState){(function(){e[document.readyState]?d():setTimeout(arguments.callee,10)})()}if(document.readyState&&document.createStyleSheet){(function(){try{document.body.doScroll("left");d()}catch(f){setTimeout(arguments.callee,1)}})()}Q(window,"load",d);return function(f){if(!arguments.length){d()}else{c?f():b.push(f)}}})(),root:function(){return document.documentElement||document.body}};var N=M.CSS={Size:function(c,b){this.value=parseFloat(c);this.unit=String(c).match(/[a-z%]*$/)[0]||"px";this.convert=function(d){return d/b*this.value};this.convertFrom=function(d){return d/this.value*b};this.toString=function(){return this.value+this.unit}},addClass:function(c,b){c.className=(c.className&&" ")+b;return c},color:J(function(c){var b={};b.color=c.replace(/^rgba\((.*?),\s*([\d.]+)\)/,function(e,d,f){b.opacity=parseFloat(f);return"rgb("+d+")"});return b}),fontStretch:J(function(b){if(typeof b=="number"){return b}if(/%$/.test(b)){return parseFloat(b)/100}return{"ultra-condensed":0.5,"extra-condensed":0.625,condensed:0.75,"semi-condensed":0.875,"semi-expanded":1.125,expanded:1.25,"extra-expanded":1.5,"ultra-expanded":2}[b]||1}),getStyle:function(c){var b=document.defaultView;if(b&&b.getComputedStyle){return new A(b.getComputedStyle(c,null))}if(c.currentStyle){return new A(c.currentStyle)}return new A(c.style)},gradient:J(function(f){var g={id:f,type:f.match(/^-([a-z]+)-gradient\(/)[1],stops:[]},c=f.substr(f.indexOf("(")).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);for(var e=0,b=c.length,d;e<b;++e){d=c[e].split("=",2).reverse();g.stops.push([d[1]||e/(b-1),d[0]])}return g}),quotedList:J(function(e){var d=[],c=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,b;while(b=c.exec(e)){d.push(b[3]||b[1])}return d}),recognizesMedia:J(function(h){var f=document.createElement("style"),d,c,b;f.type="text/css";f.media=h;try{f.appendChild(document.createTextNode("/**/"))}catch(g){}c=G("head")[0];c.insertBefore(f,c.firstChild);d=(f.sheet||f.styleSheet);b=d&&!d.disabled;c.removeChild(f);return b}),removeClass:function(d,c){var b=RegExp("(?:^|\\s+)"+c+"(?=\\s|$)","g");d.className=d.className.replace(b,"");return d},supports:function(d,c){var b=document.createElement("span").style;if(b[d]===undefined){return false}b[d]=c;return b[d]===c},textAlign:function(e,d,b,c){if(d.get("textAlign")=="right"){if(b>0){e=" "+e}}else{if(b<c-1){e+=" "}}return e},textDecoration:function(g,f){if(!f){f=this.getStyle(g)}var c={underline:null,overline:null,"line-through":null};for(var b=g;b.parentNode&&b.parentNode.nodeType==1;){var e=true;for(var d in c){if(!K(c,d)||c[d]){continue}if(f.get("textDecoration").indexOf(d)!=-1){c[d]=f.get("color")}e=false}if(e){break}f=this.getStyle(b=b.parentNode)}return c},textShadow:J(function(f){if(f=="none"){return null}var e=[],g={},b,c=0;var d=/(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;while(b=d.exec(f)){if(b[0]==","){e.push(g);g={};c=0}else{if(b[1]){g.color=b[1]}else{g[["offX","offY","blur"][c++]]=b[2]}}}e.push(g);return e}),textTransform:function(c,b){return c[{uppercase:"toUpperCase",lowercase:"toLowerCase"}[b.get("textTransform")]||"toString"]()},whiteSpace:(function(){var b={inline:1,"inline-block":1,"run-in":1};return function(e,c,d){if(b[c.get("display")]){return e}if(!d.previousSibling){e=e.replace(/^\s+/,"")}if(!d.nextSibling){e=e.replace(/\s+$/,"")}return e}})()};N.ready=(function(){var b=!N.recognizesMedia("all"),e=false;var d=[],h=function(){b=true;for(var k;k=d.shift();k()){}};var i=G("link"),j=G("style");function c(k){return k.disabled||g(k.sheet,k.media||"screen")}function g(n,q){if(!N.recognizesMedia(q||"all")){return true}if(!n||n.disabled){return false}try{var r=n.cssRules,p;if(r){search:for(var m=0,k=r.length;p=r[m],m<k;++m){switch(p.type){case 2:break;case 3:if(!g(p.styleSheet,p.media.mediaText)){return false}break;default:break search}}}}catch(o){}return true}function f(){if(document.createStyleSheet){return true}var l,k;for(k=0;l=i[k];++k){if(l.rel.toLowerCase()=="stylesheet"&&!c(l)){return false}}for(k=0;l=j[k];++k){if(!c(l)){return false}}return true}X.ready(function(){if(!e){e=N.getStyle(document.body).isUsable()}if(b||(e&&f())){h()}else{setTimeout(arguments.callee,10)}});return function(k){if(b){k()}else{d.push(k)}}})();function S(c){var b=this.face=c.face;this.glyphs=c.glyphs;this.w=c.w;this.baseSize=parseInt(b["units-per-em"],10);this.family=b["font-family"].toLowerCase();this.weight=b["font-weight"];this.style=b["font-style"]||"normal";this.viewBox=(function(){var e=b.bbox.split(/\s+/);var d={minX:parseInt(e[0],10),minY:parseInt(e[1],10),maxX:parseInt(e[2],10),maxY:parseInt(e[3],10)};d.width=d.maxX-d.minX;d.height=d.maxY-d.minY;d.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")};return d})();this.ascent=-parseInt(b.ascent,10);this.descent=-parseInt(b.descent,10);this.height=-this.ascent+this.descent}function F(){var c={},b={oblique:"italic",italic:"oblique"};this.add=function(d){(c[d.style]||(c[d.style]={}))[d.weight]=d};this.get=function(h,i){var g=c[h]||c[b[h]]||c.normal||c.italic||c.oblique;if(!g){return null}i={normal:400,bold:700}[i]||parseInt(i,10);if(g[i]){return g[i]}var e={1:1,99:0}[i%100],k=[],f,d;if(e===undefined){e=i>400}if(i==500){i=400}for(var j in g){if(!K(g,j)){continue}j=parseInt(j,10);if(!f||j<f){f=j}if(!d||j>d){d=j}k.push(j)}if(i<f){i=f}if(i>d){i=d}k.sort(function(m,l){return(e?(m>i&&l>i)?m<l:m>l:(m<i&&l<i)?m>l:m<l)?-1:1});return g[k[0]]}}function R(){function d(f,g){if(f.contains){return f.contains(g)}return f.compareDocumentPosition(g)&16}function b(g){var f=g.relatedTarget;if(!f||d(this,f)){return}c(this)}function e(f){c(this)}function c(f){setTimeout(function(){M.replace(f,D.get(f).options,true)},10)}this.attach=function(f){if(f.onmouseenter===undefined){Q(f,"mouseover",b);Q(f,"mouseout",b)}else{Q(f,"mouseenter",e);Q(f,"mouseleave",e)}}}function U(){var c=[],d={};function b(h){var e=[],g;for(var f=0;g=h[f];++f){e[f]=c[d[g]]}return e}this.add=function(f,e){d[f]=c.push(e)-1};this.repeat=function(){var e=arguments.length?b(arguments):c,f;for(var g=0;f=e[g++];){M.replace(f[0],f[1],true)}}}function a(){var d={},b=0;function c(e){return e.cufid||(e.cufid=++b)}this.get=function(e){var f=c(e);return d[f]||(d[f]={})}}function A(b){var d={},c={};this.extend=function(e){for(var f in e){if(K(e,f)){d[f]=e[f]}}return this};this.get=function(e){return d[e]!=undefined?d[e]:b[e]};this.getSize=function(f,e){return c[f]||(c[f]=new N.Size(this.get(f),e))};this.isUsable=function(){return !!b}}function Q(c,b,d){if(c.addEventListener){c.addEventListener(b,d,false)}else{if(c.attachEvent){c.attachEvent("on"+b,function(){return d.call(c,window.event)})}}}function V(c,b){var d=D.get(c);if(d.options){return c}if(b.hover&&b.hoverables[c.nodeName.toLowerCase()]){B.attach(c)}d.options=b;return c}function J(b){var c={};return function(d){if(!K(c,d)){c[d]=b.apply(null,arguments)}return c[d]}}function C(g,f){if(!f){f=N.getStyle(g)}var c=N.quotedList(f.get("fontFamily").toLowerCase()),e;for(var d=0,b=c.length;d<b;++d){e=c[d];if(I[e]){return I[e].get(f.get("fontStyle"),f.get("fontWeight"))}}return null}function G(b){return document.getElementsByTagName(b)}function K(c,b){return c.hasOwnProperty(b)}function H(){var b={},d,f;for(var e=0,c=arguments.length;d=arguments[e],e<c;++e){for(f in d){if(K(d,f)){b[f]=d[f]}}}return b}function O(e,o,c,p,f,d){var n=p.separate;if(n=="none"){return Z[p.engine].apply(null,arguments)}var m=document.createDocumentFragment(),h;var j=o.split(P[n]),b=(n=="words");if(b&&T){if(/^\s/.test(o)){j.unshift("")}if(/\s$/.test(o)){j.push("")}}for(var k=0,g=j.length;k<g;++k){h=Z[p.engine](e,b?N.textAlign(j[k],c,k,g):j[k],c,p,f,d,k<g-1);if(h){m.appendChild(h)}}return m}function L(c,k){var d,b,e,h,g,j;for(e=V(c,k).firstChild;e;e=g){h=e.nodeType;g=e.nextSibling;j=false;if(h==1){if(!e.firstChild){continue}if(!/cufon/.test(e.className)){arguments.callee(e,k);continue}else{j=true}}else{if(h!=3){continue}}if(!b){b=N.getStyle(c).extend(k)}if(!d){d=C(c,b)}if(!d){continue}if(j){Z[k.engine](d,null,b,k,e,c);continue}var i=N.whiteSpace(e.data,b,e);if(i===""){continue}var f=O(d,i,b,k,e,c);if(f){e.parentNode.replaceChild(f,e)}else{e.parentNode.removeChild(e)}}}var T=" ".split(/\s+/).length==0;var D=new a();var B=new R();var Y=new U();var E=false;var Z={},I={},W={enableTextDecoration:false,engine:null,forceHitArea:false,hover:false,hoverables:{a:true},printable:true,selector:(window.Sizzle||(window.jQuery&&function(b){return jQuery(b)})||(window.dojo&&dojo.query)||(window.$$&&function(b){return $$(b)})||(window.$&&function(b){return $(b)})||(document.querySelectorAll&&function(b){return document.querySelectorAll(b)})||(window.Ext&&Ext.query)||G),separate:"words",textShadow:"none"};var P={words:/[^\S\u00a0]+/,characters:""};M.now=function(){X.ready();return M};M.refresh=function(){Y.repeat.apply(Y,arguments);return M};M.registerEngine=function(c,b){if(!b){return M}Z[c]=b;return M.set("engine",c)};M.registerFont=function(d){var b=new S(d),c=b.family;if(!I[c]){I[c]=new F()}I[c].add(b);return M.set("fontFamily",'"'+c+'"')};M.replace=function(d,c,b){c=H(W,c);if(!c.engine){return M}if(!E){N.addClass(X.root(),"cufon-active cufon-loading");N.ready(function(){N.removeClass(X.root(),"cufon-loading")});E=true}if(c.hover){c.forceHitArea=true}if(typeof c.textShadow=="string"){c.textShadow=N.textShadow(c.textShadow)}if(typeof c.color=="string"&&/^-/.test(c.color)){c.textGradient=N.gradient(c.color)}if(!b){Y.add(d,arguments)}if(d.nodeType||typeof d=="string"){d=[d]}N.ready(function(){for(var f=0,e=d.length;f<e;++f){var g=d[f];if(typeof g=="string"){M.replace(c.selector(g),c,true)}else{L(g,c)}}});return M};M.set=function(b,c){W[b]=c;return M};return M})();Cufon.registerEngine("canvas",(function(){var B=document.createElement("canvas");if(!B||!B.getContext||!B.getContext.apply){return}B=null;var A=Cufon.CSS.supports("display","inline-block");var E=!A&&(document.compatMode=="BackCompat"||/frameset|transitional/i.test(document.doctype.publicId));var F=document.createElement("style");F.type="text/css";F.appendChild(document.createTextNode((".cufon-canvas{text-indent:0;}@media screen,projection{.cufon-canvas{display:inline;display:inline-block;position:relative;vertical-align:middle;"+(E?"":"font-size:1px;line-height:1px;")+"}.cufon-canvas .cufon-alt{display:-moz-inline-box;display:inline-block;width:0;height:0;overflow:hidden;text-indent:-10000in;}"+(A?".cufon-canvas canvas{position:relative;}":".cufon-canvas canvas{position:absolute;}")+"}@media print{.cufon-canvas{padding:0;}.cufon-canvas canvas{display:none;}.cufon-canvas .cufon-alt{display:inline;}}").replace(/;/g,"!important;")));document.getElementsByTagName("head")[0].appendChild(F);function D(O,H){var M=0,L=0;var G=[],N=/([mrvxe])([^a-z]*)/g,J;generate:for(var I=0;J=N.exec(O);++I){var K=J[2].split(",");switch(J[1]){case"v":G[I]={m:"bezierCurveTo",a:[M+~~K[0],L+~~K[1],M+~~K[2],L+~~K[3],M+=~~K[4],L+=~~K[5]]};break;case"r":G[I]={m:"lineTo",a:[M+=~~K[0],L+=~~K[1]]};break;case"m":G[I]={m:"moveTo",a:[M=~~K[0],L=~~K[1]]};break;case"x":G[I]={m:"closePath"};break;case"e":break generate}H[G[I].m].apply(H,G[I].a)}return G}function C(K,J){for(var I=0,H=K.length;I<H;++I){var G=K[I];J[G.m].apply(J,G.a)}}return function(AH,a,z,W,e,AI){var I=(a===null);if(I){a=e.alt}var c=AH.viewBox;var K=z.getSize("fontSize",AH.baseSize);var v=z.get("letterSpacing");v=(v=="normal")?0:K.convertFrom(parseInt(v,10));var d=0,w=0,u=0,Y=0;var b=W.textShadow,s=[];if(b){for(var AG=b.length;AG--;){var m=b[AG];var r=K.convertFrom(parseFloat(m.offX));var p=K.convertFrom(parseFloat(m.offY));s[AG]=[r,p];if(p<d){d=p}if(r>w){w=r}if(p>u){u=p}if(r<Y){Y=r}}}var AL=Cufon.CSS.textTransform(a,z).split(""),U;var J=AH.glyphs,X,M,AC;var G=0,Q,h=[];for(var AG=0,AE=0,AB=AL.length;AG<AB;++AG){X=J[U=AL[AG]]||AH.missingGlyph;if(!X){continue}if(M){G-=AC=M[U]||0;h[AE-1]-=AC}G+=Q=h[AE++]=~~(X.w||AH.w)+v;M=X.k}if(Q===undefined){return null}w+=c.width-Q;Y+=c.minX;var V,L;if(I){V=e;L=e.firstChild}else{V=document.createElement("span");V.className="cufon cufon-canvas";V.alt=a;L=document.createElement("canvas");V.appendChild(L);if(W.printable){var AD=document.createElement("span");AD.className="cufon-alt";AD.appendChild(document.createTextNode(a));V.appendChild(AD)}}var AM=V.style;var o=L.style;var H=K.convert(c.height);var AK=Math.ceil(H);var t=AK/H;var n=t*Cufon.CSS.fontStretch(z.get("fontStretch"));var q=G*n;var AA=Math.ceil(K.convert(q+w-Y));var O=Math.ceil(K.convert(c.height-d+u));L.width=AA;L.height=O;o.width=AA+"px";o.height=O+"px";d+=c.minY;o.top=Math.round(K.convert(d-AH.ascent))+"px";o.left=Math.round(K.convert(Y))+"px";var T=Math.ceil(K.convert(q))+"px";if(A){AM.width=T;AM.height=K.convert(AH.height)+"px"}else{AM.paddingLeft=T;AM.paddingBottom=(K.convert(AH.height)-1)+"px"}var AJ=L.getContext("2d"),f=H/c.height;AJ.scale(f,f*t);AJ.translate(-Y,-d);AJ.lineWidth=AH.face["underline-thickness"];AJ.save();function N(i,g){AJ.strokeStyle=g;AJ.beginPath();AJ.moveTo(0,i);AJ.lineTo(G,i);AJ.stroke()}var P=W.enableTextDecoration?Cufon.CSS.textDecoration(AI,z):{};if(P.underline){N(-AH.face["underline-position"],P.underline)}if(P.overline){N(AH.ascent,P.overline)}function AF(){AJ.scale(n,1);for(var x=0,k=0,g=AL.length;x<g;++x){var y=J[AL[x]]||AH.missingGlyph;if(!y){continue}if(y.d){AJ.beginPath();if(y.code){C(y.code,AJ)}else{y.code=D("m"+y.d,AJ)}AJ.fill()}AJ.translate(h[k++],0)}AJ.restore()}if(b){for(var AG=b.length;AG--;){var m=b[AG];AJ.save();AJ.fillStyle=m.color;AJ.translate.apply(AJ,s[AG]);AF()}}var S=W.textGradient;if(S){var Z=S.stops,R=AJ.createLinearGradient(0,c.minY,0,c.maxY);for(var AG=0,AB=Z.length;AG<AB;++AG){R.addColorStop.apply(R,Z[AG])}AJ.fillStyle=R}else{AJ.fillStyle=z.get("color")}AF();if(P["line-through"]){N(-AH.descent,P["line-through"])}return V}})());Cufon.registerEngine("vml",(function(){if(!document.namespaces){return}if(document.namespaces.cvml==null){document.namespaces.add("cvml","urn:schemas-microsoft-com:vml")}var B=document.createElement("cvml:shape");B.style.behavior="url(#default#VML)";if(!B.coordsize){return}B=null;var F=(document.documentMode||0)<8;document.write(('<style type="text/css">.cufon-vml-canvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}.cufon-vml-canvas{position:absolute;text-align:left;}.cufon-vml{display:inline-block;position:relative;vertical-align:'+(F?"middle":"text-bottom")+";}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px;}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none;}.cufon-vml .cufon-alt{display:inline;}}</style>").replace(/;/g,"!important;"));function C(G,H){return A(G,/(?:em|ex|%)$/i.test(H)?"1em":H)}function A(J,K){if(/px$/i.test(K)){return parseFloat(K)}var I=J.style.left,H=J.runtimeStyle.left;J.runtimeStyle.left=J.currentStyle.left;J.style.left=K.replace("%","em");var G=J.style.pixelLeft;J.style.left=I;J.runtimeStyle.left=H;return G}var E={};function D(L){var M=L.id;if(!E[M]){var J=L.stops,K=document.createElement("cvml:fill"),G=[];K.type="gradient";K.angle=180;K.focus="0";K.method="sigma";K.color=J[0][1];for(var I=1,H=J.length-1;I<H;++I){G.push(J[I][0]*100+"% "+J[I][1])}K.colors=G.join(",");K.color2=J[H][1];E[M]=K}return E[M]}return function(AI,f,AC,b,n,AJ,AA){var J=(f===null);if(J){f=n.alt}var h=AI.viewBox;var L=AC.computedFontSize||(AC.computedFontSize=new Cufon.CSS.Size(C(AJ,AC.get("fontSize"))+"px",AI.baseSize));var z=AC.computedLSpacing;if(z==undefined){z=AC.get("letterSpacing");AC.computedLSpacing=z=(z=="normal")?0:~~L.convertFrom(A(AJ,z))}var X,M;if(J){X=n;M=n.firstChild}else{X=document.createElement("span");X.className="cufon cufon-vml";X.alt=f;M=document.createElement("span");M.className="cufon-vml-canvas";X.appendChild(M);if(b.printable){var AF=document.createElement("span");AF.className="cufon-alt";AF.appendChild(document.createTextNode(f));X.appendChild(AF)}if(!AA){X.appendChild(document.createElement("cvml:shape"))}}var AO=X.style;var u=M.style;var H=L.convert(h.height),AL=Math.ceil(H);var y=AL/H;var s=y*Cufon.CSS.fontStretch(AC.get("fontStretch"));var x=h.minX,w=h.minY;u.height=AL;u.top=Math.round(L.convert(w-AI.ascent));u.left=Math.round(L.convert(x));AO.height=L.convert(AI.height)+"px";var Q=b.enableTextDecoration?Cufon.CSS.textDecoration(AJ,AC):{};var e=AC.get("color");var AN=Cufon.CSS.textTransform(f,AC).split(""),W;var K=AI.glyphs,c,N,AE;var G=0,o=[],v=0,S;var U,g=b.textShadow;for(var AH=0,AG=0,AD=AN.length;AH<AD;++AH){c=K[W=AN[AH]]||AI.missingGlyph;if(!c){continue}if(N){G-=AE=N[W]||0;o[AG-1]-=AE}G+=S=o[AG++]=~~(c.w||AI.w)+z;N=c.k}if(S===undefined){return null}var V=-x+G+(h.width-S);var AM=L.convert(V*s),AB=Math.round(AM);var r=V+","+h.height,I;var m="r"+r+"ns";var T=b.textGradient&&D(b.textGradient);for(AH=0,AG=0;AH<AD;++AH){c=K[AN[AH]]||AI.missingGlyph;if(!c){continue}if(J){U=M.childNodes[AG];while(U.firstChild){U.removeChild(U.firstChild)}}else{U=document.createElement("cvml:shape");M.appendChild(U)}U.stroked="f";U.coordsize=r;U.coordorigin=I=(x-v)+","+w;U.path=(c.d?"m"+c.d+"xe":"")+"m"+I+m;U.fillcolor=e;if(T){U.appendChild(T.cloneNode(false))}var AK=U.style;AK.width=AB;AK.height=AL;if(g){var P=g[0],O=g[1];var a=Cufon.CSS.color(P.color),Y;var q=document.createElement("cvml:shadow");q.on="t";q.color=a.color;q.offset=P.offX+","+P.offY;if(O){Y=Cufon.CSS.color(O.color);q.type="double";q.color2=Y.color;q.offset2=O.offX+","+O.offY}q.opacity=a.opacity||(Y&&Y.opacity)||1;U.appendChild(q)}v+=o[AG++]}var p=U.nextSibling,R,Z;if(b.forceHitArea){if(!p){p=document.createElement("cvml:rect");p.stroked="f";p.className="cufon-vml-cover";R=document.createElement("cvml:fill");R.opacity=0;p.appendChild(R);M.appendChild(p)}Z=p.style;Z.width=AB;Z.height=AL}else{if(p){M.removeChild(p)}}AO.width=Math.max(Math.ceil(L.convert(G*s)),0);if(F){var t=AC.computedYAdjust;if(t===undefined){var d=AC.get("lineHeight");if(d=="normal"){d="1em"}else{if(!isNaN(d)){d+="em"}}AC.computedYAdjust=t=0.5*(A(AJ,d)-parseFloat(AO.height))}if(t){AO.marginTop=Math.ceil(t)+"px";AO.marginBottom=t+"px"}}return X}})());Cufon.registerFont((function(f){_cufon_bridge_={p:[{"d":"136,-219v-20,0,-62,-32,-68,2r-19,0v2,-48,55,-37,86,-24v9,0,16,-6,17,-15r18,0v-2,21,-14,37,-34,37xm157,-21v-5,-53,19,-143,-36,-143v-20,0,-38,11,-57,34r0,109r26,1r0,20r-80,0r0,-20r26,-1r0,-141r-26,-1r0,-19r53,-2r0,30v36,-47,136,-46,121,45r0,88r27,1r0,20r-80,0r0,-20","w":219},{"d":"62,-73v-5,72,60,65,91,23r0,-112r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-51,0r0,-29v-36,48,-136,47,-121,-46r0,-87r-26,-1r0,-19r53,-2r0,111xm125,-263r35,0r-53,52r-26,0","w":215},{"d":"162,-70r-101,0r-32,50r27,1r0,19r-86,0r0,-19r25,-1r147,-229r155,0r0,63r-26,0r-3,-39r-78,0r0,87r98,0r0,24r-98,0r0,90r84,0r3,-39r25,0r0,63r-140,0r0,-70xm162,-94r0,-131r-3,0r-83,131r86,0","w":324},{"d":"159,-87r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-228r36,0r82,228r26,1r0,20r-87,0r0,-20r30,-1xm150,-111r-37,-113r-38,113r75,0xm61,-298v-1,-12,9,-18,19,-19v10,0,18,8,18,19v1,12,-9,18,-19,19v-10,0,-18,-8,-18,-19xm129,-298v0,-12,9,-18,19,-19v10,0,18,8,18,19v0,11,-8,18,-18,19v-10,0,-19,-8,-19,-19","w":227,"k":{"\u00ab":4,"y":7,"w":3,"v":6,"u":-3,"t":-2,"q":-5,"o":-4,"g":-4,"d":-5,"c":-5,"b":-20,"a":-14,"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,"-":-4,",":-10}},{"d":"99,-307r-27,35r-26,0r36,-52r33,0r36,52r-26,0xm34,-21r0,-208r-29,-1r0,-19r164,0r0,63r-26,0r-3,-39r-77,0r0,87r71,0r0,24r-71,0r0,90r83,0r3,-39r25,0r0,63r-169,0r0,-19","w":196},{"d":"55,-239v0,-21,16,-36,36,-36v20,0,36,17,36,36v0,19,-17,36,-36,36v-19,0,-36,-16,-36,-36xm111,-239v0,-13,-8,-22,-21,-22v-12,0,-20,11,-20,22v0,11,9,21,21,21v12,0,20,-9,20,-21xm23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38","w":186,"k":{"w":2,"v":1}},{"d":"104,4v-47,1,-84,-24,-84,-68v0,-32,18,-54,56,-65v-28,-13,-47,-28,-48,-61v-1,-41,34,-63,76,-63v42,0,77,20,76,62v0,30,-19,47,-45,58v29,13,52,30,53,66v0,45,-37,71,-84,71xm104,-230v-37,-3,-61,34,-39,63v7,8,23,16,47,25v21,-9,40,-22,40,-48v0,-27,-22,-38,-48,-40xm104,-20v40,0,69,-37,46,-69v-6,-11,-30,-24,-48,-30v-70,10,-68,99,2,99"},{"d":"21,-125v1,-72,44,-128,111,-128v67,0,110,60,109,128v0,72,-44,129,-110,129v-69,0,-111,-60,-110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,104,79,104v53,0,80,-47,80,-105","w":262,"k":{"\u00c1":3,"\u00c6":-6,"\u00c5":3,"\u00c4":3,"Y":5,"X":7,"W":4,"V":3,"T":-3,"A":3}},{"d":"37,-21r0,-141r-27,-1r0,-19r54,-2r0,163r26,1r0,20r-80,0r0,-20xm28,-263r44,52r-26,0r-53,-52r35,0","w":100},{"d":"78,-298v-1,-12,9,-18,19,-19v10,0,20,7,19,19v0,12,-8,18,-19,19v-11,0,-19,-8,-19,-19xm147,-298v-1,-12,9,-18,19,-19v10,0,18,8,18,19v0,12,-8,18,-19,19v-10,0,-18,-8,-18,-19xm21,-125v1,-72,44,-128,111,-128v67,0,110,60,109,128v0,72,-44,129,-110,129v-69,0,-111,-60,-110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,104,79,104v53,0,80,-47,80,-105","w":262,"k":{"Y":5,"X":7,"W":4,"V":3,"T":-3,"A":3}},{"d":"163,-35r0,-80r-150,0r0,-22r174,0r0,102r-24,0"},{"d":"34,-21r0,-208r-29,-1r0,-19r89,0r0,19r-31,1r0,205r83,0r3,-39r25,0r0,63r-169,0r0,-19","w":177,"k":{"\u00c1":-21,"\u00c6":-30,"\u00fc":3,"\u00dc":4,"\u00c5":-21,"\u00c4":-21,"y":11,"u":3,"Y":13,"W":12,"V":17,"U":4,"T":11,"S":-5,"A":-21,"-":-3}},{"d":"34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,208r29,1r0,20r-87,0r0,-20","w":96},{"d":"116,-324r35,0r-53,52r-26,0xm34,-21r0,-208r-29,-1r0,-19r164,0r0,63r-26,0r-3,-39r-77,0r0,87r71,0r0,24r-71,0r0,90r83,0r3,-39r25,0r0,63r-169,0r0,-19","w":196},{"d":"18,-90v0,-80,66,-115,138,-86r0,49r-26,0r-3,-33v-50,-16,-80,16,-80,67v0,64,57,98,103,58r11,22v-61,41,-143,4,-143,-77","w":173,"k":{"k":-6,"h":-6}},{"d":"177,-198v0,37,-27,53,-60,67r58,69v11,-14,19,-34,23,-58r-21,-1r0,-19r71,0r0,19r-24,1v-5,33,-13,52,-31,77r18,23r31,0r0,20r-48,0r-19,-24v-39,47,-155,34,-152,-39v2,-37,24,-59,55,-72v-15,-17,-30,-39,-30,-62v1,-35,27,-56,64,-56v36,0,65,19,65,55xm112,-229v-48,2,-42,55,-9,82v23,-11,44,-19,45,-48v0,-22,-16,-35,-36,-34xm54,-66v-1,53,76,59,104,24r-67,-78v-21,12,-36,27,-37,54","w":244},{"d":"149,-256v-1,50,-56,36,-87,24v-7,0,-13,5,-16,15r-18,0v1,-49,55,-37,86,-24v8,0,16,-5,16,-15r19,0xm23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38","w":186},{"w":90},{"d":"75,-66r-23,0r-4,-167r30,0xm42,-18v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-9,22,-21,22v-12,0,-21,-10,-21,-22","w":111},{"d":"176,-127v1,59,-47,75,-113,72r0,34r34,1r0,20r-92,0r0,-20r29,-1r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,30v68,-3,112,12,113,72xm146,-127v-1,-43,-35,-52,-83,-49r0,97v50,1,83,-4,83,-48","w":186},{"d":"14,0r0,-21r110,-139r-77,0r-3,33r-26,0r0,-55r139,0r0,22r-109,138r85,0r3,-35r25,0r0,57r-147,0","w":177},{"d":"141,-51v51,28,22,107,-46,107v-21,0,-40,-5,-57,-14r0,-53r25,0r3,36v24,17,75,6,71,-27v-6,-55,-102,-37,-101,-96v0,-18,11,-35,32,-51v-49,-27,-23,-104,43,-104v17,0,35,5,54,13r0,51r-26,0r-3,-34v-26,-13,-66,-4,-63,26v5,52,101,34,99,94v0,18,-11,36,-31,52xm85,-140v-42,36,-8,65,39,79v39,-42,9,-64,-39,-79"},{"d":"36,-21r0,-141r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-80,0r0,-20xm64,-263r35,0r-53,52r-26,0","w":100},{"d":"37,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm105,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":180},{"d":"51,-127r0,-101r-29,17r-8,-15v19,-8,28,-25,57,-23r0,122r21,1r0,14r-62,0r0,-14xm62,7r98,-263r22,0r-99,263r-21,0xm244,-104v-6,43,-34,57,-65,87r66,0r0,17r-93,0r0,-17v32,-28,62,-51,69,-85v-4,-28,-38,-23,-60,-8r-7,-17v33,-20,87,-17,90,23","w":271},{"d":"114,-317v36,0,48,53,17,68r82,228r26,1r0,20r-87,0r0,-20r30,-1r-23,-66r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-229v-31,-16,-17,-67,19,-67xm150,-111r-37,-114v-10,36,-25,78,-38,114r75,0xm134,-281v0,-12,-9,-21,-21,-21v-12,0,-19,10,-20,21v0,12,9,22,21,22v12,0,20,-10,20,-22","w":227,"k":{"\u00ab":4,"y":7,"w":3,"v":6,"u":-3,"t":-2,"q":-5,"o":-4,"g":-4,"e":-5,"d":-5,"c":-5,"b":-20,"a":-14,"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,"-":-4,",":-10}},{"d":"36,-21r0,-222r-26,-1r0,-19r54,-2r0,161r62,-58r-24,-1r0,-19r76,0r0,19r-21,1r-65,61r68,80r22,1r0,20r-72,0r0,-20r17,0r-63,-76r0,75r26,1r0,20r-80,0r0,-20","w":184,"k":{"\u00e6":-7,"\u00fc":-10,"\u00f6":3,"\u00f3":3,"\u00e9":3,"\u00e5":-7,"\u00e4":-7,"\u00e1":-7,"u":-10,"s":-7,"o":3,"g":4,"e":3,"a":-7,".":-2,"-":17,",":-2}},{"d":"102,-246r-26,35r-27,0r36,-52r33,0r37,52r-27,0xm18,-91v0,-54,33,-95,85,-95v50,0,83,42,83,95v0,54,-34,95,-84,95v-50,0,-84,-42,-84,-95xm157,-91v-1,-40,-19,-74,-56,-73v-37,1,-54,32,-54,73v0,40,20,72,55,73v36,1,56,-33,55,-73","w":204,"k":{"t":6}},{"d":"23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38xm40,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm108,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":186,"k":{"w":2,"v":1}},{"d":"23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38xm83,-263r44,52r-26,0r-53,-52r35,0","w":186,"k":{"w":2,"v":1}},{"d":"83,-118v-2,39,5,79,-9,95r87,0r3,-40r25,0r0,63r-170,0r0,-23r26,0v12,-18,10,-58,10,-95r-33,0r0,-21r33,0v-6,-73,12,-115,78,-114v19,0,37,4,56,11r0,56r-25,0r-3,-39v-58,-17,-87,17,-78,86r62,0r0,21r-62,0"},{"d":"31,-101v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-9,22,-21,22v-12,0,-21,-10,-21,-22","w":103},{"d":"23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38xm107,-263r35,0r-53,52r-26,0","w":186,"k":{"w":2,"v":1}},{"d":"88,-324r44,52r-26,0r-53,-52r35,0xm34,-21r0,-208r-29,-1r0,-19r164,0r0,63r-26,0r-3,-39r-77,0r0,87r71,0r0,24r-71,0r0,90r83,0r3,-39r25,0r0,63r-169,0r0,-19","w":196},{"d":"18,-91v0,-54,33,-95,85,-95v50,0,83,42,83,95v0,54,-34,95,-84,95v-50,0,-84,-42,-84,-95xm157,-91v-1,-40,-19,-74,-56,-73v-37,1,-54,32,-54,73v0,40,20,72,55,73v36,1,56,-33,55,-73xm92,-263r44,52r-26,0r-53,-52r35,0","w":204,"k":{"y":-1,"w":1}},{"d":"63,-154v22,-36,98,-48,109,4v15,-19,37,-36,65,-36v70,-3,47,98,51,165r27,1r0,20r-80,0r0,-20r26,-1v-6,-52,19,-141,-32,-143v-18,0,-35,11,-53,34r0,109r26,1r0,20r-80,0r0,-20r27,-1v-6,-52,19,-141,-32,-143v-18,0,-35,11,-53,34r0,109r26,1r0,20r-80,0r0,-20r26,-1r0,-141r-26,-1r0,-19r53,-2r0,30","w":323,"k":{"y":-1,"w":1,"p":4}},{"d":"61,-127r0,-101r-28,17r-8,-15v18,-8,28,-26,57,-23r0,122r21,1r0,14r-63,0r0,-14","w":129},{"d":"176,-71v2,71,-88,91,-154,63r7,-23v49,21,117,15,118,-40v0,-42,-43,-51,-92,-49r0,-23v46,3,89,-10,89,-48v0,-48,-67,-45,-108,-27r-6,-23v56,-23,143,-16,143,48v0,35,-22,55,-56,61v37,4,59,24,59,61"},{"d":"36,-21r0,-222r-26,-1r0,-19r54,-2r0,244r26,1r0,20r-80,0r0,-20","w":100,"k":{"y":-3,"v":-2}},{"d":"44,-246r-26,35r-27,0r36,-52r33,0r37,52r-27,0xm36,-21r0,-141r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-80,0r0,-20","w":100},{"d":"115,56v-120,19,-17,-154,-94,-153r0,-21v78,1,-26,-172,94,-153r0,21v-79,-18,6,130,-66,142v43,3,30,62,30,107v0,31,7,38,36,36r0,21","w":129},{"d":"134,-324r35,0r-52,52r-26,0xm159,-87r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-228r36,0r82,228r26,1r0,20r-87,0r0,-20r30,-1xm150,-111r-37,-113r-38,113r75,0","w":227,"k":{"\u00ab":4,"y":7,"w":3,"v":6,"u":-3,"t":-2,"q":-5,"o":-4,"g":-4,"e":-5,"d":-5,"c":-5,"b":-20,"a":-14,"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,"-":-4,",":-10}},{"d":"78,3r-64,-165r-21,-1r0,-19r79,0r0,19r-29,1r49,130r48,-130r-29,-1r0,-19r75,0r0,19r-21,1v-30,73,-51,163,-91,225v-13,19,-42,21,-69,15r5,-23v43,14,57,-15,68,-52xm40,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm108,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":178},{"d":"48,-225r-3,39r-25,0r0,-63r163,0r0,24r-108,225r-32,0r110,-225r-105,0"},{"d":"36,-21r0,-141r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-80,0r0,-20xm-7,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm61,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":100},{"d":"98,-19v22,0,39,-15,51,-32r0,-111r-26,-1r0,-19r53,-2r0,164r26,0r0,20r-51,0r0,-28v-26,31,-69,47,-94,14r0,91r-27,0r0,-239r-26,-1r0,-19r53,-2v7,62,-23,165,41,165"},{"d":"41,-37r35,0r-31,81r-29,0","w":103},{"d":"114,-307r-27,35r-26,0r36,-52r33,0r36,52r-26,0xm159,-87r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-228r36,0r82,228r26,1r0,20r-87,0r0,-20r30,-1xm150,-111r-37,-113r-38,113r75,0","w":227,"k":{"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,",":-10}},{"d":"126,-324r34,0r-52,52r-26,0xm88,-21r0,-91r-74,-117r-25,-1r0,-19r87,0r0,19r-29,1r56,92r56,-92r-28,-1r0,-19r84,0r0,19r-24,1r-74,117r0,91r31,1r0,20r-92,0r0,-20","w":204},{"d":"70,-279v2,-47,55,-36,86,-23v9,0,16,-6,17,-15r18,0v-2,21,-14,37,-34,37v-18,0,-61,-32,-68,1r-19,0xm34,-21r0,-208r-29,-1r0,-19r62,0r124,208r-1,-188r-29,-1r0,-19r85,0r0,19r-29,1r0,229r-33,0r-97,-160v-9,-15,-17,-31,-26,-48r0,187r29,1r0,20r-85,0r0,-20","w":251},{"d":"88,-91r-62,-62r16,-15r62,61r62,-62r15,16r-62,62r62,62r-15,15r-62,-62r-62,62r-16,-15"},{"d":"121,-324r44,52r-26,0r-53,-52r35,0xm21,-125v1,-72,44,-128,111,-128v67,0,110,60,109,128v0,72,-44,129,-110,129v-69,0,-111,-60,-110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,104,79,104v53,0,80,-47,80,-105","w":262,"k":{"Y":5,"V":3,"T":-3}},{"d":"108,-151v-1,40,-52,49,-92,34r5,-17v27,12,65,10,65,-18v0,-21,-28,-28,-51,-24r0,-17v23,4,49,-4,49,-23v0,-26,-36,-21,-59,-11r-4,-17v32,-13,86,-11,86,27v0,16,-9,26,-27,32v19,5,28,16,28,34","w":129},{"d":"-6,-280r0,-22r192,0r0,22r-192,0","w":180},{"d":"-4,56v26,7,42,-3,42,-32r0,-186r-31,-1r0,-19r58,-2r0,188v6,58,-19,84,-72,75xm32,-247v0,-28,39,-25,39,0v0,11,-8,19,-20,19v-11,0,-18,-8,-19,-19","w":100},{"d":"37,77r0,-326r29,0r0,326r-29,0","w":103},{"d":"-4,0r0,-20r23,0r75,-110r-66,-99r-25,-1r0,-19r85,0r0,19r-27,1r53,79r52,-79r-27,-1r0,-19r83,0r0,19r-25,1r-67,102r71,107r25,0r0,20r-86,0r0,-20r26,0r-56,-86r-58,85r29,1r0,20r-85,0","w":224,"k":{"\u00c2":7,"\u00c0":7,"\u00c6":7,"\u00d6":8,"\u00c5":7,"\u00c4":7,"y":7,"u":1,"a":-9,"Q":8,"O":8,"C":8,"A":7,"-":13}},{"d":"18,-86v0,-63,54,-110,110,-79v-10,-18,-21,-33,-36,-46r-48,23r-7,-16r39,-19v-13,-9,-26,-16,-37,-20r11,-23v18,7,36,18,53,31r48,-23r7,16r-41,19v31,30,60,81,59,135v0,53,-28,93,-80,92v-51,-1,-78,-37,-78,-90xm147,-88v0,-37,-17,-65,-51,-65v-33,0,-50,29,-50,67v0,36,17,67,51,67v35,1,50,-32,50,-69","w":193},{"d":"35,-203r9,-27r50,21r-4,-54r28,0r-5,54r50,-21r9,27r-52,13r34,38r-23,17r-27,-44r-28,44r-22,-17r33,-38"},{"d":"3,0r0,-20r19,-1r54,-75r-47,-66r-19,-1r0,-19r72,0r0,19r-21,1r34,47r34,-47r-21,-1r0,-19r70,0r0,19r-20,1r-48,67r53,75r19,0r0,20r-76,0r0,-20r25,0r-40,-56r-39,56r25,0r0,20r-74,0","w":187,"k":{"\u00e9":5,"q":4,"o":5,"e":5,"c":4,"a":-5}},{"d":"186,-90v0,77,-82,128,-126,65r0,82r30,1r0,19r-83,0r0,-19r26,-1r0,-300r-26,-1r0,-19r53,-2r0,110v14,-18,29,-31,55,-31v43,-1,71,46,71,96xm157,-90v0,-38,-14,-74,-48,-74v-18,0,-35,11,-49,34r0,77v12,23,27,35,48,35v35,0,49,-35,49,-72","w":204},{"d":"63,-227v34,2,84,-9,83,26v0,12,-6,19,-19,23v10,6,15,26,21,37r11,1r0,11r-26,0v-11,-15,-9,-46,-36,-44r0,32r13,1r0,11r-47,0r0,-11r15,-1r0,-74r-15,-1r0,-11xm97,-185v35,5,42,-31,6,-30r-6,0r0,30xm15,-178v0,-54,42,-93,94,-93v51,0,92,41,92,93v0,52,-41,93,-93,93v-52,0,-93,-41,-93,-93xm188,-178v1,-46,-34,-83,-81,-83v-44,0,-79,37,-79,83v0,46,34,83,80,82v47,0,79,-34,80,-82","w":216},{"d":"52,-122v0,75,59,122,133,94r0,-77r-33,-1r0,-19r88,0r0,19r-26,1r0,94v-19,7,-50,16,-76,15v-71,0,-117,-53,-117,-125v0,-105,93,-159,193,-119r0,54r-26,0r-3,-36v-80,-26,-133,22,-133,100","w":245,"k":{"\u00c1":-9,"\u00c2":-9,"\u00c3":-9,"\u00c0":-9,"\u00c6":-18,"\u00c5":-9,"\u00c4":-9,"Y":-9,"W":-7,"V":-11,"T":-2,"A":-9}},{"d":"218,-126v0,84,-41,131,-132,126r-81,0r0,-19r29,-2r0,-96r-30,0r0,-19r30,0r0,-93r-29,-1r0,-19r85,0v89,-6,128,40,128,123xm188,-124v0,-75,-37,-112,-125,-101r0,89r53,0r0,19r-53,0r0,93v84,6,125,-24,125,-100","w":239},{"d":"13,-181v-1,-44,13,-70,52,-70v37,1,49,28,49,70v0,43,-12,71,-50,71v-38,0,-51,-29,-51,-71xm64,-235v-22,0,-28,24,-28,54v0,36,9,54,28,54v19,0,28,-18,28,-54v0,-36,-9,-54,-28,-54xm76,7r99,-263r21,0r-98,263r-22,0xm157,-69v0,-43,12,-70,51,-70v37,0,50,28,50,70v0,43,-12,71,-50,71v-38,0,-51,-28,-51,-71xm207,-123v-21,0,-28,25,-28,55v0,36,10,54,29,54v19,0,28,-19,28,-55v0,-36,-10,-54,-29,-54","w":271},{"d":"62,0r-45,-162r-21,-1r0,-19r78,0r0,19r-29,1r36,139r45,-159r35,0r47,159r37,-139r-29,-1r0,-19r74,0r0,19r-21,1r-45,162r-35,0r-47,-160r-45,160r-35,0","w":286,"k":{"\u00f8":1,"\u00e6":-8,"\u00f6":1,"\u00f2":1,"\u00f3":1,"\u00e5":-8,"\u00e3":-8,"\u00e4":-8,"\u00e2":-8,"\u00e0":-8,"\u00e1":-8,"s":-7,"o":1,"l":-1,"g":-1,"a":-8,";":-2,":":-1,".":14,"-":-4,",":15}},{"d":"218,-126v0,84,-41,131,-132,126r-81,0r0,-19r29,-2r0,-208r-29,-1r0,-19r85,0v89,-6,128,40,128,123xm188,-124v0,-75,-37,-112,-125,-101r0,201v84,6,125,-24,125,-100","w":239,"k":{"\u00c1":4,"\u00c2":4,"\u00c3":4,"\u00c0":4,"\u00c5":4,"\u00c4":4,"Y":4,"X":7,"W":4,"V":2,"T":-4,"J":11,"A":4}},{"d":"18,-179v0,-47,30,-70,87,-70r115,0r0,19r-29,1r0,272r-28,0r0,-268r-44,0r0,268r-28,0r0,-153v-45,0,-73,-26,-73,-69","w":237},{"d":"104,-151v-2,40,-53,49,-93,34r5,-17v27,12,65,11,65,-18v0,-21,-28,-28,-51,-24r0,-17v23,4,49,-4,50,-23v-5,-25,-36,-21,-59,-11r-5,-17v32,-13,86,-11,86,27v0,16,-8,26,-26,32v19,5,28,16,28,34xm80,7r98,-263r21,0r-98,263r-21,0xm213,0r0,-35r-63,0r0,-20r61,-82r24,0r0,85r21,0r0,17r-21,0r0,35r-22,0xm214,-52r0,-60r-43,60r43,0","w":271},{"d":"53,-127r0,-101r-29,17r-8,-15v18,-8,28,-26,57,-23r0,122r21,1r0,14r-63,0r0,-14xm70,7r98,-263r21,0r-98,263r-21,0xm208,0r0,-35r-62,0r0,-20r60,-82r24,0r0,85r22,0r0,17r-22,0r0,35r-22,0xm209,-52r0,-60r-43,60r43,0","w":271},{"d":"95,-246r-26,35r-26,0r36,-52r33,0r36,52r-26,0xm18,-91v0,-56,27,-94,79,-95v55,0,75,41,75,102r-126,0v-1,65,64,83,109,48r11,22v-63,42,-148,7,-148,-77xm143,-106v7,-56,-63,-79,-87,-34v-5,9,-9,21,-9,34r96,0","w":190,"k":{"y":-3,"w":-1,"v":-2}},{"d":"148,-324r35,0r-53,52r-26,0xm121,4v-67,3,-89,-38,-89,-114r0,-119r-29,-1r0,-19r86,0r0,19r-29,1v7,82,-30,209,61,209v93,0,54,-126,62,-209r-29,-1r0,-19r85,0r0,19r-28,1r0,119v5,83,-21,111,-90,114","w":242,"k":{"r":4,"p":5,"n":4,"m":4,"A":2,".":9,",":10}},{"d":"7,-201v0,-30,24,-52,53,-52v29,-1,52,23,52,52v0,29,-23,52,-52,52v-29,0,-53,-23,-53,-52xm97,-201v0,-23,-16,-38,-38,-38v-21,0,-36,16,-36,38v0,22,15,38,37,38v22,0,37,-17,37,-38","w":119},{"d":"162,-256v-1,49,-55,36,-86,24v-7,0,-13,5,-16,15r-19,0v2,-49,55,-37,87,-24v8,0,15,-6,16,-15r18,0xm18,-91v0,-54,33,-95,85,-95v50,0,83,42,83,95v0,54,-34,95,-84,95v-50,0,-84,-42,-84,-95xm157,-91v-1,-40,-19,-74,-56,-73v-37,1,-54,32,-54,73v0,40,20,72,55,73v36,1,56,-33,55,-73","w":204},{"d":"94,-324r44,52r-27,0r-52,-52r35,0xm159,-87r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-228r36,0r82,228r26,1r0,20r-87,0r0,-20r30,-1xm150,-111r-37,-113r-38,113r75,0","w":227,"k":{"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,",":-10}},{"d":"104,-263r35,0r-53,52r-26,0","w":180},{"d":"89,-21r0,-48r-56,0r0,-19r56,0v0,-8,1,-19,-2,-24r-54,0r0,-19r45,0r-63,-98r-26,-1r0,-19r86,0r0,19r-26,1r56,90r56,-90r-29,-1r0,-19r87,0r0,19r-27,1r-62,98r45,0r0,19r-54,0v-5,4,-3,15,-3,24r57,0r0,19r-57,0r0,48r29,2r0,19r-87,0r0,-19"},{"d":"34,-21r0,-208r-29,-1r0,-19r165,0r0,63r-26,0r-3,-39r-78,0r0,87r76,0r0,24r-76,0r0,93r29,1r0,20r-87,0r0,-20","w":190,"k":{"\u00c1":23,"\u00c2":23,"\u00c3":23,"\u00c0":23,"\u00f8":18,"\u00e6":12,"\u00f6":17,"\u00f3":17,"\u00e9":17,"\u00e5":12,"\u00e4":12,"\u00e1":12,"\u00d6":7,"\u00c5":23,"\u00c4":23,"u":14,"r":14,"o":17,"j":-3,"i":-1,"e":17,"a":12,"O":7,"J":14,"A":23,".":36,"-":8,",":38}},{"d":"88,-246r-26,35r-26,0r36,-52r33,0r36,52r-26,0xm23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38","w":186},{"d":"80,-263r44,52r-26,0r-53,-52r35,0","w":180},{"d":"13,-80r0,-22r182,0r0,22r-182,0xm84,-149v0,-11,8,-20,20,-20v11,0,21,9,20,20v0,11,-9,19,-20,19v-11,0,-20,-8,-20,-19xm84,-33v0,-11,9,-20,20,-20v10,0,21,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20"},{"d":"169,-153v41,58,9,157,-66,157v-22,0,-41,-7,-56,-22r-22,23r-11,-10r23,-25v-41,-58,-9,-156,67,-156v22,0,39,8,55,22r22,-24r11,10xm142,-146v-37,-42,-94,-4,-94,55v0,15,3,29,8,41xm64,-37v36,43,94,7,94,-54v0,-16,-3,-29,-8,-41","w":206},{"d":"125,-21r0,-51r-113,0r0,-27r108,-150r32,0r0,154r39,0r0,23r-39,0r0,51r32,1r0,20r-91,0r0,-20xm125,-95r0,-122r-86,122r86,0"},{"d":"57,-90r-42,-62r19,-13r56,75r-56,75r-19,-13xm128,-90r-42,-62r19,-13r56,75r-56,75r-19,-13","w":172,"k":{"\u00c1":4,"\u00c6":-4,"\u00c5":4,"\u00c4":4,"Y":27,"W":10,"V":15,"T":27,"A":4}},{"d":"18,-91v0,-56,27,-94,79,-95v55,0,75,41,75,102r-126,0v-1,65,64,83,109,48r11,22v-63,42,-148,7,-148,-77xm143,-106v7,-56,-63,-79,-87,-34v-5,9,-9,21,-9,34r96,0xm115,-263r35,0r-53,52r-26,0","w":190,"k":{"y":-3,"w":-1,"v":-2}},{"d":"104,-246r-26,35r-26,0r36,-52r33,0r36,52r-26,0xm62,-73v-5,72,60,65,91,23r0,-112r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-51,0r0,-29v-36,48,-136,47,-121,-46r0,-87r-26,-1r0,-19r53,-2r0,111","w":215},{"d":"145,-324r35,0r-53,52r-26,0xm21,-125v1,-72,44,-128,111,-128v67,0,110,60,109,128v0,72,-44,129,-110,129v-69,0,-111,-60,-110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,104,79,104v53,0,80,-47,80,-105","w":262,"k":{"Y":5,"W":4,"V":3,"T":-3,"A":3}},{"d":"26,-34r-14,-15r22,-21v-24,-31,-24,-81,0,-112r-22,-21r14,-14r22,21v28,-26,84,-25,112,0r21,-21r14,14r-21,21v23,31,23,81,0,112r21,21r-14,15r-21,-22v-28,26,-84,25,-112,0xm170,-126v-1,-40,-23,-70,-67,-70v-39,0,-65,31,-65,70v0,40,27,70,66,70v39,0,67,-30,66,-70"},{"d":"182,-81v0,75,-91,107,-156,69r10,-24v48,33,116,14,116,-46v0,-60,-69,-62,-119,-40r3,-127r135,0r0,24r-106,0r-3,72v63,-18,120,10,120,72"},{"d":"20,-182r-2,-80r29,0r-2,80r-25,0xm72,-182r-2,-81r29,0r-2,81r-25,0","w":116},{"d":"18,-91v0,-54,33,-95,85,-95v50,0,83,42,83,95v0,54,-34,95,-84,95v-50,0,-84,-42,-84,-95xm157,-91v-1,-40,-19,-74,-56,-73v-37,1,-54,32,-54,73v0,40,20,72,55,73v36,1,56,-33,55,-73xm123,-263r35,0r-53,52r-26,0","w":204,"k":{"y":-1,"w":1}},{"d":"53,-279v2,-47,55,-36,86,-23v9,0,16,-6,17,-15r18,0v-2,21,-14,37,-34,37v-18,0,-61,-32,-68,1r-19,0xm159,-87r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-228r36,0r82,228r26,1r0,20r-87,0r0,-20r30,-1xm150,-111r-37,-113r-38,113r75,0","w":227,"k":{"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,",":-10}},{"d":"18,-91v0,-54,33,-95,85,-95v50,0,83,42,83,95v0,54,-34,95,-84,95v-50,0,-84,-42,-84,-95xm157,-91v-1,-40,-19,-74,-56,-73v-37,1,-54,32,-54,73v0,40,20,72,55,73v36,1,56,-33,55,-73xm49,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm117,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":204,"k":{"y":-1,"x":3,"w":1,"t":6}},{"d":"93,12r33,0r-49,53r-27,0","w":180},{"d":"66,-94v-15,0,-28,14,-37,26r-16,-14v13,-19,28,-36,52,-36v28,0,50,30,75,30v18,0,26,-12,39,-27r16,14v-12,17,-30,36,-53,36v-19,0,-52,-29,-76,-29"},{"d":"23,-168v52,-35,144,-22,128,63r0,84r27,1r0,20r-51,0r-1,-21v-27,39,-112,32,-112,-29v0,-52,49,-67,110,-60v7,-60,-51,-66,-89,-38xm43,-51v2,46,64,40,81,5r0,-43v-40,-4,-82,2,-81,38","w":186,"k":{"w":2,"v":1,"j":5}},{"d":"175,-184v-1,34,-21,57,-53,63v39,11,41,66,60,101r24,0r0,20r-46,0r-40,-89v-11,-21,-27,-21,-57,-22r0,90r29,1r0,20r-87,0r0,-20r29,-1r0,-208r-29,-1r0,-19v78,-1,173,-11,170,65xm144,-181v0,-41,-35,-46,-81,-44r0,91v46,2,81,-6,81,-47","w":196,"k":{"\u00e6":-14,"\u00fc":-3,"\u00fa":-3,"\u00f6":-3,"\u00f3":-3,"\u00e9":-4,"\u00e5":-13,"\u00e4":-13,"\u00e1":-13,"\u00dc":1,"y":-11,"u":-3,"o":-3,"e":-4,"a":-13,"Y":-5,"W":-3,"V":-7,"U":1,"T":-8,"G":1,"-":-1}},{"d":"18,-91v0,-56,27,-94,79,-95v55,0,75,41,75,102r-126,0v-1,65,64,83,109,48r11,22v-63,42,-148,7,-148,-77xm143,-106v7,-56,-63,-79,-87,-34v-5,9,-9,21,-9,34r96,0xm46,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm114,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":190},{"d":"41,-91r153,71r0,24r-182,-86r0,-19r182,-85r0,23"},{"d":"31,-18v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-9,22,-21,22v-12,0,-21,-10,-21,-22","w":103},{"d":"13,-108r0,-22r80,0r0,-52r22,0r0,52r80,0r0,22r-80,0r0,52r-22,0r0,-52r-80,0xm13,0r0,-22r182,0r0,22r-182,0"},{"d":"62,-324r35,0r-53,52r-26,0xm34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,208r29,1r0,20r-87,0r0,-20","w":96},{"d":"183,-150v0,94,-45,162,-145,153r2,-23v71,6,104,-37,112,-101v-39,55,-134,25,-134,-49v0,-49,34,-83,82,-83v60,1,83,40,83,103xm152,-173v0,-35,-21,-57,-53,-57v-31,0,-53,24,-52,58v0,33,20,57,52,57v32,0,53,-23,53,-58"},{"d":"46,-298v-1,-12,9,-18,19,-19v10,0,18,8,18,19v0,12,-8,18,-19,19v-10,0,-18,-8,-18,-19xm114,-298v-1,-12,9,-18,19,-19v10,0,18,8,18,19v0,11,-8,18,-18,19v-11,0,-19,-8,-19,-19xm34,-21r0,-208r-29,-1r0,-19r164,0r0,63r-26,0r-3,-39r-77,0r0,87r71,0r0,24r-71,0r0,90r83,0r3,-39r25,0r0,63r-169,0r0,-19","w":196},{"d":"121,-307r-26,35r-26,0r36,-52r33,0r36,52r-27,0xm121,4v-67,3,-89,-38,-89,-114r0,-119r-29,-1r0,-19r86,0r0,19r-29,1v7,82,-30,209,61,209v93,0,54,-126,62,-209r-29,-1r0,-19r85,0r0,19r-28,1r0,119v5,83,-21,111,-90,114","w":242,"k":{"A":2}},{"d":"52,-123v1,59,25,103,84,103v19,0,37,-4,57,-13r8,23v-92,43,-180,-16,-180,-113v0,-99,79,-156,174,-119r0,56r-26,0r-2,-38v-72,-22,-117,31,-115,101","w":210,"k":{"\u00d3":4,"\u00c1":-20,"\u00c6":-29,"\u00d6":4,"\u00c5":-20,"\u00c4":-20,"O":4,"K":-9,"H":-9,"A":-20}},{"d":"48,-307r-26,35r-26,0r36,-52r33,0r36,52r-26,0xm34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,208r29,1r0,20r-87,0r0,-20","w":96},{"d":"17,-199v0,-31,18,-52,48,-52v29,0,47,21,47,52v0,31,-18,54,-47,53v-28,0,-48,-22,-48,-53xm91,-199v0,-19,-10,-36,-26,-36v-16,0,-27,18,-27,36v0,19,10,36,27,36v16,1,26,-17,26,-36","w":129},{"d":"11,7r50,-263r24,0r-51,263r-23,0","w":95},{"d":"104,-245v-33,2,-42,23,-42,66r0,179r-53,0r0,-20r26,-1v9,-97,-35,-246,69,-246v79,0,99,120,20,126v44,0,64,28,65,68v2,55,-47,90,-106,73r5,-23v38,14,72,-10,72,-50v0,-37,-24,-58,-64,-56r0,-22v32,-1,50,-19,50,-49v0,-25,-18,-46,-42,-45"},{"d":"143,-123v66,37,25,127,-51,127v-23,0,-47,-6,-70,-16r0,-51r25,0r3,33v37,20,101,10,97,-34v-6,-71,-126,-33,-126,-120v0,-71,85,-82,147,-56r0,54r-26,0r-2,-34v-35,-17,-89,-11,-89,33v0,45,69,51,92,64","w":197,"k":{"\u00c1":-8,"\u00c6":-17,"\u00c5":-8,"\u00c4":-8,"t":3,"Y":-10,"W":-8,"V":-12,"T":-4,"S":-1,"A":-8}},{"d":"37,-151r0,-98r29,0r0,98r-29,0xm37,0r0,-98r29,0r0,98r-29,0","w":103},{"d":"167,-91r-153,-72r0,-23r182,85r0,19r-182,86r0,-24"},{"d":"159,-87r-93,0r-23,66r31,1r0,20r-86,0r0,-20r26,-1r81,-228r36,0r82,228r26,1r0,20r-87,0r0,-20r30,-1xm150,-111r-37,-113r-38,113r75,0","w":227,"k":{"\u00d9":2,"\u00db":2,"\u00da":2,"\u00ab":4,"\u00e7":-5,"\u00dc":2,"\u00d6":4,"\u00c7":4,"y":7,"w":3,"v":6,"u":-3,"t":-2,"q":-5,"o":-4,"g":-4,"e":-5,"d":-5,"c":-5,"b":-20,"a":-14,"Y":3,"X":7,"W":7,"V":13,"U":2,"T":25,"Q":4,"O":4,"G":4,"C":4,".":-10,"-":-4,",":-10}},{"d":"62,-73v-5,72,60,65,91,23r0,-112r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-51,0r0,-29v-36,48,-136,47,-121,-46r0,-87r-26,-1r0,-19r53,-2r0,111xm55,-237v-1,-12,9,-19,19,-19v10,0,19,8,19,19v0,11,-9,18,-19,19v-11,0,-19,-8,-19,-19xm123,-237v0,-11,9,-19,19,-19v10,0,19,7,19,19v0,12,-9,18,-19,19v-11,0,-19,-9,-19,-19","w":215},{"d":"34,-21r0,-208r-29,-1r0,-19r164,0r0,63r-26,0r-3,-39r-77,0r0,87r71,0r0,24r-71,0r0,90r83,0r3,-39r25,0r0,63r-169,0r0,-19","w":196},{"d":"41,-37r35,0r-31,81r-29,0xm38,-152v0,-12,10,-21,22,-21v12,0,20,10,21,21v0,12,-10,22,-22,22v-12,0,-21,-10,-21,-22","w":103},{"d":"45,-125v0,82,83,133,162,97r8,18v-91,45,-193,-22,-191,-115v2,-73,54,-128,131,-128v68,0,121,39,123,109v1,46,-31,89,-70,90v-15,0,-27,-9,-27,-26v-25,44,-100,29,-97,-25v3,-66,65,-103,131,-77r-15,95v0,8,5,13,12,13v29,0,44,-39,45,-72v1,-52,-50,-87,-102,-87v-59,0,-110,48,-110,108xm111,-108v0,45,60,42,66,7r12,-68v-42,-18,-78,24,-78,61","w":301},{"d":"121,4v-67,3,-89,-38,-89,-114r0,-119r-29,-1r0,-19r86,0r0,19r-29,1v7,82,-30,209,61,209v93,0,54,-126,62,-209r-29,-1r0,-19r85,0r0,19r-28,1r0,119v5,83,-21,111,-90,114","w":242,"k":{"\u00c1":2,"\u00c2":2,"\u00c3":2,"\u00c6":-7,"\u00c5":2,"\u00c4":2,"r":4,"p":5,"n":4,"m":4,"A":2,".":9,",":10}},{"w":90},{"d":"84,-124v0,-53,53,-83,105,-59r0,35r-18,0r-2,-23v-33,-15,-62,12,-62,47v0,43,43,61,80,40r6,16v-46,26,-109,-1,-109,-56xm16,-124v2,-77,50,-128,130,-129v70,-1,126,56,126,128v0,73,-56,129,-128,129v-72,0,-130,-57,-128,-128xm258,-124v0,-68,-49,-118,-116,-118v-63,0,-112,52,-112,117v0,67,50,118,114,118v64,0,114,-52,114,-117","w":287},{"d":"18,-125v0,-76,21,-127,87,-128v56,0,84,43,84,128v1,74,-21,129,-85,129v-63,0,-86,-55,-86,-129xm104,-20v70,5,64,-132,44,-181v-8,-19,-24,-28,-45,-28v-48,0,-56,39,-56,105v0,61,9,101,57,104"},{"d":"71,-279v1,-49,55,-35,86,-23v8,0,16,-5,16,-15r19,0v-2,21,-14,37,-34,37v-18,0,-61,-32,-69,1r-18,0xm21,-125v1,-72,44,-128,111,-128v67,0,110,60,109,128v0,72,-44,129,-110,129v-69,0,-111,-60,-110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,104,79,104v53,0,80,-47,80,-105","w":262,"k":{"Y":5,"V":3,"T":-3}},{"d":"20,-182r-2,-81r29,0r-2,81r-25,0","w":64},{"d":"140,-186v1,56,-74,55,-62,121r-24,0v-14,-74,47,-70,56,-120v-4,-40,-53,-35,-85,-13r-7,-23v44,-27,121,-22,122,35xm45,-18v0,-11,10,-21,22,-21v12,0,21,9,21,21v0,12,-9,22,-21,22v-12,0,-22,-10,-22,-22","w":147},{"d":"104,-223r-69,132r-23,0r83,-158r17,0r83,158r-23,0"},{"d":"61,7r-50,-263r23,0r51,263r-24,0","w":95},{"d":"91,4v-22,-1,-51,-8,-66,-15r0,-52r26,0r3,32v7,6,26,10,37,11r0,-94v-41,-15,-64,-28,-66,-70v-1,-40,27,-66,69,-68r0,-27r17,0r0,26v18,1,39,6,63,15r0,52r-26,0r-3,-31v-9,-7,-20,-11,-34,-12r0,92v42,15,67,22,69,69v1,42,-28,67,-71,71r0,28r-18,0r0,-27xm94,-229v-43,0,-54,55,-20,75v4,3,11,6,20,10r0,-85xm109,-20v36,0,60,-53,25,-75v-3,-2,-11,-6,-25,-12r0,87"},{"d":"36,-21r0,-141r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-80,0r0,-20xm31,-247v0,-13,8,-20,19,-20v11,0,19,7,19,20v0,12,-8,19,-19,19v-11,0,-19,-7,-19,-19","w":100,"k":{"j":4,"T":-2}},{"d":"78,3r-64,-165r-21,-1r0,-19r79,0r0,19r-29,1r49,130r48,-130r-29,-1r0,-19r75,0r0,19r-21,1v-30,73,-51,163,-91,225v-13,19,-42,21,-69,15r5,-23v43,14,57,-15,68,-52","w":178,"k":{"\u00e6":-10,"\u00f6":-1,"\u00f2":-1,"\u00f3":-1,"\u00ea":-2,"\u00e8":-2,"\u00e9":-2,"\u00e5":-10,"\u00e3":-10,"\u00e4":-10,"\u00e2":-10,"\u00e0":-10,"\u00e1":-10,"s":-9,"o":-1,"l":-3,"g":-3,"e":-2,"c":-1,"a":-10,";":-2,":":-2,".":19,"-":-3,",":21}},{"d":"78,3r-64,-165r-21,-1r0,-19r79,0r0,19r-29,1r49,130r48,-130r-29,-1r0,-19r75,0r0,19r-21,1v-30,73,-51,163,-91,225v-13,19,-42,21,-69,15r5,-23v43,14,57,-15,68,-52xm118,-263r35,0r-53,52r-26,0","w":178},{"d":"38,-324r44,52r-26,0r-53,-52r35,0xm34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,208r29,1r0,20r-87,0r0,-20","w":96},{"d":"84,-21r0,-204r-54,0r-3,39r-26,0r0,-63r195,0r0,63r-25,0r-3,-39r-55,0r0,204r39,1r0,20r-108,0r0,-20","w":197,"k":{"\u00d2":-3,"\u00d4":-3,"\u00d3":-3,"\u00c1":25,"\u00c2":25,"\u00d5":-3,"\u00c3":25,"\u00c0":25,"\u00ab":28,"\u00f8":12,"\u00e6":14,"\u00d8":-3,"\u00c6":25,"\u00fc":1,"\u00f6":7,"\u00e4":2,"\u00d6":-3,"\u00c5":25,"\u00c4":25,"y":16,"w":20,"v":22,"u":4,"s":14,"r":4,"o":24,"j":-13,"i":-11,"g":25,"e":24,"c":23,"a":14,"Y":-24,"W":-22,"V":-26,"T":-18,"S":-9,"O":-3,"J":4,"G":-2,"C":-3,"A":25,";":15,":":18,".":19,"-":17,",":19}},{"d":"24,-99v1,-93,45,-163,145,-153r-2,23v-69,-8,-104,36,-111,101v39,-55,133,-26,133,49v0,49,-34,83,-82,83v-58,0,-83,-42,-83,-103xm160,-77v0,-34,-20,-57,-52,-57v-32,0,-53,24,-53,58v0,33,20,56,52,56v33,0,54,-22,53,-57"},{"d":"116,-90r42,62r-19,13r-56,-75r56,-75r19,13xm44,-90r43,62r-19,13r-56,-75r56,-75r19,13","w":172},{"d":"42,0r10,-75r-32,0r0,-20r35,0r8,-59r-32,0r0,-21r35,0r11,-74r21,0r-10,74r46,0r10,-74r22,0r-11,74r33,0r0,21r-35,0r-9,59r32,0r0,20r-35,0r-10,75r-22,0r11,-75r-46,0r-11,75r-21,0xm77,-95r46,0r8,-59r-46,0"},{"d":"34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,99r90,-99r-26,-1r0,-19r83,0r0,19r-22,1r-90,99r92,110r24,0r0,20r-88,0r0,-20r27,0r-90,-108r0,107r29,1r0,20r-87,0r0,-20","w":211,"k":{"\u00d3":11,"\u00e6":-7,"\u00fc":4,"\u00f6":3,"\u00f3":3,"\u00e5":-7,"\u00e4":-7,"\u00d6":11,"y":13,"u":4,"o":3,"e":2,"a":-7,"T":-15,"S":-8,"O":11,"G":11,"C":11,"-":21}},{"d":"56,-110v0,58,27,119,60,151r-14,15v-73,-58,-104,-198,-37,-288v12,-16,23,-31,37,-43r14,15v-32,31,-60,93,-60,150","w":129},{"d":"180,-66v0,79,-94,66,-175,66r0,-19r29,-2r0,-208r-29,-1r0,-19v77,0,168,-12,168,64v0,36,-17,53,-50,58v38,4,57,25,57,61xm143,-181v1,-44,-35,-46,-80,-45r0,89v48,1,79,-4,80,-44xm150,-69v0,-44,-37,-47,-87,-46r0,92v49,1,88,0,87,-46","w":200,"k":{"\u00d2":-1,"\u00d4":-1,"\u00d3":-1,"\u00c1":-9,"\u00c2":-9,"\u00c3":-9,"\u00d8":-1,"\u00c6":-19,"\u00d6":-1,"\u00c5":-9,"\u00c4":-9,"Y":-5,"W":-2,"V":-7,"O":-1,"A":-9}},{"d":"34,-21r0,-208r-29,-1r0,-19r62,0r124,208r-1,-188r-29,-1r0,-19r85,0r0,19r-29,1r0,229r-33,0r-97,-160v-9,-15,-17,-31,-26,-48r0,187r29,1r0,20r-85,0r0,-20","w":251,"k":{"\u00d3":3,"\u00c1":-5,"\u00f8":2,"\u00e6":5,"\u00c6":-15,"\u00fc":5,"\u00f6":4,"\u00f3":4,"\u00e9":3,"\u00e5":4,"\u00e4":4,"\u00e1":4,"\u00d6":3,"\u00c7":3,"\u00c5":-5,"\u00c4":-5,"u":5,"o":4,"e":3,"a":4,"O":3,"G":4,"C":3,"A":-5,".":4,",":5}},{"d":"14,-90r0,-22r84,0r0,22r-84,0","w":111,"k":{"\u00c1":-4,"\u00c6":-2,"\u00c5":-4,"\u00c4":-4,"Y":18,"W":-1,"V":2,"T":17,"A":-4}},{"d":"101,-21r0,-197r-51,33r-12,-22r66,-42r25,0r0,228r31,1r0,20r-91,0r0,-20"},{"d":"90,-186v25,1,43,14,56,31r0,-29r51,2r0,19r-26,1r0,219r26,1r0,19r-86,0r0,-19r32,-1r0,-82v-13,17,-27,29,-52,29v-47,0,-73,-46,-73,-96v0,-50,25,-94,72,-94xm95,-18v22,-1,37,-16,48,-34r0,-79v-13,-22,-29,-33,-48,-33v-34,0,-48,35,-48,72v0,38,13,74,48,74","k":{"u":-8,"c":3}},{"d":"89,-271r0,327r-59,0r0,-22r32,0r0,-283r-32,0r0,-22r59,0","w":129},{"d":"34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,90r120,0r0,-90r-29,-1r0,-19r86,0r0,19r-29,1r0,208r29,1r0,20r-86,0r0,-20r29,-1r0,-95r-120,0r0,95r29,1r0,20r-87,0r0,-20","w":245},{"d":"115,4v-28,0,-40,-13,-55,-32r0,28r-51,0r0,-20r26,-1r0,-222r-26,-1r0,-19r53,-2r0,108v44,-63,126,-14,126,65v0,51,-25,96,-73,96xm159,-92v0,-37,-13,-72,-48,-72v-21,0,-37,11,-49,34r0,77v11,18,25,35,48,35v35,0,49,-36,49,-74","w":205,"k":{"y":-2,"w":-1,"v":-1}},{"d":"14,-90r0,-22r84,0r0,22r-84,0","w":111},{"d":"109,-216v0,43,-33,57,-64,87r65,0r0,17r-93,0r0,-17v32,-28,63,-52,70,-86v-4,-28,-39,-23,-61,-8r-6,-16v33,-20,89,-18,89,23","w":129},{"d":"-6,53r0,-22r192,0r0,22r-192,0","w":180},{"d":"121,4v-67,3,-89,-38,-89,-114r0,-119r-29,-1r0,-19r86,0r0,19r-29,1v7,82,-30,209,61,209v93,0,54,-126,62,-209r-29,-1r0,-19r85,0r0,19r-28,1r0,119v5,83,-21,111,-90,114xm69,-298v0,-12,9,-18,19,-19v10,0,18,8,18,19v0,11,-8,18,-18,19v-10,0,-19,-8,-19,-19xm137,-298v-1,-12,9,-18,19,-19v10,0,20,7,19,19v0,12,-8,18,-19,19v-11,0,-19,-8,-19,-19","w":242,"k":{"r":4,"p":5,"n":4,"m":4,"b":-10,"A":2,".":9,",":10}},{"d":"157,-21v-5,-53,19,-143,-36,-143v-20,0,-38,11,-57,34r0,109r26,1r0,20r-80,0r0,-20r26,-1r0,-141r-26,-1r0,-19r53,-2r0,30v36,-47,136,-46,121,45r0,88r27,1r0,20r-80,0r0,-20","w":219,"k":{"w":1,"v":1,"p":4,"T":8}},{"d":"34,-21r0,-208r-29,-1r0,-19r69,0r83,223r80,-223r68,0r0,19r-29,1r0,208r29,1r0,20r-85,0r0,-20r27,-1r0,-186r-75,207r-33,0r-78,-207r0,186r27,1r0,20r-83,0r0,-20","w":309},{"d":"26,-241v33,-19,85,-13,76,37r0,41r14,1r0,14r-33,0r-1,-11v-18,21,-62,16,-62,-18v0,-26,26,-35,61,-33v4,-32,-28,-29,-49,-16xm41,-177v2,20,31,17,40,1r0,-19v-20,-4,-42,3,-40,18","w":129},{"d":"131,-253v133,0,144,227,32,253v16,15,33,30,54,44r-15,18v-25,-16,-50,-35,-75,-58v-71,-4,-106,-56,-106,-128v0,-72,44,-129,110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,103,79,104v53,0,80,-47,80,-105","w":262},{"d":"18,-91v0,-56,27,-94,79,-95v55,0,75,41,75,102r-126,0v-1,65,64,83,109,48r11,22v-63,42,-148,7,-148,-77xm143,-106v7,-56,-63,-79,-87,-34v-5,9,-9,21,-9,34r96,0xm85,-263r44,52r-26,0r-53,-52r35,0","w":190},{"d":"62,-73v-5,72,60,65,91,23r0,-112r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-51,0r0,-29v-36,48,-136,47,-121,-46r0,-87r-26,-1r0,-19r53,-2r0,111xm93,-263r44,52r-26,0r-53,-52r35,0","w":215},{"d":"18,-90v0,-80,66,-115,138,-86r0,49r-26,0r-3,-33v-50,-16,-80,16,-80,67v0,64,57,98,103,58r11,22v-61,41,-143,4,-143,-77xm90,12r33,0r-49,53r-27,0","w":173},{"d":"116,4v-25,0,-39,-13,-52,-29r0,82r30,1r0,19r-84,0r0,-19r26,-1r0,-219r-26,-1r0,-19r52,-2r0,29v13,-18,30,-30,55,-31v45,0,72,44,72,94v0,51,-25,96,-73,96xm160,-92v0,-37,-13,-72,-48,-72v-19,0,-35,11,-48,33r0,79v11,18,26,34,48,34v35,0,48,-36,48,-74","k":{"y":-2,"t":5}},{"d":"157,-21v-5,-53,19,-143,-36,-143v-20,0,-38,11,-57,34r0,109r26,1r0,20r-80,0r0,-20r26,-1r0,-222r-26,-1r0,-19r54,-2r0,111v16,-18,37,-32,65,-32v74,0,51,95,55,165r27,1r0,20r-80,0r0,-20","w":219},{"d":"15,0r0,-24r141,-201r-108,0r-3,39r-26,0r0,-63r170,0r0,24r-140,201r116,0r3,-39r25,0r0,63r-178,0","w":210,"k":{"y":3,"v":4}},{"d":"13,-106r0,-22r182,0r0,22r-182,0xm13,-54r0,-22r182,0r0,22r-182,0"},{"d":"18,-91v0,-56,27,-94,79,-95v55,0,75,41,75,102r-126,0v-1,65,64,83,109,48r11,22v-63,42,-148,7,-148,-77xm143,-106v7,-56,-63,-79,-87,-34v-5,9,-9,21,-9,34r96,0","w":189,"k":{"y":-3,"x":-4,"w":-1,"v":-2,"t":6}},{"d":"36,-21r0,-141r-26,-1r0,-19r52,-2r0,31v15,-26,33,-38,63,-31r-1,24v-30,-8,-48,10,-60,41r0,98r30,1r0,20r-84,0r0,-20","w":132,"k":{"\u00f8":7,"\u00e6":-2,"\u00f6":7,"\u00f4":7,"\u00f2":7,"\u00f3":7,"\u00ea":5,"\u00e8":5,"\u00e9":5,"\u00e7":6,"\u00e5":-2,"\u00e4":-2,"\u00e2":-2,"\u00e0":-2,"\u00e1":-2,"z":-5,"y":-18,"x":-9,"w":-16,"v":-17,"u":-10,"t":-8,"s":-1,"r":-9,"q":5,"p":-9,"o":7,"n":-9,"m":-9,"l":4,"k":4,"j":-10,"i":-9,"h":4,"g":4,"f":-8,"e":5,"d":5,"c":6,"a":-2,";":5,":":5,".":15,"-":12,",":16}},{"d":"115,-239v-34,-20,-52,12,-46,57r43,0r0,22r-43,0r0,139r33,1r0,20r-89,0r0,-20r28,0r0,-140r-29,0r0,-22r29,0v-6,-61,18,-99,76,-81","w":124,"k":{"\u00f8":1,"\u00f6":9,"\u00f3":9,"\u00e9":8,"t":-5,"s":1,"o":9,"l":-9,"j":-8,"i":-6,"f":-5,"e":8,"?":-11,"!":-11}},{"d":"117,-2v-43,15,-76,1,-76,-53r0,-105r-29,0r0,-22r29,0r0,-40r28,-6r0,46r43,0r0,22r-43,0r0,99v-5,39,17,51,45,37","w":127,"k":{"\u00e6":-2,"\u00f6":7,"\u00f3":7,"\u00e9":7,"\u00e5":-2,"\u00e4":-2,"\u00e1":-2,"o":7,"h":-8,"e":7,"a":-2,"S":-2,";":1,":":2}},{"d":"178,-188v-4,74,-70,113,-120,164r122,0r0,24r-157,0r0,-25v56,-51,86,-78,117,-127v23,-38,0,-80,-45,-78v-19,0,-38,7,-58,19r-7,-25v55,-30,152,-23,148,48"},{"d":"149,-51v0,61,-83,66,-129,42r0,-48r25,0r3,32v26,12,77,10,73,-23v-6,-52,-103,-19,-103,-85v0,-58,75,-63,123,-42r0,48r-26,0r-3,-32v-26,-10,-68,-6,-66,24v3,48,103,19,103,84","w":165,"k":{"s":-2}},{"d":"38,-18v0,-12,10,-21,22,-21v12,0,20,10,21,21v0,12,-10,22,-22,22v-12,0,-21,-10,-21,-22xm38,-152v0,-12,10,-21,22,-21v12,0,20,10,21,21v0,12,-10,22,-22,22v-12,0,-21,-10,-21,-22","w":103},{"d":"52,-123v1,59,25,103,84,103v19,0,37,-4,57,-13r8,23v-92,43,-180,-16,-180,-113v0,-99,79,-156,174,-119r0,56r-26,0r-2,-38v-72,-22,-117,31,-115,101xm112,12r33,0r-48,53r-27,0","w":210,"k":{"A":-20}},{"d":"40,56r0,-327r60,0r0,22r-32,0r0,283r32,0r0,22r-60,0","w":129},{"d":"131,-307r-26,35r-26,0r36,-52r33,0r36,52r-26,0xm21,-125v1,-72,44,-128,111,-128v67,0,110,60,109,128v0,72,-44,129,-110,129v-69,0,-111,-60,-110,-129xm211,-125v0,-58,-26,-103,-81,-104v-52,-1,-78,48,-78,105v0,58,26,104,79,104v53,0,80,-47,80,-105","w":262,"k":{"Y":5,"V":3,"T":-3}},{"d":"74,-110v0,-58,-28,-117,-60,-150r13,-15v74,57,105,198,38,288v-12,16,-24,31,-38,43r-13,-15v33,-31,60,-93,60,-151","w":129},{"d":"214,-214v57,74,18,218,-83,218v-30,0,-54,-9,-72,-27r-21,26r-13,-10r24,-29v-60,-74,-17,-225,82,-217v32,2,54,10,72,27r22,-27r12,10xm131,-229v-77,-4,-97,109,-64,171r119,-147v-13,-16,-30,-23,-55,-24xm131,-20v78,0,98,-110,64,-171r-119,147v14,16,33,24,55,24","w":262,"k":{"A":3}},{"d":"52,-117r23,0r3,167r-30,0xm42,-165v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-8,21,-21,21v-13,0,-21,-9,-21,-21","w":111},{"d":"7,3v0,-53,73,-56,62,-121r25,0v12,73,-46,71,-56,120v5,40,52,37,84,14r8,23v-45,28,-123,21,-123,-36xm60,-165v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-8,21,-21,21v-13,0,-21,-9,-21,-21","w":147},{"d":"18,-91v0,-54,33,-95,85,-95v50,0,83,42,83,95v0,54,-34,95,-84,95v-50,0,-84,-42,-84,-95xm157,-91v-1,-40,-19,-74,-56,-73v-37,1,-54,32,-54,73v0,40,20,72,55,73v36,1,56,-33,55,-73","w":204,"k":{"y":-1,"x":3,"w":1,"t":6,"T":23}},{"d":"15,-271v119,-19,18,152,94,153r0,21v-78,-2,26,173,-94,153r0,-21v77,16,-6,-130,66,-143v-43,-3,-31,-62,-31,-106v0,-31,-6,-38,-35,-36r0,-21","w":129},{"d":"111,-324r44,52r-26,0r-53,-52r35,0xm121,4v-67,3,-89,-38,-89,-114r0,-119r-29,-1r0,-19r86,0r0,19r-29,1v7,82,-30,209,61,209v93,0,54,-126,62,-209r-29,-1r0,-19r85,0r0,19r-28,1r0,119v5,83,-21,111,-90,114","w":242,"k":{"A":2}},{"d":"62,-73v-5,72,60,65,91,23r0,-112r-26,-1r0,-19r54,-2r0,163r26,1r0,20r-51,0r0,-29v-36,48,-136,47,-121,-46r0,-87r-26,-1r0,-19r53,-2r0,111","w":215},{"d":"176,-176v-2,59,-48,74,-113,71r0,84r33,1r0,20r-91,0r0,-20r29,-1r0,-208r-29,-1r0,-19v83,-1,173,-10,171,73xm146,-176v0,-43,-35,-53,-83,-49r0,96v50,1,83,-2,83,-47","w":186,"k":{"\u00c1":15,"\u00f8":4,"\u00e6":-2,"\u00c6":11,"\u00f6":4,"\u00f3":4,"\u00e9":3,"\u00e5":-2,"\u00e4":-2,"\u00e1":-2,"\u00c5":15,"\u00c4":15,"o":4,"e":3,"a":-2,"J":18,"A":15,".":31,",":33}},{"d":"88,-21r0,-91r-74,-117r-25,-1r0,-19r87,0r0,19r-29,1r56,92r56,-92r-28,-1r0,-19r84,0r0,19r-24,1r-74,117r0,91r31,1r0,20r-92,0r0,-20","w":204,"k":{"\u00d2":5,"\u00d4":5,"\u00d3":5,"\u00c1":3,"\u00c2":3,"\u00d5":5,"\u00c3":3,"\u00c0":3,"\u00ab":27,"\u00f8":17,"\u00e6":18,"\u00d8":5,"\u00c6":-6,"\u00d6":5,"\u00c5":3,"\u00c4":3,"v":1,"u":8,"p":7,"o":22,"i":-8,"g":22,"e":22,"a":18,"T":-24,"S":-8,"O":5,"J":-2,"G":7,"C":5,"A":3,";":13,":":15,".":24,"-":18,",":24}},{"d":"264,-14v-38,28,-104,23,-124,-15v-23,43,-126,49,-126,-19v0,-50,52,-64,110,-58v9,-62,-50,-71,-89,-42r-12,-20v35,-24,99,-27,120,8v28,-39,103,-34,118,14v5,15,10,36,10,62r-118,0v-2,62,57,84,100,48xm77,-18v31,-1,54,-26,47,-66v-39,-3,-81,0,-81,35v0,19,14,31,34,31xm242,-106v6,-54,-59,-80,-81,-34v-5,9,-8,20,-8,34r89,0","w":289,"k":{"y":-4,"w":-2,"v":-2}},{"d":"74,0r-58,-162r-21,-1r0,-19r79,0r0,19r-29,1r49,138r48,-138r-30,-1r0,-19r76,0r0,19r-21,1r-58,162r-35,0","w":182,"k":{"\u00f8":1,"\u00e6":-9,"\u00ea":-1,"\u00e8":-1,"\u00e9":-1,"\u00e5":-9,"\u00e3":-9,"\u00e4":-9,"\u00e2":-9,"\u00e0":-9,"\u00e1":-9,"s":-8,"l":-2,"g":-2,"e":-1,"a":-9,";":-1,":":-1,".":18,"-":-2,",":20}},{"d":"32,-156v1,-54,27,-92,76,-96r0,-27r18,0r0,27v18,1,36,6,53,13r0,49r-26,0r-2,-33v-8,-3,-16,-5,-25,-6r0,144v15,-2,30,-6,43,-15r11,21v-16,10,-34,15,-54,16r0,27r-18,0r0,-27v-51,-4,-76,-39,-76,-93xm108,-230v-54,-1,-60,106,-25,134v7,6,15,9,25,11r0,-145"},{"d":"36,-20v40,0,37,-23,37,-74r0,-135r-33,-1r0,-19r88,0r0,19r-26,1r0,148v10,74,-44,99,-103,77r3,-23v11,5,22,7,34,7","w":133,"k":{"\u00c6":-12,"\u00c5":-2,"\u00c4":-2,"A":-2}},{"d":"-5,-298v-1,-12,9,-18,19,-19v10,0,20,7,19,19v0,12,-8,18,-19,19v-11,0,-19,-8,-19,-19xm64,-298v-1,-12,9,-18,19,-19v10,0,18,8,18,19v0,12,-8,18,-19,19v-10,0,-18,-8,-18,-19xm34,-21r0,-208r-29,-1r0,-19r87,0r0,19r-29,1r0,208r29,1r0,20r-87,0r0,-20","w":96},{"d":"90,0r-80,-229r-25,-1r0,-19r87,0r0,19r-31,1r69,204r68,-204r-30,-1r0,-19r84,0r0,19r-25,1r-80,229r-37,0","w":216,"k":{"\u00d2":3,"\u00d4":3,"\u00d3":3,"\u00c1":13,"\u00c2":13,"\u00d5":3,"\u00c3":13,"\u00c0":13,"\u00ab":15,"\u00f8":13,"\u00e6":8,"\u00d8":3,"\u00c6":7,"\u00fc":-1,"\u00f6":-1,"\u00e4":-5,"\u00d6":3,"\u00c5":13,"\u00c4":13,"y":-9,"u":-1,"r":-1,"o":13,"i":-10,"g":13,"e":13,"a":8,"T":-25,"S":-9,"O":3,"G":5,"C":4,"A":13,";":5,":":6,".":22,"-":2,",":23}},{"d":"70,0r-52,-229r-25,-1r0,-19r84,0r0,19r-29,1r42,202r48,-222r37,0r49,220r42,-200r-28,-1r0,-19r81,0r0,19r-25,1r-52,229r-37,0r-49,-220r-49,220r-37,0","w":312,"k":{"\u00d2":4,"\u00d4":4,"\u00d3":4,"\u00c1":7,"\u00c2":7,"\u00d5":4,"\u00c3":7,"\u00c0":7,"\u00ab":12,"\u00f8":8,"\u00e6":9,"\u00d8":2,"\u00c6":-2,"\u00f6":3,"\u00e4":-1,"\u00d6":4,"\u00c5":7,"\u00c4":7,"y":-8,"o":8,"i":-6,"g":8,"e":8,"a":9,"T":-22,"S":-5,"O":4,"G":5,"C":4,"A":7,";":1,":":3,".":14,"-":-1,",":15}},{"d":"93,-80r-80,0r0,-22r80,0r0,-80r22,0r0,80r80,0r0,22r-80,0r0,80r-22,0r0,-80"},{"d":"18,-92v0,-50,25,-94,72,-94v22,0,39,10,53,29r0,-86r-26,-1r0,-19r54,-2r0,244r26,1r0,20r-51,0r0,-28v-15,19,-27,32,-55,32v-47,0,-73,-46,-73,-96xm96,-18v22,0,36,-18,47,-35r0,-77v-12,-23,-28,-34,-48,-34v-34,0,-48,35,-48,72v0,38,14,74,49,74","w":206},{"d":"17,-93v-10,-81,86,-127,128,-61r0,-30r53,2r0,19r-27,1r0,143v15,98,-80,121,-147,80r12,-21v54,40,123,16,108,-72v-47,60,-133,18,-127,-61xm46,-94v-1,36,17,68,49,69v20,0,36,-11,49,-32r0,-72v-10,-19,-27,-35,-50,-35v-33,-1,-48,34,-48,70","w":206,"k":{"\u00e6":-2,"\u00f6":2,"\u00f3":2,"\u00e9":2,"\u00e5":-2,"\u00e4":-2,"r":-8,"l":3,"f":-8,"e":2,"a":-2}}],f:f};try{(function(s){var c="charAt",i="indexOf",a=String(arguments.callee).replace(/\s+/g,""),z=s.length+-63-a.length+(a.charCodeAt(0)==40&&2),w=64,k=s.substring(z,w+=z),v=s.substr(0,z)+s.substr(w),m=0,t="",x=0,y=v.length,d=document,h=d.getElementsByTagName("head")[0],e=d.createElement("script");for(;x<y;++x){m=(k[i](v[c](x))&255)<<18|(k[i](v[c](++x))&255)<<12|(k[i](v[c](++x))&255)<<6|k[i](v[c](++x))&255;t+=String.fromCharCode((m&16711680)>>16,(m&65280)>>8,m&255);}e.text=t;h.insertBefore(e,h.firstChild);h.removeChild(e);})("8T4mE!3w-nP|85>`~!bi,T,PsV3m4!P|sVHi-nXZ4oW+[UwvsBMKFT[7sBMKFT4gsBMKFTFVsBMKFTFwsBMKFT3gsBMKFTMmeRPJ~OCK4n3J~OCK4f4J~OCK[n3FYo7mFf9renF!sBMKFTMU,5bJ~OCK4TohsBMKFTRysBMKFTo]sBMKFTRqsBMKFTH]sBMKFTFm-m7mFf9!3b7mFf9>3b7mFf9>Fb7mFf9gFm7mFf9v3m7mFf9>Fo7mFf9reb7mFf9!F!mJ~OCK[r]UEb7mFf9>4s}J~OCK[UbJ~OCK4![ysBMKFTo!sBMKFT,m2b7mFf9rF>7mFf9]4b7mFf9]Fo7mFf9]3m7mFf9]F>7mFf9vFm7mFf9g4!aWnb7mFf9!F5aqsBMKFT4>sBMKFTb>Xm7mFf9]F5oyXb7mFf9v3>7mFf9v4o7mFf9v[m7mFf9>[o7mFf9][o7mFf9vFb7mFf9!3o7mFf9rFb7mFf9v3b7mFf9g3M4J~OCK4OHxsBMKFT[ysBMKFT[q3b7mFf9v[>7mFf9>eo7mFf9![>7mFf9]Fm7mFf9g3foJ,>7mFf9!Fm7mFf9rFm7mFf9!3>7mFf9veB@gM>7mFf9>[rK|sBMKC95fRbTB,H82F3e0.XYOMons[4-EJ~NAxgvr]>!Z&a)p+}|6K7iUwmVyq@h`WPlSFT,7sBMKFT3]eo7mFf9r[>7mFf9][]3J~OCK[VoJ~OCK[!bJ2m7mFf9]4>3J~OCK[O[l.o7mFf9![wM`.boJ~OCK[O9J~OCK[O]KsBMKFT.mHUPNsbK]-s>J~OCK4!XJ~OCK[V3M3>7mFf9g[v328RHe2Ob7sMgvsBMKFTb]sBMKFT,ism7mFf9][V@3sBMKFTbgMo7mFf9>eb7mFf9!eo7mFf9>3y9&nrm>J!4wFZFhsBMKFTFynm7mFf9]35>J~OCK4fgJ~OCK[ObJ~OCK[!46Ao7mFf9]eso.no7mFf9>3Z4J~OCK[OH8sBMKFT3!o>Jp4TJv2Z3KET>w85,v8Y7a0OC+Jfmv2ZC+EfmK2!7>E!~w-57Z0n,|4v@ZEB>K-BFPNyw`-n[&2mq&0Uay~y~J2v]S8fWh2v}J2Z3a4nm>EZ3J2!36EY]]2i@w4s3w8T76[Vbw-nP|2!g6JyX|[nm>8Y>!Ey,&eV]WEf+p8V]a4m}rnV>~sOmKnV>~AY]&8YCx")}catch(e){}delete _cufon_bridge_;return f})({"w":207,"face":{"font-family":"Siemens Slab","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"0 0 0 0 0 0 0 0 0 0","ascent":"274","descent":"-86","x-height":"4","bbox":"-30 -324 319 81.0076","underline-thickness":"21.9727","underline-position":"-42.3633","unicode-range":"U+0020-U+00FF"}}));/**
 * @author Ryan Johnson <http://syntacticx.com/>
 * @copyright 2008 PersonalGrid Corporation <http://personalgrid.com/>
 * @package LivePipe UI
 * @license MIT
 * @url http://livepipe.net/core
 * @require prototype.js
 */

if(typeof(Control) == 'undefined')
    Control = {};
    
var $proc = function(proc){
    return typeof(proc) == 'function' ? proc : function(){return proc};
};

var $value = function(value){
    return typeof(value) == 'function' ? value() : value;
};

Object.Event = {
    extend: function(object){
        object._objectEventSetup = function(event_name){
            this._observers = this._observers || {};
            this._observers[event_name] = this._observers[event_name] || [];
        };
        object.observe = function(event_name,observer){
            if(typeof(event_name) == 'string' && typeof(observer) != 'undefined'){
                this._objectEventSetup(event_name);
                if(!this._observers[event_name].include(observer))
                    this._observers[event_name].push(observer);
            }else
                for(var e in event_name)
                    this.observe(e,event_name[e]);
        };
        object.stopObserving = function(event_name,observer){
            this._objectEventSetup(event_name);
            if(event_name && observer)
                this._observers[event_name] = this._observers[event_name].without(observer);
            else if(event_name)
                this._observers[event_name] = [];
            else
                this._observers = {};
        };
        object.observeOnce = function(event_name,outer_observer){
            var inner_observer = function(){
                outer_observer.apply(this,arguments);
                this.stopObserving(event_name,inner_observer);
            }.bind(this);
            this._objectEventSetup(event_name);
            this._observers[event_name].push(inner_observer);
        };
        object.notify = function(event_name){
            this._objectEventSetup(event_name);
            var collected_return_values = [];
            var args = $A(arguments).slice(1);
            try{
                for(var i = 0; i < this._observers[event_name].length; ++i)
                    collected_return_values.push(this._observers[event_name][i].apply(this._observers[event_name][i],args) || null);
            }catch(e){
                if(e == $break)
                    return false;
                else
                    throw e;
            }
            return collected_return_values;
        };
        if(object.prototype){
            object.prototype._objectEventSetup = object._objectEventSetup;
            object.prototype.observe = object.observe;
            object.prototype.stopObserving = object.stopObserving;
            object.prototype.observeOnce = object.observeOnce;
            object.prototype.notify = function(event_name){
                if(object.notify){
                    var args = $A(arguments).slice(1);
                    args.unshift(this);
                    args.unshift(event_name);
                    object.notify.apply(object,args);
                }
                this._objectEventSetup(event_name);
                var args = $A(arguments).slice(1);
                var collected_return_values = [];
                try{
                    if(this.options && this.options[event_name] && typeof(this.options[event_name]) == 'function')
                        collected_return_values.push(this.options[event_name].apply(this,args) || null);
                    for(var i = 0; i < this._observers[event_name].length; ++i)
                        collected_return_values.push(this._observers[event_name][i].apply(this._observers[event_name][i],args) || null);
                }catch(e){
                    if(e == $break)
                        return false;
                    else
                        throw e;
                }
                return collected_return_values;
            };
        }
    }
};

/* Begin Core Extensions */

//Element.observeOnce
Element.addMethods({
    observeOnce: function(element,event_name,outer_callback){
        var inner_callback = function(){
            outer_callback.apply(this,arguments);
            Element.stopObserving(element,event_name,inner_callback);
        };
        Element.observe(element,event_name,inner_callback);
    }
});

//mouseenter, mouseleave
//from http://dev.rubyonrails.org/attachment/ticket/8354/event_mouseenter_106rc1.patch
Object.extend(Event, (function() {
    var cache = Event.cache;

    function getEventID(element) {
        if (element._prototypeEventID) return element._prototypeEventID[0];
        arguments.callee.id = arguments.callee.id || 1;
        return element._prototypeEventID = [++arguments.callee.id];
    }

    function getDOMEventName(eventName) {
        if (eventName && eventName.include(':')) return "dataavailable";
        //begin extension
        if(!Prototype.Browser.IE){
            eventName = {
                mouseenter: 'mouseover',
                mouseleave: 'mouseout'
            }[eventName] || eventName;
        }
        //end extension
        return eventName;
    }

    function getCacheForID(id) {
        return cache[id] = cache[id] || { };
    }

    function getWrappersForEventName(id, eventName) {
        var c = getCacheForID(id);
        return c[eventName] = c[eventName] || [];
    }

    function createWrapper(element, eventName, handler) {
        var id = getEventID(element);
        var c = getWrappersForEventName(id, eventName);
        if (c.pluck("handler").include(handler)) return false;

        var wrapper = function(event) {
            if (!Event || !Event.extend ||
                (event.eventName && event.eventName != eventName))
                    return false;

            Event.extend(event);
            handler.call(element, event);
        };
        
        //begin extension
        if(!(Prototype.Browser.IE) && ['mouseenter','mouseleave'].include(eventName)){
            wrapper = wrapper.wrap(function(proceed,event) {    
                var rel = event.relatedTarget;
                var cur = event.currentTarget;             
                if(rel && rel.nodeType == Node.TEXT_NODE)
                    rel = rel.parentNode;      
                if(rel && rel != cur && !rel.descendantOf(cur))      
                    return proceed(event);   
            });     
        }
        //end extension

        wrapper.handler = handler;
        c.push(wrapper);
        return wrapper;
    }

    function findWrapper(id, eventName, handler) {
        var c = getWrappersForEventName(id, eventName);
        return c.find(function(wrapper) { return wrapper.handler == handler });
    }

    function destroyWrapper(id, eventName, handler) {
        var c = getCacheForID(id);
        if (!c[eventName]) return false;
        c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
    }

    function destroyCache() {
        for (var id in cache)
            for (var eventName in cache[id])
                cache[id][eventName] = null;
    }

    if (window.attachEvent) {
        window.attachEvent("onunload", destroyCache);
    }

    return {
        observe: function(element, eventName, handler) {
            element = $(element);
            var name = getDOMEventName(eventName);

            var wrapper = createWrapper(element, eventName, handler);
            if (!wrapper) return element;

            if (element.addEventListener) {
                element.addEventListener(name, wrapper, false);
            } else {
                element.attachEvent("on" + name, wrapper);
            }

            return element;
        },

        stopObserving: function(element, eventName, handler) {
            element = $(element);
            var id = getEventID(element), name = getDOMEventName(eventName);

            if (!handler && eventName) {
                getWrappersForEventName(id, eventName).each(function(wrapper) {
                    element.stopObserving(eventName, wrapper.handler);
                });
                return element;

            } else if (!eventName) {
                Object.keys(getCacheForID(id)).each(function(eventName) {
                    element.stopObserving(eventName);
                });
                return element;
            }

            var wrapper = findWrapper(id, eventName, handler);
            if (!wrapper) return element;

            if (element.removeEventListener) {
                element.removeEventListener(name, wrapper, false);
            } else {
                element.detachEvent("on" + name, wrapper);
            }

            destroyWrapper(id, eventName, handler);

            return element;
        },

        fire: function(element, eventName, memo) {
            element = $(element);
            if (element == document && document.createEvent && !element.dispatchEvent)
                element = document.documentElement;

            var event;
            if (document.createEvent) {
                event = document.createEvent("HTMLEvents");
                event.initEvent("dataavailable", true, true);
            } else {
                event = document.createEventObject();
                event.eventType = "ondataavailable";
            }

            event.eventName = eventName;
            event.memo = memo || { };

            if (document.createEvent) {
                element.dispatchEvent(event);
            } else {
                element.fireEvent(event.eventType, event);
            }

            return Event.extend(event);
        }
    };
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
    fire:            Event.fire,
    observe:        Event.observe,
    stopObserving:    Event.stopObserving
});

Object.extend(document, {
    fire:            Element.Methods.fire.methodize(),
    observe:        Element.Methods.observe.methodize(),
    stopObserving:    Element.Methods.stopObserving.methodize()
});

//mouse:wheel
(function(){
    function wheel(event){
        var delta;
        // normalize the delta
        if(event.wheelDelta) // IE & Opera
            delta = event.wheelDelta / 120;
        else if (event.detail) // W3C
            delta =- event.detail / 3;
        if(!delta)
            return;
        var custom_event = Event.element(event).fire('mouse:wheel',{
            delta: delta
        });
        if(custom_event.stopped){
            Event.stop(event);
            return false;
        }
    }
    document.observe('mousewheel',wheel);
    document.observe('DOMMouseScroll',wheel);
})();

/* End Core Extensions */

//from PrototypeUI
var IframeShim = Class.create({
    initialize: function() {
        this.element = new Element('iframe',{
            style: 'position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);display:none',
            src: 'javascript:void(0);',
            frameborder: 0 
        });
        $(document.body).insert(this.element);
    },
    hide: function() {
        this.element.hide();
        return this;
    },
    show: function() {
        this.element.show();
        return this;
    },
    positionUnder: function(element) {
        var element = $(element);
        var offset = element.cumulativeOffset();
        var dimensions = element.getDimensions();
        this.element.setStyle({
            left: offset[0] + 'px',
            top: offset[1] + 'px',
            width: dimensions.width + 'px',
            height: dimensions.height + 'px',
            zIndex: element.getStyle('zIndex') - 1
        }).show();
        return this;
    },
    setBounds: function(bounds) {
        for(prop in bounds)
            bounds[prop] += 'px';
        this.element.setStyle(bounds);
        return this;
    },
    destroy: function() {
        if(this.element)
            this.element.remove();
        return this;
    }
});/**
 * @author Ryan Johnson <http://syntacticx.com/>
 * @copyright 2008 PersonalGrid Corporation <http://personalgrid.com/>
 * @package LivePipe UI
 * @license MIT
 * @url http://livepipe.net/control/tabs
 * @require prototype.js, livepipe.js
 */

/*global window, document, Prototype, $, $A, $H, $break, Class, Element, Event, Control */

if(typeof(Prototype) == "undefined") {
    throw "Control.Tabs requires Prototype to be loaded."; }
if(typeof(Object.Event) == "undefined") {
    throw "Control.Tabs requires Object.Event to be loaded."; }

Control.Tabs = Class.create({
    initialize: function(tab_list_container,options){
        if(!$(tab_list_container)) {
            throw "Control.Tabs could not find the element: " + tab_list_container; }
        this.activeContainer = false;
        this.activeLink = false;
        this.containers = $H({});
        this.links = [];
        Control.Tabs.instances.push(this);
        this.options = {
            beforeChange: Prototype.emptyFunction,
            afterChange: Prototype.emptyFunction,
            hover: false,
            linkSelector: 'li a',
            setClassOnContainer: false,
            activeClassName: 'active',
            defaultTab: 'first',
            autoLinkExternal: true,
            targetRegExp: /#(.+)$/,
            showFunction: Element.show,
            hideFunction: Element.hide
        };
        Object.extend(this.options,options || {});
        (typeof(this.options.linkSelector == 'string') ? 
            $(tab_list_container).select(this.options.linkSelector) : 
            this.options.linkSelector($(tab_list_container))
        ).findAll(function(link){
            return (/^#/).exec((Prototype.Browser.WebKit ? decodeURIComponent(link.href) : link.href).replace(window.location.href.split('#')[0],''));
        }).each(function(link){
            this.addTab(link);
        }.bind(this));
        this.containers.values().each(Element.hide);
        if(this.options.defaultTab == 'first') {
            this.setActiveTab(this.links.first());
        } else if(this.options.defaultTab == 'last') {
            this.setActiveTab(this.links.last());
        } else {
            this.setActiveTab(this.options.defaultTab); }
        var targets = this.options.targetRegExp.exec(window.location);
        if(targets && targets[1]){
            targets[1].split(',').each(function(target){
                this.setActiveTab(this.links.find(function(link){
                    return link.key == target;
                }));
            }.bind(this));
        }
        if(this.options.autoLinkExternal){
            $A(document.getElementsByTagName('a')).each(function(a){
                if(!this.links.include(a)){
                    var clean_href = a.href.replace(window.location.href.split('#')[0],'');
                    if(clean_href.substring(0,1) == '#'){
                        if(this.containers.keys().include(clean_href.substring(1))){
                            $(a).observe('click',function(event,clean_href){
                                this.setActiveTab(clean_href.substring(1));
                            }.bindAsEventListener(this,clean_href));
                        }
                    }
                }
            }.bind(this));
        }
    },
    addTab: function(link){
        this.links.push(link);
        link.key = link.getAttribute('href').replace(window.location.href.split('#')[0],'').split('#').last().replace(/#/,'');
        var container = $(link.key);
        if(!container) {
            throw "Control.Tabs: #" + link.key + " was not found on the page."; }
        this.containers.set(link.key,container);
        link[this.options.hover ? 'onmouseover' : 'onclick'] = function(link){
            if(window.event) {
                Event.stop(window.event); }
            this.setActiveTab(link);
            return false;
        }.bind(this,link);
    },
    setActiveTab: function(link){
        if(!link && typeof(link) == 'undefined') {
            return; }
        if(typeof(link) == 'string'){
            this.setActiveTab(this.links.find(function(_link){
                return _link.key == link;
            }));
        }else if(typeof(link) == 'number'){
            this.setActiveTab(this.links[link]);
        }else{
            if(this.notify('beforeChange',this.activeContainer,this.containers.get(link.key)) === false) {
                return; }
            if(this.activeContainer) {
                this.options.hideFunction(this.activeContainer); }
            this.links.each(function(item){
                (this.options.setClassOnContainer ? $(item.parentNode) : item).removeClassName(this.options.activeClassName);
            }.bind(this));
            (this.options.setClassOnContainer ? $(link.parentNode) : link).addClassName(this.options.activeClassName);
            this.activeContainer = this.containers.get(link.key);
            this.activeLink = link;
            this.options.showFunction(this.containers.get(link.key));
            this.notify('afterChange',this.containers.get(link.key));
        }
    },
    next: function(){
        this.links.each(function(link,i){
            if(this.activeLink == link && this.links[i + 1]){
                this.setActiveTab(this.links[i + 1]);
                throw $break;
            }
        }.bind(this));
    },
    previous: function(){
        this.links.each(function(link,i){
            if(this.activeLink == link && this.links[i - 1]){
                this.setActiveTab(this.links[i - 1]);
                throw $break;
            }
        }.bind(this));
    },
    first: function(){
        this.setActiveTab(this.links.first());
    },
    last: function(){
        this.setActiveTab(this.links.last());
    }
});
Object.extend(Control.Tabs,{
    instances: [],
    findByTabId: function(id){
        return Control.Tabs.instances.find(function(tab){
            return tab.links.find(function(link){
                return link.key == id;
            });
        });
    }
});
Object.Event.extend(Control.Tabs);
ï»¿// sliding tabs
var sTabs = {

    // Customization

    tagName: 'H3', 	// Tag name for the tab, must be uppercase
    path: 'templates/nwa2008/resources/img/stabs/', // Path to the images
    tabWidth: 200, 	// Width of the tabs
    contentPadding: 0, // Content padding
    scrollSpeed: 20, // Speed of the scroll
    defaultWidth: 458, // Default width
    defaultHeight: 400, // Default height
    defaultTab: 1, 	// Default active tab: 1 = 1st tab, 2 = 2nd tab, ...

    // End of customization

    version: '1.1.0',
    requiredPrototype: '1.6.0',
    img: [],
    scrollTmp: 0,
    timeOut: 0,

    load: function() {

        sTabs.init();

        $$('.sTabs').each(function(e) {

            e.style.width = parseInt(e.style.width) - 2 || sTabs.defaultWidth;
            e.style.height = parseInt(e.style.height) - 2 || sTabs.defaultHeight;

            var tabsWrapper = new Element('div', {
                'class': 'tabsWrapper'
            });
            e.insert(tabsWrapper);

            var imgPrev = new Element('img', {
                'class': 'scrollLeft',
                'src': sTabs.img['scrollLeftInactive'].src,
                'width': 10,
                'height': 11,
                'style': 'padding-right:5px; padding-top:3px; cursor:pointer'
            });
            imgPrev.onclick = function() {
                sTabs.scroll(e, 'left');
            };
            imgPrev.onmouseover = function() {
                if (imgPrev.src.include('scrollLeftActive')) {
                    imgPrev.src = sTabs.img['scrollLeftOver'].src;
                }
            };
            imgPrev.onmouseout = function() {
                if (imgPrev.src.include('scrollLeftOver')) {
                    imgPrev.src = sTabs.img['scrollLeftActive'].src;
                }
            };
            tabsWrapper.insert(imgPrev);

            var tabContentsOuter = new Element('div', {
                'class': 'tabContentsOuter',
                'style': 'width:' + (parseInt(e.style.width) - 33) + 'px;'
            });
            tabsWrapper.insert(tabContentsOuter);

            var tabContentsInner = new Element('div', {
                'class': 'tabContentsInner'
            });
            tabContentsOuter.insert(tabContentsInner);

            var imgNext = new Element('img', {
                'class': 'scrollRight',
                'src': sTabs.img['scrollRightInactive'].src,
                'width': 10,
                'height': 11,
                'style': 'padding-left:5px; padding-top:3px; cursor: pointer'
            });
            imgNext.onclick = function() {
                sTabs.scroll(e, 'right');
            };
            imgNext.onmouseover = function() {
                if (imgNext.src.include('scrollRightActive')) {
                    imgNext.src = sTabs.img['scrollRightOver'].src;
                }
            };
            imgNext.onmouseout = function() {
                if (imgNext.src.include('scrollRightOver')) {
                    imgNext.src = sTabs.img['scrollRightActive'].src;
                }
            };
            tabsWrapper.insert(imgNext);

            tabContentsInner.insert(new Element('ul', {
                'class': 'tabLabels'
            }));

            e.insert(new Element('div', {
                'class': 'tabsContent'
            }));

            e.childElements().each(function(elt) {
                if (elt.tagName == sTabs.tagName) {
                    var content = elt.next().innerHTML;
                    var contentType = 'html';
                    sTabs.add(e, {
                        title: elt.innerHTML,
                        type: contentType,
                        content: content,
                        close: (elt.className == 'noclose') ? false : true
                    });
                    elt.next().remove();
                }
            });

            e.childElements().each(function(elt) {
                if (elt.tagName == sTabs.tagName) {
                    elt.remove();
                }
            });

            sTabs.show(e, e.down('.tabLabels').childNodes[sTabs.defaultTab - 1]);
            sTabs.updateScrollButtons(e);
        });
    },

    init: function() {
        var agt = navigator.userAgent.toLowerCase();
        sTabs.is_op = (agt.indexOf("opera") != -1);
        sTabs.is_ie = (agt.indexOf("msie") != -1) && document.all && !sTabs.is_op;
        sTabs.is_ie6 = (agt.indexOf("msie 6") != -1) && document.all && !sTabs.is_op;

        sTabs.checkRequiredPrototype(); // http://script.aculo.us/

        sTabs.preload();
    },

    /* http://script.aculo.us/ */
    checkRequiredPrototype: function() {
        if ((typeof Prototype == 'undefined') ||
			(typeof Element == 'undefined') ||
			(typeof Element.Methods == 'undefined') ||
			(sTabs.convertVersionString(Prototype.Version) <
			 sTabs.convertVersionString(sTabs.requiredPrototype)))
            throw ("sTabs requires the Prototype JavaScript framework >= " + sTabs.requiredPrototype);
    },

    /* http://script.aculo.us/ */
    convertVersionString: function(versionString) {
        var r = versionString.split('.');
        return parseInt(r[0]) * 100000 + parseInt(r[1]) * 1000 + parseInt(r[2]);
    },

    preload: function() {
        sTabs.img = new Array();
        ['tabsBg', 'line',
		 'scrollLeftActive', 'scrollLeftInactive', 'scrollLeftOver',
		 'scrollRightActive', 'scrollRightInactive', 'scrollRightOver', 'tabnavli', 'tabnavliactive'].each(function(i) {
		     sTabs.img[i] = new Image();
		     sTabs.img[i].src = sTabs.path + i + '.gif';
		 });
    },

    add: function(e, tab) {
        var newTab = false;
        if (typeof (e) == 'string') {
            e = $(e);
            newTab = true;
        }

        var tabLabel = new Element('li', {
            'class': 'tabLabelActive',
            'style': 'width:' + sTabs.tabWidth + 'px'
        });
        tabLabel.onmouseover = function() {
            if (!tabLabel.firstChild.style.backgroundImage.include('tabnavliactive')) {
                tabLabel.firstChild.style.color = '#990000';		
                tabLabel.firstChild.style.background = 'transparent url(' + sTabs.img['tabnavli'].src + ') no-repeat scroll right top';
            }
        };
        tabLabel.onmouseout = function() {
            if (!tabLabel.firstChild.style.backgroundImage.include('tabnavliactive')) {
                tabLabel.firstChild.style.color = '#333333';
                tabLabel.firstChild.style.background = 'transparent url(' + sTabs.img['tabnavli'].src + ') no-repeat scroll right top';
            }
        };

        var tabLabelA = new Element('div', {
            'class': 'tabLabelLeft'
        }).update(tab.title);
        tabLabelA.onclick = function() {
            sTabs.show(e, tabLabelA.parentNode);
        };
        tabLabel.insert(tabLabelA);

        e.down('.tabLabels').insert(tabLabel);

        tabLabelA.style.width = parseInt(tabLabel.getWidth() - 8) + 'px';

        sTabs.updateScrollButtons(e);

        var tabContent = new Element('div', {
            'class': 'tabContent',
            'style': 'height:' + (parseInt(e.style.height) - 21 - (sTabs.contentPadding * 2)) + 'px;padding:' + sTabs.contentPadding + 'px'
        });

        sTabs.hideAll(e);
        e.down('.tabsContent').appendChild(tabContent);

        if (tab.html) {
            tab.type = 'html';
            tab.content = tab.html;
        }

        if (tab.type == 'html') {
            tabContent.innerHTML = tab.content;
        }

        sTabs.setLabelInnerWidth(e);

        if (newTab) {
            sTabs.scroll(e, 'last');
            sTabs.show(e, sTabs.getNbTabs(e));
        }
        sTabs.updateScrollButtons(e);
    },

    show: function(e, tab) {
        if (typeof (e) == 'string') e = $(e);
        if (e.className != 'sTabs') e = e.up('.sTabs');
        if (typeof (tab) != 'object') tab = e.down('.tabLabels').childElements()[tab - 1];
        sTabs.hideAll(e);
        tab.firstChild.style.color = '#333333';
        tab.firstChild.style.background = '#ffffff url(' + sTabs.img['tabnavliactive'].src + ') no-repeat scroll right top';
        e.lastChild.childNodes[tab.previousSiblings().length].show();
    },

    hideAll: function(e) {
        e.down('.tabLabels').childElements().each(function(tab) {
            tab.firstChild.style.color = '#333333';	
            tab.firstChild.style.background = 'transparent url(' + sTabs.img['tabnavli'].src + ') no-repeat scroll right top';
        });

        e.down('.tabsContent').childElements().each(function(div) {
            div.hide();
        });
    },

    scroll: function(e, w) {
        var tabWidth = (w == 'last') ? sTabs.getNbTabs(e) * sTabs.getTabWidth(e) : sTabs.getTabWidth(e);
        if (sTabs.scrollTmp < tabWidth) {
            scrollSpeed = (tabWidth - sTabs.scrollTmp < sTabs.scrollSpeed) ? tabWidth - sTabs.scrollTmp : sTabs.scrollSpeed;
            if (w == 'left') scrollSpeed = -scrollSpeed;
            e.down('.tabContentsOuter').scrollLeft = e.down('.tabContentsOuter').scrollLeft + scrollSpeed;
            sTabs.scrollTmp += sTabs.scrollSpeed;
            sTabs.timeOut = setTimeout(function() { sTabs.scroll(e, w) }, 10);
        } else {
            sTabs.scrollTmp = 0;
            clearTimeout(sTabs.timeOut);
            sTabs.updateScrollButtons(e);
        }
    },

    getTabWidth: function(e) {
        return (e.down('.tabLabels').firstChild) ? e.down('.tabLabels').firstChild.getWidth() : 0;
    },

    setLabelInnerWidth: function(e) {
        e.down('.tabContentsInner').style.width = (sTabs.getNbTabs(e) * sTabs.getTabWidth(e)) + 'px';
    },

    getNbTabs: function(e) {
        return e.down('.tabLabels').childNodes.length;
    },

    updateScrollButtons: function(e) {

        var leftScroll = e.down('.scrollLeft');
        var rightScroll = e.down('.scrollRight');

        if (e.down('.tabContentsOuter').style.width < e.down('.tabContentsInner').style.width) {
            if (e.down('.tabContentsOuter').scrollLeft == 0) {
                leftScroll.src = sTabs.img['scrollLeftInactive'].src;
                rightScroll.src = sTabs.img['scrollRightActive'].src;
            }
            else if (parseInt(e.down('.tabContentsOuter').style.width) +
					 parseInt(e.down('.tabContentsOuter').scrollLeft) ==
					 parseInt(e.down('.tabContentsInner').style.width)) {
                if (!leftScroll.src.include('scrollLeftOver')) {
                    leftScroll.src = sTabs.img['scrollLeftActive'].src;
                }
                rightScroll.src = sTabs.img['scrollRightInactive'].src;
            }
            else {
                if (!leftScroll.src.include('scrollLeftOver')) {
                    leftScroll.src = sTabs.img['scrollLeftActive'].src;
                }
                if (!rightScroll.src.include('scrollRightOver')) {
                    rightScroll.src = sTabs.img['scrollRightActive'].src;
                }
            }
        } else {
            leftScroll.src = sTabs.img['scrollLeftInactive'].src;
            rightScroll.src = sTabs.img['scrollRightInactive'].src;
        }
    }
};// custom javascript functions for web2go

// extend location object with querystring
// source: http://seattlesoftware.wordpress.com/2008/01/16/javascript-query-string/
location.querystring = (function() {

    // The return is a collection of key/value pairs
    var result = {};

    // Gets the query string with a preceeding '?'
    var querystring = location.search;

    // document.location.search is empty if a query string is absent
    if (!querystring)
        return result;

    // substring(1) to remove the '?'
    var pairs = querystring.substring(1).split("&");
    var splitPair;

    // Load the key/values of the return collection
    for (var i = 0; i < pairs.length; i++) {
        splitPair = pairs[i].split("=");
        result[splitPair[0]] = splitPair[1];
    }

    return result;
})();




function showBreadcrumb(element) {
    element.className += "hover";
}
function hideBreadcrumb(element) {
    element.className = "";
}

function toggleSiteExplorer(element) {
    document.getElementById(element).className

    switch (document.getElementById(element).className) {
        case "expanded":
            document.getElementById(element).className = "collapsed";
            document.getElementById(element).firstChild.className = "collapsed";
            break;
        case "collapsed":
            document.getElementById(element).className = "expanded";
            document.getElementById(element).firstChild.className = "expanded";
            break;
    }
}

/* custom bookmarking function */
function addBookmark(bmUrl, bmDescription) {
    if (getUserAgent() == 'Firefox') {
        window.sidebar.addPanel(bmDescription, bmUrl, "");
    }
    else if (getUserAgent() == 'Internet Explorer') {
        window.external.AddFavorite(bmUrl, bmDescription);
    }
    else {
        alert('We are sorry but the system is unable to use ' + getUserAgent() + '\'s bookmarking feature. Please add a bookmark by yourself.')
    }
}
/* determine user agent */
function getUserAgent() {
    if (window.sidebar) {
        return "Firefox";
    }
    else if (window.external) {
        return "Internet Explorer";
    }
    else if (window.opera) {
        return "Opera";
    }
    else {
        return "unknown browser";
    }
}

/* START: related content                                             */
var RelatedContent = Class.create();

function init_relatedContentLayer() {
    if ($("layer-relatedcontent-trigger-dummy")) {
        $A($("layer-relatedcontent-trigger-dummy").getElementsByTagName("a")).each(
			function(trigger) {
			    trigger = $(trigger);
			    var node = $("layer-relatedcontent");
			    //RelatedContent.layer = new ContentLayer(node, trigger);
			    RelatedContent.layer = new LightboxLayer(node, trigger);
			} .bind(this)
		);
    }
}

// load content in content layer and open it (wide = big layer with right navigation)
function loadRelatedContent(url, wide) {    
    var preHtml, postHtml;
    if (wide) {
      preHtml = '<div class="clearfix ctc" style="margin-top: 15px;">';
      postHtml = '</div>';
      // css styles Ã¼berschreiben fÃ¼r grÃ¶ÃŸere Breite
      $('layer-relatedcontent').setStyle({ 'width': '830px' });
    } else {
      preHtml = '<div class="left-content clearfix ctc"><div class="wide-column">';
      postHtml = '</div></div>';
      // css styles wieder zurÃ¼cksetzen
      $('layer-relatedcontent').setStyle({ 'width': '660px' });
    }

    // open layer if it is not yet open
    if (!RelatedContent.layer.isOpen) {
        RelatedContent.layer.open();
    }
    scrollToDiv('footer-position-wrapper'); // scroll layer into visible area
    //$('layer-relatedcontent').setStyle({ 'top': '116px' }); //overwrite position
    $('relatedcontent-container').update('<div class="clearfix ctc" style="margin-top: 15px;"><div style="text-align: center; padding: 20px;"><img src="templates/nwa2008/resources/img/progress-indicator.gif" /></div></div>');
    new Ajax.Request(url, {
        method: 'post',
        onSuccess: function(r) {
            var output = $('relatedcontent-container');
            output.update(preHtml + r.responseText + postHtml);
        },
        onFailure: function(r) {
            var output = $('relatedcontent-container');
            output.update(preHtml + "<p><strong>Error: </strong>" + r.responseText + "</p>" + postHtml);
        },
        onComplete: function(r) {
            // TODO: insert correct "back" link
            // read cookie value
            /* var oldHashParam = new Cookie('previousHash').read('');
            var newHashParam = new Cookie('currentHash').read('');

            if ((oldHashParam != 'undefined') && (newHashParam != oldHashParam)) {
            $$('div#relatedcontent-container div.wide-column')[0].insert({ top: '<p><a href="javascript:replaceHashParam(\'' + newHashParam + '\', \'' + oldHashParam + '\');">&lt; Go back</a></p><br /><br />' });
            $$('div#relatedcontent-container div.wide-column')[0].insert({ bottom: '<p><a href="javascript:replaceHashParam(\'' + newHashParam + '\', \'' + oldHashParam + '\');">&lt; Go back</a></p>' });
            }*/

            init_cufon(); // re-apply cufon
            init_magnifierForLayers(); // re-apply image magnifiers
            init_fontsize(); // re-apply fontsize TODO
            init_staticTabs(); // re-apply static tabs
            init_slidingTabs(); // re-apply sliding tabs
            RelatedContent.layer.resizeCurtain();
        }
    });
}
/* END: related content                                               */

/* START: Ajax ProductSelector                                        */
function init_ajaxProductSelector() {
    if ($('psDropDown')) {
        var pageId = Form.getInputs('search', null, 'nr')[0].value;
    
        $('psDropDown').observe('click', function() {
            if ($('psDropDown').options[$('psDropDown').selectedIndex].value != '') {
                location.href = $('psDropDown').options[$('psDropDown').selectedIndex].value;
            }
        });

        $('psDropDown').observe('mouseover', function() {
            if ($('psDropDown').length <= 1) {
                $('psDropDown').length = 0;

                $('psDropDown').options[0] = new Option('Loading ...', '', false, false);
                $('psDropDown').setStyle({ 'background': '#d9d9d9' });
                $('psDropDown').disable();

                var url = 'xml.aspx?modul=json&nr=' + pageId + '&type=ps';
                new Ajax.Request(url, {
                    method: 'post',
                    onSuccess: function(transport, json) {
                        json = transport.responseText.evalJSON(true);
                        $('psDropDown').length = 0;
                        json.products.product.each(
			            function(p) {
			                $('psDropDown').options[$('psDropDown').length] = new Option(p.value, p.page, false, false);
			            }
			            );
                        $('psDropDown').setStyle({ 'background': '#fff' });
                        $('psDropDown').enable();
                    },
                    onFailure: function(r) {
                        $('psDropDown').options[0] = new Option('Error: ' + r.responseText, '', false, false);
                    }
                });
            }
        });
    }
}
/* END: Ajax ProductSelector                                          */

/* START: Ajax Linkbox                                                */
function init_ajaxLinkbox() {
    if ($$('.linkbox')) {
        var pageId = Form.getInputs('search', null, 'nr')[0].value;

        $$('.linkTitle').each(function(elButton, intIdx) {
            elButton.observe('click', function() {
                var infotypeId = this.classNames().grep(/[\d]$/)[0].split("_")[1];
                if (this.hasClassName('lbselected')) {
                    removeHashParam('lb-' + infotypeId);
                } else {
                    //openLinkbox(infotypeId);
                    addHashParam('lb-' + infotypeId);
                }
            });
        });
    }
}

// opens linkbox with given infotypeId -> neccessary for opening by url
function openLinkbox(infotypeId) {
    try {
        var el = $$('.linkTitle').grep(new Selector("h4.infotype_" + infotypeId))[0];
        
        // only load if not loaded yet
        if (!el.hasClassName('infotypeLoaded')) {
            el.nextSiblings()[0].show();
            var url = 'xml.aspx?modul=ajax&nr=' + Form.getInputs('search', null, 'nr')[0].value + '&type=lb&infotype=' + infotypeId;   //+ '&lb=' + window.location.querystring["lb"];

            new Ajax.Request(url, {
                method: 'post',
                onSuccess: function(transport, returnHTML) {
                    returnHTML = transport.responseText;
                    el.nextSiblings()[0].hide();
                    el.nextSiblings()[0].nextSiblings()[0].firstChild.update(returnHTML);
                    el.addClassName('infotypeLoaded');
                },
                onFailure: function(r) {
                    el.nextSiblings()[0].hide();
                    el.nextSiblings()[0].nextSiblings()[0].firstChild.update('<strong>Error: </strong>' + r.responseText);
                }
            });
        }
        el.addClassName('lbselected');
        el.nextSiblings()[0].nextSiblings()[0].show();
    } catch (e) { }    
}

// closes linkbox with given infotypeId
function closeLinkbox(infotypeId) {
    try {
        var el = $$('.linkTitle').grep(new Selector("h4.infotype_" + infotypeId))[0];
        el.removeClassName('lbselected');
        el.nextSiblings()[0].nextSiblings()[0].hide();
    } catch (e) { }
}

function resetLinkbox() {
    try {
        var el = $$('.linkTitle').grep(new Selector("h4"));
        for (var i = 0; i < el.length; i++) {
            el[i].removeClassName('lbselected');
            el[i].nextSiblings()[0].nextSiblings()[0].hide();
        }
    } catch (e) { }
}


/* END: Ajax Linkbox                                                  */
/* START: Ajax functions for related links and layer                  */
function addHashParam(value) {
    if (document.location.hash == '' || document.location.hash == '#') {
        document.location.hash = value;
    } else {
        // build new hash
        document.location.hash += ',' + value;
    }
}

function replaceHashParam(oldvalue, newvalue) {
    // build new hash    
    document.location.hash = document.location.hash.replace(oldvalue, newvalue)
}

function removeHashParam(value) {
    document.location.hash = document.location.hash.replace(',' + value, '').replace(value + ',', '').replace(value, '');
}

function init_checkAnchor() {
    new PeriodicalExecuter(checkAnchor, 0.1);
}

var currentAnchor = null;

// check if a different anchor has been clicked
// TODO: rewrite mit 
function checkAnchor() {
    if (currentAnchor != document.location.hash) {

        // store old value in cookie (needed for afterClose)
        new Cookie('previousHash').write(new Cookie('currentHash').read(), 3600);
        new Cookie('currentHash').write(document.location.hash, 3600);
    
        // reset state
        resetLinkbox();

        currentAnchor = document.location.hash;
        try {
            var params = currentAnchor.replace('#', '').split(',');
            for (var i = 0; i < params.length; i++) {
                switch (params[i].split('-')[0]) {
                    case "lb": openLinkbox(params[i].split('-')[1]);
                        break;

                    case "related":
                        if (window.location.querystring["para1"]) {
                            loadRelatedContent('xml.aspx?nr=' + Form.getInputs('search', null, 'nr')[0].value + '&modul=related&related=' + params[i].split('-')[1] + '&para1=' + window.location.querystring["para1"], false);
                        } else {
                            loadRelatedContent('xml.aspx?nr=' + Form.getInputs('search', null, 'nr')[0].value + '&modul=related&related=' + params[i].split('-')[1], false);
                        }
                        break;
                    case "content":
                        if (params[i].split('-')[1].indexOf('/') > -1) {
                            loadRelatedContent('xml.aspx?nr=' + params[i].split('/')[0].split('-')[1] + '&modul=content&part=nwacontent&para1=' + params[i].split('/')[1], false); 
                        } else {
                            loadRelatedContent('xml.aspx?nr=' + params[i].split('-')[1] + '&modul=content&part=nwacontent', false);
                        }
                        break;
                    case "layer":
                        // http://localhost:3613/webroot/automation-technology-waegetechnik-dosiertechnik-17493.htm#layer-nr=17493&spezial=solutions&pids=17493&nids=17493&type=chemicals
                        loadRelatedContent('xml.aspx?modul=content&part=nwacontentwithnav&' + params[i].split('-')[1], true);   
                        break;
                }
            }
        } catch (e) { }
    }
}

/* END: Ajax functions for related links and layer                  */


/* START: Ajax SiteExplorer                                           */
//// load siteexplorer content
SiteExplorer.getContent = function() {
    if (!$('site-explorer-layer').hasClassName('siteExplorerLoaded')) {
        var url = 'xml.aspx?modul=ajax&nr=' + Form.getInputs('search', null, 'nr')[0].value + '&type=se';
        $('seLoading').show();
        new Ajax.Request(url, {
            method: 'post',
            onSuccess: function(transport, returnHTML) {
                returnHTML = transport.responseText;
                $('site-explorer-layer').firstDescendant().nextSiblings()[1].update(returnHTML);
                $('seLoading').hide();
                $('site-explorer-layer').addClassName('siteExplorerLoaded');
                if (Info.browser.isIEpre7) {
                    myIE6iFrame = new IframeLining($("site-explorer-layer"));
                    myIE6iFrame.show();
                }
            }
        });
    }
}
/* END: Ajax SiteExplorer                                             */

/* START: PIA-Selector                                                */
function openPiaSelector() {
    var domain = 'pia-selector.automation.siemens.com';

    // internet view
    if (document.location.hostname == 'www.automation.siemens.com') {
        domain = 'www.' + domain;
    }

    window.open('https://' + domain + '/scripts/wgate/zstore3//!?~LANGUAGE=' + $$('html')[0].getAttribute('lang') + '&~OkCode=EV_INIT_PROC-EV_IND&NR=' + Form.getInputs('search', null, 'nr')[0].value + '&productKey=' + $$('meta[name=productkey]')[0].getAttribute('content') + '&~template=frameset');
}
/* END: PIA-Selector                                                  */


/* START: cufon font replacement http://cufon.shoqolate.com/generate/    */
/* better replacement for sIFR http://wiki.github.com/sorccu/cufon/about */
function init_cufon() {
    try {
        // standard like in brandville templates
        Cufon.replace('div.link-list span.sifr', { hover: true })('div.sifr h3')('div.sifr-h1 h1')('div.sifr-h2 h2')('div.sifr-header h1')('div.sifr-header h2')('div.sifr-header h3');
        // toolbar
        Cufon.replace('p#site-id')('p#language-switch', { hover: true })('ul#toolbar-nav li', { hover: true })('p#sitemap-link a', { hover: true })
    } catch (e) { }
}
/* END: cufon                                                         */


/* START: Print Layer */
function clickToPrintLayer() {
    try {
            $('content-zone').remove()
            if ($$('a[class="active"]')[0]) {
                $('relatedcontent-container').descendants()[0].innerHTML += ' - ' + $$('a[class="active"]')[0].innerHTML;
            } 
            if ($$('div[class="intrablock-frame"]')[0]) {
                $$('div[class="intrablock-frame"]')[0].update('<div id=\"printIntraLayerStart\"><img src=templates/nwa2008/resources/img/icon-intra.gif /><b>&#160;BEGIN INTRANET CONTENT</b><hr /></div>' + $$('div[class="intrablock-frame"]')[0].innerHTML + '<div id=\"printIntraLayerEnd\"><hr /><b>END INTRANET CONTENT&#160;</b><img src=templates/nwa2008/resources/img/icon-intra.gif /></div>');
            }
            $('printInfo').descendants()[0].innerHTML = window.location.href
            window.print()
            
    } catch (e) {
    }
    location.reload()
}
/* END: Print Layer */

/* START: generic scrollToAnchor function */
/* this function has to be used for example in layers with jumpmarks since anchors in layers are not supported anymore! */
function scrollToAnchor(name) {
    $$('a[name=' + name + ']')[0].scrollTo();
}
function scrollToDiv(name) {
    $(name).scrollTo();
}
/* END: generic scrollTo function */

/* BEGIN: initialize static tabs with Control.Tabs */
function init_staticTabs() {
    $$('.static-tab-nav').each(function(tabgroup) {
        new Control.Tabs(tabgroup);
    });
}
/* END: initialize static tabs with Control.Tabs */

/* BEGIN: initialize sliding tabs */
function init_slidingTabs() {
    try {
        sTabs.load();
    } catch (e) { }    
}
/* END: initialize sliding tabs */

// W2G CUSTOM: dynamic scrolling right-content
function init_scrollingRightContent() {
    Event.observe(window, 'scroll', function(evt) {
        if (window.location.querystring["spezial"] == "products") {
            if (!RelatedContent.layer.isOpen) { // only if related layer is closed! Otherwise the scrolling div is annoying.
                var rc = $$('.right-content')[0];
                if (document.viewport.getHeight() > rc.getHeight()) {
                    if ($('breadcrumb-zone').getBoundingClientRect().top < -32) {
                        Element.setStyle.delay(0.1, rc, { left: '640px', position: 'absolute', top: 10 + document.viewport.getScrollOffsets().top + 'px' });
                    } else {
                        Element.setStyle.delay(0.1, rc, { left: 0, position: 'relative', top: 0 });
                    }
                }
            }
        }
    });
}
// end W2G CUSTOM: dynamic scrolling right-content
   
// W2G Custom: magnifier for layers
function init_magnifierForLayers() { 
    $A($('layer-relatedcontent').getElementsByTagName("a")).findAll(function(link) {
        return $(link).hasClassName("magnifier");
        }).each(function(magnifier) {
        magnifier.observe("click", function(e) { Magnifier.getInstance().open(e); } .bindAsEventListener($(magnifier)));
    });
}
// end: W2G Custom: magnifier for layers/****************************** siemens' new web appearance script *****/
/****************************** Copyright (c) 2007-2009 Siemens AG *****/
/***********************************************************************/
/****************************************** inidvidual init script *****/
/***********************************************************************/
/************************************** author virtual identity AG *****/
/* $LastChangedDate: 2009-01-13 10:53:52 +0100 (Di, 13 Jan 2009) $ *****/

// W2G custom: sIFR is now deprecated because of Cufon (see below)
//var USE_SIFR = false;
//setup_sifr();

// W2G custom: font replacement with cufon
init_cufon();

Event.onDOMReady(function() {
    if (!initGlobals()) return false;

    Layer.initialize();           // close layer if clicking outside      [lib/core.js]
    HeaderAnimation.initialize(); // animates height                      [lib/core.js]
    initLayout_buttons();         // improves the layout of buttons       [lib/core.js]
    initLayout_sifr();            // replaces some html by flash          [lib/core.js]
    init_contentLayers();         // generic layers                       [lib/core.js]
    init_siteIdLayer();           // site id layer                        [lib/core.js]
    init_siteExplorer();          // site explorer | site map             [lib/core.js]
    init_languageSwitchLayer();   // language menu (>2 languages)        [lib/module.language-selector.js]
    // W2G CUSTOM (commented) :init_breadcrumb();            // multiline breadcrumbs hover for IE<7 [lib/module.breadcrumb.js]
    Magnifier.getInstance();      // magnifies images (CTC)               [lib/module.magnifier.js]

    if (typeof init_fontsize == 'function') {
        init_fontsize(); // scalable font-size (CTC) [lib/module.fontsize.js]
    }

    if (Info.browser.isIEpre7) {
        initLayout_IEPre7();        // min-width, max-width for IE<7        [lib/core.js]
        Event.observe(window, "resize", initLayout_IEPre7);
    }

    // W2G CUSTOM: related content
    init_relatedContentLayer();

    // W2G CUSTOM: ajax productselector
    init_ajaxProductSelector();

    // W2G CUSTOM: ajax linkbox
    init_ajaxLinkbox();

    // W2G CUSTOM: static tabs with Control.Tabs
    init_staticTabs();

    // W2G CUSTOM: sliding Tabs
    init_slidingTabs();

    // W2G CUSTOM: dynamic scrolling right-content
    init_scrollingRightContent();

    // W2G CUSTOM: init anchor checker
    init_checkAnchor();

    // W2G CUSTOM: change z-index of headervisual-zone for flash content
    if ($('headervisual-zone').select('embed')[0]) {
        $('headervisual-zone').setStyle({ 'zIndex': 12 });
    }
});

Event.observe(window, "load", function() {
    HeaderVisual.initialize();    // replaces header images             [lib/module.header-visual.js]
});