/*  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);
    if(element.tagName.toUpperCase()=='HTML') //for IE6,7
        return $(document.body);                //

    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) {
        if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
        return Element.extend(node);
      } else return false;
    },

    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) {
    try {
      if (element._prototypeEventID) return element._prototypeEventID[0];
      arguments.callee.id = arguments.callee.id || 1;
      return element._prototypeEventID = [++arguments.callee.id];
    } catch (error) {
      return false;
    }
  }

  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 {
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/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();
// Credit Card Validation Javascript
// copyright 12th May 2003, by Stephen Chapman, Felgall Pty Ltd

// You have permission to copy and use this javascript provided that
// the content of the script is not changed in any way.

function validateCreditCard(s) {
    // remove non-numerics
    var v = "0123456789";
    var w = "";
    for (i=0; i < s.length; i++) {
        x = s.charAt(i);
        if (v.indexOf(x,0) != -1)
        w += x;
    }
    // validate number
    j = w.length / 2;
    k = Math.floor(j);
    m = Math.ceil(j) - k;
    c = 0;
    for (i=0; i<k; i++) {
        a = w.charAt(i*2+m) * 2;
        c += a > 9 ? Math.floor(a/10 + a%10) : a;
    }
    for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
    return (c%10 == 0);
}


/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
*
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
var Validator = Class.create();

Validator.prototype = {
    initialize : function(className, error, test, options) {
        if(typeof test == 'function'){
            this.options = $H(options);
            this._test = test;
        } else {
            this.options = $H(test);
            this._test = function(){return true};
        }
        this.error = error || 'Validation failed.';
        this.className = className;
    },
    test : function(v, elm) {
        return (this._test(v,elm) && this.options.all(function(p){
            return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
        }));
    }
}
Validator.methods = {
    pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
    minLength : function(v,elm,opt) {return v.length >= opt},
    maxLength : function(v,elm,opt) {return v.length <= opt},
    min : function(v,elm,opt) {return v >= parseFloat(opt)},
    max : function(v,elm,opt) {return v <= parseFloat(opt)},
    notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
        return v != value;
    })},
    oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
        return v == value;
    })},
    is : function(v,elm,opt) {return v == opt},
    isNot : function(v,elm,opt) {return v != opt},
    equalToField : function(v,elm,opt) {return v == $F(opt)},
    notEqualToField : function(v,elm,opt) {return v != $F(opt)},
    include : function(v,elm,opt) {return $A(opt).all(function(value) {
        return Validation.get(value).test(v,elm);
    })}
}

var Validation = Class.create();
Validation.defaultOptions = {
    onSubmit : true,
    stopOnFirst : false,
    immediate : false,
    focusOnError : true,
    useTitles : false,
    addClassNameToContainer: false,
    containerClassName: '.input-box',
    onFormValidate : function(result, form) {},
    onElementValidate : function(result, elm) {}
};

Validation.prototype = {
    initialize : function(form, options){
        this.form = $(form);
        if (!this.form) {
            return;
        }
        this.options = Object.extend({
            onSubmit : Validation.defaultOptions.onSubmit,
            stopOnFirst : Validation.defaultOptions.stopOnFirst,
            immediate : Validation.defaultOptions.immediate,
            focusOnError : Validation.defaultOptions.focusOnError,
            useTitles : Validation.defaultOptions.useTitles,
            onFormValidate : Validation.defaultOptions.onFormValidate,
            onElementValidate : Validation.defaultOptions.onElementValidate
        }, options || {});
        if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
        if(this.options.immediate) {
            Form.getElements(this.form).each(function(input) { // Thanks Mike!
                if (input.tagName.toLowerCase() == 'select') {
                    Event.observe(input, 'blur', this.onChange.bindAsEventListener(this));
                }
                if (input.type.toLowerCase() == 'radio' || input.type.toLowerCase() == 'checkbox') {
                    Event.observe(input, 'click', this.onChange.bindAsEventListener(this));
                } else {
                    Event.observe(input, 'change', this.onChange.bindAsEventListener(this));
                }
            }, this);
        }
    },
    onChange : function (ev) {
        Validation.isOnChange = true;
        Validation.validate(Event.element(ev),{
                useTitle : this.options.useTitles,
                onElementValidate : this.options.onElementValidate
        });
        Validation.isOnChange = false;
    },
    onSubmit :  function(ev){
        if(!this.validate()) Event.stop(ev);
    },
    validate : function() {
        var result = false;
        var useTitles = this.options.useTitles;
        var callback = this.options.onElementValidate;
        try {
            if(this.options.stopOnFirst) {
                result = Form.getElements(this.form).all(function(elm) {
                    if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) {
                        return true;
                    }
                    return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback});
                }, this);
            } else {
                result = Form.getElements(this.form).collect(function(elm) {
                    if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) {
                        return true;
                    }
                    return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback});
                }, this).all();
            }
        } catch (e) {
        }
        if(!result && this.options.focusOnError) {
            try{
                Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
            }
            catch(e){
            }
        }
        this.options.onFormValidate(result, this.form);
        return result;
    },
    reset : function() {
        Form.getElements(this.form).each(Validation.reset);
    },
    isElementInForm : function(elm, form) {
        var domForm = elm.up('form');
        if (domForm == form) {
            return true;
        }
        return false;
    }
}

Object.extend(Validation, {
    validate : function(elm, options){
        options = Object.extend({
            useTitle : false,
            onElementValidate : function(result, elm) {}
        }, options || {});
        elm = $(elm);

        var cn = $w(elm.className);
        return result = cn.all(function(value) {
            var test = Validation.test(value,elm,options.useTitle);
            options.onElementValidate(test, elm);
            return test;
        });
    },
    insertAdvice : function(elm, advice){
        var container = $(elm).up('.field-row');
        if(container){
            Element.insert(container, {after: advice});
        } else if (elm.up('td.value')) {
            elm.up('td.value').insert({bottom: advice});
        } else if (elm.advaiceContainer && $(elm.advaiceContainer)) {
            $(elm.advaiceContainer).update(advice);
        }
        else {
            switch (elm.type.toLowerCase()) {
                case 'checkbox':
                case 'radio':
                    var p = elm.parentNode;
                    if(p) {
                        Element.insert(p, {'bottom': advice});
                    } else {
                        Element.insert(elm, {'after': advice});
                    }
                    break;
                default:
                    Element.insert(elm, {'after': advice});
            }
        }
    },
    showAdvice : function(elm, advice, adviceName){
        if(!elm.advices){
            elm.advices = new Hash();
        }
        else{
            elm.advices.each(function(pair){
                if (!advice || pair.value.id != advice.id) {
                    // hide non-current advice after delay
                    this.hideAdvice(elm, pair.value);
                }
            }.bind(this));
        }
        elm.advices.set(adviceName, advice);
        if(typeof Effect == 'undefined') {
            advice.style.display = 'block';
        } else {
            if(!advice._adviceAbsolutize) {
                new Effect.Appear(advice, {duration : 1 });
            } else {
                Position.absolutize(advice);
                advice.show();
                advice.setStyle({
                    'top':advice._adviceTop,
                    'left': advice._adviceLeft,
                    'width': advice._adviceWidth,
                    'z-index': 1000
                });
                advice.addClassName('advice-absolute');
            }
        }
    },
    hideAdvice : function(elm, advice){
        if (advice != null) {
            new Effect.Fade(advice, {duration : 1, afterFinishInternal : function() {advice.hide();}});
        }
    },
    updateCallback : function(elm, status) {
        if (typeof elm.callbackFunction != 'undefined') {
            eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')');
        }
    },
    ajaxError : function(elm, errorMsg) {
        var name = 'validate-ajax';
        var advice = Validation.getAdvice(name, elm);
        if (advice == null) {
            advice = this.createAdvice(name, elm, false, errorMsg);
        }
        this.showAdvice(elm, advice, 'validate-ajax');
        this.updateCallback(elm, 'failed');

        elm.addClassName('validation-failed');
        elm.addClassName('validate-ajax');
        if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
            var container = elm.up(Validation.defaultOptions.containerClassName);
            if (container && this.allowContainerClassName(elm)) {
                container.removeClassName('validation-passed');
                container.addClassName('validation-error');
            }
        }
    },
    allowContainerClassName: function (elm) {
        if (elm.type == 'radio' || elm.type == 'checkbox') {
            return elm.hasClassName('change-container-classname');
        }

        return true;
    },
    test : function(name, elm, useTitle) {
        var v = Validation.get(name);
        var prop = '__advice'+name.camelize();
        try {
        if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
            //if(!elm[prop]) {
                var advice = Validation.getAdvice(name, elm);
                if (advice == null) {
                    advice = this.createAdvice(name, elm, useTitle);
                }
                this.showAdvice(elm, advice, name);
                this.updateCallback(elm, 'failed');
            //}
            elm[prop] = 1;
            if (!elm.advaiceContainer) {
                elm.removeClassName('validation-passed');
                elm.addClassName('validation-failed');
            }

           if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
                var container = elm.up(Validation.defaultOptions.containerClassName);
                if (container && this.allowContainerClassName(elm)) {
                    container.removeClassName('validation-passed');
                    container.addClassName('validation-error');
                }
            }
            return false;
        } else {
            var advice = Validation.getAdvice(name, elm);
            this.hideAdvice(elm, advice);
            this.updateCallback(elm, 'passed');
            elm[prop] = '';
            elm.removeClassName('validation-failed');
            elm.addClassName('validation-passed');
            if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
                var container = elm.up(Validation.defaultOptions.containerClassName);
                if (container && !container.down('.validation-failed') && this.allowContainerClassName(elm)) {
                    if (!Validation.get('IsEmpty').test(elm.value) || !this.isVisible(elm)) {
                        container.addClassName('validation-passed');
                    } else {
                        container.removeClassName('validation-passed');
                    }
                    container.removeClassName('validation-error');
                }
            }
            return true;
        }
        } catch(e) {
            throw(e)
        }
    },
    isVisible : function(elm) {
        while(elm.tagName != 'BODY') {
            if(!$(elm).visible()) return false;
            elm = elm.parentNode;
        }
        return true;
    },
    getAdvice : function(name, elm) {
        return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
    },
    createAdvice : function(name, elm, useTitle, customError) {
        var v = Validation.get(name);
        var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
        if (customError) {
            errorMsg = customError;
        }
        try {
            if (Translator){
                errorMsg = Translator.translate(errorMsg);
            }
        }
        catch(e){}

        advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'


        Validation.insertAdvice(elm, advice);
        advice = Validation.getAdvice(name, elm);
        if($(elm).hasClassName('absolute-advice')) {
            var dimensions = $(elm).getDimensions();
            var originalPosition = Position.cumulativeOffset(elm);

            advice._adviceTop = (originalPosition[1] + dimensions.height) + 'px';
            advice._adviceLeft = (originalPosition[0])  + 'px';
            advice._adviceWidth = (dimensions.width)  + 'px';
            advice._adviceAbsolutize = true;
        }
        return advice;
    },
    getElmID : function(elm) {
        return elm.id ? elm.id : elm.name;
    },
    reset : function(elm) {
        elm = $(elm);
        var cn = $w(elm.className);
        cn.each(function(value) {
            var prop = '__advice'+value.camelize();
            if(elm[prop]) {
                var advice = Validation.getAdvice(value, elm);
                if (advice) {
                    advice.hide();
                }
                elm[prop] = '';
            }
            elm.removeClassName('validation-failed');
            elm.removeClassName('validation-passed');
            if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
                var container = elm.up(Validation.defaultOptions.containerClassName);
                if (container) {
                    container.removeClassName('validation-passed');
                    container.removeClassName('validation-error');
                }
            }
        });
    },
    add : function(className, error, test, options) {
        var nv = {};
        nv[className] = new Validator(className, error, test, options);
        Object.extend(Validation.methods, nv);
    },
    addAllThese : function(validators) {
        var nv = {};
        $A(validators).each(function(value) {
                nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
            });
        Object.extend(Validation.methods, nv);
    },
    get : function(name) {
        return  Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
    },
    methods : {
        '_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
    }
});

Validation.add('IsEmpty', '', function(v) {
    return  (v == '' || (v == null) || (v.length == 0) || /^\s+$/.test(v)); // || /^\s+$/.test(v));
});

Validation.addAllThese([
    ['validate-select', 'Please select an option.', function(v) {
                return ((v != "none") && (v != null) && (v.length != 0));
            }],
    ['required-entry', 'This is a required field.', function(v) {
                return !Validation.get('IsEmpty').test(v);
            }],
    ['validate-number', 'Please enter a valid number in this field.', function(v) {
                return Validation.get('IsEmpty').test(v) || (!isNaN(parseNumber(v)) && !/^\s+$/.test(parseNumber(v)));
            }],
    ['validate-digits', 'Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.', function(v) {
                return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
            }],
    ['validate-digits-range', 'The value is not within the specified range.', function(v, elm) {
                var result = Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
                var reRange = new RegExp(/^digits-range-[0-9]+-[0-9]+$/);
                $w(elm.className).each(function(name, index) {
                    if (name.match(reRange) && result) {
                        var min = parseInt(name.split('-')[2], 10);
                        var max = parseInt(name.split('-')[3], 10);
                        var val = parseInt(v, 10);
                        result = (v >= min) && (v <= max);
                    }
                });
                return result;
            }],
    ['validate-alpha', 'Please use letters only (a-z or A-Z) in this field.', function (v) {
                return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
            }],
    ['validate-code', 'Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
                return Validation.get('IsEmpty').test(v) ||  /^[a-z]+[a-z0-9_]+$/.test(v)
            }],
    ['validate-alphanum', 'Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
                return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z0-9]+$/.test(v) /*!/\W/.test(v)*/
            }],
    ['validate-street', 'Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.', function(v) {
                return Validation.get('IsEmpty').test(v) ||  /^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v)
            }],
    ['validate-phoneStrict', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
                return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
            }],
    ['validate-phoneLax', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
                return Validation.get('IsEmpty').test(v) || /^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v);
            }],
    ['validate-fax', 'Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.', function(v) {
                return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
            }],
    ['validate-date', 'Please enter a valid date.', function(v) {
                var test = new Date(v);
                return Validation.get('IsEmpty').test(v) || !isNaN(test);
            }],
    ['validate-email', 'Please enter a valid email address. For example johndoe@domain.com.', function (v) {
                //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
                //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v)
                return Validation.get('IsEmpty').test(v) || /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i.test(v)
            }],
    ['validate-emailSender', 'Please use only visible characters and spaces.', function (v) {
                return Validation.get('IsEmpty').test(v) ||  /^[\S ]+$/.test(v)
                    }],
    ['validate-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
                var pass=v.strip(); /*strip leading and trailing spaces*/
                return !(pass.length>0 && pass.length < 6);
            }],
    ['validate-admin-password', 'Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.', function(v) {
                var pass=v.strip();
                if (0 == pass.length) {
                    return true;
                }
                if (!(/[a-z]/i.test(v)) || !(/[0-9]/.test(v))) {
                    return false;
                }
                return !(pass.length < 7);
            }],
    ['validate-cpassword', 'Please make sure your passwords match.', function(v) {
                var conf = $('confirmation') ? $('confirmation') : $$('.validate-cpassword')[0];
                var pass = false;
                if ($('password')) {
                    pass = $('password');
                }
                var passwordElements = $$('.validate-password');
                for (var i = 0; i < passwordElements.size(); i++) {
                    var passwordElement = passwordElements[i];
                    if (passwordElement.up('form').id == conf.up('form').id) {
                        pass = passwordElement;
                    }
                }
                if ($$('.validate-admin-password').size()) {
                    pass = $$('.validate-admin-password')[0];
                }
                return (pass.value == conf.value);
            }],
    ['validate-url', 'Please enter a valid URL. Protocol is required (http://, https:// or ftp://)', function (v) {
                return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
            }],
    ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) {
                return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
            }],
    ['validate-identifier', 'Please enter a valid URL Key. For example "example-page", "example-page.html" or "anotherlevel/example-page".', function (v) {
                return Validation.get('IsEmpty').test(v) || /^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/.test(v)
            }],
    ['validate-xml-identifier', 'Please enter a valid XML-identifier. For example something_1, block5, id-4.', function (v) {
                return Validation.get('IsEmpty').test(v) || /^[A-Z][A-Z0-9_\/-]*$/i.test(v)
            }],
    ['validate-ssn', 'Please enter a valid social security number. For example 123-45-6789.', function(v) {
            return Validation.get('IsEmpty').test(v) || /^\d{3}-?\d{2}-?\d{4}$/.test(v);
            }],
    ['validate-zip', 'Please enter a valid zip code. For example 90602 or 90602-1234.', function(v) {
            return Validation.get('IsEmpty').test(v) || /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v);
            }],
    ['validate-zip-international', 'Please enter a valid zip code.', function(v) {
            //return Validation.get('IsEmpty').test(v) || /(^[A-z0-9]{2,10}([\s]{0,1}|[\-]{0,1})[A-z0-9]{2,10}$)/.test(v);
            return true;
            }],
    ['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
                if(Validation.get('IsEmpty').test(v)) return true;
                var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
                if(!regex.test(v)) return false;
                var d = new Date(v.replace(regex, '$2/$1/$3'));
                return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
                            (parseInt(RegExp.$1, 10) == d.getDate()) &&
                            (parseInt(RegExp.$3, 10) == d.getFullYear() );
            }],
    ['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00.', function(v) {
                // [$]1[##][,###]+[.##]
                // [$]1###+[.##]
                // [$]0.##
                // [$].##
                return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
            }],
    ['validate-one-required', 'Please select one of the above options.', function (v,elm) {
                var p = elm.parentNode;
                var options = p.getElementsByTagName('INPUT');
                return $A(options).any(function(elm) {
                    return $F(elm);
                });
            }],
    ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) {
                var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]');

                var error = 1;
                for(var i=0;i<inputs.length;i++) {
                    if((inputs[i].type == 'checkbox' || inputs[i].type == 'radio') && inputs[i].checked == true) {
                        error = 0;
                    }

                    if(Validation.isOnChange && (inputs[i].type == 'checkbox' || inputs[i].type == 'radio')) {
                        Validation.reset(inputs[i]);
                    }
                }

                if( error == 0 ) {
                    return true;
                } else {
                    return false;
                }
            }],
    ['validate-not-negative-number', 'Please enter a valid number in this field.', function(v) {
                v = parseNumber(v);
                return (!isNaN(v) && v>=0);
            }],
    ['validate-state', 'Please select State/Province.', function(v) {
                return (v!=0 || v == '');
            }],

    ['validate-new-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
                if (!Validation.get('validate-password').test(v)) return false;
                if (Validation.get('IsEmpty').test(v) && v != '') return false;
                return true;
            }],
    ['validate-greater-than-zero', 'Please enter a number greater than 0 in this field.', function(v) {
                if(v.length)
                    return parseFloat(v) > 0;
                else
                    return true;
            }],
    ['validate-zero-or-greater', 'Please enter a number 0 or greater in this field.', function(v) {
                if(v.length)
                    return parseFloat(v) >= 0;
                else
                    return true;
            }],
    ['validate-cc-number', 'Please enter a valid credit card number.', function(v, elm) {
                // remove non-numerics
                var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
                if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined'
                        && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) {
                    if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) {
                        return true;
                    } else {
                        return false;
                    }
                }
                return validateCreditCard(v);
            }],
    ['validate-cc-type', 'Credit card number does not match credit card type.', function(v, elm) {
                // remove credit card number delimiters such as "-" and space
                elm.value = removeDelimiters(elm.value);
                v         = removeDelimiters(v);

                var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
                if (!ccTypeContainer) {
                    return true;
                }
                var ccType = ccTypeContainer.value;

                if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
                    return false;
                }

                // Other card type or switch or solo card
                if (Validation.creditCartTypes.get(ccType)[0]==false) {
                    return true;
                }

                // Matched credit card type
                var ccMatchedType = '';

                Validation.creditCartTypes.each(function (pair) {
                    if (pair.value[0] && v.match(pair.value[0])) {
                        ccMatchedType = pair.key;
                        throw $break;
                    }
                });

                if(ccMatchedType != ccType) {
                    return false;
                }

                if (ccTypeContainer.hasClassName('validation-failed') && Validation.isOnChange) {
                    Validation.validate(ccTypeContainer);
                }

                return true;
            }],
     ['validate-cc-type-select', 'Card type does not match credit card number.', function(v, elm) {
                var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number');
                if (Validation.isOnChange && Validation.get('IsEmpty').test(ccNumberContainer.value)) {
                    return true;
                }
                if (Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer)) {
                    Validation.validate(ccNumberContainer);
                }
                return Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer);
            }],
     ['validate-cc-exp', 'Incorrect credit card expiration date.', function(v, elm) {
                var ccExpMonth   = v;
                var ccExpYear    = $(elm.id.substr(0,elm.id.indexOf('_expiration')) + '_expiration_yr').value;
                var currentTime  = new Date();
                var currentMonth = currentTime.getMonth() + 1;
                var currentYear  = currentTime.getFullYear();
                if (ccExpMonth < currentMonth && ccExpYear == currentYear) {
                    return false;
                }
                return true;
            }],
     ['validate-cc-cvn', 'Please enter a valid credit card verification number.', function(v, elm) {
                var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type');
                if (!ccTypeContainer) {
                    return true;
                }
                var ccType = ccTypeContainer.value;

                if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
                    return false;
                }

                var re = Validation.creditCartTypes.get(ccType)[1];

                if (v.match(re)) {
                    return true;
                }

                return false;
            }],
     ['validate-ajax', '', function(v, elm) { return true; }],
     ['validate-data', 'Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
                if(v != '' && v) {
                    return /^[A-Za-z]+[A-Za-z0-9_]+$/.test(v);
                }
                return true;
            }],
     ['validate-css-length', 'Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%.', function (v) {
                if (v != '' && v) {
                    return /^[0-9\.]+(px|pt|em|ex|%)?$/.test(v) && (!(/\..*\./.test(v))) && !(/\.$/.test(v));
                }
                return true;
            }],
     ['validate-length', 'Text length does not satisfy specified text range.', function (v, elm) {
                var reMax = new RegExp(/^maximum-length-[0-9]+$/);
                var reMin = new RegExp(/^minimum-length-[0-9]+$/);
                var result = true;
                $w(elm.className).each(function(name, index) {
                    if (name.match(reMax) && result) {
                       var length = name.split('-')[2];
                       result = (v.length <= length);
                    }
                    if (name.match(reMin) && result && !Validation.get('IsEmpty').test(v)) {
                        var length = name.split('-')[2];
                        result = (v.length >= length);
                    }
                });
                return result;
            }],
     ['validate-percents', 'Please enter a number lower than 100.', {max:100}],
     ['required-file', 'Please select a file', function(v, elm) {
         var result = !Validation.get('IsEmpty').test(v);
         if (result === false) {
             ovId = elm.id + '_value';
             if ($(ovId)) {
                 result = !Validation.get('IsEmpty').test($(ovId).value);
             }
         }
         return result;
     }],
     ['validate-cc-ukss', 'Please enter issue number or start date for switch/solo card type.', function(v,elm) {
         var endposition;

         if (elm.id.match(/(.)+_cc_issue$/)) {
             endposition = elm.id.indexOf('_cc_issue');
         } else if (elm.id.match(/(.)+_start_month$/)) {
             endposition = elm.id.indexOf('_start_month');
         } else {
             endposition = elm.id.indexOf('_start_year');
         }

         var prefix = elm.id.substr(0,endposition);

         var ccTypeContainer = $(prefix + '_cc_type');

         if (!ccTypeContainer) {
               return true;
         }
         var ccType = ccTypeContainer.value;

         if(['SS','SM','SO'].indexOf(ccType) == -1){
             return true;
         }

         $(prefix + '_cc_issue').advaiceContainer
           = $(prefix + '_start_month').advaiceContainer
           = $(prefix + '_start_year').advaiceContainer
           = $(prefix + '_cc_type_ss_div').down('ul li.adv-container');

         var ccIssue   =  $(prefix + '_cc_issue').value;
         var ccSMonth  =  $(prefix + '_start_month').value;
         var ccSYear   =  $(prefix + '_start_year').value;

         var ccStartDatePresent = (ccSMonth && ccSYear) ? true : false;

         if (!ccStartDatePresent && !ccIssue){
             return false;
         }
         return true;
     }]
]);

function removeDelimiters (v) {
    v = v.replace(/\s/g, '');
    v = v.replace(/\-/g, '');
    return v;
}

function parseNumber(v)
{
    if (typeof v != 'string') {
        return parseFloat(v);
    }

    var isDot  = v.indexOf('.');
    var isComa = v.indexOf(',');

    if (isDot != -1 && isComa != -1) {
        if (isComa > isDot) {
            v = v.replace('.', '').replace(',', '.');
        }
        else {
            v = v.replace(',', '');
        }
    }
    else if (isComa != -1) {
        v = v.replace(',', '.');
    }

    return parseFloat(v);
}

/**
 * Hash with credit card types wich can be simply extended in payment modules
 * 0 - regexp for card number
 * 1 - regexp for cvn
 * 2 - check or not credit card number trough Luhn algorithm by
 *     function validateCreditCard wich you can find above in this file
 */
Validation.creditCartTypes = $H({
//    'SS': [new RegExp('^((6759[0-9]{12})|(5018|5020|5038|6304|6759|6761|6763[0-9]{12,19})|(49[013][1356][0-9]{12})|(6333[0-9]{12})|(6334[0-4]\d{11})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
    'SO': [new RegExp('^(6334[5-9]([0-9]{11}|[0-9]{13,14}))|(6767([0-9]{12}|[0-9]{14,15}))$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
    'SM': [new RegExp('(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
    'VI': [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true],
    'MC': [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true],
    'AE': [new RegExp('^3[47][0-9]{13}$'), new RegExp('^[0-9]{4}$'), true],
    'DI': [new RegExp('^6011[0-9]{12}$'), new RegExp('^[0-9]{3}$'), true],
    'JCB': [new RegExp('^(3[0-9]{15}|(2131|1800)[0-9]{11})$'), new RegExp('^[0-9]{4}$'), true],
    'OT': [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), false]
});

// script.aculo.us builder.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 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)));
      };
    });
  }
};
// script.aculo.us effects.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
//
// 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/

// converts rgb() and #xxx to #xxxxxx format,
// returns self (or first argument) if not convertable
String.prototype.parseColor = function() {
  var color = '#';
  if (this.slice(0,4) == 'rgb(') {
    var cols = this.slice(4,this.length-1).split(',');
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
  } else {
    if (this.slice(0,1) == '#') {
      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
      if (this.length==7) color = this.toLowerCase();
    }
  }
  return (color.length==7 ? color : (arguments[0] || this));
};

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

Element.collectTextNodes = function(element) {
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue :
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
};

Element.collectTextNodesIgnoreClass = function(element, className) {
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue :
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
};

Element.setContentZoom = function(element, percent) {
  element = $(element);
  element.setStyle({fontSize: (percent/100) + 'em'});
  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
  return element;
};

Element.getInlineOpacity = function(element){
  return $(element).style.opacity || '';
};

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

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

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  Transitions: {
    linear: Prototype.K,
    sinoidal: function(pos) {
      return (-Math.cos(pos*Math.PI)/2) + .5;
    },
    reverse: function(pos) {
      return 1-pos;
    },
    flicker: function(pos) {
      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
      return pos > 1 ? 1 : pos;
    },
    wobble: function(pos) {
      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
    },
    pulse: function(pos, pulses) {
      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
    },
    spring: function(pos) {
      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
    },
    none: function(pos) {
      return 0;
    },
    full: function(pos) {
      return 1;
    }
  },
  DefaultOptions: {
    duration:   1.0,   // seconds
    fps:        100,   // 100= assume 66fps max.
    sync:       false, // true for combining
    from:       0.0,
    to:         1.0,
    delay:      0.0,
    queue:      'parallel'
  },
  tagifyText: function(element) {
    var tagifyStyle = 'position:relative';
    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';

    element = $(element);
    $A(element.childNodes).each( function(child) {
      if (child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            new Element('span', {style: tagifyStyle}).update(
              character == ' ' ? String.fromCharCode(160) : character),
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if (((typeof element == 'object') ||
        Object.isFunction(element)) &&
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;

    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || { });
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || { });
    Effect[element.visible() ?
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create(Enumerable, {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();

    var position = Object.isString(effect.options.queue) ?
      effect.options.queue : effect.options.queue.position;

    switch(position) {
      case 'front':
        // move unstarted effects after this effect
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }

    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);

    if (!this.interval)
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if (this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    for(var i=0, len=this.effects.length;i<len;i++)
      this.effects[i] && this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if (!Object.isString(queueName)) return queueName;

    return this.instances.get(queueName) ||
      this.instances.set(queueName, new Effect.ScopedQueue());
  }
};
Effect.Queue = Effect.Queues.get('global');

Effect.Base = Class.create({
  position: null,
  start: function(options) {
    function codeForEvent(options,eventName){
      return (
        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
      );
    }
    if (options && options.transition === false) options.transition = Effect.Transitions.linear;
    this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn+(this.options.duration*1000);
    this.fromToDelta  = this.options.to-this.options.from;
    this.totalTime    = this.finishOn-this.startOn;
    this.totalFrames  = this.options.fps*this.options.duration;

    this.render = (function() {
      function dispatch(effect, eventName) {
        if (effect.options[eventName + 'Internal'])
          effect.options[eventName + 'Internal'](effect);
        if (effect.options[eventName])
          effect.options[eventName](effect);
      }

      return function(pos) {
        if (this.state === "idle") {
          this.state = "running";
          dispatch(this, 'beforeSetup');
          if (this.setup) this.setup();
          dispatch(this, 'afterSetup');
        }
        if (this.state === "running") {
          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
          this.position = pos;
          dispatch(this, 'beforeUpdate');
          if (this.update) this.update(pos);
          dispatch(this, 'afterUpdate');
        }
      };
    })();

    this.event('beforeStart');
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if (timePos >= this.startOn) {
      if (timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if (this.finish) this.finish();
        this.event('afterFinish');
        return;
      }
      var pos   = (timePos - this.startOn) / this.totalTime,
          frame = (pos * this.totalFrames).round();
      if (frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  cancel: function() {
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if (this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    var data = $H();
    for(property in this)
      if (!Object.isFunction(this[property])) data.set(property, this[property]);
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
});

Effect.Parallel = Class.create(Effect.Base, {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if (effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Tween = Class.create(Effect.Base, {
  initialize: function(object, from, to) {
    object = Object.isString(object) ? $(object) : object;
    var args = $A(arguments), method = args.last(),
      options = args.length == 5 ? args[3] : null;
    this.method = Object.isFunction(method) ? method.bind(object) :
      Object.isFunction(object[method]) ? object[method].bind(object) :
      function(value) { object[method] = value };
    this.start(Object.extend({ from: from, to: to }, options || { }));
  },
  update: function(position) {
    this.method(position);
  }
});

Effect.Event = Class.create(Effect.Base, {
  initialize: function() {
    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || { });
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if (this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: (this.options.x  * position + this.originalLeft).round() + 'px',
      top:  (this.options.y  * position + this.originalTop).round()  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element,
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
};

Effect.Scale = Class.create(Effect.Base, {
  initialize: function(element, percent) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or { } with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || { });
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');

    this.originalStyle = { };
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));

    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;

    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if (fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));

    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;

    this.dims = null;
    if (this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if (/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if (!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if (this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = { };
    if (this.options.scaleX) d.width = width.round() + 'px';
    if (this.options.scaleY) d.height = height.round() + 'px';
    if (this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if (this.elementPositioning == 'absolute') {
        if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if (this.options.scaleY) d.top = -topd + 'px';
        if (this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if (this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = { };
    if (!this.options.keepBackgroundImage) {
      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
      this.element.setStyle({backgroundImage: 'none'});
    }
    if (!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if (!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = function(element) {
  var options = arguments[1] || { },
  scrollOffsets = document.viewport.getScrollOffsets(),
  elementOffsets = $(element).cumulativeOffset();

  if (options.offset) elementOffsets[1] += options.offset;

  return new Effect.Tween(null,
    scrollOffsets.top,
    elementOffsets[1],
    options,
    function(p){ scrollTo(scrollOffsets.left, p.round()); }
  );
};

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
    from: element.getOpacity() || 1.0,
    to:   0.0,
    afterFinishInternal: function(effect) {
      if (effect.options.to!=0) return;
      effect.element.hide().setStyle({opacity: oldOpacity});
    }
  }, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Appear = function(element) {
  element = $(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  // force Safari to render floated elements properly
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from).show();
  }}, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = {
    opacity: element.getInlineOpacity(),
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200,
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
     Object.extend({ duration: 1.0,
      beforeSetupInternal: function(effect) {
        Position.absolutize(effect.effects[0].element);
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide().setStyle(oldStyle); }
     }, arguments[1] || { })
   );
};

Effect.BlindUp = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false,
      scaleX: false,
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      }
    }, arguments[1] || { })
  );
};

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || { }));
};

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, {
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) {
          effect.element.makePositioned().makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
        }
      });
    }
  }, arguments[1] || { }));
};

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) {
          effect.effects[0].element.makePositioned();
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
        }
      }, arguments[1] || { }));
};

Effect.Shake = function(element) {
  element = $(element);
  var options = Object.extend({
    distance: 20,
    duration: 0.5
  }, arguments[1] || {});
  var distance = parseFloat(options.distance);
  var split = parseFloat(options.duration) / 10.0;
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element,
      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
        effect.element.undoPositioned().setStyle(oldStyle);
  }}); }}); }}); }}); }}); }});
};

Effect.SlideDown = function(element) {
  element = $(element).cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || { })
  );
};

Effect.SlideUp = function(element) {
  element = $(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false,
    scaleX: false,
    scaleMode: 'box',
    scaleFrom: 100,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
    }
   }, arguments[1] || { })
  );
};

// Bug in opera makes the TD containing this element expand for a instance after finish
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, {
    restoreAfterFinish: true,
    beforeSetup: function(effect) {
      effect.element.makeClipping();
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping();
    }
  });
};

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || { });
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var initialMoveX, initialMoveY;
  var moveX, moveY;

  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0;
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }

  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01,
    beforeSetup: function(effect) {
      effect.element.hide().makeClipping().makePositioned();
    },
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) {
               effect.effects[0].element.setStyle({height: '0px'}).show();
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
             }
           }, options)
      );
    }
  });
};

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || { });
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var moveX, moveY;

  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }

  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({
         beforeStartInternal: function(effect) {
           effect.effects[0].element.makePositioned().makeClipping();
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
       }, options)
  );
};

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || { },
    oldOpacity = element.getInlineOpacity(),
    transition = options.transition || Effect.Transitions.linear,
    reverser   = function(pos){
      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
    };

  return new Effect.Opacity(element,
    Object.extend(Object.extend({  duration: 2.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
};

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 5, Object.extend({
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, {
      scaleContent: false,
      scaleY: false,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping().setStyle(oldStyle);
      } });
  }}, arguments[1] || { }));
};

Effect.Morph = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: { }
    }, arguments[1] || { });

    if (!Object.isString(options.style)) this.style = $H(options.style);
    else {
      if (options.style.include(':'))
        this.style = options.style.parseStyle();
      else {
        this.element.addClassName(options.style);
        this.style = $H(this.element.getStyles());
        this.element.removeClassName(options.style);
        var css = this.element.getStyles();
        this.style = this.style.reject(function(style) {
          return style.value == css[style.key];
        });
        options.afterFinishInternal = function(effect) {
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            effect.element.style[transform.style] = '';
          });
        };
      }
    }
    this.start(options);
  },

  setup: function(){
    function parseColor(color){
      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
      color = color.parseColor();
      return $R(0,2).map(function(i){
        return parseInt( color.slice(i*2+1,i*2+3), 16 );
      });
    }
    this.transforms = this.style.map(function(pair){
      var property = pair[0], value = pair[1], unit = null;

      if (value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if (property == 'opacity') {
        value = parseFloat(value);
        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
          this.element.setStyle({zoom: 1});
      } else if (Element.CSS_LENGTH.test(value)) {
          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
          value = parseFloat(components[1]);
          unit = (components.length == 3) ? components[2] : null;
      }

      var originalValue = this.element.getStyle(property);
      return {
        style: property.camelize(),
        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
        targetValue: unit=='color' ? parseColor(value) : value,
        unit: unit
      };
    }.bind(this)).reject(function(transform){
      return (
        (transform.originalValue == transform.targetValue) ||
        (
          transform.unit != 'color' &&
          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
        )
      );
    });
  },
  update: function(position) {
    var style = { }, transform, i = this.transforms.length;
    while(i--)
      style[(transform = this.transforms[i]).style] =
        transform.unit=='color' ? '#'+
          (Math.round(transform.originalValue[0]+
            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
          (Math.round(transform.originalValue[1]+
            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
          (Math.round(transform.originalValue[2]+
            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
        (transform.originalValue +
          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
            (transform.unit === null ? '' : transform.unit);
    this.element.setStyle(style, true);
  }
});

Effect.Transform = Class.create({
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || { };
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      track = $H(track);
      var data = track.values().first();
      this.tracks.push($H({
        ids:     track.keys().first(),
        effect:  Effect.Morph,
        options: { style: data }
      }));
    }.bind(this));
    return this;
  },
  play: function(){
    return new Effect.Parallel(
      this.tracks.map(function(track){
        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
        var elements = [$(ids) || $$(ids)].flatten();
        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
      }).flatten(),
      this.options
    );
  }
});

Element.CSS_PROPERTIES = $w(
  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  'fontSize fontWeight height left letterSpacing lineHeight ' +
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  'right textIndent top width wordSpacing zIndex');

Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.__parseStyleElement = document.createElement('div');
String.prototype.parseStyle = function(){
  var style, styleRules = $H();
  if (Prototype.Browser.WebKit)
    style = new Element('div',{style:this}).style;
  else {
    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
    style = String.__parseStyleElement.childNodes[0].style;
  }

  Element.CSS_PROPERTIES.each(function(property){
    if (style[property]) styleRules.set(property, style[property]);
  });

  if (Prototype.Browser.IE && this.include('opacity'))
    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);

  return styleRules;
};

if (document.defaultView && document.defaultView.getComputedStyle) {
  Element.getStyles = function(element) {
    var css = document.defaultView.getComputedStyle($(element), null);
    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
      styles[property] = css[property];
      return styles;
    });
  };
} else {
  Element.getStyles = function(element) {
    element = $(element);
    var css = element.currentStyle, styles;
    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
      results[property] = css[property];
      return results;
    });
    if (!styles.opacity) styles.opacity = element.getOpacity();
    return styles;
  };
}

Effect.Methods = {
  morph: function(element, style) {
    element = $(element);
    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
    return element;
  },
  visualEffect: function(element, effect, options) {
    element = $(element);
    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
    new Effect[klass](element, options);
    return element;
  },
  highlight: function(element, options) {
    element = $(element);
    new Effect.Highlight(element, options);
    return element;
  }
};

$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
  'pulsate shake puff squish switchOff dropOut').each(
  function(effect) {
    Effect.Methods[effect] = function(element, options){
      element = $(element);
      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
      return element;
    };
  }
);

$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
  function(f) { Effect.Methods[f] = Element[f]; }
);

Element.addMethods(Effect.Methods);
// script.aculo.us dragdrop.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
//
// 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/

if(Object.isUndefined(Effect))
  throw("dragdrop.js requires including script.aculo.us' effects.js library");

var Droppables = {
  drops: [],

  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },

  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null,
      tree:       false
    }, arguments[1] || { });

    // cache containers
    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if(Object.isArray(containment)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }

    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },

  findDeepestChild: function(drops) {
    deepest = drops[0];

    for (i = 1; i < drops.length; ++i)
      if (Element.isParent(drops[i].element, deepest.element))
        deepest = drops[i];

    return deepest;
  },

  isContained: function(element, drop) {
    var containmentNode;
    if(drop.tree) {
      containmentNode = element.treeNode;
    } else {
      containmentNode = element.parentNode;
    }
    return drop._containers.detect(function(c) { return containmentNode == c });
  },

  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect(
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },

  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },

  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },

  show: function(point, element) {
    if(!this.drops.length) return;
    var drop, affected = [];

    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop))
        affected.push(drop);
    });

    if(affected.length>0)
      drop = Droppables.findDeepestChild(affected);

    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
    if (drop) {
      Position.within(drop.element, point[0], point[1]);
      if(drop.onHover)
        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));

      if (drop != this.last_active) Droppables.activate(drop);
    }
  },

  fire: function(event, element) {
    if(!this.last_active) return;
    Position.prepare();

    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
      if (this.last_active.onDrop) {
        this.last_active.onDrop(element, this.last_active.element, event);
        return true;
      }
  },

  reset: function() {
    if(this.last_active)
      this.deactivate(this.last_active);
  }
};

var Draggables = {
  drags: [],
  observers: [],

  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);

      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(draggable.element, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
  },

  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(draggable.element, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },

  activate: function(draggable) {
    if(draggable.options.delay) {
      this._timeout = setTimeout(function() {
        Draggables._timeout = null;
        window.focus();
        Draggables.activeDraggable = draggable;
      }.bind(this), draggable.options.delay);
    } else {
      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
      this.activeDraggable = draggable;
    }
  },

  deactivate: function() {
    this.activeDraggable = null;
  },

  updateDrag: function(event) {
    if(!this.activeDraggable) return;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    // Mozilla-based browsers fire successive mousemove events with
    // the same coordinates, prevent needless redrawing (moz bug?)
    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
    this._lastPointer = pointer;

    this.activeDraggable.updateDrag(event, pointer);
  },

  endDrag: function(event) {
    if(this._timeout) {
      clearTimeout(this._timeout);
      this._timeout = null;
    }
    if(!this.activeDraggable) return;
    this._lastPointer = null;
    this.activeDraggable.endDrag(event);
    this.activeDraggable = null;
  },

  keyPress: function(event) {
    if(this.activeDraggable)
      this.activeDraggable.keyPress(event);
  },

  addObserver: function(observer) {
    this.observers.push(observer);
    this._cacheObserverCallbacks();
  },

  removeObserver: function(element) {  // element instead of observer fixes mem leaks
    this.observers = this.observers.reject( function(o) { return o.element==element });
    this._cacheObserverCallbacks();
  },

  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
    if(this[eventName+'Count'] > 0)
      this.observers.each( function(o) {
        if(o[eventName]) o[eventName](eventName, draggable, event);
      });
    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
  },

  _cacheObserverCallbacks: function() {
    ['onStart','onEnd','onDrag'].each( function(eventName) {
      Draggables[eventName+'Count'] = Draggables.observers.select(
        function(o) { return o[eventName]; }
      ).length;
    });
  }
};

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

var Draggable = Class.create({
  initialize: function(element) {
    var defaults = {
      handle: false,
      reverteffect: function(element, top_offset, left_offset) {
        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
          queue: {scope:'_draggable', position:'end'}
        });
      },
      endeffect: function(element) {
        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
          queue: {scope:'_draggable', position:'end'},
          afterFinish: function(){
            Draggable._dragging[element] = false
          }
        });
      },
      zindex: 1000,
      revert: false,
      quiet: false,
      scroll: false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
      delay: 0
    };

    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
      Object.extend(defaults, {
        starteffect: function(element) {
          element._opacity = Element.getOpacity(element);
          Draggable._dragging[element] = true;
          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
        }
      });

    var options = Object.extend(defaults, arguments[1] || { });

    this.element = $(element);

    if(options.handle && Object.isString(options.handle))
      this.handle = this.element.down('.'+options.handle, 0);

    if(!this.handle) this.handle = $(options.handle);
    if(!this.handle) this.handle = this.element;

    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
      options.scroll = $(options.scroll);
      this._isScrollChild = Element.childOf(this.element, options.scroll);
    }

    Element.makePositioned(this.element); // fix IE

    this.options  = options;
    this.dragging = false;

    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
    Event.observe(this.handle, "mousedown", this.eventMouseDown);

    Draggables.register(this);
  },

  destroy: function() {
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    Draggables.unregister(this);
  },

  currentDelta: function() {
    return([
      parseInt(Element.getStyle(this.element,'left') || '0'),
      parseInt(Element.getStyle(this.element,'top') || '0')]);
  },

  initDrag: function(event) {
    if(!Object.isUndefined(Draggable._dragging[this.element]) &&
      Draggable._dragging[this.element]) return;
    if(Event.isLeftClick(event)) {
      // abort on form elements, fixes a Firefox issue
      var src = Event.element(event);
      if((tag_name = src.tagName.toUpperCase()) && (
        tag_name=='INPUT' ||
        tag_name=='SELECT' ||
        tag_name=='OPTION' ||
        tag_name=='BUTTON' ||
        tag_name=='TEXTAREA')) return;

      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      var pos     = Position.cumulativeOffset(this.element);
      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });

      Draggables.activate(this);
      Event.stop(event);
    }
  },

  startDrag: function(event) {
    this.dragging = true;
    if(!this.delta)
      this.delta = this.currentDelta();

    if(this.options.zindex) {
      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
      this.element.style.zIndex = this.options.zindex;
    }

    if(this.options.ghosting) {
      this._clone = this.element.cloneNode(true);
      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
      if (!this._originallyAbsolute)
        Position.absolutize(this.element);
      this.element.parentNode.insertBefore(this._clone, this.element);
    }

    if(this.options.scroll) {
      if (this.options.scroll == window) {
        var where = this._getWindowScroll(this.options.scroll);
        this.originalScrollLeft = where.left;
        this.originalScrollTop = where.top;
      } else {
        this.originalScrollLeft = this.options.scroll.scrollLeft;
        this.originalScrollTop = this.options.scroll.scrollTop;
      }
    }

    Draggables.notify('onStart', this, event);

    if(this.options.starteffect) this.options.starteffect(this.element);
  },

  updateDrag: function(event, pointer) {
    if(!this.dragging) this.startDrag(event);

    if(!this.options.quiet){
      Position.prepare();
      Droppables.show(pointer, this.element);
    }

    Draggables.notify('onDrag', this, event);

    this.draw(pointer);
    if(this.options.change) this.options.change(this);

    if(this.options.scroll) {
      this.stopScrolling();

      var p;
      if (this.options.scroll == window) {
        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
      } else {
        p = Position.page(this.options.scroll);
        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
        p[1] += this.options.scroll.scrollTop + Position.deltaY;
        p.push(p[0]+this.options.scroll.offsetWidth);
        p.push(p[1]+this.options.scroll.offsetHeight);
      }
      var speed = [0,0];
      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
      this.startScrolling(speed);
    }

    // fix AppleWebKit rendering
    if(Prototype.Browser.WebKit) window.scrollBy(0,0);

    Event.stop(event);
  },

  finishDrag: function(event, success) {
    this.dragging = false;

    if(this.options.quiet){
      Position.prepare();
      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      Droppables.show(pointer, this.element);
    }

    if(this.options.ghosting) {
      if (!this._originallyAbsolute)
        Position.relativize(this.element);
      delete this._originallyAbsolute;
      Element.remove(this._clone);
      this._clone = null;
    }

    var dropped = false;
    if(success) {
      dropped = Droppables.fire(event, this.element);
      if (!dropped) dropped = false;
    }
    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
    Draggables.notify('onEnd', this, event);

    var revert = this.options.revert;
    if(revert && Object.isFunction(revert)) revert = revert(this.element);

    var d = this.currentDelta();
    if(revert && this.options.reverteffect) {
      if (dropped == 0 || revert != 'failure')
        this.options.reverteffect(this.element,
          d[1]-this.delta[1], d[0]-this.delta[0]);
    } else {
      this.delta = d;
    }

    if(this.options.zindex)
      this.element.style.zIndex = this.originalZ;

    if(this.options.endeffect)
      this.options.endeffect(this.element);

    Draggables.deactivate(this);
    Droppables.reset();
  },

  keyPress: function(event) {
    if(event.keyCode!=Event.KEY_ESC) return;
    this.finishDrag(event, false);
    Event.stop(event);
  },

  endDrag: function(event) {
    if(!this.dragging) return;
    this.stopScrolling();
    this.finishDrag(event, true);
    Event.stop(event);
  },

  draw: function(point) {
    var pos = Position.cumulativeOffset(this.element);
    if(this.options.ghosting) {
      var r   = Position.realOffset(this.element);
      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
    }

    var d = this.currentDelta();
    pos[0] -= d[0]; pos[1] -= d[1];

    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
    }

    var p = [0,1].map(function(i){
      return (point[i]-pos[i]-this.offset[i])
    }.bind(this));

    if(this.options.snap) {
      if(Object.isFunction(this.options.snap)) {
        p = this.options.snap(p[0],p[1],this);
      } else {
      if(Object.isArray(this.options.snap)) {
        p = p.map( function(v, i) {
          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
      } else {
        p = p.map( function(v) {
          return (v/this.options.snap).round()*this.options.snap }.bind(this));
      }
    }}

    var style = this.element.style;
    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
      style.left = p[0] + "px";
    if((!this.options.constraint) || (this.options.constraint=='vertical'))
      style.top  = p[1] + "px";

    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  },

  stopScrolling: function() {
    if(this.scrollInterval) {
      clearInterval(this.scrollInterval);
      this.scrollInterval = null;
      Draggables._lastScrollPointer = null;
    }
  },

  startScrolling: function(speed) {
    if(!(speed[0] || speed[1])) return;
    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
    this.lastScrolled = new Date();
    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
  },

  scroll: function() {
    var current = new Date();
    var delta = current - this.lastScrolled;
    this.lastScrolled = current;
    if(this.options.scroll == window) {
      with (this._getWindowScroll(this.options.scroll)) {
        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
          var d = delta / 1000;
          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
        }
      }
    } else {
      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
    }

    Position.prepare();
    Droppables.show(Draggables._lastPointer, this.element);
    Draggables.notify('onDrag', this);
    if (this._isScrollChild) {
      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
      if (Draggables._lastScrollPointer[0] < 0)
        Draggables._lastScrollPointer[0] = 0;
      if (Draggables._lastScrollPointer[1] < 0)
        Draggables._lastScrollPointer[1] = 0;
      this.draw(Draggables._lastScrollPointer);
    }

    if(this.options.change) this.options.change(this);
  },

  _getWindowScroll: function(w) {
    var T, L, W, H;
    with (w.document) {
      if (w.document.documentElement && documentElement.scrollTop) {
        T = documentElement.scrollTop;
        L = documentElement.scrollLeft;
      } else if (w.document.body) {
        T = body.scrollTop;
        L = body.scrollLeft;
      }
      if (w.innerWidth) {
        W = w.innerWidth;
        H = w.innerHeight;
      } else if (w.document.documentElement && documentElement.clientWidth) {
        W = documentElement.clientWidth;
        H = documentElement.clientHeight;
      } else {
        W = body.offsetWidth;
        H = body.offsetHeight;
      }
    }
    return { top: T, left: L, width: W, height: H };
  }
});

Draggable._dragging = { };

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

var SortableObserver = Class.create({
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
    this.lastValue = Sortable.serialize(this.element);
  },

  onStart: function() {
    this.lastValue = Sortable.serialize(this.element);
  },

  onEnd: function() {
    Sortable.unmark();
    if(this.lastValue != Sortable.serialize(this.element))
      this.observer(this.element)
  }
});

var Sortable = {
  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,

  sortables: { },

  _findRootElement: function(element) {
    while (element.tagName.toUpperCase() != "BODY") {
      if(element.id && Sortable.sortables[element.id]) return element;
      element = element.parentNode;
    }
  },

  options: function(element) {
    element = Sortable._findRootElement($(element));
    if(!element) return;
    return Sortable.sortables[element.id];
  },

  destroy: function(element){
    element = $(element);
    var s = Sortable.sortables[element.id];

    if(s) {
      Draggables.removeObserver(s.element);
      s.droppables.each(function(d){ Droppables.remove(d) });
      s.draggables.invoke('destroy');

      delete Sortable.sortables[s.element.id];
    }
  },

  create: function(element) {
    element = $(element);
    var options = Object.extend({
      element:     element,
      tag:         'li',       // assumes li children, override with tag: 'tagname'
      dropOnEmpty: false,
      tree:        false,
      treeTag:     'ul',
      overlap:     'vertical', // one of 'vertical', 'horizontal'
      constraint:  'vertical', // one of 'vertical', 'horizontal', false
      containment: element,    // also takes array of elements (or id's); or false
      handle:      false,      // or a CSS class
      only:        false,
      delay:       0,
      hoverclass:  null,
      ghosting:    false,
      quiet:       false,
      scroll:      false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      format:      this.SERIALIZE_RULE,

      // these take arrays of elements or ids and can be
      // used for better initialization performance
      elements:    false,
      handles:     false,

      onChange:    Prototype.emptyFunction,
      onUpdate:    Prototype.emptyFunction
    }, arguments[1] || { });

    // clear any old sortable with same element
    this.destroy(element);

    // build options for the draggables
    var options_for_draggable = {
      revert:      true,
      quiet:       options.quiet,
      scroll:      options.scroll,
      scrollSpeed: options.scrollSpeed,
      scrollSensitivity: options.scrollSensitivity,
      delay:       options.delay,
      ghosting:    options.ghosting,
      constraint:  options.constraint,
      handle:      options.handle };

    if(options.starteffect)
      options_for_draggable.starteffect = options.starteffect;

    if(options.reverteffect)
      options_for_draggable.reverteffect = options.reverteffect;
    else
      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
        element.style.top  = 0;
        element.style.left = 0;
      };

    if(options.endeffect)
      options_for_draggable.endeffect = options.endeffect;

    if(options.zindex)
      options_for_draggable.zindex = options.zindex;

    // build options for the droppables
    var options_for_droppable = {
      overlap:     options.overlap,
      containment: options.containment,
      tree:        options.tree,
      hoverclass:  options.hoverclass,
      onHover:     Sortable.onHover
    };

    var options_for_tree = {
      onHover:      Sortable.onEmptyHover,
      overlap:      options.overlap,
      containment:  options.containment,
      hoverclass:   options.hoverclass
    };

    // fix for gecko engine
    Element.cleanWhitespace(element);

    options.draggables = [];
    options.droppables = [];

    // drop on empty handling
    if(options.dropOnEmpty || options.tree) {
      Droppables.add(element, options_for_tree);
      options.droppables.push(element);
    }

    (options.elements || this.findElements(element, options) || []).each( function(e,i) {
      var handle = options.handles ? $(options.handles[i]) :
        (options.handle ? $(e).select('.' + options.handle)[0] : e);
      options.draggables.push(
        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
      Droppables.add(e, options_for_droppable);
      if(options.tree) e.treeNode = element;
      options.droppables.push(e);
    });

    if(options.tree) {
      (Sortable.findTreeElements(element, options) || []).each( function(e) {
        Droppables.add(e, options_for_tree);
        e.treeNode = element;
        options.droppables.push(e);
      });
    }

    // keep reference
    this.sortables[element.id] = options;

    // for onupdate
    Draggables.addObserver(new SortableObserver(element, options.onUpdate));

  },

  // return all suitable-for-sortable elements in a guaranteed order
  findElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.tag);
  },

  findTreeElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.treeTag);
  },

  onHover: function(element, dropon, overlap) {
    if(Element.isParent(dropon, element)) return;

    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
      return;
    } else if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },

  onEmptyHover: function(element, dropon, overlap) {
    var oldParentNode = element.parentNode;
    var droponOptions = Sortable.options(dropon);

    if(!Element.isParent(dropon, element)) {
      var index;

      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
      var child = null;

      if(children) {
        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);

        for (index = 0; index < children.length; index += 1) {
          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
            offset -= Element.offsetSize (children[index], droponOptions.overlap);
          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
            child = index + 1 < children.length ? children[index + 1] : null;
            break;
          } else {
            child = children[index];
            break;
          }
        }
      }

      dropon.insertBefore(element, child);

      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },

  unmark: function() {
    if(Sortable._marker) Sortable._marker.hide();
  },

  mark: function(dropon, position) {
    // mark on ghosting only
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return;

    if(!Sortable._marker) {
      Sortable._marker =
        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
          hide().addClassName('dropmarker').setStyle({position:'absolute'});
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});

    if(position=='after')
      if(sortable.overlap == 'horizontal')
        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
      else
        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});

    Sortable._marker.show();
  },

  _tree: function(element, options, parent) {
    var children = Sortable.findElements(element, options) || [];

    for (var i = 0; i < children.length; ++i) {
      var match = children[i].id.match(options.format);

      if (!match) continue;

      var child = {
        id: encodeURIComponent(match ? match[1] : null),
        element: element,
        parent: parent,
        children: [],
        position: parent.children.length,
        container: $(children[i]).down(options.treeTag)
      };

      /* Get the element containing the children and recurse over it */
      if (child.container)
        this._tree(child.container, options, child);

      parent.children.push (child);
    }

    return parent;
  },

  tree: function(element) {
    element = $(element);
    var sortableOptions = this.options(element);
    var options = Object.extend({
      tag: sortableOptions.tag,
      treeTag: sortableOptions.treeTag,
      only: sortableOptions.only,
      name: element.id,
      format: sortableOptions.format
    }, arguments[1] || { });

    var root = {
      id: null,
      parent: null,
      children: [],
      container: element,
      position: 0
    };

    return Sortable._tree(element, options, root);
  },

  /* Construct a [i] index for a particular node */
  _constructIndex: function(node) {
    var index = '';
    do {
      if (node.id) index = '[' + node.position + ']' + index;
    } while ((node = node.parent) != null);
    return index;
  },

  sequence: function(element) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[1] || { });

    return $(this.findElements(element, options) || []).map( function(item) {
      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
    });
  },

  setSequence: function(element, new_sequence) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[2] || { });

    var nodeMap = { };
    this.findElements(element, options).each( function(n) {
        if (n.id.match(options.format))
            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
        n.parentNode.removeChild(n);
    });

    new_sequence.each(function(ident) {
      var n = nodeMap[ident];
      if (n) {
        n[1].appendChild(n[0]);
        delete nodeMap[ident];
      }
    });
  },

  serialize: function(element) {
    element = $(element);
    var options = Object.extend(Sortable.options(element), arguments[1] || { });
    var name = encodeURIComponent(
      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);

    if (options.tree) {
      return Sortable.tree(element, arguments[1]).children.map( function (item) {
        return [name + Sortable._constructIndex(item) + "[id]=" +
                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
      }).flatten().join('&');
    } else {
      return Sortable.sequence(element, arguments[1]).map( function(item) {
        return name + "[]=" + encodeURIComponent(item);
      }).join('&');
    }
  }
};

// Returns true if child is contained within element
Element.isParent = function(child, element) {
  if (!child.parentNode || child == element) return false;
  if (child.parentNode == element) return true;
  return Element.isParent(child.parentNode, element);
};

Element.findChildren = function(element, only, recursive, tagName) {
  if(!element.hasChildNodes()) return null;
  tagName = tagName.toUpperCase();
  if(only) only = [only].flatten();
  var elements = [];
  $A(element.childNodes).each( function(e) {
    if(e.tagName && e.tagName.toUpperCase()==tagName &&
      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
        elements.push(e);
    if(recursive) {
      var grandchildren = Element.findChildren(e, only, recursive, tagName);
      if(grandchildren) elements.push(grandchildren);
    }
  });

  return (elements.length>0 ? elements.flatten() : []);
};

Element.offsetSize = function (element, type) {
  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
};
// script.aculo.us controls.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005-2008 Jon Tirsen (http://www.tirsen.com)
// Contributors:
//  Richard Livsey
//  Rahul Bhargava
//  Rob Wills
//
// 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/

// Autocompleter.Base handles all the autocompletion functionality
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least,
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most
// useful when one of the tokens is \n (a newline), as it
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = { };
Autocompleter.Base = Class.create({
  baseInitialize: function(element, update, options) {
    element          = $(element);
    this.element     = element;
    this.update      = $(update);
    this.hasFocus    = false;
    this.changed     = false;
    this.active      = false;
    this.index       = 0;
    this.entryCount  = 0;
    this.oldElementValue = this.element.value;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || { };

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow ||
      function(element, update){
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false,
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide ||
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string')
      this.options.tokens = new Array(this.options.tokens);
    // Force carriage returns as token delimiters anyway
    if (!this.options.tokens.include('\n'))
      this.options.tokens.push('\n');

    this.observer = null;

    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);

    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix &&
      (Prototype.Browser.IE) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update,
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },

  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         Event.stop(event);
         return;
      }
     else
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer =
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex)
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },

  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },

  onBlur: function(event) {
    // needed to make click events working
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;
  },

  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ?
          Element.addClassName(this.getEntry(i),"selected") :
          Element.removeClassName(this.getEntry(i),"selected");
      if(this.hasFocus) {
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },

  markPrevious: function() {
    if(this.index > 0) this.index--;
      else this.index = this.entryCount-1;
    //this.getEntry(this.index).scrollIntoView(true); useless
  },

  markNext: function() {
    if(this.index < this.entryCount-1) this.index++;
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },

  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },

  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },

  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = $(selectedElement).select('.' + this.options.select) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');

    var bounds = this.getTokenBounds();
    if (bounds[0] != -1) {
      var newValue = this.element.value.substr(0, bounds[0]);
      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
    } else {
      this.element.value = value;
    }
    this.oldElementValue = this.element.value;
    this.element.focus();

    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices) {
    if(!this.changed && this.hasFocus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount =
          this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else {
        this.entryCount = 0;
      }

      this.stopIndicator();
      this.index = 0;

      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;
    this.tokenBounds = null;
    if(this.getToken().length>=this.options.minChars) {
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
    this.oldElementValue = this.element.value;
  },

  getToken: function() {
    var bounds = this.getTokenBounds();
    return this.element.value.substring(bounds[0], bounds[1]).strip();
  },

  getTokenBounds: function() {
    if (null != this.tokenBounds) return this.tokenBounds;
    var value = this.element.value;
    if (value.strip().empty()) return [-1, 0];
    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
    var offset = (diff == this.oldElementValue.length ? 1 : 0);
    var prevTokenPos = -1, nextTokenPos = value.length;
    var tp;
    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
      if (tp > prevTokenPos) prevTokenPos = tp;
      tp = value.indexOf(this.options.tokens[index], diff + offset);
      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
    }
    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
  }
});

Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
  var boundary = Math.min(newS.length, oldS.length);
  for (var index = 0; index < boundary; ++index)
    if (newS[index] != oldS[index])
      return index;
  return boundary;
};

Ajax.Autocompleter = Class.create(Autocompleter.Base, {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    this.startIndicator();

    var entry = encodeURIComponent(this.options.paramName) + '=' +
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams)
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }
});

// The local array autocompleter. Used when you'd prefer to
// inject an array of autocompletion options into the page, rather
// than sending out Ajax queries, which can be quite slow sometimes.
//
// The constructor takes four parameters. The first two are, as usual,
// the id of the monitored textbox, and id of the autocompletion menu.
// The third is the array you want to autocomplete from, and the fourth
// is the options block.
//
// Extra local autocompletion options:
// - choices - How many autocompletion choices to offer
//
// - partialSearch - If false, the autocompleter will match entered
//                    text only at the beginning of strings in the
//                    autocomplete array. Defaults to true, which will
//                    match text at the beginning of any *word* in the
//                    strings in the autocomplete array. If you want to
//                    search anywhere in the string, additionally set
//                    the option fullSearch to true (default: off).
//
// - fullSsearch - Search anywhere in autocomplete array strings.
//
// - partialChars - How many characters to enter before triggering
//                   a partial match (unlike minChars, which defines
//                   how many characters are required to do any match
//                   at all). Defaults to 2.
//
// - ignoreCase - Whether to ignore case when autocompleting.
//                 Defaults to true.
//
// It's possible to pass in a custom function as the 'selector'
// option, if you prefer to write your own autocompletion logic.
// In that case, the other options above will not apply unless
// you support them.

Autocompleter.Local = Class.create(Autocompleter.Base, {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&
          ret.length < instance.options.choices ; i++) {

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ?
            elem.toLowerCase().indexOf(entry.toLowerCase()) :
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) {
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partialChars &&
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
                  foundPos + entry.length) + "</li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ?
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || { });
  }
});

// AJAX in-place editor and collection editor
// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).

// Use this if you notice weird scrolling problems on some browsers,
// the DOM might be a bit confused when this gets called so do this
// waits 1 ms (with setTimeout) until it does the activation
Field.scrollFreeActivate = function(field) {
  setTimeout(function() {
    Field.activate(field);
  }, 1);
};

Ajax.InPlaceEditor = Class.create({
  initialize: function(element, url, options) {
    this.url = url;
    this.element = element = $(element);
    this.prepareOptions();
    this._controls = { };
    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
    Object.extend(this.options, options || { });
    if (!this.options.formId && this.element.id) {
      this.options.formId = this.element.id + '-inplaceeditor';
      if ($(this.options.formId))
        this.options.formId = '';
    }
    if (this.options.externalControl)
      this.options.externalControl = $(this.options.externalControl);
    if (!this.options.externalControl)
      this.options.externalControlOnly = false;
    this._originalBackground = this.element.getStyle('background-color') || 'transparent';
    this.element.title = this.options.clickToEditText;
    this._boundCancelHandler = this.handleFormCancellation.bind(this);
    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
    this._boundFailureHandler = this.handleAJAXFailure.bind(this);
    this._boundSubmitHandler = this.handleFormSubmission.bind(this);
    this._boundWrapperHandler = this.wrapUp.bind(this);
    this.registerListeners();
  },
  checkForEscapeOrReturn: function(e) {
    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
    if (Event.KEY_ESC == e.keyCode)
      this.handleFormCancellation(e);
    else if (Event.KEY_RETURN == e.keyCode)
      this.handleFormSubmission(e);
  },
  createControl: function(mode, handler, extraClasses) {
    var control = this.options[mode + 'Control'];
    var text = this.options[mode + 'Text'];
    if ('button' == control) {
      var btn = document.createElement('input');
      btn.type = 'submit';
      btn.value = text;
      btn.className = 'editor_' + mode + '_button';
      if ('cancel' == mode)
        btn.onclick = this._boundCancelHandler;
      this._form.appendChild(btn);
      this._controls[mode] = btn;
    } else if ('link' == control) {
      var link = document.createElement('a');
      link.href = '#';
      link.appendChild(document.createTextNode(text));
      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
      link.className = 'editor_' + mode + '_link';
      if (extraClasses)
        link.className += ' ' + extraClasses;
      this._form.appendChild(link);
      this._controls[mode] = link;
    }
  },
  createEditField: function() {
    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
    var fld;
    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
      fld = document.createElement('input');
      fld.type = 'text';
      var size = this.options.size || this.options.cols || 0;
      if (0 < size) fld.size = size;
    } else {
      fld = document.createElement('textarea');
      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
      fld.cols = this.options.cols || 40;
    }
    fld.name = this.options.paramName;
    fld.value = text; // No HTML breaks conversion anymore
    fld.className = 'editor_field';
    if (this.options.submitOnBlur)
      fld.onblur = this._boundSubmitHandler;
    this._controls.editor = fld;
    if (this.options.loadTextURL)
      this.loadExternalText();
    this._form.appendChild(this._controls.editor);
  },
  createForm: function() {
    var ipe = this;
    function addText(mode, condition) {
      var text = ipe.options['text' + mode + 'Controls'];
      if (!text || condition === false) return;
      ipe._form.appendChild(document.createTextNode(text));
    };
    this._form = $(document.createElement('form'));
    this._form.id = this.options.formId;
    this._form.addClassName(this.options.formClassName);
    this._form.onsubmit = this._boundSubmitHandler;
    this.createEditField();
    if ('textarea' == this._controls.editor.tagName.toLowerCase())
      this._form.appendChild(document.createElement('br'));
    if (this.options.onFormCustomization)
      this.options.onFormCustomization(this, this._form);
    addText('Before', this.options.okControl || this.options.cancelControl);
    this.createControl('ok', this._boundSubmitHandler);
    addText('Between', this.options.okControl && this.options.cancelControl);
    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
    addText('After', this.options.okControl || this.options.cancelControl);
  },
  destroy: function() {
    if (this._oldInnerHTML)
      this.element.innerHTML = this._oldInnerHTML;
    this.leaveEditMode();
    this.unregisterListeners();
  },
  enterEditMode: function(e) {
    if (this._saving || this._editing) return;
    this._editing = true;
    this.triggerCallback('onEnterEditMode');
    if (this.options.externalControl)
      this.options.externalControl.hide();
    this.element.hide();
    this.createForm();
    this.element.parentNode.insertBefore(this._form, this.element);
    if (!this.options.loadTextURL)
      this.postProcessEditField();
    if (e) Event.stop(e);
  },
  enterHover: function(e) {
    if (this.options.hoverClassName)
      this.element.addClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onEnterHover');
  },
  getText: function() {
    return this.element.innerHTML.unescapeHTML();
  },
  handleAJAXFailure: function(transport) {
    this.triggerCallback('onFailure', transport);
    if (this._oldInnerHTML) {
      this.element.innerHTML = this._oldInnerHTML;
      this._oldInnerHTML = null;
    }
  },
  handleFormCancellation: function(e) {
    this.wrapUp();
    if (e) Event.stop(e);
  },
  handleFormSubmission: function(e) {
    var form = this._form;
    var value = $F(this._controls.editor);
    this.prepareSubmission();
    var params = this.options.callback(form, value) || '';
    if (Object.isString(params))
      params = params.toQueryParams();
    params.editorId = this.element.id;
    if (this.options.htmlResponse) {
      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Updater({ success: this.element }, this.url, options);
    } else {
      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Request(this.url, options);
    }
    if (e) Event.stop(e);
  },
  leaveEditMode: function() {
    this.element.removeClassName(this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
    if (this.options.externalControl)
      this.options.externalControl.show();
    this._saving = false;
    this._editing = false;
    this._oldInnerHTML = null;
    this.triggerCallback('onLeaveEditMode');
  },
  leaveHover: function(e) {
    if (this.options.hoverClassName)
      this.element.removeClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onLeaveHover');
  },
  loadExternalText: function() {
    this._form.addClassName(this.options.loadingClassName);
    this._controls.editor.disabled = true;
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._form.removeClassName(this.options.loadingClassName);
        var text = transport.responseText;
        if (this.options.stripLoadedTextTags)
          text = text.stripTags();
        this._controls.editor.value = text;
        this._controls.editor.disabled = false;
        this.postProcessEditField();
      }.bind(this),
      onFailure: this._boundFailureHandler
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },
  postProcessEditField: function() {
    var fpc = this.options.fieldPostCreation;
    if (fpc)
      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
  },
  prepareOptions: function() {
    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
    [this._extraDefaultOptions].flatten().compact().each(function(defs) {
      Object.extend(this.options, defs);
    }.bind(this));
  },
  prepareSubmission: function() {
    this._saving = true;
    this.removeForm();
    this.leaveHover();
    this.showSaving();
  },
  registerListeners: function() {
    this._listeners = { };
    var listener;
    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
      listener = this[pair.value].bind(this);
      this._listeners[pair.key] = listener;
      if (!this.options.externalControlOnly)
        this.element.observe(pair.key, listener);
      if (this.options.externalControl)
        this.options.externalControl.observe(pair.key, listener);
    }.bind(this));
  },
  removeForm: function() {
    if (!this._form) return;
    this._form.remove();
    this._form = null;
    this._controls = { };
  },
  showSaving: function() {
    this._oldInnerHTML = this.element.innerHTML;
    this.element.innerHTML = this.options.savingText;
    this.element.addClassName(this.options.savingClassName);
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
  },
  triggerCallback: function(cbName, arg) {
    if ('function' == typeof this.options[cbName]) {
      this.options[cbName](this, arg);
    }
  },
  unregisterListeners: function() {
    $H(this._listeners).each(function(pair) {
      if (!this.options.externalControlOnly)
        this.element.stopObserving(pair.key, pair.value);
      if (this.options.externalControl)
        this.options.externalControl.stopObserving(pair.key, pair.value);
    }.bind(this));
  },
  wrapUp: function(transport) {
    this.leaveEditMode();
    // Can't use triggerCallback due to backward compatibility: requires
    // binding + direct element
    this._boundComplete(transport, this.element);
  }
});

Object.extend(Ajax.InPlaceEditor.prototype, {
  dispose: Ajax.InPlaceEditor.prototype.destroy
});

Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
  initialize: function($super, element, url, options) {
    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
    $super(element, url, options);
  },

  createEditField: function() {
    var list = document.createElement('select');
    list.name = this.options.paramName;
    list.size = 1;
    this._controls.editor = list;
    this._collection = this.options.collection || [];
    if (this.options.loadCollectionURL)
      this.loadCollection();
    else
      this.checkForExternalText();
    this._form.appendChild(this._controls.editor);
  },

  loadCollection: function() {
    this._form.addClassName(this.options.loadingClassName);
    this.showLoadingText(this.options.loadingCollectionText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        var js = transport.responseText.strip();
        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
          throw('Server returned an invalid collection representation.');
        this._collection = eval(js);
        this.checkForExternalText();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadCollectionURL, options);
  },

  showLoadingText: function(text) {
    this._controls.editor.disabled = true;
    var tempOption = this._controls.editor.firstChild;
    if (!tempOption) {
      tempOption = document.createElement('option');
      tempOption.value = '';
      this._controls.editor.appendChild(tempOption);
      tempOption.selected = true;
    }
    tempOption.update((text || '').stripScripts().stripTags());
  },

  checkForExternalText: function() {
    this._text = this.getText();
    if (this.options.loadTextURL)
      this.loadExternalText();
    else
      this.buildOptionList();
  },

  loadExternalText: function() {
    this.showLoadingText(this.options.loadingText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._text = transport.responseText.strip();
        this.buildOptionList();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },

  buildOptionList: function() {
    this._form.removeClassName(this.options.loadingClassName);
    this._collection = this._collection.map(function(entry) {
      return 2 === entry.length ? entry : [entry, entry].flatten();
    });
    var marker = ('value' in this.options) ? this.options.value : this._text;
    var textFound = this._collection.any(function(entry) {
      return entry[0] == marker;
    }.bind(this));
    this._controls.editor.update('');
    var option;
    this._collection.each(function(entry, index) {
      option = document.createElement('option');
      option.value = entry[0];
      option.selected = textFound ? entry[0] == marker : 0 == index;
      option.appendChild(document.createTextNode(entry[1]));
      this._controls.editor.appendChild(option);
    }.bind(this));
    this._controls.editor.disabled = false;
    Field.scrollFreeActivate(this._controls.editor);
  }
});

//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
//**** This only  exists for a while,  in order to  let ****
//**** users adapt to  the new API.  Read up on the new ****
//**** API and convert your code to it ASAP!            ****

Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
  if (!options) return;
  function fallback(name, expr) {
    if (name in options || expr === undefined) return;
    options[name] = expr;
  };
  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
    options.cancelLink == options.cancelButton == false ? false : undefined)));
  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
    options.okLink == options.okButton == false ? false : undefined)));
  fallback('highlightColor', options.highlightcolor);
  fallback('highlightEndColor', options.highlightendcolor);
};

Object.extend(Ajax.InPlaceEditor, {
  DefaultOptions: {
    ajaxOptions: { },
    autoRows: 3,                                // Use when multi-line w/ rows == 1
    cancelControl: 'link',                      // 'link'|'button'|false
    cancelText: 'cancel',
    clickToEditText: 'Click to edit',
    externalControl: null,                      // id|elt
    externalControlOnly: false,
    fieldPostCreation: 'activate',              // 'activate'|'focus'|false
    formClassName: 'inplaceeditor-form',
    formId: null,                               // id|elt
    highlightColor: '#ffff99',
    highlightEndColor: '#ffffff',
    hoverClassName: '',
    htmlResponse: true,
    loadingClassName: 'inplaceeditor-loading',
    loadingText: 'Loading...',
    okControl: 'button',                        // 'link'|'button'|false
    okText: 'ok',
    paramName: 'value',
    rows: 1,                                    // If 1 and multi-line, uses autoRows
    savingClassName: 'inplaceeditor-saving',
    savingText: 'Saving...',
    size: 0,
    stripLoadedTextTags: false,
    submitOnBlur: false,
    textAfterControls: '',
    textBeforeControls: '',
    textBetweenControls: ''
  },
  DefaultCallbacks: {
    callback: function(form) {
      return Form.serialize(form);
    },
    onComplete: function(transport, element) {
      // For backward compatibility, this one is bound to the IPE, and passes
      // the element directly.  It was too often customized, so we don't break it.
      new Effect.Highlight(element, {
        startcolor: this.options.highlightColor, keepBackgroundImage: true });
    },
    onEnterEditMode: null,
    onEnterHover: function(ipe) {
      ipe.element.style.backgroundColor = ipe.options.highlightColor;
      if (ipe._effect)
        ipe._effect.cancel();
    },
    onFailure: function(transport, ipe) {
      alert('Error communication with the server: ' + transport.responseText.stripTags());
    },
    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
    onLeaveEditMode: null,
    onLeaveHover: function(ipe) {
      ipe._effect = new Effect.Highlight(ipe.element, {
        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
        restorecolor: ipe._originalBackground, keepBackgroundImage: true
      });
    }
  },
  Listeners: {
    click: 'enterEditMode',
    keydown: 'checkForEscapeOrReturn',
    mouseover: 'enterHover',
    mouseout: 'leaveHover'
  }
});

Ajax.InPlaceCollectionEditor.DefaultOptions = {
  loadingCollectionText: 'Loading options...'
};

// Delayed observer, like Form.Element.Observer,
// but waits for delay after last key input
// Ideal for live-search fields

Form.Element.DelayedObserver = Class.create({
  initialize: function(element, delay, callback) {
    this.delay     = delay || 0.5;
    this.element   = $(element);
    this.callback  = callback;
    this.timer     = null;
    this.lastValue = $F(this.element);
    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
  },
  delayedListener: function(event) {
    if(this.lastValue == $F(this.element)) return;
    if(this.timer) clearTimeout(this.timer);
    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
    this.lastValue = $F(this.element);
  },
  onTimerEvent: function() {
    this.timer = null;
    this.callback(this.element, $F(this.element));
  }
});
// script.aculo.us slider.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Marty Haught, Thomas Fuchs
//
// 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/

if (!Control) var Control = { };

// options:
//  axis: 'vertical', or 'horizontal' (default)
//
// callbacks:
//  onChange(value)
//  onSlide(value)
Control.Slider = Class.create({
  initialize: function(handle, track, options) {
    var slider = this;

    if (Object.isArray(handle)) {
      this.handles = handle.collect( function(e) { return $(e) });
    } else {
      this.handles = [$(handle)];
    }

    this.track   = $(track);
    this.options = options || { };

    this.axis      = this.options.axis || 'horizontal';
    this.increment = this.options.increment || 1;
    this.step      = parseInt(this.options.step || '1');
    this.range     = this.options.range || $R(0,1);

    this.value     = 0; // assure backwards compat
    this.values    = this.handles.map( function() { return 0 });
    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
    this.options.startSpan = $(this.options.startSpan || null);
    this.options.endSpan   = $(this.options.endSpan || null);

    this.restricted = this.options.restricted || false;

    this.maximum   = this.options.maximum || this.range.end;
    this.minimum   = this.options.minimum || this.range.start;

    // Will be used to align the handle onto the track, if necessary
    this.alignX = parseInt(this.options.alignX || '0');
    this.alignY = parseInt(this.options.alignY || '0');

    this.trackLength = this.maximumOffset() - this.minimumOffset();

    this.handleLength = this.isVertical() ?
      (this.handles[0].offsetHeight != 0 ?
        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
        this.handles[0].style.width.replace(/px$/,""));

    this.active   = false;
    this.dragging = false;
    this.disabled = false;

    if (this.options.disabled) this.setDisabled();

    // Allowed values array
    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
    if (this.allowedValues) {
      this.minimum = this.allowedValues.min();
      this.maximum = this.allowedValues.max();
    }

    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
    this.eventMouseMove = this.update.bindAsEventListener(this);

    // Initialize handles in reverse (make sure first handle is active)
    this.handles.each( function(h,i) {
      i = slider.handles.length-1-i;
      slider.setValue(parseFloat(
        (Object.isArray(slider.options.sliderValue) ?
          slider.options.sliderValue[i] : slider.options.sliderValue) ||
         slider.range.start), i);
      h.makePositioned().observe("mousedown", slider.eventMouseDown);
    });

    this.track.observe("mousedown", this.eventMouseDown);
    document.observe("mouseup", this.eventMouseUp);
    $(this.track.parentNode.parentNode).observe("mousemove", this.eventMouseMove);


    this.initialized = true;
  },
  dispose: function() {
    var slider = this;
    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
    Event.stopObserving(document, "mouseup", this.eventMouseUp);
    Event.stopObserving(this.track.parentNode.parentNode, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
    this.track.parentNode.className = this.track.parentNode.className + ' disabled';
  },
  setEnabled: function(){
    this.disabled = false;
  },
  getNearestValue: function(value){
    if (this.allowedValues){
      if (value >= this.allowedValues.max()) return(this.allowedValues.max());
      if (value <= this.allowedValues.min()) return(this.allowedValues.min());

      var offset = Math.abs(this.allowedValues[0] - value);
      var newValue = this.allowedValues[0];
      this.allowedValues.each( function(v) {
        var currentOffset = Math.abs(v - value);
        if (currentOffset <= offset){
          newValue = v;
          offset = currentOffset;
        }
      });
      return newValue;
    }
    if (value > this.range.end) return this.range.end;
    if (value < this.range.start) return this.range.start;
    return value;
  },
  setValue: function(sliderValue, handleIdx){
    if (!this.active) {
      this.activeHandleIdx = handleIdx || 0;
      this.activeHandle    = this.handles[this.activeHandleIdx];
      this.updateStyles();
    }
    handleIdx = handleIdx || this.activeHandleIdx || 0;
    if (this.initialized && this.restricted) {
      if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
        sliderValue = this.values[handleIdx-1];
      if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
        sliderValue = this.values[handleIdx+1];
    }
    sliderValue = this.getNearestValue(sliderValue);
    this.values[handleIdx] = sliderValue;
    this.value = this.values[0]; // assure backwards compat

    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
      this.translateToPx(sliderValue);

    this.drawSpans();
    if (!this.dragging || !this.event) this.updateFinished();
  },
  setValueBy: function(delta, handleIdx) {
    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
      handleIdx || this.activeHandleIdx || 0);
  },
  translateToPx: function(value) {
    return Math.round(
      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
      (value - this.range.start)) + "px";
  },
  translateToValue: function(offset) {
    return ((offset/(this.trackLength-this.handleLength) *
      (this.range.end-this.range.start)) + this.range.start);
  },
  getRange: function(range) {
    var v = this.values.sortBy(Prototype.K);
    range = range || 0;
    return $R(v[range],v[range+1]);
  },
  minimumOffset: function(){
    return(this.isVertical() ? this.alignY : this.alignX);
  },
  maximumOffset: function(){
    return(this.isVertical() ?
      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
        this.track.style.height.replace(/px$/,"")) - this.alignY :
      (this.track.offsetWidth != 0 ? this.track.offsetWidth :
        this.track.style.width.replace(/px$/,"")) - this.alignX);
  },
  isVertical:  function(){
    return (this.axis == 'vertical');
  },
  drawSpans: function() {
    var slider = this;
    if (this.spans)
      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
    if (this.options.startSpan)
      this.setSpan(this.options.startSpan,
        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
    if (this.options.endSpan)
      this.setSpan(this.options.endSpan,
        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
  },
  setSpan: function(span, range) {
    if (this.isVertical()) {
      span.style.top = this.translateToPx(range.start);
      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
    } else {
      span.style.left = this.translateToPx(range.start);
      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
    }
  },
  updateStyles: function() {
    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
    Element.addClassName(this.activeHandle, 'selected');
  },
  startDrag: function(event) {
    if (Event.isLeftClick(event)) {
      if (!this.disabled){
        this.active = true;

        var handle = Event.element(event);
        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
        var track = handle;
        if (track==this.track) {
          var offsets  = Position.cumulativeOffset(this.track);
          this.event = event;
          this.setValue(this.translateToValue(
           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
          ));
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        } else {
          // find the handle (prevents issues with Safari)
          while((this.handles.indexOf(handle) == -1) && handle.parentNode)
            handle = handle.parentNode;

          if (this.handles.indexOf(handle)!=-1) {
            this.activeHandle    = handle;
            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
            this.updateStyles();

            var offsets  = Position.cumulativeOffset(this.activeHandle);
            this.offsetX = (pointer[0] - offsets[0]);
            this.offsetY = (pointer[1] - offsets[1]);
          }
        }
      }
      Event.stop(event);
    }
  },
  update: function(event) {
   if (this.active) {
      if (!this.dragging) this.dragging = true;
      this.draw(event);
      if (Prototype.Browser.WebKit) window.scrollBy(0,0);
      Event.stop(event);
   }
  },
  draw: function(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var offsets = Position.cumulativeOffset(this.track);
    pointer[0] -= this.offsetX + offsets[0];
    pointer[1] -= this.offsetY + offsets[1];
    this.event = event;
    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
    if (this.initialized && this.options.onSlide)
      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
  },
  endDrag: function(event) {
    if (this.active && this.dragging) {
      this.finishDrag(event, true);
      Event.stop(event);
    }
    this.active = false;
    this.dragging = false;
  },
  finishDrag: function(event, success) {
    this.active = false;
    this.dragging = false;
    this.updateFinished();
  },
  updateFinished: function() {
    if (this.initialized && this.options.onChange)
      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
    this.event = null;
  }
});
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
function popWin(url,win,para) {
    var win = window.open(url,win,para);
    win.focus();
}

function setLocation(url){
    window.location.href = url;
}

function setPLocation(url, setFocus){
    if( setFocus ) {
        window.opener.focus();
    }
    window.opener.location.href = url;
}

function setLanguageCode(code, fromCode){
    //TODO: javascript cookies have different domain and path than php cookies
    var href = window.location.href;
    var after = '', dash;
    if (dash = href.match(/\#(.*)$/)) {
        href = href.replace(/\#(.*)$/, '');
        after = dash[0];
    }

    if (href.match(/[?]/)) {
        var re = /([?&]store=)[a-z0-9_]*/;
        if (href.match(re)) {
            href = href.replace(re, '$1'+code);
        } else {
            href += '&store='+code;
        }

        var re = /([?&]from_store=)[a-z0-9_]*/;
        if (href.match(re)) {
            href = href.replace(re, '');
        }
    } else {
        href += '?store='+code;
    }
    if (typeof(fromCode) != 'undefined') {
        href += '&from_store='+fromCode;
    }
    href += after;

    setLocation(href);
}

/**
 * Add classes to specified elements.
 * Supported classes are: 'odd', 'even', 'first', 'last'
 *
 * @param elements - array of elements to be decorated
 * [@param decorateParams] - array of classes to be set. If omitted, all available will be used
 */
function decorateGeneric(elements, decorateParams)
{
    var allSupportedParams = ['odd', 'even', 'first', 'last'];
    var _decorateParams = {};
    var total = elements.length;

    if (total) {
        // determine params called
        if (typeof(decorateParams) == 'undefined') {
            decorateParams = allSupportedParams;
        }
        if (!decorateParams.length) {
            return;
        }
        for (var k in allSupportedParams) {
            _decorateParams[allSupportedParams[k]] = false;
        }
        for (var k in decorateParams) {
            _decorateParams[decorateParams[k]] = true;
        }

        // decorate elements
        // elements[0].addClassName('first'); // will cause bug in IE (#5587)
        if (_decorateParams.first) {
            Element.addClassName(elements[0], 'first');
        }
        if (_decorateParams.last) {
            Element.addClassName(elements[total-1], 'last');
        }
        for (var i = 0; i < total; i++) {
            if ((i + 1) % 2 == 0) {
                if (_decorateParams.even) {
                    Element.addClassName(elements[i], 'even');
                }
            }
            else {
                if (_decorateParams.odd) {
                    Element.addClassName(elements[i], 'odd');
                }
            }
        }
    }
}

/**
 * Decorate table rows and cells, tbody etc
 * @see decorateGeneric()
 */
function decorateTable(table, options) {
    var table = $(table);
    if (table) {
        // set default options
        var _options = {
            'tbody'    : false,
            'tbody tr' : ['odd', 'even', 'first', 'last'],
            'thead tr' : ['first', 'last'],
            'tfoot tr' : ['first', 'last'],
            'tr td'    : ['last']
        };
        // overload options
        if (typeof(options) != 'undefined') {
            for (var k in options) {
                _options[k] = options[k];
            }
        }
        // decorate
        if (_options['tbody']) {
            decorateGeneric(table.select('tbody'), _options['tbody']);
        }
        if (_options['tbody tr']) {
            decorateGeneric(table.select('tbody tr'), _options['tbody tr']);
        }
        if (_options['thead tr']) {
            decorateGeneric(table.select('thead tr'), _options['thead tr']);
        }
        if (_options['tfoot tr']) {
            decorateGeneric(table.select('tfoot tr'), _options['tfoot tr']);
        }
        if (_options['tr td']) {
            var allRows = table.select('tr');
            if (allRows.length) {
                for (var i = 0; i < allRows.length; i++) {
                    decorateGeneric(allRows[i].getElementsByTagName('TD'), _options['tr td']);
                }
            }
        }
    }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateList(list, nonRecursive) {
    if ($(list)) {
        if (typeof(nonRecursive) == 'undefined') {
            var items = $(list).select('li')
        }
        else {
            var items = $(list).childElements();
        }
        decorateGeneric(items, ['odd', 'even', 'last']);
    }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateDataList(list) {
    list = $(list);
    if (list) {
        decorateGeneric(list.select('dt'), ['odd', 'even', 'last']);
        decorateGeneric(list.select('dd'), ['odd', 'even', 'last']);
    }
}

/**
 * Parse SID and produces the correct URL
 */
function parseSidUrl(baseUrl, urlExt) {
    sidPos = baseUrl.indexOf('/?SID=');
    sid = '';
    urlExt = (urlExt != undefined) ? urlExt : '';

    if(sidPos > -1) {
        sid = '?' + baseUrl.substring(sidPos + 2);
        baseUrl = baseUrl.substring(0, sidPos + 1);
    }

    return baseUrl+urlExt+sid;
}

/**
 * Formats currency using patern
 * format - JSON (pattern, decimal, decimalsDelimeter, groupsDelimeter)
 * showPlus - true (always show '+'or '-'),
 *      false (never show '-' even if number is negative)
 *      null (show '-' if number is negative)
 */

function formatCurrency(price, format, showPlus){
    precision = isNaN(format.precision = Math.abs(format.precision)) ? 2 : format.precision;
    requiredPrecision = isNaN(format.requiredPrecision = Math.abs(format.requiredPrecision)) ? 2 : format.requiredPrecision;

    //precision = (precision > requiredPrecision) ? precision : requiredPrecision;
    //for now we don't need this difference so precision is requiredPrecision
    precision = requiredPrecision;

    integerRequired = isNaN(format.integerRequired = Math.abs(format.integerRequired)) ? 1 : format.integerRequired;

    decimalSymbol = format.decimalSymbol == undefined ? "," : format.decimalSymbol;
    groupSymbol = format.groupSymbol == undefined ? "." : format.groupSymbol;
    groupLength = format.groupLength == undefined ? 3 : format.groupLength;

    if (showPlus == undefined || showPlus == true) {
        s = price < 0 ? "-" : ( showPlus ? "+" : "");
    } else if (showPlus == false) {
        s = '';
    }

    i = parseInt(price = Math.abs(+price || 0).toFixed(precision)) + "";
    pad = (i.length < integerRequired) ? (integerRequired - i.length) : 0;
    while (pad) { i = '0' + i; pad--; }

    j = (j = i.length) > groupLength ? j % groupLength : 0;
    re = new RegExp("(\\d{" + groupLength + "})(?=\\d)", "g");

    /**
     * replace(/-/, 0) is only for fixing Safari bug which appears
     * when Math.abs(0).toFixed() executed on "0" number.
     * Result is "0.-0" :(
     */
    r = (j ? i.substr(0, j) + groupSymbol : "") + i.substr(j).replace(re, "$1" + groupSymbol) + (precision ? decimalSymbol + Math.abs(price - i).toFixed(precision).replace(/-/, 0).slice(2) : "")

    if (format.pattern.indexOf('{sign}') == -1) {
        pattern = s + format.pattern;
    } else {
        pattern = format.pattern.replace('{sign}', s);
    }

    return pattern.replace('%s', r).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};

function expandDetails(el, childClass) {
    if (Element.hasClassName(el,'show-details')) {
        $$(childClass).each(function(item){item.hide()});
        Element.removeClassName(el,'show-details');
    }
    else {
        $$(childClass).each(function(item){item.show()});
        Element.addClassName(el,'show-details');
    }
}

// Version 1.0
var isIE = navigator.appVersion.match(/MSIE/) == "MSIE";

if (!window.Varien)
    var Varien = new Object();

Varien.showLoading = function(){
    Element.show('loading-process');
}
Varien.hideLoading = function(){
    Element.hide('loading-process');
}
Varien.GlobalHandlers = {
    onCreate: function() {
        Varien.showLoading();
    },

    onComplete: function() {
        if(Ajax.activeRequestCount == 0) {
            Varien.hideLoading();
        }
    }
};

Ajax.Responders.register(Varien.GlobalHandlers);

/**
 * Quick Search form client model
 */
Varien.searchForm = Class.create();
Varien.searchForm.prototype = {
    initialize : function(form, field, emptyText){
        this.form   = $(form);
        this.field  = $(field);
        this.emptyText = emptyText;

        Event.observe(this.form,  'submit', this.submit.bind(this));
        Event.observe(this.field, 'focus', this.focus.bind(this));
        Event.observe(this.field, 'blur', this.blur.bind(this));
        this.blur();
    },

    submit : function(event){
        if (this.field.value == this.emptyText || this.field.value == ''){
            Event.stop(event);
            return false;
        }
        return true;
    },

    focus : function(event){
        if(this.field.value==this.emptyText){
            this.field.value='';
        }

    },

    blur : function(event){
        if(this.field.value==''){
            this.field.value=this.emptyText;
        }
    },

    initAutocomplete : function(url, destinationElement){
        new Ajax.Autocompleter(
            this.field,
            destinationElement,
            url,
            {
                paramName: this.field.name,
                method: 'get',
                minChars: 2,
                updateElement: this._selectAutocompleteItem.bind(this),
                onShow : function(element, update) {
                    if(!update.style.position || update.style.position=='absolute') {
                        update.style.position = 'absolute';
                        Position.clone(element, update, {
                            setHeight: false,
                            offsetTop: element.offsetHeight
                        });
                    }
                    Effect.Appear(update,{duration:0});
                }

            }
        );
    },

    _selectAutocompleteItem : function(element){
        if(element.title){
            this.field.value = element.title;
        }
        this.form.submit();
    }
}

Varien.Tabs = Class.create();
Varien.Tabs.prototype = {
  initialize: function(selector) {
    var self=this;
    $$(selector+' a').each(this.initTab.bind(this));
  },

  initTab: function(el) {
      el.href = 'javascript:void(0)';
      if ($(el.parentNode).hasClassName('active')) {
        this.showContent(el);
      }
      el.observe('click', this.showContent.bind(this, el));
  },

  showContent: function(a) {
    var li = $(a.parentNode), ul = $(li.parentNode);
    ul.getElementsBySelector('li', 'ol').each(function(el){
      var contents = $(el.id+'_contents');
      if (el==li) {
        el.addClassName('active');
        contents.show();
      } else {
        el.removeClassName('active');
        contents.hide();
      }
    });
  }
}

Varien.DateElement = Class.create();
Varien.DateElement.prototype = {
    initialize: function(type, content, required, format) {
        if (type == 'id') {
            // id prefix
            this.day    = $(content + 'day');
            this.month  = $(content + 'month');
            this.year   = $(content + 'year');
            this.full   = $(content + 'full');
            this.advice = $(content + 'advice');
        } else if (type == 'container') {
            // content must be container with data
            this.day    = content.day;
            this.month  = content.month;
            this.year   = content.year;
            this.full   = content.full;
            this.advice = content.advice;
        } else {
            return;
        }

        this.required = required;
        this.format   = format;
        
        this.day.addClassName('validate-custom');
        this.day.validate = this.validate.bind(this);
        this.month.addClassName('validate-custom');
        this.month.validate = this.validate.bind(this);
        this.year.addClassName('validate-custom');
        this.year.validate = this.validate.bind(this);

        this.year.setAttribute('autocomplete','off');

        this.advice.hide();
    },
    validate: function() {
        var error = false, day = parseInt(this.day.value) || 0, month = parseInt(this.month.value) || 0, year = parseInt(this.year.value) || 0;
        if (!day && !month && !year) {
            if (this.required) {
                error = 'This date is a required value.';
            } else {
                this.full.value = '';
            }
        } else if (!day || !month || !year) {
            error = 'Please enter a valid full date.';
        } else {
            var date = new Date, curyear = date.getFullYear(), countDaysInMonth = 0, errorType = null;
            date.setYear(year); date.setMonth(month-1); date.setDate(32);
            countDaysInMonth = 32 - date.getDate();
            if(!countDaysInMonth || countDaysInMonth>31) countDaysInMonth = 31;
             
            if (day<1 || day>countDaysInMonth) {
                errorType = 'day';
                error = 'Please enter a valid day (1-%d).';
            } else if (month<1 || month>12) {
                errorType = 'month';
                error = 'Please enter a valid month (1-12).';
            } else if (year<1900 || year>curyear) {
                errorType = 'year';
                error = 'Please enter a valid year (1900-%d).';
            } else {
                if(day % 10 == day) this.day.value = '0'+day;
                if(month % 10 == month) this.month.value = '0'+month;
                this.full.value = this.format.replace(/%[mb]/i, this.month.value).replace(/%[de]/i, this.day.value).replace(/%y/i, this.year.value);
                var testFull = this.month.value + '/' + this.day.value + '/'+ this.year.value;
                var test = new Date(testFull);
                if (isNaN(test)) {
                    error = 'Please enter a valid date.';
                }
            }
        }

        if (error !== false) {
            try {
                error = Translator.translate(error);
            }
            catch (e) {}
            this.advice.innerHTML = error.replace('%d', errorType == 'day' ? countDaysInMonth : curyear);
            this.advice.show();
            return false;
        }
        
        // fixing elements class
        this.day.removeClassName('validation-failed');
        this.month.removeClassName('validation-failed');
        this.year.removeClassName('validation-failed');
        
        this.advice.hide();
        return true;
    }
};

Varien.DOB = Class.create();
Varien.DOB.prototype = {
    initialize: function(selector, required, format) {
        var el = $$(selector)[0];
        var container       = {};
        container.day       = Element.select(el, '.dob-day input')[0];
        container.month     = Element.select(el, '.dob-month input')[0];
        container.year      = Element.select(el, '.dob-year input')[0];
        container.full      = Element.select(el, '.dob-full input')[0];
        container.advice    = Element.select(el, '.validation-advice')[0];
        
        new Varien.DateElement('container', container, required, format);
    }
};

Varien.FileElement = Class.create();
Varien.FileElement.prototype = {
    initialize: function (id) {
        this.fileElement = $(id);
        this.hiddenElement = $(id + '_value');
        
        this.fileElement.observe('change', this.selectFile.bind(this));
    },
    selectFile: function(event) {
        this.hiddenElement.value = this.fileElement.getValue();
    }
};

Validation.addAllThese([
    ['validate-custom', ' ', function(v,elm) {
        return elm.validate();
    }]
]);

function truncateOptions() {
    $$('.truncated').each(function(element){
        Event.observe(element, 'mouseover', function(){
            if (element.down('div.truncated_full_value')) {
                element.down('div.truncated_full_value').addClassName('show')
            }
        });
        Event.observe(element, 'mouseout', function(){
            if (element.down('div.truncated_full_value')) {
                element.down('div.truncated_full_value').removeClassName('show')
            }
        });

    });
}
Event.observe(window, 'load', function(){
   truncateOptions();
});

Element.addMethods({
    getInnerText: function(element)
    {
        element = $(element);
        if(element.innerText && !Prototype.Browser.Opera) {
            return element.innerText
        }
        return element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ').strip();
    }
});

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

/**
 * Executes event handler on the element. Works with event handlers attached by Prototype,
 * in a browser-agnostic fashion.
 * @param element The element object
 * @param event Event name, like 'change'
 *
 * @example fireEvent($('my-input', 'click'));
 */
function fireEvent(element, event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
VarienForm = Class.create();
VarienForm.prototype = {
    initialize: function(formId, firstFieldFocus){
        this.form       = $(formId);
        if (!this.form) {
            return;
        }
        this.cache      = $A();
        this.currLoader = false;
        this.currDataIndex = false;
        this.validator  = new Validation(this.form);
        this.elementFocus   = this.elementOnFocus.bindAsEventListener(this);
        this.elementBlur    = this.elementOnBlur.bindAsEventListener(this);
        this.childLoader    = this.onChangeChildLoad.bindAsEventListener(this);
        this.highlightClass = 'highlight';
        this.extraChildParams = '';
        this.firstFieldFocus= firstFieldFocus || false;
        this.bindElements();
        if(this.firstFieldFocus){
            try{
                Form.Element.focus(Form.findFirstElement(this.form))
            }
            catch(e){}
        }
    },

    submit : function(url){
        if(this.validator && this.validator.validate()){
             this.form.submit();
        }
        return false;
    },

    bindElements:function (){
        var elements = Form.getElements(this.form);
        for (var row in elements) {
            if (elements[row].id) {
                Event.observe(elements[row],'focus',this.elementFocus);
                Event.observe(elements[row],'blur',this.elementBlur);
            }
        }
    },

    elementOnFocus: function(event){
        var element = Event.findElement(event, 'fieldset');
        if(element){
            Element.addClassName(element, this.highlightClass);
        }
    },

    elementOnBlur: function(event){
        var element = Event.findElement(event, 'fieldset');
        if(element){
            Element.removeClassName(element, this.highlightClass);
        }
    },

    setElementsRelation: function(parent, child, dataUrl, first){
        if (parent=$(parent)) {
            // TODO: array of relation and caching
            if (!this.cache[parent.id]){
                this.cache[parent.id] = $A();
                this.cache[parent.id]['child']     = child;
                this.cache[parent.id]['dataUrl']   = dataUrl;
                this.cache[parent.id]['data']      = $A();
                this.cache[parent.id]['first']      = first || false;
            }
            Event.observe(parent,'change',this.childLoader);
        }
    },

    onChangeChildLoad: function(event){
        element = Event.element(event);
        this.elementChildLoad(element);
    },

    elementChildLoad: function(element, callback){
        this.callback = callback || false;
        if (element.value) {
            this.currLoader = element.id;
            this.currDataIndex = element.value;
            if (this.cache[element.id]['data'][element.value]) {
                this.setDataToChild(this.cache[element.id]['data'][element.value]);
            }
            else{
                new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{
                        method: 'post',
                        parameters: {"parent":element.value},
                        onComplete: this.reloadChildren.bind(this)
                });
            }
        }
    },

    reloadChildren: function(transport){
        var data = eval('(' + transport.responseText + ')');
        this.cache[this.currLoader]['data'][this.currDataIndex] = data;
        this.setDataToChild(data);
    },

    setDataToChild: function(data){
        if (data.length) {
            var child = $(this.cache[this.currLoader]['child']);
            if (child){
                var html = '<select name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
                if(this.cache[this.currLoader]['first']){
                    html+= '<option value="">'+this.cache[this.currLoader]['first']+'</option>';
                }
                for (var i in data){
                    if(data[i].value) {
                        html+= '<option value="'+data[i].value+'"';
                        if(child.value && (child.value == data[i].value || child.value == data[i].label)){
                            html+= ' selected';
                        }
                        html+='>'+data[i].label+'</option>';
                    }
                }
                html+= '</select>';
                Element.insert(child, {before: html});
                Element.remove(child);
            }
        }
        else{
            var child = $(this.cache[this.currLoader]['child']);
            if (child){
                var html = '<input type="text" name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
                Element.insert(child, {before: html});
                Element.remove(child);
            }
        }

        this.bindElements();
        if (this.callback) {
            this.callback();
        }
    }
}

RegionUpdater = Class.create();
RegionUpdater.prototype = {
    initialize: function (countryEl, regionTextEl, regionSelectEl, regions, disableAction, zipEl)
    {
        this.countryEl = $(countryEl);
        this.regionTextEl = $(regionTextEl);
        this.regionSelectEl = $(regionSelectEl);
        this.zipEl = $(zipEl);
        this.regions = regions;

        this.disableAction = (typeof disableAction=='undefined') ? 'hide' : disableAction;
        this.zipOptions = (typeof zipOptions=='undefined') ? false : zipOptions;

        if (this.regionSelectEl.options.length<=1) {
            this.update();
        }

        Event.observe(this.countryEl, 'change', this.update.bind(this));
    },

    update: function()
    {
        if (this.regions[this.countryEl.value]) {
            var i, option, region, def;

            if (this.regionTextEl) {
                def = this.regionTextEl.value.toLowerCase();
                this.regionTextEl.value = '';
            }
            if (!def) {
                def = this.regionSelectEl.getAttribute('defaultValue');
            }

            this.regionSelectEl.options.length = 1;
            for (regionId in this.regions[this.countryEl.value]) {
                region = this.regions[this.countryEl.value][regionId];

                option = document.createElement('OPTION');
                option.value = regionId;
                option.text = region.name;

                if (this.regionSelectEl.options.add) {
                    this.regionSelectEl.options.add(option);
                } else {
                    this.regionSelectEl.appendChild(option);
                }

                if (regionId==def || region.name.toLowerCase()==def || region.code.toLowerCase()==def) {
                    this.regionSelectEl.value = regionId;
                }
            }

            if (this.disableAction=='hide') {
                if (this.regionTextEl) {
                    this.regionTextEl.style.display = 'none';
                }

                this.regionSelectEl.style.display = '';
            } else if (this.disableAction=='disable') {
                if (this.regionTextEl) {
                    this.regionTextEl.disabled = true;
                }
                this.regionSelectEl.disabled = false;
            }
            this.setMarkDisplay(this.regionSelectEl, true);
        } else {
            if (this.disableAction=='hide') {
                if (this.regionTextEl) {
                    this.regionTextEl.style.display = '';
                }
                this.regionSelectEl.style.display = 'none';
                Validation.reset(this.regionSelectEl);
            } else if (this.disableAction=='disable') {
                if (this.regionTextEl) {
                    this.regionTextEl.disabled = false;
                }
                this.regionSelectEl.disabled = true;
            } else if (this.disableAction=='nullify') {
                this.regionSelectEl.options.length = 1;
                this.regionSelectEl.value = '';
                this.regionSelectEl.selectedIndex = 0;
                this.lastCountryId = '';
            }
            this.setMarkDisplay(this.regionSelectEl, false);
        }

        // Make Zip and its label required/optional
        var zipUpdater = new ZipUpdater(this.countryEl.value, this.zipEl);
        zipUpdater.update();
    },

    setMarkDisplay: function(elem, display){
        elem = $(elem);
        var labelElement = elem.up(0).down('label > span.required') ||
                           elem.up(1).down('label > span.required') ||
                           elem.up(0).down('label.required > em') ||
                           elem.up(1).down('label.required > em');
        if(labelElement) {
            inputElement = labelElement.up().next('input');
            if (display) {
                labelElement.show();
                if (inputElement) {
                    inputElement.addClassName('required-entry');
                }
            } else {
                labelElement.hide();
                if (inputElement) {
                    inputElement.removeClassName('required-entry');
                }
            }
        }
    }
}

ZipUpdater = Class.create();
ZipUpdater.prototype = {
    initialize: function(country, zipElement)
    {
        this.country = country;
        this.zipElement = $(zipElement);
    },

    update: function()
    {
        // Country ISO 2-letter codes must be pre-defined
        if (typeof optionalZipCountries == 'undefined') {
            return false;
        }

        // Ajax-request and normal content load compatibility
        if (this.zipElement != undefined) {
            this._setPostcodeOptional();
        } else {
            Event.observe(window, "load", this._setPostcodeOptional.bind(this));
        }
    },

    _setPostcodeOptional: function()
    {
        this.zipElement = $(this.zipElement);
        if (this.zipElement == undefined) {
            return false;
        }

        // find label
        var label = $$('label[for="' + this.zipElement.id + '"]')[0];
        if (label != undefined) {
            var wildCard = label.down('em') || label.down('span.required');
        }

        // Make Zip and its label required/optional
        if (optionalZipCountries.indexOf(this.country) != -1) {
            while (this.zipElement.hasClassName('required-entry')) {
                this.zipElement.removeClassName('required-entry');
            }
            if (wildCard != undefined) {
                wildCard.hide();
            }
        } else {
            this.zipElement.addClassName('required-entry');
            if (wildCard != undefined) {
                wildCard.show();
            }
        }
    }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

/**
 * @classDescription simple Navigation with replacing old handlers
 * @param {String} id id of ul element with navigation lists
 * @param {Object} settings object with settings
 */
var mainNav = function() {

    var main = {
        obj_nav :   $(arguments[0]) || $("nav"),

        settings :  {
            show_delay      :   0,
            hide_delay      :   0,
            _ie6            :   /MSIE 6.+Win/.test(navigator.userAgent),
            _ie7            :   /MSIE 7.+Win/.test(navigator.userAgent)
        },

        init :  function(obj, level) {
            obj.lists = obj.childElements();
            obj.lists.each(function(el,ind){
                main.handlNavElement(el);
                if((main.settings._ie6 || main.settings._ie7) && level){
                    main.ieFixZIndex(el, ind, obj.lists.size());
                }
            });
            if(main.settings._ie6 && !level){
                document.execCommand("BackgroundImageCache", false, true);
            }
        },

        handlNavElement :   function(list) {
            if(list !== undefined){
                list.onmouseover = function(){
                    main.fireNavEvent(this,true);
                };
                list.onmouseout = function(){
                    main.fireNavEvent(this,false);
                };
                if(list.down("ul")){
                    main.init(list.down("ul"), true);
                }
            }
        },

        ieFixZIndex : function(el, i, l) {
            if(el.tagName.toString().toLowerCase().indexOf("iframe") == -1){
                el.style.zIndex = l - i;
            } else {
                el.onmouseover = "null";
                el.onmouseout = "null";
            }
        },

        fireNavEvent :  function(elm,ev) {
            if(ev){
                elm.addClassName("over");
                elm.down("a").addClassName("over");
                if (elm.childElements()[1]) {
                    main.show(elm.childElements()[1]);
                }
            } else {
                elm.removeClassName("over");
                elm.down("a").removeClassName("over");
                if (elm.childElements()[1]) {
                    main.hide(elm.childElements()[1]);
                }
            }
        },

        show : function (sub_elm) {
            if (sub_elm.hide_time_id) {
                clearTimeout(sub_elm.hide_time_id);
            }
            sub_elm.show_time_id = setTimeout(function() {
                if (!sub_elm.hasClassName("shown-sub")) {
                    sub_elm.addClassName("shown-sub");
                }
            }, main.settings.show_delay);
        },

        hide : function (sub_elm) {
            if (sub_elm.show_time_id) {
                clearTimeout(sub_elm.show_time_id);
            }
            sub_elm.hide_time_id = setTimeout(function(){
                if (sub_elm.hasClassName("shown-sub")) {
                    sub_elm.removeClassName("shown-sub");
                }
            }, main.settings.hide_delay);
        }

    };
    if (arguments[1]) {
        main.settings = Object.extend(main.settings, arguments[1]);
    }
    if (main.obj_nav) {
        main.init(main.obj_nav, false);
    }
};

document.observe("dom:loaded", function() {
    //run navigation without delays and with default id="#nav"
    //mainNav();

    //run navigation with delays
    mainNav("nav", {"show_delay":"100","hide_delay":"100"});
});

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

var Translate = Class.create();
Translate.prototype = {
    initialize: function(data){
        this.data = $H(data);
    },

    translate : function(){
        var args = arguments;
        var text = arguments[0];

        if(this.data.get(text)){
            return this.data.get(text);
        }
        return text;
    },
    add : function() {
        if (arguments.length > 1) {
            this.data.set(arguments[0], arguments[1]);
        } else if (typeof arguments[0] =='object') {
            $H(arguments[0]).each(function (pair){
                this.data.set(pair.key, pair.value);
            }.bind(this));
        }
    }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
// old school cookie functions grabbed off the web

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

Mage.Cookies = {};
Mage.Cookies.expires  = null;
Mage.Cookies.path     = '/';
Mage.Cookies.domain   = null;
Mage.Cookies.secure   = false;
Mage.Cookies.set = function(name, value){
     var argv = arguments;
     var argc = arguments.length;
     var expires = (argc > 2) ? argv[2] : Mage.Cookies.expires;
     var path = (argc > 3) ? argv[3] : Mage.Cookies.path;
     var domain = (argc > 4) ? argv[4] : Mage.Cookies.domain;
     var secure = (argc > 5) ? argv[5] : Mage.Cookies.secure;
     document.cookie = name + "=" + escape (value) +
       ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
       ((path == null) ? "" : ("; path=" + path)) +
       ((domain == null) ? "" : ("; domain=" + domain)) +
       ((secure == true) ? "; secure" : "");
};

Mage.Cookies.get = function(name){
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    var j = 0;
    while(i < clen){
        j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return Mage.Cookies.getCookieVal(j);
        i = document.cookie.indexOf(" ", i) + 1;
        if(i == 0)
            break;
    }
    return null;
};

Mage.Cookies.clear = function(name) {
  if(Mage.Cookies.get(name)){
    document.cookie = name + "=" +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
};

Mage.Cookies.getCookieVal = function(offset){
   var endstr = document.cookie.indexOf(";", offset);
   if(endstr == -1){
       endstr = document.cookie.length;
   }
   return unescape(document.cookie.substring(offset, endstr));
};

/**
 * aheadWorks Co.
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the EULA
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://ecommerce.aheadworks.com/LICENSE-M1.txt
 *
 * @category   AW
 * @package    AW_Onsale
 * @copyright  Copyright (c) 2009-2010 aheadWorks Co. (http://www.aheadworks.com)
 * @license    http://ecommerce.aheadworks.com/LICENSE-M1.txt
 */


AwOnSale = Class.create();
AwOnSale.prototype = {
    initialize: function(){
        this.helements = new Array();
        this.velements = new Array();
        document.observe("dom:loaded", onPageLoad);      
    },
    setVertPos: function(element, position){
        var eH = element.offsetHeight;
        var pH = element.parentNode.offsetHeight;
        var eT = 0;

        if (eH != pH){
            switch (position){
                case 'top':
                    eT = 0;
                    break;
                case 'middle':
                    eT = (pH - eH)/2;
                    break;
                case 'middle':
                    eT = pH - eH;
                    break;
                default:
                    eT = 0;
            }
        } else if (eH == pH) {
            eT = 0;
        }
        element.style.top = eT + 'px';

    },
    setHorPos: function(element, position){
        var eW = element.offsetWidth;
        var pW = element.parentNode.offsetWidth;
        var eL = 0;

        if (eW != pW){
            switch (position){
                case 'left':
                    eL = 0;
                    break;
                case 'center':
                    eL = (pW - eW)/2;
                    break;
                case 'right':
                    eL = pW - eW;
                    break;
                default:
                    eL = 0;
            }
        } else if (eW == pW) {
            eL = 0;
        }
        element.style.left = eL + 'px';

    },
    registerVertPosition: function(element, position) {
        element.vposition = position;
        this.velements.push(element);
    },
    registerHorPosition: function(element, position) {
        element.hposition = position;
        this.helements.push(element);
    }
}

var onPageLoad = function(){
    /* Set hor. position to labels */
    if (onsale.helements.length > 0){
        for (var i = 0; i < onsale.helements.length; i++){
            onsale.setHorPos(onsale.helements[i], onsale.helements[i].hposition);
        }
    }
    /* Set vert. position to labels */
    if (onsale.velements.length > 0){
        for (var j = 0; j < onsale.velements.length; j++){
            onsale.setVertPos(onsale.velements[j], onsale.velements[j].vposition);
        }
    }
}

if(typeof onsale=='undefined') {
    var onsale = new AwOnSale();
}
/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0
*/
if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C<A.length;C=C+1){D=A[C].split(".");E=YAHOO;for(B=(D[0]=="YAHOO")?1:0;B<D.length;B=B+1){E[D[B]]=E[D[B]]||{};E=E[D[B]];}}return E;};YAHOO.log=function(D,A,C){var B=YAHOO.widget.Logger;if(B&&B.log){return B.log(D,A,C);}else{return false;}};YAHOO.register=function(A,E,D){var I=YAHOO.env.modules;if(!I[A]){I[A]={versions:[],builds:[]};}var B=I[A],H=D.version,G=D.build,F=YAHOO.env.listeners;B.name=A;B.version=H;B.build=G;B.versions.push(H);B.builds.push(G);B.mainClass=E;for(var C=0;C<F.length;C=C+1){F[C](B);}if(E){E.VERSION=H;E.BUILD=G;}else{YAHOO.log("mainClass is undefined for module "+A,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(A){return YAHOO.env.modules[A]||null;};YAHOO.env.ua=function(){var C={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0};var B=navigator.userAgent,A;if((/KHTML/).test(B)){C.webkit=1;}A=B.match(/AppleWebKit\/([^\s]*)/);if(A&&A[1]){C.webkit=parseFloat(A[1]);if(/ Mobile\//.test(B)){C.mobile="Apple";}else{A=B.match(/NokiaN[^\/]*/);if(A){C.mobile=A[0];}}A=B.match(/AdobeAIR\/([^\s]*)/);if(A){C.air=A[0];}}if(!C.webkit){A=B.match(/Opera[\s\/]([^\s]*)/);if(A&&A[1]){C.opera=parseFloat(A[1]);A=B.match(/Opera Mini[^;]*/);if(A){C.mobile=A[0];}}else{A=B.match(/MSIE\s([^;]*)/);if(A&&A[1]){C.ie=parseFloat(A[1]);}else{A=B.match(/Gecko\/([^\s]*)/);if(A){C.gecko=1;A=B.match(/rv:([^\s\)]*)/);if(A&&A[1]){C.gecko=parseFloat(A[1]);}}}}}return C;}();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var B=YAHOO_config.listener,A=YAHOO.env.listeners,D=true,C;if(B){for(C=0;C<A.length;C=C+1){if(A[C]==B){D=false;break;}}if(D){A.push(B);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var A=YAHOO.lang,C=["toString","valueOf"],B={isArray:function(D){if(D){return A.isNumber(D.length)&&A.isFunction(D.splice);}return false;},isBoolean:function(D){return typeof D==="boolean";},isFunction:function(D){return typeof D==="function";},isNull:function(D){return D===null;},isNumber:function(D){return typeof D==="number"&&isFinite(D);},isObject:function(D){return(D&&(typeof D==="object"||A.isFunction(D)))||false;},isString:function(D){return typeof D==="string";},isUndefined:function(D){return typeof D==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(F,E){for(var D=0;D<C.length;D=D+1){var H=C[D],G=E[H];if(A.isFunction(G)&&G!=Object.prototype[H]){F[H]=G;}}}:function(){},extend:function(H,I,G){if(!I||!H){throw new Error("extend failed, please check that "+"all dependencies are included.");}var E=function(){};E.prototype=I.prototype;H.prototype=new E();H.prototype.constructor=H;H.superclass=I.prototype;if(I.prototype.constructor==Object.prototype.constructor){I.prototype.constructor=I;}if(G){for(var D in G){if(A.hasOwnProperty(G,D)){H.prototype[D]=G[D];}}A._IEEnumFix(H.prototype,G);}},augmentObject:function(H,G){if(!G||!H){throw new Error("Absorb failed, verify dependencies.");}var D=arguments,F,I,E=D[2];if(E&&E!==true){for(F=2;F<D.length;F=F+1){H[D[F]]=G[D[F]];}}else{for(I in G){if(E||!(I in H)){H[I]=G[I];}}A._IEEnumFix(H,G);}},augmentProto:function(G,F){if(!F||!G){throw new Error("Augment failed, verify dependencies.");}var D=[G.prototype,F.prototype];for(var E=2;E<arguments.length;E=E+1){D.push(arguments[E]);}A.augmentObject.apply(this,D);},dump:function(D,I){var F,H,K=[],L="{...}",E="f(){...}",J=", ",G=" => ";if(!A.isObject(D)){return D+"";}else{if(D instanceof Date||("nodeType" in D&&"tagName" in D)){return D;}else{if(A.isFunction(D)){return E;}}}I=(A.isNumber(I))?I:3;if(A.isArray(D)){K.push("[");for(F=0,H=D.length;F<H;F=F+1){if(A.isObject(D[F])){K.push((I>0)?A.dump(D[F],I-1):L);}else{K.push(D[F]);}K.push(J);}if(K.length>1){K.pop();}K.push("]");}else{K.push("{");for(F in D){if(A.hasOwnProperty(D,F)){K.push(F+G);if(A.isObject(D[F])){K.push((I>0)?A.dump(D[F],I-1):L);}else{K.push(D[F]);}K.push(J);}}if(K.length>1){K.pop();}K.push("}");}return K.join("");},substitute:function(S,E,L){var I,H,G,O,P,R,N=[],F,J="dump",M=" ",D="{",Q="}";for(;;){I=S.lastIndexOf(D);if(I<0){break;}H=S.indexOf(Q,I);if(I+1>=H){break;}F=S.substring(I+1,H);O=F;R=null;G=O.indexOf(M);if(G>-1){R=O.substring(G+1);O=O.substring(0,G);}P=E[O];if(L){P=L(O,P,R);}if(A.isObject(P)){if(A.isArray(P)){P=A.dump(P,parseInt(R,10));}else{R=R||"";var K=R.indexOf(J);if(K>-1){R=R.substring(4);}if(P.toString===Object.prototype.toString||K>-1){P=A.dump(P,parseInt(R,10));}else{P=P.toString();}}}else{if(!A.isString(P)&&!A.isNumber(P)){P="~-"+N.length+"-~";N[N.length]=F;}}S=S.substring(0,I)+P+S.substring(H+1);}for(I=N.length-1;I>=0;I=I-1){S=S.replace(new RegExp("~-"+I+"-~"),"{"+N[I]+"}","g");}return S;},trim:function(D){try{return D.replace(/^\s+|\s+$/g,"");}catch(E){return D;}},merge:function(){var G={},E=arguments;for(var F=0,D=E.length;F<D;F=F+1){A.augmentObject(G,E[F],true);}return G;},later:function(K,E,L,G,H){K=K||0;E=E||{};var F=L,J=G,I,D;if(A.isString(L)){F=E[L];}if(!F){throw new TypeError("method undefined");}if(!A.isArray(J)){J=[G];}I=function(){F.apply(E,J);};D=(H)?setInterval(I,K):setTimeout(I,K);return{interval:H,cancel:function(){if(this.interval){clearInterval(D);}else{clearTimeout(D);}}};},isValue:function(D){return(A.isObject(D)||A.isString(D)||A.isNumber(D)||A.isBoolean(D));}};A.hasOwnProperty=(Object.prototype.hasOwnProperty)?function(D,E){return D&&D.hasOwnProperty(E);}:function(D,E){return !A.isUndefined(D[E])&&D.constructor.prototype[E]!==D[E];};B.augmentObject(A,B,true);YAHOO.util.Lang=A;A.augment=A.augmentProto;YAHOO.augment=A.augmentProto;YAHOO.extend=A.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.6.0",build:"1321"});YAHOO.util.Get=function(){var M={},L=0,R=0,E=false,N=YAHOO.env.ua,S=YAHOO.lang;var J=function(W,T,X){var U=X||window,Y=U.document,Z=Y.createElement(W);for(var V in T){if(T[V]&&YAHOO.lang.hasOwnProperty(T,V)){Z.setAttribute(V,T[V]);}}return Z;};var I=function(T,U,W){var V=W||"utf-8";return J("link",{"id":"yui__dyn_"+(R++),"type":"text/css","charset":V,"rel":"stylesheet","href":T},U);
};var P=function(T,U,W){var V=W||"utf-8";return J("script",{"id":"yui__dyn_"+(R++),"type":"text/javascript","charset":V,"src":T},U);};var A=function(T,U){return{tId:T.tId,win:T.win,data:T.data,nodes:T.nodes,msg:U,purge:function(){D(this.tId);}};};var B=function(T,W){var U=M[W],V=(S.isString(T))?U.win.document.getElementById(T):T;if(!V){Q(W,"target node not found: "+T);}return V;};var Q=function(W,V){var T=M[W];if(T.onFailure){var U=T.scope||T.win;T.onFailure.call(U,A(T,V));}};var C=function(W){var T=M[W];T.finished=true;if(T.aborted){var V="transaction "+W+" was aborted";Q(W,V);return ;}if(T.onSuccess){var U=T.scope||T.win;T.onSuccess.call(U,A(T));}};var O=function(V){var T=M[V];if(T.onTimeout){var U=T.context||T;T.onTimeout.call(U,A(T));}};var G=function(V,Z){var U=M[V];if(U.timer){U.timer.cancel();}if(U.aborted){var X="transaction "+V+" was aborted";Q(V,X);return ;}if(Z){U.url.shift();if(U.varName){U.varName.shift();}}else{U.url=(S.isString(U.url))?[U.url]:U.url;if(U.varName){U.varName=(S.isString(U.varName))?[U.varName]:U.varName;}}var c=U.win,b=c.document,a=b.getElementsByTagName("head")[0],W;if(U.url.length===0){if(U.type==="script"&&N.webkit&&N.webkit<420&&!U.finalpass&&!U.varName){var Y=P(null,U.win,U.charset);Y.innerHTML='YAHOO.util.Get._finalize("'+V+'");';U.nodes.push(Y);a.appendChild(Y);}else{C(V);}return ;}var T=U.url[0];if(!T){U.url.shift();return G(V);}if(U.timeout){U.timer=S.later(U.timeout,U,O,V);}if(U.type==="script"){W=P(T,c,U.charset);}else{W=I(T,c,U.charset);}F(U.type,W,V,T,c,U.url.length);U.nodes.push(W);if(U.insertBefore){var e=B(U.insertBefore,V);if(e){e.parentNode.insertBefore(W,e);}}else{a.appendChild(W);}if((N.webkit||N.gecko)&&U.type==="css"){G(V,T);}};var K=function(){if(E){return ;}E=true;for(var T in M){var U=M[T];if(U.autopurge&&U.finished){D(U.tId);delete M[T];}}E=false;};var D=function(a){var X=M[a];if(X){var Z=X.nodes,T=Z.length,Y=X.win.document,W=Y.getElementsByTagName("head")[0];if(X.insertBefore){var V=B(X.insertBefore,a);if(V){W=V.parentNode;}}for(var U=0;U<T;U=U+1){W.removeChild(Z[U]);}X.nodes=[];}};var H=function(U,T,V){var X="q"+(L++);V=V||{};if(L%YAHOO.util.Get.PURGE_THRESH===0){K();}M[X]=S.merge(V,{tId:X,type:U,url:T,finished:false,aborted:false,nodes:[]});var W=M[X];W.win=W.win||window;W.scope=W.scope||W.win;W.autopurge=("autopurge" in W)?W.autopurge:(U==="script")?true:false;S.later(0,W,G,X);return{tId:X};};var F=function(c,X,W,U,Y,Z,b){var a=b||G;if(N.ie){X.onreadystatechange=function(){var d=this.readyState;if("loaded"===d||"complete"===d){X.onreadystatechange=null;a(W,U);}};}else{if(N.webkit){if(c==="script"){if(N.webkit>=420){X.addEventListener("load",function(){a(W,U);});}else{var T=M[W];if(T.varName){var V=YAHOO.util.Get.POLL_FREQ;T.maxattempts=YAHOO.util.Get.TIMEOUT/V;T.attempts=0;T._cache=T.varName[0].split(".");T.timer=S.later(V,T,function(j){var f=this._cache,e=f.length,d=this.win,g;for(g=0;g<e;g=g+1){d=d[f[g]];if(!d){this.attempts++;if(this.attempts++>this.maxattempts){var h="Over retry limit, giving up";T.timer.cancel();Q(W,h);}else{}return ;}}T.timer.cancel();a(W,U);},null,true);}else{S.later(YAHOO.util.Get.POLL_FREQ,null,a,[W,U]);}}}}else{X.onload=function(){a(W,U);};}}};return{POLL_FREQ:10,PURGE_THRESH:20,TIMEOUT:2000,_finalize:function(T){S.later(0,null,C,T);},abort:function(U){var V=(S.isString(U))?U:U.tId;var T=M[V];if(T){T.aborted=true;}},script:function(T,U){return H("script",T,U);},css:function(T,U){return H("css",T,U);}};}();YAHOO.register("get",YAHOO.util.Get,{version:"2.6.0",build:"1321"});(function(){var Y=YAHOO,util=Y.util,lang=Y.lang,env=Y.env,PROV="_provides",SUPER="_supersedes",REQ="expanded",AFTER="_after";var YUI={dupsAllowed:{"yahoo":true,"get":true},info:{"root":"2.6.0/build/","base":"http://yui.yahooapis.com/2.6.0/build/","comboBase":"http://yui.yahooapis.com/combo?","skin":{"defaultSkin":"sam","base":"assets/skins/","path":"skin.css","after":["reset","fonts","grids","base"],"rollup":3},dupsAllowed:["yahoo","get"],"moduleInfo":{"animation":{"type":"js","path":"animation/animation-min.js","requires":["dom","event"]},"autocomplete":{"type":"js","path":"autocomplete/autocomplete-min.js","requires":["dom","event","datasource"],"optional":["connection","animation"],"skinnable":true},"base":{"type":"css","path":"base/base-min.css","after":["reset","fonts","grids"]},"button":{"type":"js","path":"button/button-min.js","requires":["element"],"optional":["menu"],"skinnable":true},"calendar":{"type":"js","path":"calendar/calendar-min.js","requires":["event","dom"],"skinnable":true},"carousel":{"type":"js","path":"carousel/carousel-beta-min.js","requires":["element"],"optional":["animation"],"skinnable":true},"charts":{"type":"js","path":"charts/charts-experimental-min.js","requires":["element","json","datasource"]},"colorpicker":{"type":"js","path":"colorpicker/colorpicker-min.js","requires":["slider","element"],"optional":["animation"],"skinnable":true},"connection":{"type":"js","path":"connection/connection-min.js","requires":["event"]},"container":{"type":"js","path":"container/container-min.js","requires":["dom","event"],"optional":["dragdrop","animation","connection"],"supersedes":["containercore"],"skinnable":true},"containercore":{"type":"js","path":"container/container_core-min.js","requires":["dom","event"],"pkg":"container"},"cookie":{"type":"js","path":"cookie/cookie-min.js","requires":["yahoo"]},"datasource":{"type":"js","path":"datasource/datasource-min.js","requires":["event"],"optional":["connection"]},"datatable":{"type":"js","path":"datatable/datatable-min.js","requires":["element","datasource"],"optional":["calendar","dragdrop","paginator"],"skinnable":true},"dom":{"type":"js","path":"dom/dom-min.js","requires":["yahoo"]},"dragdrop":{"type":"js","path":"dragdrop/dragdrop-min.js","requires":["dom","event"]},"editor":{"type":"js","path":"editor/editor-min.js","requires":["menu","element","button"],"optional":["animation","dragdrop"],"supersedes":["simpleeditor"],"skinnable":true},"element":{"type":"js","path":"element/element-beta-min.js","requires":["dom","event"]},"event":{"type":"js","path":"event/event-min.js","requires":["yahoo"]},"fonts":{"type":"css","path":"fonts/fonts-min.css"},"get":{"type":"js","path":"get/get-min.js","requires":["yahoo"]},"grids":{"type":"css","path":"grids/grids-min.css","requires":["fonts"],"optional":["reset"]},"history":{"type":"js","path":"history/history-min.js","requires":["event"]},"imagecropper":{"type":"js","path":"imagecropper/imagecropper-beta-min.js","requires":["dom","event","dragdrop","element","resize"],"skinnable":true},"imageloader":{"type":"js","path":"imageloader/imageloader-min.js","requires":["event","dom"]},"json":{"type":"js","path":"json/json-min.js","requires":["yahoo"]},"layout":{"type":"js","path":"layout/layout-min.js","requires":["dom","event","element"],"optional":["animation","dragdrop","resize","selector"],"skinnable":true},"logger":{"type":"js","path":"logger/logger-min.js","requires":["event","dom"],"optional":["dragdrop"],"skinnable":true},"menu":{"type":"js","path":"menu/menu-min.js","requires":["containercore"],"skinnable":true},"paginator":{"type":"js","path":"paginator/paginator-min.js","requires":["element"],"skinnable":true},"profiler":{"type":"js","path":"profiler/profiler-min.js","requires":["yahoo"]},"profilerviewer":{"type":"js","path":"profilerviewer/profilerviewer-beta-min.js","requires":["profiler","yuiloader","element"],"skinnable":true},"reset":{"type":"css","path":"reset/reset-min.css"},"reset-fonts-grids":{"type":"css","path":"reset-fonts-grids/reset-fonts-grids.css","supersedes":["reset","fonts","grids","reset-fonts"],"rollup":4},"reset-fonts":{"type":"css","path":"reset-fonts/reset-fonts.css","supersedes":["reset","fonts"],"rollup":2},"resize":{"type":"js","path":"resize/resize-min.js","requires":["dom","event","dragdrop","element"],"optional":["animation"],"skinnable":true},"selector":{"type":"js","path":"selector/selector-beta-min.js","requires":["yahoo","dom"]},"simpleeditor":{"type":"js","path":"editor/simpleeditor-min.js","requires":["element"],"optional":["containercore","menu","button","animation","dragdrop"],"skinnable":true,"pkg":"editor"},"slider":{"type":"js","path":"slider/slider-min.js","requires":["dragdrop"],"optional":["animation"],"skinnable":true},"tabview":{"type":"js","path":"tabview/tabview-min.js","requires":["element"],"optional":["connection"],"skinnable":true},"treeview":{"type":"js","path":"treeview/treeview-min.js","requires":["event","dom"],"skinnable":true},"uploader":{"type":"js","path":"uploader/uploader-experimental.js","requires":["element"]},"utilities":{"type":"js","path":"utilities/utilities.js","supersedes":["yahoo","event","dragdrop","animation","dom","connection","element","yahoo-dom-event","get","yuiloader","yuiloader-dom-event"],"rollup":8},"yahoo":{"type":"js","path":"yahoo/yahoo-min.js"},"yahoo-dom-event":{"type":"js","path":"yahoo-dom-event/yahoo-dom-event.js","supersedes":["yahoo","event","dom"],"rollup":3},"yuiloader":{"type":"js","path":"yuiloader/yuiloader-min.js","supersedes":["yahoo","get"]},"yuiloader-dom-event":{"type":"js","path":"yuiloader-dom-event/yuiloader-dom-event.js","supersedes":["yahoo","dom","event","get","yuiloader","yahoo-dom-event"],"rollup":5},"yuitest":{"type":"js","path":"yuitest/yuitest-min.js","requires":["logger"],"skinnable":true}}},ObjectUtil:{appendArray:function(o,a){if(a){for(var i=0;
i<a.length;i=i+1){o[a[i]]=true;}}},keys:function(o,ordered){var a=[],i;for(i in o){if(lang.hasOwnProperty(o,i)){a.push(i);}}return a;}},ArrayUtil:{appendArray:function(a1,a2){Array.prototype.push.apply(a1,a2);},indexOf:function(a,val){for(var i=0;i<a.length;i=i+1){if(a[i]===val){return i;}}return -1;},toObject:function(a){var o={};for(var i=0;i<a.length;i=i+1){o[a[i]]=true;}return o;},uniq:function(a){return YUI.ObjectUtil.keys(YUI.ArrayUtil.toObject(a));}}};YAHOO.util.YUILoader=function(o){this._internalCallback=null;this._useYahooListener=false;this.onSuccess=null;this.onFailure=Y.log;this.onProgress=null;this.onTimeout=null;this.scope=this;this.data=null;this.insertBefore=null;this.charset=null;this.varName=null;this.base=YUI.info.base;this.comboBase=YUI.info.comboBase;this.combine=false;this.root=YUI.info.root;this.timeout=0;this.ignore=null;this.force=null;this.allowRollup=true;this.filter=null;this.required={};this.moduleInfo=lang.merge(YUI.info.moduleInfo);this.rollups=null;this.loadOptional=false;this.sorted=[];this.loaded={};this.dirty=true;this.inserted={};var self=this;env.listeners.push(function(m){if(self._useYahooListener){self.loadNext(m.name);}});this.skin=lang.merge(YUI.info.skin);this._config(o);};Y.util.YUILoader.prototype={FILTERS:{RAW:{"searchExp":"-min\\.js","replaceStr":".js"},DEBUG:{"searchExp":"-min\\.js","replaceStr":"-debug.js"}},SKIN_PREFIX:"skin-",_config:function(o){if(o){for(var i in o){if(lang.hasOwnProperty(o,i)){if(i=="require"){this.require(o[i]);}else{this[i]=o[i];}}}}var f=this.filter;if(lang.isString(f)){f=f.toUpperCase();if(f==="DEBUG"){this.require("logger");}if(!Y.widget.LogWriter){Y.widget.LogWriter=function(){return Y;};}this.filter=this.FILTERS[f];}},addModule:function(o){if(!o||!o.name||!o.type||(!o.path&&!o.fullpath)){return false;}o.ext=("ext" in o)?o.ext:true;o.requires=o.requires||[];this.moduleInfo[o.name]=o;this.dirty=true;return true;},require:function(what){var a=(typeof what==="string")?arguments:what;this.dirty=true;YUI.ObjectUtil.appendArray(this.required,a);},_addSkin:function(skin,mod){var name=this.formatSkin(skin),info=this.moduleInfo,sinf=this.skin,ext=info[mod]&&info[mod].ext;if(!info[name]){this.addModule({"name":name,"type":"css","path":sinf.base+skin+"/"+sinf.path,"after":sinf.after,"rollup":sinf.rollup,"ext":ext});}if(mod){name=this.formatSkin(skin,mod);if(!info[name]){var mdef=info[mod],pkg=mdef.pkg||mod;this.addModule({"name":name,"type":"css","after":sinf.after,"path":pkg+"/"+sinf.base+skin+"/"+mod+".css","ext":ext});}}return name;},getRequires:function(mod){if(!mod){return[];}if(!this.dirty&&mod.expanded){return mod.expanded;}mod.requires=mod.requires||[];var i,d=[],r=mod.requires,o=mod.optional,info=this.moduleInfo,m;for(i=0;i<r.length;i=i+1){d.push(r[i]);m=info[r[i]];YUI.ArrayUtil.appendArray(d,this.getRequires(m));}if(o&&this.loadOptional){for(i=0;i<o.length;i=i+1){d.push(o[i]);YUI.ArrayUtil.appendArray(d,this.getRequires(info[o[i]]));}}mod.expanded=YUI.ArrayUtil.uniq(d);return mod.expanded;},getProvides:function(name,notMe){var addMe=!(notMe),ckey=(addMe)?PROV:SUPER,m=this.moduleInfo[name],o={};if(!m){return o;}if(m[ckey]){return m[ckey];}var s=m.supersedes,done={},me=this;var add=function(mm){if(!done[mm]){done[mm]=true;lang.augmentObject(o,me.getProvides(mm));}};if(s){for(var i=0;i<s.length;i=i+1){add(s[i]);}}m[SUPER]=o;m[PROV]=lang.merge(o);m[PROV][name]=true;return m[ckey];},calculate:function(o){if(o||this.dirty){this._config(o);this._setup();this._explode();if(this.allowRollup){this._rollup();}this._reduce();this._sort();this.dirty=false;}},_setup:function(){var info=this.moduleInfo,name,i,j;for(name in info){if(lang.hasOwnProperty(info,name)){var m=info[name];if(m&&m.skinnable){var o=this.skin.overrides,smod;if(o&&o[name]){for(i=0;i<o[name].length;i=i+1){smod=this._addSkin(o[name][i],name);}}else{smod=this._addSkin(this.skin.defaultSkin,name);}m.requires.push(smod);}}}var l=lang.merge(this.inserted);if(!this._sandbox){l=lang.merge(l,env.modules);}if(this.ignore){YUI.ObjectUtil.appendArray(l,this.ignore);}if(this.force){for(i=0;i<this.force.length;i=i+1){if(this.force[i] in l){delete l[this.force[i]];}}}for(j in l){if(lang.hasOwnProperty(l,j)){lang.augmentObject(l,this.getProvides(j));}}this.loaded=l;},_explode:function(){var r=this.required,i,mod;for(i in r){if(lang.hasOwnProperty(r,i)){mod=this.moduleInfo[i];if(mod){var req=this.getRequires(mod);if(req){YUI.ObjectUtil.appendArray(r,req);}}}}},_skin:function(){},formatSkin:function(skin,mod){var s=this.SKIN_PREFIX+skin;if(mod){s=s+"-"+mod;}return s;},parseSkin:function(mod){if(mod.indexOf(this.SKIN_PREFIX)===0){var a=mod.split("-");return{skin:a[1],module:a[2]};}return null;},_rollup:function(){var i,j,m,s,rollups={},r=this.required,roll,info=this.moduleInfo;if(this.dirty||!this.rollups){for(i in info){if(lang.hasOwnProperty(info,i)){m=info[i];if(m&&m.rollup){rollups[i]=m;}}}this.rollups=rollups;}for(;;){var rolled=false;for(i in rollups){if(!r[i]&&!this.loaded[i]){m=info[i];s=m.supersedes;roll=false;if(!m.rollup){continue;}var skin=(m.ext)?false:this.parseSkin(i),c=0;if(skin){for(j in r){if(lang.hasOwnProperty(r,j)){if(i!==j&&this.parseSkin(j)){c++;roll=(c>=m.rollup);if(roll){break;}}}}}else{for(j=0;j<s.length;j=j+1){if(this.loaded[s[j]]&&(!YUI.dupsAllowed[s[j]])){roll=false;break;}else{if(r[s[j]]){c++;roll=(c>=m.rollup);if(roll){break;}}}}}if(roll){r[i]=true;rolled=true;this.getRequires(m);}}}if(!rolled){break;}}},_reduce:function(){var i,j,s,m,r=this.required;for(i in r){if(i in this.loaded){delete r[i];}else{var skinDef=this.parseSkin(i);if(skinDef){if(!skinDef.module){var skin_pre=this.SKIN_PREFIX+skinDef.skin;for(j in r){if(lang.hasOwnProperty(r,j)){m=this.moduleInfo[j];var ext=m&&m.ext;if(!ext&&j!==i&&j.indexOf(skin_pre)>-1){delete r[j];}}}}}else{m=this.moduleInfo[i];s=m&&m.supersedes;if(s){for(j=0;j<s.length;j=j+1){if(s[j] in r){delete r[s[j]];}}}}}}},_onFailure:function(msg){YAHOO.log("Failure","info","loader");var f=this.onFailure;if(f){f.call(this.scope,{msg:"failure: "+msg,data:this.data,success:false});
}},_onTimeout:function(){YAHOO.log("Timeout","info","loader");var f=this.onTimeout;if(f){f.call(this.scope,{msg:"timeout",data:this.data,success:false});}},_sort:function(){var s=[],info=this.moduleInfo,loaded=this.loaded,checkOptional=!this.loadOptional,me=this;var requires=function(aa,bb){var mm=info[aa];if(loaded[bb]||!mm){return false;}var ii,rr=mm.expanded,after=mm.after,other=info[bb],optional=mm.optional;if(rr&&YUI.ArrayUtil.indexOf(rr,bb)>-1){return true;}if(after&&YUI.ArrayUtil.indexOf(after,bb)>-1){return true;}if(checkOptional&&optional&&YUI.ArrayUtil.indexOf(optional,bb)>-1){return true;}var ss=info[bb]&&info[bb].supersedes;if(ss){for(ii=0;ii<ss.length;ii=ii+1){if(requires(aa,ss[ii])){return true;}}}if(mm.ext&&mm.type=="css"&&!other.ext&&other.type=="css"){return true;}return false;};for(var i in this.required){if(lang.hasOwnProperty(this.required,i)){s.push(i);}}var p=0;for(;;){var l=s.length,a,b,j,k,moved=false;for(j=p;j<l;j=j+1){a=s[j];for(k=j+1;k<l;k=k+1){if(requires(a,s[k])){b=s.splice(k,1);s.splice(j,0,b[0]);moved=true;break;}}if(moved){break;}else{p=p+1;}}if(!moved){break;}}this.sorted=s;},toString:function(){var o={type:"YUILoader",base:this.base,filter:this.filter,required:this.required,loaded:this.loaded,inserted:this.inserted};lang.dump(o,1);},_combine:function(){this._combining=[];var self=this,s=this.sorted,len=s.length,js=this.comboBase,css=this.comboBase,target,startLen=js.length,i,m,type=this.loadType;YAHOO.log("type "+type);for(i=0;i<len;i=i+1){m=this.moduleInfo[s[i]];if(m&&!m.ext&&(!type||type===m.type)){target=this.root+m.path;target+="&";if(m.type=="js"){js+=target;}else{css+=target;}this._combining.push(s[i]);}}if(this._combining.length){YAHOO.log("Attempting to combine: "+this._combining,"info","loader");var callback=function(o){var c=this._combining,len=c.length,i,m;for(i=0;i<len;i=i+1){this.inserted[c[i]]=true;}this.loadNext(o.data);},loadScript=function(){if(js.length>startLen){YAHOO.util.Get.script(self._filter(js),{data:self._loading,onSuccess:callback,onFailure:self._onFailure,onTimeout:self._onTimeout,insertBefore:self.insertBefore,charset:self.charset,timeout:self.timeout,scope:self});}};if(css.length>startLen){YAHOO.util.Get.css(this._filter(css),{data:this._loading,onSuccess:loadScript,onFailure:this._onFailure,onTimeout:this._onTimeout,insertBefore:this.insertBefore,charset:this.charset,timeout:this.timeout,scope:self});}else{loadScript();}return ;}else{this.loadNext(this._loading);}},insert:function(o,type){this.calculate(o);this._loading=true;this.loadType=type;if(this.combine){return this._combine();}if(!type){var self=this;this._internalCallback=function(){self._internalCallback=null;self.insert(null,"js");};this.insert(null,"css");return ;}this.loadNext();},sandbox:function(o,type){this._config(o);if(!this.onSuccess){throw new Error("You must supply an onSuccess handler for your sandbox");}this._sandbox=true;var self=this;if(!type||type!=="js"){this._internalCallback=function(){self._internalCallback=null;self.sandbox(null,"js");};this.insert(null,"css");return ;}if(!util.Connect){var ld=new YAHOO.util.YUILoader();ld.insert({base:this.base,filter:this.filter,require:"connection",insertBefore:this.insertBefore,charset:this.charset,onSuccess:function(){this.sandbox(null,"js");},scope:this},"js");return ;}this._scriptText=[];this._loadCount=0;this._stopCount=this.sorted.length;this._xhr=[];this.calculate();var s=this.sorted,l=s.length,i,m,url;for(i=0;i<l;i=i+1){m=this.moduleInfo[s[i]];if(!m){this._onFailure("undefined module "+m);for(var j=0;j<this._xhr.length;j=j+1){this._xhr[j].abort();}return ;}if(m.type!=="js"){this._loadCount++;continue;}url=m.fullpath;url=(url)?this._filter(url):this._url(m.path);var xhrData={success:function(o){var idx=o.argument[0],name=o.argument[2];this._scriptText[idx]=o.responseText;if(this.onProgress){this.onProgress.call(this.scope,{name:name,scriptText:o.responseText,xhrResponse:o,data:this.data});}this._loadCount++;if(this._loadCount>=this._stopCount){var v=this.varName||"YAHOO";var t="(function() {\n";var b="\nreturn "+v+";\n})();";var ref=eval(t+this._scriptText.join("\n")+b);this._pushEvents(ref);if(ref){this.onSuccess.call(this.scope,{reference:ref,data:this.data});}else{this._onFailure.call(this.varName+" reference failure");}}},failure:function(o){this.onFailure.call(this.scope,{msg:"XHR failure",xhrResponse:o,data:this.data});},scope:this,argument:[i,url,s[i]]};this._xhr.push(util.Connect.asyncRequest("GET",url,xhrData));}},loadNext:function(mname){if(!this._loading){return ;}if(mname){if(mname!==this._loading){return ;}this.inserted[mname]=true;if(this.onProgress){this.onProgress.call(this.scope,{name:mname,data:this.data});}}var s=this.sorted,len=s.length,i,m;for(i=0;i<len;i=i+1){if(s[i] in this.inserted){continue;}if(s[i]===this._loading){return ;}m=this.moduleInfo[s[i]];if(!m){this.onFailure.call(this.scope,{msg:"undefined module "+m,data:this.data});return ;}if(!this.loadType||this.loadType===m.type){this._loading=s[i];var fn=(m.type==="css")?util.Get.css:util.Get.script,url=m.fullpath,self=this,c=function(o){self.loadNext(o.data);};url=(url)?this._filter(url):this._url(m.path);if(env.ua.webkit&&env.ua.webkit<420&&m.type==="js"&&!m.varName){c=null;this._useYahooListener=true;}fn(url,{data:s[i],onSuccess:c,onFailure:this._onFailure,onTimeout:this._onTimeout,insertBefore:this.insertBefore,charset:this.charset,timeout:this.timeout,varName:m.varName,scope:self});return ;}}this._loading=null;if(this._internalCallback){var f=this._internalCallback;this._internalCallback=null;f.call(this);}else{if(this.onSuccess){this._pushEvents();this.onSuccess.call(this.scope,{data:this.data});}}},_pushEvents:function(ref){var r=ref||YAHOO;if(r.util&&r.util.Event){r.util.Event._load();}},_filter:function(str){var f=this.filter;return(f)?str.replace(new RegExp(f.searchExp),f.replaceStr):str;},_url:function(path){var u=this.base||"",f=this.filter;u=u+path;return this._filter(u);}};})();(function(){var B=YAHOO.util,F=YAHOO.lang,L,J,K={},G={},N=window.document;YAHOO.env._id_counter=YAHOO.env._id_counter||0;var C=YAHOO.env.ua.opera,M=YAHOO.env.ua.webkit,A=YAHOO.env.ua.gecko,H=YAHOO.env.ua.ie;var E={HYPHEN:/(-[a-z])/i,ROOT_TAG:/^body|html$/i,OP_SCROLL:/^(?:inline|table-row)$/i};var O=function(Q){if(!E.HYPHEN.test(Q)){return Q;}if(K[Q]){return K[Q];}var R=Q;while(E.HYPHEN.exec(R)){R=R.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());}K[Q]=R;return R;};var P=function(R){var Q=G[R];if(!Q){Q=new RegExp("(?:^|\\s+)"+R+"(?:\\s+|$)");G[R]=Q;}return Q;};if(N.defaultView&&N.defaultView.getComputedStyle){L=function(Q,T){var S=null;if(T=="float"){T="cssFloat";}var R=Q.ownerDocument.defaultView.getComputedStyle(Q,"");if(R){S=R[O(T)];}return Q.style[T]||S;};}else{if(N.documentElement.currentStyle&&H){L=function(Q,S){switch(O(S)){case"opacity":var U=100;try{U=Q.filters["DXImageTransform.Microsoft.Alpha"].opacity;}catch(T){try{U=Q.filters("alpha").opacity;}catch(T){}}return U/100;case"float":S="styleFloat";default:var R=Q.currentStyle?Q.currentStyle[S]:null;return(Q.style[S]||R);}};}else{L=function(Q,R){return Q.style[R];};}}if(H){J=function(Q,R,S){switch(R){case"opacity":if(F.isString(Q.style.filter)){Q.style.filter="alpha(opacity="+S*100+")";if(!Q.currentStyle||!Q.currentStyle.hasLayout){Q.style.zoom=1;}}break;case"float":R="styleFloat";default:Q.style[R]=S;}};}else{J=function(Q,R,S){if(R=="float"){R="cssFloat";}Q.style[R]=S;};}var D=function(Q,R){return Q&&Q.nodeType==1&&(!R||R(Q));};YAHOO.util.Dom={get:function(S){if(S){if(S.nodeType||S.item){return S;}if(typeof S==="string"){return N.getElementById(S);}if("length" in S){var T=[];for(var R=0,Q=S.length;R<Q;++R){T[T.length]=B.Dom.get(S[R]);}return T;}return S;}return null;},getStyle:function(Q,S){S=O(S);var R=function(T){return L(T,S);};return B.Dom.batch(Q,R,B.Dom,true);},setStyle:function(Q,S,T){S=O(S);var R=function(U){J(U,S,T);};B.Dom.batch(Q,R,B.Dom,true);},getXY:function(Q){var R=function(S){if((S.parentNode===null||S.offsetParent===null||this.getStyle(S,"display")=="none")&&S!=S.ownerDocument.body){return false;}return I(S);};return B.Dom.batch(Q,R,B.Dom,true);},getX:function(Q){var R=function(S){return B.Dom.getXY(S)[0];};return B.Dom.batch(Q,R,B.Dom,true);},getY:function(Q){var R=function(S){return B.Dom.getXY(S)[1];};return B.Dom.batch(Q,R,B.Dom,true);},setXY:function(Q,T,S){var R=function(W){var V=this.getStyle(W,"position");if(V=="static"){this.setStyle(W,"position","relative");V="relative";}var Y=this.getXY(W);if(Y===false){return false;}var X=[parseInt(this.getStyle(W,"left"),10),parseInt(this.getStyle(W,"top"),10)];if(isNaN(X[0])){X[0]=(V=="relative")?0:W.offsetLeft;}if(isNaN(X[1])){X[1]=(V=="relative")?0:W.offsetTop;}if(T[0]!==null){W.style.left=T[0]-Y[0]+X[0]+"px";}if(T[1]!==null){W.style.top=T[1]-Y[1]+X[1]+"px";}if(!S){var U=this.getXY(W);if((T[0]!==null&&U[0]!=T[0])||(T[1]!==null&&U[1]!=T[1])){this.setXY(W,T,true);}}};B.Dom.batch(Q,R,B.Dom,true);},setX:function(R,Q){B.Dom.setXY(R,[Q,null]);},setY:function(Q,R){B.Dom.setXY(Q,[null,R]);},getRegion:function(Q){var R=function(S){if((S.parentNode===null||S.offsetParent===null||this.getStyle(S,"display")=="none")&&S!=S.ownerDocument.body){return false;}var T=B.Region.getRegion(S);return T;};return B.Dom.batch(Q,R,B.Dom,true);},getClientWidth:function(){return B.Dom.getViewportWidth();},getClientHeight:function(){return B.Dom.getViewportHeight();},getElementsByClassName:function(U,Y,V,W){U=F.trim(U);Y=Y||"*";V=(V)?B.Dom.get(V):null||N;if(!V){return[];}var R=[],Q=V.getElementsByTagName(Y),X=P(U);for(var S=0,T=Q.length;S<T;++S){if(X.test(Q[S].className)){R[R.length]=Q[S];if(W){W.call(Q[S],Q[S]);}}}return R;},hasClass:function(S,R){var Q=P(R);var T=function(U){return Q.test(U.className);};return B.Dom.batch(S,T,B.Dom,true);},addClass:function(R,Q){var S=function(T){if(this.hasClass(T,Q)){return false;}T.className=F.trim([T.className,Q].join(" "));return true;};return B.Dom.batch(R,S,B.Dom,true);},removeClass:function(S,R){var Q=P(R);var T=function(W){var V=false,X=W.className;if(R&&X&&this.hasClass(W,R)){W.className=X.replace(Q," ");if(this.hasClass(W,R)){this.removeClass(W,R);}W.className=F.trim(W.className);if(W.className===""){var U=(W.hasAttribute)?"class":"className";W.removeAttribute(U);}V=true;}return V;};return B.Dom.batch(S,T,B.Dom,true);},replaceClass:function(T,R,Q){if(!Q||R===Q){return false;}var S=P(R);var U=function(V){if(!this.hasClass(V,R)){this.addClass(V,Q);return true;}V.className=V.className.replace(S," "+Q+" ");if(this.hasClass(V,R)){this.removeClass(V,R);}V.className=F.trim(V.className);return true;};return B.Dom.batch(T,U,B.Dom,true);},generateId:function(Q,S){S=S||"yui-gen";var R=function(T){if(T&&T.id){return T.id;}var U=S+YAHOO.env._id_counter++;if(T){T.id=U;}return U;};return B.Dom.batch(Q,R,B.Dom,true)||R.apply(B.Dom,arguments);},isAncestor:function(R,S){R=B.Dom.get(R);S=B.Dom.get(S);var Q=false;if((R&&S)&&(R.nodeType&&S.nodeType)){if(R.contains&&R!==S){Q=R.contains(S);}else{if(R.compareDocumentPosition){Q=!!(R.compareDocumentPosition(S)&16);}}}else{}return Q;},inDocument:function(Q){return this.isAncestor(N.documentElement,Q);},getElementsBy:function(X,R,S,U){R=R||"*";S=(S)?B.Dom.get(S):null||N;if(!S){return[];}var T=[],W=S.getElementsByTagName(R);for(var V=0,Q=W.length;V<Q;++V){if(X(W[V])){T[T.length]=W[V];if(U){U(W[V]);}}}return T;},batch:function(U,X,W,S){U=(U&&(U.tagName||U.item))?U:B.Dom.get(U);if(!U||!X){return false;}var T=(S)?W:window;if(U.tagName||U.length===undefined){return X.call(T,U,W);}var V=[];for(var R=0,Q=U.length;R<Q;++R){V[V.length]=X.call(T,U[R],W);}return V;},getDocumentHeight:function(){var R=(N.compatMode!="CSS1Compat")?N.body.scrollHeight:N.documentElement.scrollHeight;var Q=Math.max(R,B.Dom.getViewportHeight());return Q;},getDocumentWidth:function(){var R=(N.compatMode!="CSS1Compat")?N.body.scrollWidth:N.documentElement.scrollWidth;var Q=Math.max(R,B.Dom.getViewportWidth());return Q;},getViewportHeight:function(){var Q=self.innerHeight;
var R=N.compatMode;if((R||H)&&!C){Q=(R=="CSS1Compat")?N.documentElement.clientHeight:N.body.clientHeight;}return Q;},getViewportWidth:function(){var Q=self.innerWidth;var R=N.compatMode;if(R||H){Q=(R=="CSS1Compat")?N.documentElement.clientWidth:N.body.clientWidth;}return Q;},getAncestorBy:function(Q,R){while((Q=Q.parentNode)){if(D(Q,R)){return Q;}}return null;},getAncestorByClassName:function(R,Q){R=B.Dom.get(R);if(!R){return null;}var S=function(T){return B.Dom.hasClass(T,Q);};return B.Dom.getAncestorBy(R,S);},getAncestorByTagName:function(R,Q){R=B.Dom.get(R);if(!R){return null;}var S=function(T){return T.tagName&&T.tagName.toUpperCase()==Q.toUpperCase();};return B.Dom.getAncestorBy(R,S);},getPreviousSiblingBy:function(Q,R){while(Q){Q=Q.previousSibling;if(D(Q,R)){return Q;}}return null;},getPreviousSibling:function(Q){Q=B.Dom.get(Q);if(!Q){return null;}return B.Dom.getPreviousSiblingBy(Q);},getNextSiblingBy:function(Q,R){while(Q){Q=Q.nextSibling;if(D(Q,R)){return Q;}}return null;},getNextSibling:function(Q){Q=B.Dom.get(Q);if(!Q){return null;}return B.Dom.getNextSiblingBy(Q);},getFirstChildBy:function(Q,S){var R=(D(Q.firstChild,S))?Q.firstChild:null;return R||B.Dom.getNextSiblingBy(Q.firstChild,S);},getFirstChild:function(Q,R){Q=B.Dom.get(Q);if(!Q){return null;}return B.Dom.getFirstChildBy(Q);},getLastChildBy:function(Q,S){if(!Q){return null;}var R=(D(Q.lastChild,S))?Q.lastChild:null;return R||B.Dom.getPreviousSiblingBy(Q.lastChild,S);},getLastChild:function(Q){Q=B.Dom.get(Q);return B.Dom.getLastChildBy(Q);},getChildrenBy:function(R,T){var S=B.Dom.getFirstChildBy(R,T);var Q=S?[S]:[];B.Dom.getNextSiblingBy(S,function(U){if(!T||T(U)){Q[Q.length]=U;}return false;});return Q;},getChildren:function(Q){Q=B.Dom.get(Q);if(!Q){}return B.Dom.getChildrenBy(Q);},getDocumentScrollLeft:function(Q){Q=Q||N;return Math.max(Q.documentElement.scrollLeft,Q.body.scrollLeft);},getDocumentScrollTop:function(Q){Q=Q||N;return Math.max(Q.documentElement.scrollTop,Q.body.scrollTop);},insertBefore:function(R,Q){R=B.Dom.get(R);Q=B.Dom.get(Q);if(!R||!Q||!Q.parentNode){return null;}return Q.parentNode.insertBefore(R,Q);},insertAfter:function(R,Q){R=B.Dom.get(R);Q=B.Dom.get(Q);if(!R||!Q||!Q.parentNode){return null;}if(Q.nextSibling){return Q.parentNode.insertBefore(R,Q.nextSibling);}else{return Q.parentNode.appendChild(R);}},getClientRegion:function(){var S=B.Dom.getDocumentScrollTop(),R=B.Dom.getDocumentScrollLeft(),T=B.Dom.getViewportWidth()+R,Q=B.Dom.getViewportHeight()+S;return new B.Region(S,T,Q,R);}};var I=function(){if(N.documentElement.getBoundingClientRect){return function(S){var T=S.getBoundingClientRect(),R=Math.round;var Q=S.ownerDocument;return[R(T.left+B.Dom.getDocumentScrollLeft(Q)),R(T.top+B.Dom.getDocumentScrollTop(Q))];};}else{return function(S){var T=[S.offsetLeft,S.offsetTop];var R=S.offsetParent;var Q=(M&&B.Dom.getStyle(S,"position")=="absolute"&&S.offsetParent==S.ownerDocument.body);if(R!=S){while(R){T[0]+=R.offsetLeft;T[1]+=R.offsetTop;if(!Q&&M&&B.Dom.getStyle(R,"position")=="absolute"){Q=true;}R=R.offsetParent;}}if(Q){T[0]-=S.ownerDocument.body.offsetLeft;T[1]-=S.ownerDocument.body.offsetTop;}R=S.parentNode;while(R.tagName&&!E.ROOT_TAG.test(R.tagName)){if(R.scrollTop||R.scrollLeft){T[0]-=R.scrollLeft;T[1]-=R.scrollTop;}R=R.parentNode;}return T;};}}();})();YAHOO.util.Region=function(C,D,A,B){this.top=C;this[1]=C;this.right=D;this.bottom=A;this.left=B;this[0]=B;};YAHOO.util.Region.prototype.contains=function(A){return(A.left>=this.left&&A.right<=this.right&&A.top>=this.top&&A.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(E){var C=Math.max(this.top,E.top);var D=Math.min(this.right,E.right);var A=Math.min(this.bottom,E.bottom);var B=Math.max(this.left,E.left);if(A>=C&&D>=B){return new YAHOO.util.Region(C,D,A,B);}else{return null;}};YAHOO.util.Region.prototype.union=function(E){var C=Math.min(this.top,E.top);var D=Math.max(this.right,E.right);var A=Math.max(this.bottom,E.bottom);var B=Math.min(this.left,E.left);return new YAHOO.util.Region(C,D,A,B);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(D){var F=YAHOO.util.Dom.getXY(D);var C=F[1];var E=F[0]+D.offsetWidth;var A=F[1]+D.offsetHeight;var B=F[0];return new YAHOO.util.Region(C,E,A,B);};YAHOO.util.Point=function(A,B){if(YAHOO.lang.isArray(A)){B=A[1];A=A[0];}this.x=this.right=this.left=this[0]=A;this.y=this.top=this.bottom=this[1]=B;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.6.0",build:"1321"});YAHOO.util.CustomEvent=function(D,B,C,A){this.type=D;this.scope=B||window;this.silent=C;this.signature=A||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var E="_YUICEOnSubscribe";if(D!==E){this.subscribeEvent=new YAHOO.util.CustomEvent(E,this,true);}this.lastError=null;};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(B,C,A){if(!B){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}if(this.subscribeEvent){this.subscribeEvent.fire(B,C,A);}this.subscribers.push(new YAHOO.util.Subscriber(B,C,A));},unsubscribe:function(D,F){if(!D){return this.unsubscribeAll();}var E=false;for(var B=0,A=this.subscribers.length;B<A;++B){var C=this.subscribers[B];if(C&&C.contains(D,F)){this._delete(B);E=true;}}return E;},fire:function(){this.lastError=null;var K=[],E=this.subscribers.length;if(!E&&this.silent){return true;}var I=[].slice.call(arguments,0),G=true,D,J=false;if(!this.silent){}var C=this.subscribers.slice(),A=YAHOO.util.Event.throwErrors;for(D=0;D<E;++D){var M=C[D];if(!M){J=true;}else{if(!this.silent){}var L=M.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var B=null;if(I.length>0){B=I[0];}try{G=M.fn.call(L,B,M.obj);}catch(F){this.lastError=F;if(A){throw F;}}}else{try{G=M.fn.call(L,this.type,I,M.obj);}catch(H){this.lastError=H;if(A){throw H;}}}if(false===G){if(!this.silent){}break;}}}return(G!==false);},unsubscribeAll:function(){for(var A=this.subscribers.length-1;A>-1;A--){this._delete(A);}this.subscribers=[];return A;},_delete:function(A){var B=this.subscribers[A];if(B){delete B.fn;delete B.obj;}this.subscribers.splice(A,1);},toString:function(){return"CustomEvent: "+"'"+this.type+"', "+"scope: "+this.scope;}};YAHOO.util.Subscriber=function(B,C,A){this.fn=B;this.obj=YAHOO.lang.isUndefined(C)?null:C;this.override=A;};YAHOO.util.Subscriber.prototype.getScope=function(A){if(this.override){if(this.override===true){return this.obj;}else{return this.override;}}return A;};YAHOO.util.Subscriber.prototype.contains=function(A,B){if(B){return(this.fn==A&&this.obj==B);}else{return(this.fn==A);}};YAHOO.util.Subscriber.prototype.toString=function(){return"Subscriber { obj: "+this.obj+", override: "+(this.override||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var H=false;var I=[];var J=[];var G=[];var E=[];var C=0;var F=[];var B=[];var A=0;var D={63232:38,63233:40,63234:37,63235:39,63276:33,63277:34,25:9};var K=YAHOO.env.ua.ie?"focusin":"focus";var L=YAHOO.env.ua.ie?"focusout":"blur";return{POLL_RETRYS:2000,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,UNLOAD_OBJ:3,ADJ_SCOPE:4,OBJ:5,OVERRIDE:6,CAPTURE:7,lastError:null,isSafari:YAHOO.env.ua.webkit,webkit:YAHOO.env.ua.webkit,isIE:YAHOO.env.ua.ie,_interval:null,_dri:null,DOMReady:false,throwErrors:false,startInterval:function(){if(!this._interval){var M=this;var N=function(){M._tryPreloadAttach();};this._interval=setInterval(N,this.POLL_INTERVAL);}},onAvailable:function(R,O,S,Q,P){var M=(YAHOO.lang.isString(R))?[R]:R;for(var N=0;N<M.length;N=N+1){F.push({id:M[N],fn:O,obj:S,override:Q,checkReady:P});}C=this.POLL_RETRYS;this.startInterval();},onContentReady:function(O,M,P,N){this.onAvailable(O,M,P,N,true);},onDOMReady:function(M,O,N){if(this.DOMReady){setTimeout(function(){var P=window;if(N){if(N===true){P=O;}else{P=N;}}M.call(P,"DOMReady",[],O);},0);}else{this.DOMReadyEvent.subscribe(M,O,N);}},_addListener:function(O,M,X,S,N,a){if(!X||!X.call){return false;}if(this._isValidCollection(O)){var Y=true;for(var T=0,V=O.length;T<V;++T){Y=this._addListener(O[T],M,X,S,N,a)&&Y;}return Y;}else{if(YAHOO.lang.isString(O)){var R=this.getEl(O);if(R){O=R;}else{this.onAvailable(O,function(){YAHOO.util.Event._addListener(O,M,X,S,N,a);});return true;}}}if(!O){return false;}if("unload"==M&&S!==this){J[J.length]=[O,M,X,S,N,a];return true;}var b=O;if(N){if(N===true){b=S;}else{b=N;}}var P=function(c){return X.call(b,YAHOO.util.Event.getEvent(c,O),S);};var Z=[O,M,X,P,b,S,N,a];var U=I.length;I[U]=Z;if(this.useLegacyEvent(O,M)){var Q=this.getLegacyIndex(O,M);if(Q==-1||O!=G[Q][0]){Q=G.length;B[O.id+M]=Q;G[Q]=[O,M,O["on"+M]];E[Q]=[];O["on"+M]=function(c){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(c),Q);};}E[Q].push(Z);}else{try{this._simpleAdd(O,M,P,a);}catch(W){this.lastError=W;this._removeListener(O,M,X,a);return false;}}return true;},addListener:function(O,Q,N,P,M){return this._addListener(O,Q,N,P,M,false);},addFocusListener:function(O,N,P,M){return this._addListener(O,K,N,P,M,true);},removeFocusListener:function(N,M){return this._removeListener(N,K,M,true);},addBlurListener:function(O,N,P,M){return this._addListener(O,L,N,P,M,true);},removeBlurListener:function(N,M){return this._removeListener(N,L,M,true);},fireLegacyEvent:function(Q,O){var S=true,M,U,T,V,R;U=E[O].slice();for(var N=0,P=U.length;N<P;++N){T=U[N];if(T&&T[this.WFN]){V=T[this.ADJ_SCOPE];R=T[this.WFN].call(V,Q);S=(S&&R);}}M=G[O];if(M&&M[2]){M[2](Q);}return S;},getLegacyIndex:function(N,O){var M=this.generateId(N)+O;if(typeof B[M]=="undefined"){return -1;}else{return B[M];}},useLegacyEvent:function(M,N){return(this.webkit&&this.webkit<419&&("click"==N||"dblclick"==N));},_removeListener:function(N,M,V,Y){var Q,T,X;if(typeof N=="string"){N=this.getEl(N);}else{if(this._isValidCollection(N)){var W=true;for(Q=N.length-1;Q>-1;Q--){W=(this._removeListener(N[Q],M,V,Y)&&W);}return W;}}if(!V||!V.call){return this.purgeElement(N,false,M);}if("unload"==M){for(Q=J.length-1;Q>-1;Q--){X=J[Q];if(X&&X[0]==N&&X[1]==M&&X[2]==V){J.splice(Q,1);return true;}}return false;}var R=null;var S=arguments[4];if("undefined"===typeof S){S=this._getCacheIndex(N,M,V);}if(S>=0){R=I[S];}if(!N||!R){return false;}if(this.useLegacyEvent(N,M)){var P=this.getLegacyIndex(N,M);var O=E[P];if(O){for(Q=0,T=O.length;Q<T;++Q){X=O[Q];if(X&&X[this.EL]==N&&X[this.TYPE]==M&&X[this.FN]==V){O.splice(Q,1);break;}}}}else{try{this._simpleRemove(N,M,R[this.WFN],Y);}catch(U){this.lastError=U;return false;}}delete I[S][this.WFN];delete I[S][this.FN];
I.splice(S,1);return true;},removeListener:function(N,O,M){return this._removeListener(N,O,M,false);},getTarget:function(O,N){var M=O.target||O.srcElement;return this.resolveTextNode(M);},resolveTextNode:function(N){try{if(N&&3==N.nodeType){return N.parentNode;}}catch(M){}return N;},getPageX:function(N){var M=N.pageX;if(!M&&0!==M){M=N.clientX||0;if(this.isIE){M+=this._getScrollLeft();}}return M;},getPageY:function(M){var N=M.pageY;if(!N&&0!==N){N=M.clientY||0;if(this.isIE){N+=this._getScrollTop();}}return N;},getXY:function(M){return[this.getPageX(M),this.getPageY(M)];},getRelatedTarget:function(N){var M=N.relatedTarget;if(!M){if(N.type=="mouseout"){M=N.toElement;}else{if(N.type=="mouseover"){M=N.fromElement;}}}return this.resolveTextNode(M);},getTime:function(O){if(!O.time){var N=new Date().getTime();try{O.time=N;}catch(M){this.lastError=M;return N;}}return O.time;},stopEvent:function(M){this.stopPropagation(M);this.preventDefault(M);},stopPropagation:function(M){if(M.stopPropagation){M.stopPropagation();}else{M.cancelBubble=true;}},preventDefault:function(M){if(M.preventDefault){M.preventDefault();}else{M.returnValue=false;}},getEvent:function(O,M){var N=O||window.event;if(!N){var P=this.getEvent.caller;while(P){N=P.arguments[0];if(N&&Event==N.constructor){break;}P=P.caller;}}return N;},getCharCode:function(N){var M=N.keyCode||N.charCode||0;if(YAHOO.env.ua.webkit&&(M in D)){M=D[M];}return M;},_getCacheIndex:function(Q,R,P){for(var O=0,N=I.length;O<N;O=O+1){var M=I[O];if(M&&M[this.FN]==P&&M[this.EL]==Q&&M[this.TYPE]==R){return O;}}return -1;},generateId:function(M){var N=M.id;if(!N){N="yuievtautoid-"+A;++A;M.id=N;}return N;},_isValidCollection:function(N){try{return(N&&typeof N!=="string"&&N.length&&!N.tagName&&!N.alert&&typeof N[0]!=="undefined");}catch(M){return false;}},elCache:{},getEl:function(M){return(typeof M==="string")?document.getElementById(M):M;},clearCache:function(){},DOMReadyEvent:new YAHOO.util.CustomEvent("DOMReady",this),_load:function(N){if(!H){H=true;var M=YAHOO.util.Event;M._ready();M._tryPreloadAttach();}},_ready:function(N){var M=YAHOO.util.Event;if(!M.DOMReady){M.DOMReady=true;M.DOMReadyEvent.fire();M._simpleRemove(document,"DOMContentLoaded",M._ready);}},_tryPreloadAttach:function(){if(F.length===0){C=0;clearInterval(this._interval);this._interval=null;return ;}if(this.locked){return ;}if(this.isIE){if(!this.DOMReady){this.startInterval();return ;}}this.locked=true;var S=!H;if(!S){S=(C>0&&F.length>0);}var R=[];var T=function(V,W){var U=V;if(W.override){if(W.override===true){U=W.obj;}else{U=W.override;}}W.fn.call(U,W.obj);};var N,M,Q,P,O=[];for(N=0,M=F.length;N<M;N=N+1){Q=F[N];if(Q){P=this.getEl(Q.id);if(P){if(Q.checkReady){if(H||P.nextSibling||!S){O.push(Q);F[N]=null;}}else{T(P,Q);F[N]=null;}}else{R.push(Q);}}}for(N=0,M=O.length;N<M;N=N+1){Q=O[N];T(this.getEl(Q.id),Q);}C--;if(S){for(N=F.length-1;N>-1;N--){Q=F[N];if(!Q||!Q.id){F.splice(N,1);}}this.startInterval();}else{clearInterval(this._interval);this._interval=null;}this.locked=false;},purgeElement:function(Q,R,T){var O=(YAHOO.lang.isString(Q))?this.getEl(Q):Q;var S=this.getListeners(O,T),P,M;if(S){for(P=S.length-1;P>-1;P--){var N=S[P];this._removeListener(O,N.type,N.fn,N.capture);}}if(R&&O&&O.childNodes){for(P=0,M=O.childNodes.length;P<M;++P){this.purgeElement(O.childNodes[P],R,T);}}},getListeners:function(O,M){var R=[],N;if(!M){N=[I,J];}else{if(M==="unload"){N=[J];}else{N=[I];}}var T=(YAHOO.lang.isString(O))?this.getEl(O):O;for(var Q=0;Q<N.length;Q=Q+1){var V=N[Q];if(V){for(var S=0,U=V.length;S<U;++S){var P=V[S];if(P&&P[this.EL]===T&&(!M||M===P[this.TYPE])){R.push({type:P[this.TYPE],fn:P[this.FN],obj:P[this.OBJ],adjust:P[this.OVERRIDE],scope:P[this.ADJ_SCOPE],capture:P[this.CAPTURE],index:S});}}}}return(R.length)?R:null;},_unload:function(S){var M=YAHOO.util.Event,P,O,N,R,Q,T=J.slice();for(P=0,R=J.length;P<R;++P){N=T[P];if(N){var U=window;if(N[M.ADJ_SCOPE]){if(N[M.ADJ_SCOPE]===true){U=N[M.UNLOAD_OBJ];}else{U=N[M.ADJ_SCOPE];}}N[M.FN].call(U,M.getEvent(S,N[M.EL]),N[M.UNLOAD_OBJ]);T[P]=null;N=null;U=null;}}J=null;if(I){for(O=I.length-1;O>-1;O--){N=I[O];if(N){M._removeListener(N[M.EL],N[M.TYPE],N[M.FN],N[M.CAPTURE],O);}}N=null;}G=null;M._simpleRemove(window,"unload",M._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var M=document.documentElement,N=document.body;if(M&&(M.scrollTop||M.scrollLeft)){return[M.scrollTop,M.scrollLeft];}else{if(N){return[N.scrollTop,N.scrollLeft];}else{return[0,0];}}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(O,P,N,M){O.addEventListener(P,N,(M));};}else{if(window.attachEvent){return function(O,P,N,M){O.attachEvent("on"+P,N);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(O,P,N,M){O.removeEventListener(P,N,(M));};}else{if(window.detachEvent){return function(N,O,M){N.detachEvent("on"+O,M);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;EU.onFocus=EU.addFocusListener;EU.onBlur=EU.addBlurListener;
/* DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
if(EU.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);var n=document.createElement("p");EU._dri=setInterval(function(){try{n.doScroll("left");clearInterval(EU._dri);EU._dri=null;EU._ready();n=null;}catch(ex){}},EU.POLL_INTERVAL);}else{if(EU.webkit&&EU.webkit<525){EU._dri=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._dri);EU._dri=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);}}EU._simpleAdd(window,"load",EU._load);EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(A,C,F,E){this.__yui_events=this.__yui_events||{};
var D=this.__yui_events[A];if(D){D.subscribe(C,F,E);}else{this.__yui_subscribers=this.__yui_subscribers||{};var B=this.__yui_subscribers;if(!B[A]){B[A]=[];}B[A].push({fn:C,obj:F,override:E});}},unsubscribe:function(C,E,G){this.__yui_events=this.__yui_events||{};var A=this.__yui_events;if(C){var F=A[C];if(F){return F.unsubscribe(E,G);}}else{var B=true;for(var D in A){if(YAHOO.lang.hasOwnProperty(A,D)){B=B&&A[D].unsubscribe(E,G);}}return B;}return false;},unsubscribeAll:function(A){return this.unsubscribe(A);},createEvent:function(G,D){this.__yui_events=this.__yui_events||{};var A=D||{};var I=this.__yui_events;if(I[G]){}else{var H=A.scope||this;var E=(A.silent);var B=new YAHOO.util.CustomEvent(G,H,E,YAHOO.util.CustomEvent.FLAT);I[G]=B;if(A.onSubscribeCallback){B.subscribeEvent.subscribe(A.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var F=this.__yui_subscribers[G];if(F){for(var C=0;C<F.length;++C){B.subscribe(F[C].fn,F[C].obj,F[C].override);}}}return I[G];},fireEvent:function(E,D,A,C){this.__yui_events=this.__yui_events||{};var G=this.__yui_events[E];if(!G){return null;}var B=[];for(var F=1;F<arguments.length;++F){B.push(arguments[F]);}return G.fire.apply(G,B);},hasEvent:function(A){if(this.__yui_events){if(this.__yui_events[A]){return true;}}return false;}};YAHOO.util.KeyListener=function(A,F,B,C){if(!A){}else{if(!F){}else{if(!B){}}}if(!C){C=YAHOO.util.KeyListener.KEYDOWN;}var D=new YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=new YAHOO.util.CustomEvent("enabled");this.disabledEvent=new YAHOO.util.CustomEvent("disabled");if(typeof A=="string"){A=document.getElementById(A);}if(typeof B=="function"){D.subscribe(B);}else{D.subscribe(B.fn,B.scope,B.correctScope);}function E(J,I){if(!F.shift){F.shift=false;}if(!F.alt){F.alt=false;}if(!F.ctrl){F.ctrl=false;}if(J.shiftKey==F.shift&&J.altKey==F.alt&&J.ctrlKey==F.ctrl){var G;if(F.keys instanceof Array){for(var H=0;H<F.keys.length;H++){G=F.keys[H];if(G==J.charCode){D.fire(J.charCode,J);break;}else{if(G==J.keyCode){D.fire(J.keyCode,J);break;}}}}else{G=F.keys;if(G==J.charCode){D.fire(J.charCode,J);}else{if(G==J.keyCode){D.fire(J.keyCode,J);}}}}}this.enable=function(){if(!this.enabled){YAHOO.util.Event.addListener(A,C,E);this.enabledEvent.fire(F);}this.enabled=true;};this.disable=function(){if(this.enabled){YAHOO.util.Event.removeListener(A,C,E);this.disabledEvent.fire(F);}this.enabled=false;};this.toString=function(){return"KeyListener ["+F.keys+"] "+A.tagName+(A.id?"["+A.id+"]":"");};};YAHOO.util.KeyListener.KEYDOWN="keydown";YAHOO.util.KeyListener.KEYUP="keyup";YAHOO.util.KeyListener.KEY={ALT:18,BACK_SPACE:8,CAPS_LOCK:20,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,META:224,NUM_LOCK:144,PAGE_DOWN:34,PAGE_UP:33,PAUSE:19,PRINTSCREEN:44,RIGHT:39,SCROLL_LOCK:145,SHIFT:16,SPACE:32,TAB:9,UP:38};YAHOO.register("event",YAHOO.util.Event,{version:"2.6.0",build:"1321"});YAHOO.register("yuiloader-dom-event", YAHOO, {version: "2.6.0", build: "1321"});

/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0
*/
(function(){var lang=YAHOO.lang,util=YAHOO.util,Ev=util.Event;util.DataSourceBase=function(oLiveData,oConfigs){if(oLiveData===null||oLiveData===undefined){return ;}this.liveData=oLiveData;this._oQueue={interval:null,conn:null,requests:[]};this.responseSchema={};if(oConfigs&&(oConfigs.constructor==Object)){for(var sConfig in oConfigs){if(sConfig){this[sConfig]=oConfigs[sConfig];}}}var maxCacheEntries=this.maxCacheEntries;if(!lang.isNumber(maxCacheEntries)||(maxCacheEntries<0)){maxCacheEntries=0;}this._aIntervals=[];this.createEvent("cacheRequestEvent");this.createEvent("cacheResponseEvent");this.createEvent("requestEvent");this.createEvent("responseEvent");this.createEvent("responseParseEvent");this.createEvent("responseCacheEvent");this.createEvent("dataErrorEvent");this.createEvent("cacheFlushEvent");var DS=util.DataSourceBase;this._sName="DataSource instance"+DS._nIndex;DS._nIndex++;};var DS=util.DataSourceBase;lang.augmentObject(DS,{TYPE_UNKNOWN:-1,TYPE_JSARRAY:0,TYPE_JSFUNCTION:1,TYPE_XHR:2,TYPE_JSON:3,TYPE_XML:4,TYPE_TEXT:5,TYPE_HTMLTABLE:6,TYPE_SCRIPTNODE:7,TYPE_LOCAL:8,ERROR_DATAINVALID:"Invalid data",ERROR_DATANULL:"Null data",_nIndex:0,_nTransactionId:0,issueCallback:function(callback,params,error,scope){if(lang.isFunction(callback)){callback.apply(scope,params);}else{if(lang.isObject(callback)){scope=callback.scope||scope||window;var callbackFunc=callback.success;if(error){callbackFunc=callback.failure;}if(callbackFunc){callbackFunc.apply(scope,params.concat([callback.argument]));}}}},parseString:function(oData){if(!lang.isValue(oData)){return null;}var string=oData+"";if(lang.isString(string)){return string;}else{return null;}},parseNumber:function(oData){var number=oData*1;if(lang.isNumber(number)){return number;}else{return null;}},convertNumber:function(oData){return DS.parseNumber(oData);},parseDate:function(oData){var date=null;if(!(oData instanceof Date)){date=new Date(oData);}else{return oData;}if(date instanceof Date){return date;}else{return null;}},convertDate:function(oData){return DS.parseDate(oData);}});DS.Parser={string:DS.parseString,number:DS.parseNumber,date:DS.parseDate};DS.prototype={_sName:null,_aCache:null,_oQueue:null,_aIntervals:null,maxCacheEntries:0,liveData:null,dataType:DS.TYPE_UNKNOWN,responseType:DS.TYPE_UNKNOWN,responseSchema:null,toString:function(){return this._sName;},getCachedResponse:function(oRequest,oCallback,oCaller){var aCache=this._aCache;if(this.maxCacheEntries>0){if(!aCache){this._aCache=[];}else{var nCacheLength=aCache.length;if(nCacheLength>0){var oResponse=null;this.fireEvent("cacheRequestEvent",{request:oRequest,callback:oCallback,caller:oCaller});for(var i=nCacheLength-1;i>=0;i--){var oCacheElem=aCache[i];if(this.isCacheHit(oRequest,oCacheElem.request)){oResponse=oCacheElem.response;this.fireEvent("cacheResponseEvent",{request:oRequest,response:oResponse,callback:oCallback,caller:oCaller});if(i<nCacheLength-1){aCache.splice(i,1);this.addToCache(oRequest,oResponse);}oResponse.cached=true;break;}}return oResponse;}}}else{if(aCache){this._aCache=null;}}return null;},isCacheHit:function(oRequest,oCachedRequest){return(oRequest===oCachedRequest);},addToCache:function(oRequest,oResponse){var aCache=this._aCache;if(!aCache){return ;}while(aCache.length>=this.maxCacheEntries){aCache.shift();}var oCacheElem={request:oRequest,response:oResponse};aCache[aCache.length]=oCacheElem;this.fireEvent("responseCacheEvent",{request:oRequest,response:oResponse});},flushCache:function(){if(this._aCache){this._aCache=[];this.fireEvent("cacheFlushEvent");}},setInterval:function(nMsec,oRequest,oCallback,oCaller){if(lang.isNumber(nMsec)&&(nMsec>=0)){var oSelf=this;var nId=setInterval(function(){oSelf.makeConnection(oRequest,oCallback,oCaller);},nMsec);this._aIntervals.push(nId);return nId;}else{}},clearInterval:function(nId){var tracker=this._aIntervals||[];for(var i=tracker.length-1;i>-1;i--){if(tracker[i]===nId){tracker.splice(i,1);clearInterval(nId);}}},clearAllIntervals:function(){var tracker=this._aIntervals||[];for(var i=tracker.length-1;i>-1;i--){clearInterval(tracker[i]);}tracker=[];},sendRequest:function(oRequest,oCallback,oCaller){var oCachedResponse=this.getCachedResponse(oRequest,oCallback,oCaller);if(oCachedResponse){DS.issueCallback(oCallback,[oRequest,oCachedResponse],false,oCaller);return null;}return this.makeConnection(oRequest,oCallback,oCaller);},makeConnection:function(oRequest,oCallback,oCaller){var tId=DS._nTransactionId++;this.fireEvent("requestEvent",{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});var oRawResponse=this.liveData;this.handleResponse(oRequest,oRawResponse,oCallback,oCaller,tId);return tId;},handleResponse:function(oRequest,oRawResponse,oCallback,oCaller,tId){this.fireEvent("responseEvent",{tId:tId,request:oRequest,response:oRawResponse,callback:oCallback,caller:oCaller});var xhr=(this.dataType==DS.TYPE_XHR)?true:false;var oParsedResponse=null;var oFullResponse=oRawResponse;if(this.responseType===DS.TYPE_UNKNOWN){var ctype=(oRawResponse&&oRawResponse.getResponseHeader)?oRawResponse.getResponseHeader["Content-Type"]:null;if(ctype){if(ctype.indexOf("text/xml")>-1){this.responseType=DS.TYPE_XML;}else{if(ctype.indexOf("application/json")>-1){this.responseType=DS.TYPE_JSON;}else{if(ctype.indexOf("text/plain")>-1){this.responseType=DS.TYPE_TEXT;}}}}else{if(YAHOO.lang.isArray(oRawResponse)){this.responseType=DS.TYPE_JSARRAY;}else{if(oRawResponse&&oRawResponse.nodeType&&oRawResponse.nodeType==9){this.responseType=DS.TYPE_XML;}else{if(oRawResponse&&oRawResponse.nodeName&&(oRawResponse.nodeName.toLowerCase()=="table")){this.responseType=DS.TYPE_HTMLTABLE;}else{if(YAHOO.lang.isObject(oRawResponse)){this.responseType=DS.TYPE_JSON;}else{if(YAHOO.lang.isString(oRawResponse)){this.responseType=DS.TYPE_TEXT;}}}}}}}switch(this.responseType){case DS.TYPE_JSARRAY:if(xhr&&oRawResponse&&oRawResponse.responseText){oFullResponse=oRawResponse.responseText;}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseArrayData(oRequest,oFullResponse);
break;case DS.TYPE_JSON:if(xhr&&oRawResponse&&oRawResponse.responseText){oFullResponse=oRawResponse.responseText;}try{if(lang.isString(oFullResponse)){if(lang.JSON){oFullResponse=lang.JSON.parse(oFullResponse);}else{if(window.JSON&&JSON.parse){oFullResponse=JSON.parse(oFullResponse);}else{if(oFullResponse.parseJSON){oFullResponse=oFullResponse.parseJSON();}else{while(oFullResponse.length>0&&(oFullResponse.charAt(0)!="{")&&(oFullResponse.charAt(0)!="[")){oFullResponse=oFullResponse.substring(1,oFullResponse.length);}if(oFullResponse.length>0){var objEnd=Math.max(oFullResponse.lastIndexOf("]"),oFullResponse.lastIndexOf("}"));oFullResponse=oFullResponse.substring(0,objEnd+1);oFullResponse=eval("("+oFullResponse+")");}}}}}}catch(e){}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseJSONData(oRequest,oFullResponse);break;case DS.TYPE_HTMLTABLE:if(xhr&&oRawResponse.responseText){oFullResponse=oRawResponse.responseText;}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseHTMLTableData(oRequest,oFullResponse);break;case DS.TYPE_XML:if(xhr&&oRawResponse.responseXML){oFullResponse=oRawResponse.responseXML;}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseXMLData(oRequest,oFullResponse);break;case DS.TYPE_TEXT:if(xhr&&lang.isString(oRawResponse.responseText)){oFullResponse=oRawResponse.responseText;}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseTextData(oRequest,oFullResponse);break;default:oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseData(oRequest,oFullResponse);break;}oParsedResponse=oParsedResponse||{};if(!oParsedResponse.results){oParsedResponse.results=[];}if(!oParsedResponse.meta){oParsedResponse.meta={};}if(oParsedResponse&&!oParsedResponse.error){oParsedResponse=this.doBeforeCallback(oRequest,oFullResponse,oParsedResponse,oCallback);this.fireEvent("responseParseEvent",{request:oRequest,response:oParsedResponse,callback:oCallback,caller:oCaller});this.addToCache(oRequest,oParsedResponse);}else{oParsedResponse.error=true;this.fireEvent("dataErrorEvent",{request:oRequest,response:oRawResponse,callback:oCallback,caller:oCaller,message:DS.ERROR_DATANULL});}oParsedResponse.tId=tId;DS.issueCallback(oCallback,[oRequest,oParsedResponse],oParsedResponse.error,oCaller);},doBeforeParseData:function(oRequest,oFullResponse,oCallback){return oFullResponse;},doBeforeCallback:function(oRequest,oFullResponse,oParsedResponse,oCallback){return oParsedResponse;},parseData:function(oRequest,oFullResponse){if(lang.isValue(oFullResponse)){var oParsedResponse={results:oFullResponse,meta:{}};return oParsedResponse;}return null;},parseArrayData:function(oRequest,oFullResponse){if(lang.isArray(oFullResponse)){var results=[],i,j,rec,field,data;if(lang.isArray(this.responseSchema.fields)){var fields=this.responseSchema.fields;for(i=fields.length-1;i>=0;--i){if(typeof fields[i]!=="object"){fields[i]={key:fields[i]};}}var parsers={},p;for(i=fields.length-1;i>=0;--i){p=(typeof fields[i].parser==="function"?fields[i].parser:DS.Parser[fields[i].parser+""])||fields[i].converter;if(p){parsers[fields[i].key]=p;}}var arrType=lang.isArray(oFullResponse[0]);for(i=oFullResponse.length-1;i>-1;i--){var oResult={};rec=oFullResponse[i];if(typeof rec==="object"){for(j=fields.length-1;j>-1;j--){field=fields[j];data=arrType?rec[j]:rec[field.key];if(parsers[field.key]){data=parsers[field.key].call(this,data);}if(data===undefined){data=null;}oResult[field.key]=data;}}else{if(lang.isString(rec)){for(j=fields.length-1;j>-1;j--){field=fields[j];data=rec;if(parsers[field.key]){data=parsers[field.key].call(this,data);}if(data===undefined){data=null;}oResult[field.key]=data;}}}results[i]=oResult;}}else{results=oFullResponse;}var oParsedResponse={results:results};return oParsedResponse;}return null;},parseTextData:function(oRequest,oFullResponse){if(lang.isString(oFullResponse)){if(lang.isString(this.responseSchema.recordDelim)&&lang.isString(this.responseSchema.fieldDelim)){var oParsedResponse={results:[]};var recDelim=this.responseSchema.recordDelim;var fieldDelim=this.responseSchema.fieldDelim;if(oFullResponse.length>0){var newLength=oFullResponse.length-recDelim.length;if(oFullResponse.substr(newLength)==recDelim){oFullResponse=oFullResponse.substr(0,newLength);}if(oFullResponse.length>0){var recordsarray=oFullResponse.split(recDelim);for(var i=0,len=recordsarray.length,recIdx=0;i<len;++i){var bError=false,sRecord=recordsarray[i];if(lang.isString(sRecord)&&(sRecord.length>0)){var fielddataarray=recordsarray[i].split(fieldDelim);var oResult={};if(lang.isArray(this.responseSchema.fields)){var fields=this.responseSchema.fields;for(var j=fields.length-1;j>-1;j--){try{var data=fielddataarray[j];if(lang.isString(data)){if(data.charAt(0)=='"'){data=data.substr(1);}if(data.charAt(data.length-1)=='"'){data=data.substr(0,data.length-1);}var field=fields[j];var key=(lang.isValue(field.key))?field.key:field;if(!field.parser&&field.converter){field.parser=field.converter;}var parser=(typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""];if(parser){data=parser.call(this,data);}if(data===undefined){data=null;}oResult[key]=data;}else{bError=true;}}catch(e){bError=true;}}}else{oResult=fielddataarray;}if(!bError){oParsedResponse.results[recIdx++]=oResult;}}}}}return oParsedResponse;}}return null;},parseXMLResult:function(result){var oResult={},schema=this.responseSchema;try{for(var m=schema.fields.length-1;m>=0;m--){var field=schema.fields[m];var key=(lang.isValue(field.key))?field.key:field;var data=null;var xmlAttr=result.attributes.getNamedItem(key);if(xmlAttr){data=xmlAttr.value;}else{var xmlNode=result.getElementsByTagName(key);if(xmlNode&&xmlNode.item(0)&&xmlNode.item(0)){data=xmlNode.item(0).firstChild.nodeValue;var item=xmlNode.item(0);data=(item.text)?item.text:(item.textContent)?item.textContent:null;
if(!data){var datapieces=[];for(var j=0,len=item.childNodes.length;j<len;j++){if(item.childNodes[j].nodeValue){datapieces[datapieces.length]=item.childNodes[j].nodeValue;}}if(datapieces.length>0){data=datapieces.join("");}}}}if(data===null){data="";}if(!field.parser&&field.converter){field.parser=field.converter;}var parser=(typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""];if(parser){data=parser.call(this,data);}if(data===undefined){data=null;}oResult[key]=data;}}catch(e){}return oResult;},parseXMLData:function(oRequest,oFullResponse){var bError=false,schema=this.responseSchema,oParsedResponse={meta:{}},xmlList=null,metaNode=schema.metaNode,metaLocators=schema.metaFields||{},i,k,loc,v;try{xmlList=(schema.resultNode)?oFullResponse.getElementsByTagName(schema.resultNode):null;metaNode=metaNode?oFullResponse.getElementsByTagName(metaNode)[0]:oFullResponse;if(metaNode){for(k in metaLocators){if(lang.hasOwnProperty(metaLocators,k)){loc=metaLocators[k];v=metaNode.getElementsByTagName(loc)[0];if(v){v=v.firstChild.nodeValue;}else{v=metaNode.attributes.getNamedItem(loc);if(v){v=v.value;}}if(lang.isValue(v)){oParsedResponse.meta[k]=v;}}}}}catch(e){}if(!xmlList||!lang.isArray(schema.fields)){bError=true;}else{oParsedResponse.results=[];for(i=xmlList.length-1;i>=0;--i){var oResult=this.parseXMLResult(xmlList.item(i));oParsedResponse.results[i]=oResult;}}if(bError){oParsedResponse.error=true;}else{}return oParsedResponse;},parseJSONData:function(oRequest,oFullResponse){var oParsedResponse={results:[],meta:{}};if(lang.isObject(oFullResponse)&&this.responseSchema.resultsList){var schema=this.responseSchema,fields=schema.fields,resultsList=oFullResponse,results=[],metaFields=schema.metaFields||{},fieldParsers=[],fieldPaths=[],simpleFields=[],bError=false,i,len,j,v,key,parser,path;var buildPath=function(needle){var path=null,keys=[],i=0;if(needle){needle=needle.replace(/\[(['"])(.*?)\1\]/g,function(x,$1,$2){keys[i]=$2;return".@"+(i++);}).replace(/\[(\d+)\]/g,function(x,$1){keys[i]=parseInt($1,10)|0;return".@"+(i++);}).replace(/^\./,"");if(!/[^\w\.\$@]/.test(needle)){path=needle.split(".");for(i=path.length-1;i>=0;--i){if(path[i].charAt(0)==="@"){path[i]=keys[parseInt(path[i].substr(1),10)];}}}else{}}return path;};var walkPath=function(path,origin){var v=origin,i=0,len=path.length;for(;i<len&&v;++i){v=v[path[i]];}return v;};path=buildPath(schema.resultsList);if(path){resultsList=walkPath(path,oFullResponse);if(resultsList===undefined){bError=true;}}else{bError=true;}if(!resultsList){resultsList=[];}if(!lang.isArray(resultsList)){resultsList=[resultsList];}if(!bError){if(schema.fields){var field;for(i=0,len=fields.length;i<len;i++){field=fields[i];key=field.key||field;parser=((typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""])||field.converter;path=buildPath(key);if(parser){fieldParsers[fieldParsers.length]={key:key,parser:parser};}if(path){if(path.length>1){fieldPaths[fieldPaths.length]={key:key,path:path};}else{simpleFields[simpleFields.length]={key:key,path:path[0]};}}else{}}for(i=resultsList.length-1;i>=0;--i){var r=resultsList[i],rec={};for(j=simpleFields.length-1;j>=0;--j){rec[simpleFields[j].key]=(r[simpleFields[j].path]!==undefined)?r[simpleFields[j].path]:r[j];}for(j=fieldPaths.length-1;j>=0;--j){rec[fieldPaths[j].key]=walkPath(fieldPaths[j].path,r);}for(j=fieldParsers.length-1;j>=0;--j){var p=fieldParsers[j].key;rec[p]=fieldParsers[j].parser(rec[p]);if(rec[p]===undefined){rec[p]=null;}}results[i]=rec;}}else{results=resultsList;}for(key in metaFields){if(lang.hasOwnProperty(metaFields,key)){path=buildPath(metaFields[key]);if(path){v=walkPath(path,oFullResponse);oParsedResponse.meta[key]=v;}}}}else{oParsedResponse.error=true;}oParsedResponse.results=results;}else{oParsedResponse.error=true;}return oParsedResponse;},parseHTMLTableData:function(oRequest,oFullResponse){var bError=false;var elTable=oFullResponse;var fields=this.responseSchema.fields;var oParsedResponse={results:[]};for(var i=0;i<elTable.tBodies.length;i++){var elTbody=elTable.tBodies[i];for(var j=elTbody.rows.length-1;j>-1;j--){var elRow=elTbody.rows[j];var oResult={};for(var k=fields.length-1;k>-1;k--){var field=fields[k];var key=(lang.isValue(field.key))?field.key:field;var data=elRow.cells[k].innerHTML;if(!field.parser&&field.converter){field.parser=field.converter;}var parser=(typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""];if(parser){data=parser.call(this,data);}if(data===undefined){data=null;}oResult[key]=data;}oParsedResponse.results[j]=oResult;}}if(bError){oParsedResponse.error=true;}else{}return oParsedResponse;}};lang.augmentProto(DS,util.EventProvider);util.LocalDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_LOCAL;if(oLiveData){if(YAHOO.lang.isArray(oLiveData)){this.responseType=DS.TYPE_JSARRAY;}else{if(oLiveData.nodeType&&oLiveData.nodeType==9){this.responseType=DS.TYPE_XML;}else{if(oLiveData.nodeName&&(oLiveData.nodeName.toLowerCase()=="table")){this.responseType=DS.TYPE_HTMLTABLE;oLiveData=oLiveData.cloneNode(true);}else{if(YAHOO.lang.isString(oLiveData)){this.responseType=DS.TYPE_TEXT;}else{if(YAHOO.lang.isObject(oLiveData)){this.responseType=DS.TYPE_JSON;}}}}}}else{oLiveData=[];this.responseType=DS.TYPE_JSARRAY;}this.constructor.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.LocalDataSource,DS);lang.augmentObject(util.LocalDataSource,DS);util.FunctionDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_JSFUNCTION;oLiveData=oLiveData||function(){};this.constructor.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.FunctionDataSource,DS,{makeConnection:function(oRequest,oCallback,oCaller){var tId=DS._nTransactionId++;this.fireEvent("requestEvent",{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});var oRawResponse=this.liveData(oRequest);if(this.responseType===DS.TYPE_UNKNOWN){if(YAHOO.lang.isArray(oRawResponse)){this.responseType=DS.TYPE_JSARRAY;}else{if(oRawResponse&&oRawResponse.nodeType&&oRawResponse.nodeType==9){this.responseType=DS.TYPE_XML;
}else{if(oRawResponse&&oRawResponse.nodeName&&(oRawResponse.nodeName.toLowerCase()=="table")){this.responseType=DS.TYPE_HTMLTABLE;}else{if(YAHOO.lang.isObject(oRawResponse)){this.responseType=DS.TYPE_JSON;}else{if(YAHOO.lang.isString(oRawResponse)){this.responseType=DS.TYPE_TEXT;}}}}}}this.handleResponse(oRequest,oRawResponse,oCallback,oCaller,tId);return tId;}});lang.augmentObject(util.FunctionDataSource,DS);util.ScriptNodeDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_SCRIPTNODE;oLiveData=oLiveData||"";this.constructor.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.ScriptNodeDataSource,DS,{getUtility:util.Get,asyncMode:"allowAll",scriptCallbackParam:"callback",generateRequestCallback:function(id){return"&"+this.scriptCallbackParam+"=YAHOO.util.ScriptNodeDataSource.callbacks["+id+"]";},makeConnection:function(oRequest,oCallback,oCaller){var tId=DS._nTransactionId++;this.fireEvent("requestEvent",{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});if(util.ScriptNodeDataSource._nPending===0){util.ScriptNodeDataSource.callbacks=[];util.ScriptNodeDataSource._nId=0;}var id=util.ScriptNodeDataSource._nId;util.ScriptNodeDataSource._nId++;var oSelf=this;util.ScriptNodeDataSource.callbacks[id]=function(oRawResponse){if((oSelf.asyncMode!=="ignoreStaleResponses")||(id===util.ScriptNodeDataSource.callbacks.length-1)){if(oSelf.responseType===DS.TYPE_UNKNOWN){if(YAHOO.lang.isArray(oRawResponse)){oSelf.responseType=DS.TYPE_JSARRAY;}else{if(oRawResponse.nodeType&&oRawResponse.nodeType==9){oSelf.responseType=DS.TYPE_XML;}else{if(oRawResponse.nodeName&&(oRawResponse.nodeName.toLowerCase()=="table")){oSelf.responseType=DS.TYPE_HTMLTABLE;}else{if(YAHOO.lang.isObject(oRawResponse)){oSelf.responseType=DS.TYPE_JSON;}else{if(YAHOO.lang.isString(oRawResponse)){oSelf.responseType=DS.TYPE_TEXT;}}}}}}oSelf.handleResponse(oRequest,oRawResponse,oCallback,oCaller,tId);}else{}delete util.ScriptNodeDataSource.callbacks[id];};util.ScriptNodeDataSource._nPending++;var sUri=this.liveData+oRequest+this.generateRequestCallback(id);this.getUtility.script(sUri,{autopurge:true,onsuccess:util.ScriptNodeDataSource._bumpPendingDown,onfail:util.ScriptNodeDataSource._bumpPendingDown});return tId;}});lang.augmentObject(util.ScriptNodeDataSource,DS);lang.augmentObject(util.ScriptNodeDataSource,{_nId:0,_nPending:0,callbacks:[]});util.XHRDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_XHR;this.connMgr=this.connMgr||util.Connect;oLiveData=oLiveData||"";this.constructor.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.XHRDataSource,DS,{connMgr:null,connXhrMode:"allowAll",connMethodPost:false,connTimeout:0,makeConnection:function(oRequest,oCallback,oCaller){var oRawResponse=null;var tId=DS._nTransactionId++;this.fireEvent("requestEvent",{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});var oSelf=this;var oConnMgr=this.connMgr;var oQueue=this._oQueue;var _xhrSuccess=function(oResponse){if(oResponse&&(this.asyncMode=="ignoreStaleResponses")&&(oResponse.tId!=oQueue.conn.tId)){return null;}else{if(!oResponse){this.fireEvent("dataErrorEvent",{request:oRequest,callback:oCallback,caller:oCaller,message:DS.ERROR_DATANULL});DS.issueCallback(oCallback,[oRequest,{error:true}],true,oCaller);return null;}else{if(this.responseType===DS.TYPE_UNKNOWN){var ctype=(oResponse.getResponseHeader)?oResponse.getResponseHeader["Content-Type"]:null;if(ctype){if(ctype.indexOf("text/xml")>-1){this.responseType=DS.TYPE_XML;}else{if(ctype.indexOf("application/json")>-1){this.responseType=DS.TYPE_JSON;}else{if(ctype.indexOf("text/plain")>-1){this.responseType=DS.TYPE_TEXT;}}}}}this.handleResponse(oRequest,oResponse,oCallback,oCaller,tId);}}};var _xhrFailure=function(oResponse){this.fireEvent("dataErrorEvent",{request:oRequest,callback:oCallback,caller:oCaller,message:DS.ERROR_DATAINVALID});if(lang.isString(this.liveData)&&lang.isString(oRequest)&&(this.liveData.lastIndexOf("?")!==this.liveData.length-1)&&(oRequest.indexOf("?")!==0)){}oResponse=oResponse||{};oResponse.error=true;DS.issueCallback(oCallback,[oRequest,oResponse],true,oCaller);return null;};var _xhrCallback={success:_xhrSuccess,failure:_xhrFailure,scope:this};if(lang.isNumber(this.connTimeout)){_xhrCallback.timeout=this.connTimeout;}if(this.connXhrMode=="cancelStaleRequests"){if(oQueue.conn){if(oConnMgr.abort){oConnMgr.abort(oQueue.conn);oQueue.conn=null;}else{}}}if(oConnMgr&&oConnMgr.asyncRequest){var sLiveData=this.liveData;var isPost=this.connMethodPost;var sMethod=(isPost)?"POST":"GET";var sUri=(isPost||!lang.isValue(oRequest))?sLiveData:sLiveData+oRequest;var sRequest=(isPost)?oRequest:null;if(this.connXhrMode!="queueRequests"){oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,_xhrCallback,sRequest);}else{if(oQueue.conn){var allRequests=oQueue.requests;allRequests.push({request:oRequest,callback:_xhrCallback});if(!oQueue.interval){oQueue.interval=setInterval(function(){if(oConnMgr.isCallInProgress(oQueue.conn)){return ;}else{if(allRequests.length>0){sUri=(isPost||!lang.isValue(allRequests[0].request))?sLiveData:sLiveData+allRequests[0].request;sRequest=(isPost)?allRequests[0].request:null;oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,allRequests[0].callback,sRequest);allRequests.shift();}else{clearInterval(oQueue.interval);oQueue.interval=null;}}},50);}}else{oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,_xhrCallback,sRequest);}}}else{DS.issueCallback(oCallback,[oRequest,{error:true}],true,oCaller);}return tId;}});lang.augmentObject(util.XHRDataSource,DS);util.DataSource=function(oLiveData,oConfigs){oConfigs=oConfigs||{};var dataType=oConfigs.dataType;if(dataType){if(dataType==DS.TYPE_LOCAL){lang.augmentObject(util.DataSource,util.LocalDataSource);return new util.LocalDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_XHR){lang.augmentObject(util.DataSource,util.XHRDataSource);return new util.XHRDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_SCRIPTNODE){lang.augmentObject(util.DataSource,util.ScriptNodeDataSource);
return new util.ScriptNodeDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_JSFUNCTION){lang.augmentObject(util.DataSource,util.FunctionDataSource);return new util.FunctionDataSource(oLiveData,oConfigs);}}}}}if(YAHOO.lang.isString(oLiveData)){lang.augmentObject(util.DataSource,util.XHRDataSource);return new util.XHRDataSource(oLiveData,oConfigs);}else{if(YAHOO.lang.isFunction(oLiveData)){lang.augmentObject(util.DataSource,util.FunctionDataSource);return new util.FunctionDataSource(oLiveData,oConfigs);}else{lang.augmentObject(util.DataSource,util.LocalDataSource);return new util.LocalDataSource(oLiveData,oConfigs);}}};lang.augmentObject(util.DataSource,DS);})();YAHOO.util.Number={format:function(B,F){F=F||{};if(!YAHOO.lang.isNumber(B)){B*=1;}if(YAHOO.lang.isNumber(B)){var D=(B<0);var J=B+"";var G=(F.decimalSeparator)?F.decimalSeparator:".";var H;if(YAHOO.lang.isNumber(F.decimalPlaces)){var I=F.decimalPlaces;var C=Math.pow(10,I);J=Math.round(B*C)/C+"";H=J.lastIndexOf(".");if(I>0){if(H<0){J+=G;H=J.length-1;}else{if(G!=="."){J=J.replace(".",G);}}while((J.length-1-H)<I){J+="0";}}}if(F.thousandsSeparator){var L=F.thousandsSeparator;H=J.lastIndexOf(G);H=(H>-1)?H:J.length;var K=J.substring(H);var A=-1;for(var E=H;E>0;E--){A++;if((A%3===0)&&(E!==H)&&(!D||(E>1))){K=L+K;}K=J.charAt(E-1)+K;}J=K;}J=(F.prefix)?F.prefix+J:J;J=(F.suffix)?J+F.suffix:J;return J;}else{return B;}}};(function(){var A=function(C,E,D){if(typeof D==="undefined"){D=10;}for(;parseInt(C,10)<D&&D>1;D/=10){C=E.toString()+C;}return C.toString();};var B={formats:{a:function(D,C){return C.a[D.getDay()];},A:function(D,C){return C.A[D.getDay()];},b:function(D,C){return C.b[D.getMonth()];},B:function(D,C){return C.B[D.getMonth()];},C:function(C){return A(parseInt(C.getFullYear()/100,10),0);},d:["getDate","0"],e:["getDate"," "],g:function(C){return A(parseInt(B.formats.G(C)%100,10),0);},G:function(E){var F=E.getFullYear();var D=parseInt(B.formats.V(E),10);var C=parseInt(B.formats.W(E),10);if(C>D){F++;}else{if(C===0&&D>=52){F--;}}return F;},H:["getHours","0"],I:function(D){var C=D.getHours()%12;return A(C===0?12:C,0);},j:function(G){var F=new Date(""+G.getFullYear()+"/1/1 GMT");var D=new Date(""+G.getFullYear()+"/"+(G.getMonth()+1)+"/"+G.getDate()+" GMT");var C=D-F;var E=parseInt(C/60000/60/24,10)+1;return A(E,0,100);},k:["getHours"," "],l:function(D){var C=D.getHours()%12;return A(C===0?12:C," ");},m:function(C){return A(C.getMonth()+1,0);},M:["getMinutes","0"],p:function(D,C){return C.p[D.getHours()>=12?1:0];},P:function(D,C){return C.P[D.getHours()>=12?1:0];},s:function(D,C){return parseInt(D.getTime()/1000,10);},S:["getSeconds","0"],u:function(C){var D=C.getDay();return D===0?7:D;},U:function(F){var C=parseInt(B.formats.j(F),10);var E=6-F.getDay();var D=parseInt((C+E)/7,10);return A(D,0);},V:function(F){var E=parseInt(B.formats.W(F),10);var C=(new Date(""+F.getFullYear()+"/1/1")).getDay();var D=E+(C>4||C<=1?0:1);if(D===53&&(new Date(""+F.getFullYear()+"/12/31")).getDay()<4){D=1;}else{if(D===0){D=B.formats.V(new Date(""+(F.getFullYear()-1)+"/12/31"));}}return A(D,0);},w:"getDay",W:function(F){var C=parseInt(B.formats.j(F),10);var E=7-B.formats.u(F);var D=parseInt((C+E)/7,10);return A(D,0,10);},y:function(C){return A(C.getFullYear()%100,0);},Y:"getFullYear",z:function(E){var D=E.getTimezoneOffset();var C=A(parseInt(Math.abs(D/60),10),0);var F=A(Math.abs(D%60),0);return(D>0?"-":"+")+C+F;},Z:function(C){var D=C.toString().replace(/^.*:\d\d( GMT[+-]\d+)? \(?([A-Za-z ]+)\)?\d*$/,"$2").replace(/[a-z ]/g,"");if(D.length>4){D=B.formats.z(C);}return D;},"%":function(C){return"%";}},aggregates:{c:"locale",D:"%m/%d/%y",F:"%Y-%m-%d",h:"%b",n:"\n",r:"locale",R:"%H:%M",t:"\t",T:"%H:%M:%S",x:"locale",X:"locale"},format:function(G,F,D){F=F||{};if(!(G instanceof Date)){return YAHOO.lang.isValue(G)?G:"";}var H=F.format||"%m/%d/%Y";if(H==="YYYY/MM/DD"){H="%Y/%m/%d";}else{if(H==="DD/MM/YYYY"){H="%d/%m/%Y";}else{if(H==="MM/DD/YYYY"){H="%m/%d/%Y";}}}D=D||"en";if(!(D in YAHOO.util.DateLocale)){if(D.replace(/-[a-zA-Z]+$/,"") in YAHOO.util.DateLocale){D=D.replace(/-[a-zA-Z]+$/,"");}else{D="en";}}var J=YAHOO.util.DateLocale[D];var C=function(L,K){var M=B.aggregates[K];return(M==="locale"?J[K]:M);};var E=function(L,K){var M=B.formats[K];if(typeof M==="string"){return G[M]();}else{if(typeof M==="function"){return M.call(G,G,J);}else{if(typeof M==="object"&&typeof M[0]==="string"){return A(G[M[0]](),M[1]);}else{return K;}}}};while(H.match(/%[cDFhnrRtTxX]/)){H=H.replace(/%([cDFhnrRtTxX])/g,C);}var I=H.replace(/%([aAbBCdegGHIjklmMpPsSuUVwWyYzZ%])/g,E);C=E=undefined;return I;}};YAHOO.namespace("YAHOO.util");YAHOO.util.Date=B;YAHOO.util.DateLocale={a:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],A:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],b:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],B:["January","February","March","April","May","June","July","August","September","October","November","December"],c:"%a %d %b %Y %T %Z",p:["AM","PM"],P:["am","pm"],r:"%I:%M:%S %p",x:"%d/%m/%y",X:"%T"};YAHOO.util.DateLocale["en"]=YAHOO.lang.merge(YAHOO.util.DateLocale,{});YAHOO.util.DateLocale["en-US"]=YAHOO.lang.merge(YAHOO.util.DateLocale["en"],{c:"%a %d %b %Y %I:%M:%S %p %Z",x:"%m/%d/%Y",X:"%I:%M:%S %p"});YAHOO.util.DateLocale["en-GB"]=YAHOO.lang.merge(YAHOO.util.DateLocale["en"],{r:"%l:%M:%S %P %Z"});YAHOO.util.DateLocale["en-AU"]=YAHOO.lang.merge(YAHOO.util.DateLocale["en"]);})();YAHOO.register("datasource",YAHOO.util.DataSource,{version:"2.6.0",build:"1321"});
/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0
*/
YAHOO.widget.DS_JSArray=YAHOO.util.LocalDataSource;YAHOO.widget.DS_JSFunction=YAHOO.util.FunctionDataSource;YAHOO.widget.DS_XHR=function(B,A,D){var C=new YAHOO.util.XHRDataSource(B,D);C._aDeprecatedSchema=A;return C;};YAHOO.widget.DS_ScriptNode=function(B,A,D){var C=new YAHOO.util.ScriptNodeDataSource(B,D);C._aDeprecatedSchema=A;return C;};YAHOO.widget.DS_XHR.TYPE_JSON=YAHOO.util.DataSourceBase.TYPE_JSON;YAHOO.widget.DS_XHR.TYPE_XML=YAHOO.util.DataSourceBase.TYPE_XML;YAHOO.widget.DS_XHR.TYPE_FLAT=YAHOO.util.DataSourceBase.TYPE_TEXT;YAHOO.widget.AutoComplete=function(G,B,J,C){if(G&&B&&J){if(J instanceof YAHOO.util.DataSourceBase){this.dataSource=J;}else{return ;}this.key=0;var D=J.responseSchema;if(J._aDeprecatedSchema){var K=J._aDeprecatedSchema;if(YAHOO.lang.isArray(K)){if((J.responseType===YAHOO.util.DataSourceBase.TYPE_JSON)||(J.responseType===YAHOO.util.DataSourceBase.TYPE_UNKNOWN)){D.resultsList=K[0];this.key=K[1];D.fields=(K.length<3)?null:K.slice(1);}else{if(J.responseType===YAHOO.util.DataSourceBase.TYPE_XML){D.resultNode=K[0];this.key=K[1];D.fields=K.slice(1);}else{if(J.responseType===YAHOO.util.DataSourceBase.TYPE_TEXT){D.recordDelim=K[0];D.fieldDelim=K[1];}}}J.responseSchema=D;}}if(YAHOO.util.Dom.inDocument(G)){if(YAHOO.lang.isString(G)){this._sName="instance"+YAHOO.widget.AutoComplete._nIndex+" "+G;this._elTextbox=document.getElementById(G);}else{this._sName=(G.id)?"instance"+YAHOO.widget.AutoComplete._nIndex+" "+G.id:"instance"+YAHOO.widget.AutoComplete._nIndex;this._elTextbox=G;}YAHOO.util.Dom.addClass(this._elTextbox,"yui-ac-input");}else{return ;}if(YAHOO.util.Dom.inDocument(B)){if(YAHOO.lang.isString(B)){this._elContainer=document.getElementById(B);}else{this._elContainer=B;}if(this._elContainer.style.display=="none"){}var E=this._elContainer.parentNode;var A=E.tagName.toLowerCase();if(A=="div"){YAHOO.util.Dom.addClass(E,"yui-ac");}else{}}else{return ;}if(this.dataSource.dataType===YAHOO.util.DataSourceBase.TYPE_LOCAL){this.applyLocalFilter=true;}if(C&&(C.constructor==Object)){for(var I in C){if(I){this[I]=C[I];}}}this._initContainerEl();this._initProps();this._initListEl();this._initContainerHelperEls();var H=this;var F=this._elTextbox;YAHOO.util.Event.addListener(F,"keyup",H._onTextboxKeyUp,H);YAHOO.util.Event.addListener(F,"keydown",H._onTextboxKeyDown,H);YAHOO.util.Event.addListener(F,"focus",H._onTextboxFocus,H);YAHOO.util.Event.addListener(F,"blur",H._onTextboxBlur,H);YAHOO.util.Event.addListener(B,"mouseover",H._onContainerMouseover,H);YAHOO.util.Event.addListener(B,"mouseout",H._onContainerMouseout,H);YAHOO.util.Event.addListener(B,"click",H._onContainerClick,H);YAHOO.util.Event.addListener(B,"scroll",H._onContainerScroll,H);YAHOO.util.Event.addListener(B,"resize",H._onContainerResize,H);YAHOO.util.Event.addListener(F,"keypress",H._onTextboxKeyPress,H);YAHOO.util.Event.addListener(window,"unload",H._onWindowUnload,H);this.textboxFocusEvent=new YAHOO.util.CustomEvent("textboxFocus",this);this.textboxKeyEvent=new YAHOO.util.CustomEvent("textboxKey",this);this.dataRequestEvent=new YAHOO.util.CustomEvent("dataRequest",this);this.dataReturnEvent=new YAHOO.util.CustomEvent("dataReturn",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.containerPopulateEvent=new YAHOO.util.CustomEvent("containerPopulate",this);this.containerExpandEvent=new YAHOO.util.CustomEvent("containerExpand",this);this.typeAheadEvent=new YAHOO.util.CustomEvent("typeAhead",this);this.itemMouseOverEvent=new YAHOO.util.CustomEvent("itemMouseOver",this);this.itemMouseOutEvent=new YAHOO.util.CustomEvent("itemMouseOut",this);this.itemArrowToEvent=new YAHOO.util.CustomEvent("itemArrowTo",this);this.itemArrowFromEvent=new YAHOO.util.CustomEvent("itemArrowFrom",this);this.itemSelectEvent=new YAHOO.util.CustomEvent("itemSelect",this);this.unmatchedItemSelectEvent=new YAHOO.util.CustomEvent("unmatchedItemSelect",this);this.selectionEnforceEvent=new YAHOO.util.CustomEvent("selectionEnforce",this);this.containerCollapseEvent=new YAHOO.util.CustomEvent("containerCollapse",this);this.textboxBlurEvent=new YAHOO.util.CustomEvent("textboxBlur",this);this.textboxChangeEvent=new YAHOO.util.CustomEvent("textboxChange",this);F.setAttribute("autocomplete","off");YAHOO.widget.AutoComplete._nIndex++;}else{}};YAHOO.widget.AutoComplete.prototype.dataSource=null;YAHOO.widget.AutoComplete.prototype.applyLocalFilter=null;YAHOO.widget.AutoComplete.prototype.queryMatchCase=false;YAHOO.widget.AutoComplete.prototype.queryMatchContains=false;YAHOO.widget.AutoComplete.prototype.queryMatchSubset=false;YAHOO.widget.AutoComplete.prototype.minQueryLength=1;YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed=10;YAHOO.widget.AutoComplete.prototype.queryDelay=0.2;YAHOO.widget.AutoComplete.prototype.typeAheadDelay=0.5;YAHOO.widget.AutoComplete.prototype.queryInterval=500;YAHOO.widget.AutoComplete.prototype.highlightClassName="yui-ac-highlight";YAHOO.widget.AutoComplete.prototype.prehighlightClassName=null;YAHOO.widget.AutoComplete.prototype.delimChar=null;YAHOO.widget.AutoComplete.prototype.autoHighlight=true;YAHOO.widget.AutoComplete.prototype.typeAhead=false;YAHOO.widget.AutoComplete.prototype.animHoriz=false;YAHOO.widget.AutoComplete.prototype.animVert=true;YAHOO.widget.AutoComplete.prototype.animSpeed=0.3;YAHOO.widget.AutoComplete.prototype.forceSelection=false;YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete=true;YAHOO.widget.AutoComplete.prototype.alwaysShowContainer=false;YAHOO.widget.AutoComplete.prototype.useIFrame=false;YAHOO.widget.AutoComplete.prototype.useShadow=false;YAHOO.widget.AutoComplete.prototype.suppressInputUpdate=false;YAHOO.widget.AutoComplete.prototype.resultTypeList=true;YAHOO.widget.AutoComplete.prototype.queryQuestionMark=true;YAHOO.widget.AutoComplete.prototype.toString=function(){return"AutoComplete "+this._sName;};YAHOO.widget.AutoComplete.prototype.getInputEl=function(){return this._elTextbox;};YAHOO.widget.AutoComplete.prototype.getContainerEl=function(){return this._elContainer;
};YAHOO.widget.AutoComplete.prototype.isFocused=function(){return(this._bFocused===null)?false:this._bFocused;};YAHOO.widget.AutoComplete.prototype.isContainerOpen=function(){return this._bContainerOpen;};YAHOO.widget.AutoComplete.prototype.getListEl=function(){return this._elList;};YAHOO.widget.AutoComplete.prototype.getListItemMatch=function(A){if(A._sResultMatch){return A._sResultMatch;}else{return null;}};YAHOO.widget.AutoComplete.prototype.getListItemData=function(A){if(A._oResultData){return A._oResultData;}else{return null;}};YAHOO.widget.AutoComplete.prototype.getListItemIndex=function(A){if(YAHOO.lang.isNumber(A._nItemIndex)){return A._nItemIndex;}else{return null;}};YAHOO.widget.AutoComplete.prototype.setHeader=function(B){if(this._elHeader){var A=this._elHeader;if(B){A.innerHTML=B;A.style.display="block";}else{A.innerHTML="";A.style.display="none";}}};YAHOO.widget.AutoComplete.prototype.setFooter=function(B){if(this._elFooter){var A=this._elFooter;if(B){A.innerHTML=B;A.style.display="block";}else{A.innerHTML="";A.style.display="none";}}};YAHOO.widget.AutoComplete.prototype.setBody=function(A){if(this._elBody){var B=this._elBody;YAHOO.util.Event.purgeElement(B,true);if(A){B.innerHTML=A;B.style.display="block";}else{B.innerHTML="";B.style.display="none";}this._elList=null;}};YAHOO.widget.AutoComplete.prototype.generateRequest=function(B){var A=this.dataSource.dataType;if(A===YAHOO.util.DataSourceBase.TYPE_XHR){if(!this.dataSource.connMethodPost){B=(this.queryQuestionMark?"?":"")+(this.dataSource.scriptQueryParam||"query")+"="+B+(this.dataSource.scriptQueryAppend?("&"+this.dataSource.scriptQueryAppend):"");}else{B=(this.dataSource.scriptQueryParam||"query")+"="+B+(this.dataSource.scriptQueryAppend?("&"+this.dataSource.scriptQueryAppend):"");}}else{if(A===YAHOO.util.DataSourceBase.TYPE_SCRIPTNODE){B="&"+(this.dataSource.scriptQueryParam||"query")+"="+B+(this.dataSource.scriptQueryAppend?("&"+this.dataSource.scriptQueryAppend):"");}}return B;};YAHOO.widget.AutoComplete.prototype.sendQuery=function(B){var A=(this.delimChar)?this._elTextbox.value+B:B;this._sendQuery(A);};YAHOO.widget.AutoComplete.prototype.collapseContainer=function(){this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype.getSubsetMatches=function(E){var D,C,A;for(var B=E.length;B>=this.minQueryLength;B--){A=this.generateRequest(E.substr(0,B));this.dataRequestEvent.fire(this,D,A);C=this.dataSource.getCachedResponse(A);if(C){return this.filterResults.apply(this.dataSource,[E,C,C,{scope:this}]);}}return null;};YAHOO.widget.AutoComplete.prototype.preparseRawResponse=function(C,B,A){var D=((this.responseStripAfter!=="")&&(B.indexOf))?B.indexOf(this.responseStripAfter):-1;if(D!=-1){B=B.substring(0,D);}return B;};YAHOO.widget.AutoComplete.prototype.filterResults=function(J,L,P,K){if(J&&J!==""){P=YAHOO.widget.AutoComplete._cloneObject(P);var H=K.scope,O=this,B=P.results,M=[],D=false,I=(O.queryMatchCase||H.queryMatchCase),A=(O.queryMatchContains||H.queryMatchContains);for(var C=B.length-1;C>=0;C--){var F=B[C];var E=null;if(YAHOO.lang.isString(F)){E=F;}else{if(YAHOO.lang.isArray(F)){E=F[0];}else{if(this.responseSchema.fields){var N=this.responseSchema.fields[0].key||this.responseSchema.fields[0];E=F[N];}else{if(this.key){E=F[this.key];}}}}if(YAHOO.lang.isString(E)){var G=(I)?E.indexOf(decodeURIComponent(J)):E.toLowerCase().indexOf(decodeURIComponent(J).toLowerCase());if((!A&&(G===0))||(A&&(G>-1))){M.unshift(F);}}}P.results=M;}else{}return P;};YAHOO.widget.AutoComplete.prototype.handleResponse=function(C,A,B){if((this instanceof YAHOO.widget.AutoComplete)&&this._sName){this._populateList(C,A,B);}};YAHOO.widget.AutoComplete.prototype.doBeforeLoadData=function(C,A,B){return true;};YAHOO.widget.AutoComplete.prototype.formatResult=function(B,D,A){var C=(A)?A:"";return C;};YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer=function(D,A,C,B){return true;};YAHOO.widget.AutoComplete.prototype.destroy=function(){var B=this.toString();var A=this._elTextbox;var D=this._elContainer;this.textboxFocusEvent.unsubscribeAll();this.textboxKeyEvent.unsubscribeAll();this.dataRequestEvent.unsubscribeAll();this.dataReturnEvent.unsubscribeAll();this.dataErrorEvent.unsubscribeAll();this.containerPopulateEvent.unsubscribeAll();this.containerExpandEvent.unsubscribeAll();this.typeAheadEvent.unsubscribeAll();this.itemMouseOverEvent.unsubscribeAll();this.itemMouseOutEvent.unsubscribeAll();this.itemArrowToEvent.unsubscribeAll();this.itemArrowFromEvent.unsubscribeAll();this.itemSelectEvent.unsubscribeAll();this.unmatchedItemSelectEvent.unsubscribeAll();this.selectionEnforceEvent.unsubscribeAll();this.containerCollapseEvent.unsubscribeAll();this.textboxBlurEvent.unsubscribeAll();this.textboxChangeEvent.unsubscribeAll();YAHOO.util.Event.purgeElement(A,true);YAHOO.util.Event.purgeElement(D,true);D.innerHTML="";for(var C in this){if(YAHOO.lang.hasOwnProperty(this,C)){this[C]=null;}}};YAHOO.widget.AutoComplete.prototype.textboxFocusEvent=null;YAHOO.widget.AutoComplete.prototype.textboxKeyEvent=null;YAHOO.widget.AutoComplete.prototype.dataRequestEvent=null;YAHOO.widget.AutoComplete.prototype.dataReturnEvent=null;YAHOO.widget.AutoComplete.prototype.dataErrorEvent=null;YAHOO.widget.AutoComplete.prototype.containerPopulateEvent=null;YAHOO.widget.AutoComplete.prototype.containerExpandEvent=null;YAHOO.widget.AutoComplete.prototype.typeAheadEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowToEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent=null;YAHOO.widget.AutoComplete.prototype.itemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent=null;YAHOO.widget.AutoComplete.prototype.containerCollapseEvent=null;YAHOO.widget.AutoComplete.prototype.textboxBlurEvent=null;YAHOO.widget.AutoComplete.prototype.textboxChangeEvent=null;YAHOO.widget.AutoComplete._nIndex=0;
YAHOO.widget.AutoComplete.prototype._sName=null;YAHOO.widget.AutoComplete.prototype._elTextbox=null;YAHOO.widget.AutoComplete.prototype._elContainer=null;YAHOO.widget.AutoComplete.prototype._elContent=null;YAHOO.widget.AutoComplete.prototype._elHeader=null;YAHOO.widget.AutoComplete.prototype._elBody=null;YAHOO.widget.AutoComplete.prototype._elFooter=null;YAHOO.widget.AutoComplete.prototype._elShadow=null;YAHOO.widget.AutoComplete.prototype._elIFrame=null;YAHOO.widget.AutoComplete.prototype._bFocused=null;YAHOO.widget.AutoComplete.prototype._oAnim=null;YAHOO.widget.AutoComplete.prototype._bContainerOpen=false;YAHOO.widget.AutoComplete.prototype._bOverContainer=false;YAHOO.widget.AutoComplete.prototype._elList=null;YAHOO.widget.AutoComplete.prototype._nDisplayedItems=0;YAHOO.widget.AutoComplete.prototype._sCurQuery=null;YAHOO.widget.AutoComplete.prototype._sPastSelections="";YAHOO.widget.AutoComplete.prototype._sInitInputValue=null;YAHOO.widget.AutoComplete.prototype._elCurListItem=null;YAHOO.widget.AutoComplete.prototype._bItemSelected=false;YAHOO.widget.AutoComplete.prototype._nKeyCode=null;YAHOO.widget.AutoComplete.prototype._nDelayID=-1;YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID=-1;YAHOO.widget.AutoComplete.prototype._iFrameSrc="javascript:false;";YAHOO.widget.AutoComplete.prototype._queryInterval=null;YAHOO.widget.AutoComplete.prototype._sLastTextboxValue=null;YAHOO.widget.AutoComplete.prototype._initProps=function(){var B=this.minQueryLength;if(!YAHOO.lang.isNumber(B)){this.minQueryLength=1;}var E=this.maxResultsDisplayed;if(!YAHOO.lang.isNumber(E)||(E<1)){this.maxResultsDisplayed=10;}var F=this.queryDelay;if(!YAHOO.lang.isNumber(F)||(F<0)){this.queryDelay=0.2;}var C=this.typeAheadDelay;if(!YAHOO.lang.isNumber(C)||(C<0)){this.typeAheadDelay=0.2;}var A=this.delimChar;if(YAHOO.lang.isString(A)&&(A.length>0)){this.delimChar=[A];}else{if(!YAHOO.lang.isArray(A)){this.delimChar=null;}}var D=this.animSpeed;if((this.animHoriz||this.animVert)&&YAHOO.util.Anim){if(!YAHOO.lang.isNumber(D)||(D<0)){this.animSpeed=0.3;}if(!this._oAnim){this._oAnim=new YAHOO.util.Anim(this._elContent,{},this.animSpeed);}else{this._oAnim.duration=this.animSpeed;}}if(this.forceSelection&&A){}};YAHOO.widget.AutoComplete.prototype._initContainerHelperEls=function(){if(this.useShadow&&!this._elShadow){var A=document.createElement("div");A.className="yui-ac-shadow";A.style.width=0;A.style.height=0;this._elShadow=this._elContainer.appendChild(A);}if(this.useIFrame&&!this._elIFrame){var B=document.createElement("iframe");B.src=this._iFrameSrc;B.frameBorder=0;B.scrolling="no";B.style.position="absolute";B.style.width=0;B.style.height=0;B.tabIndex=-1;B.style.padding=0;this._elIFrame=this._elContainer.appendChild(B);}};YAHOO.widget.AutoComplete.prototype._initContainerEl=function(){YAHOO.util.Dom.addClass(this._elContainer,"yui-ac-container");if(!this._elContent){var C=document.createElement("div");C.className="yui-ac-content";C.style.display="none";this._elContent=this._elContainer.appendChild(C);var B=document.createElement("div");B.className="yui-ac-hd";B.style.display="none";this._elHeader=this._elContent.appendChild(B);var D=document.createElement("div");D.className="yui-ac-bd";this._elBody=this._elContent.appendChild(D);var A=document.createElement("div");A.className="yui-ac-ft";A.style.display="none";this._elFooter=this._elContent.appendChild(A);}else{}};YAHOO.widget.AutoComplete.prototype._initListEl=function(){var C=this.maxResultsDisplayed;var A=this._elList||document.createElement("ul");var B;while(A.childNodes.length<C){B=document.createElement("li");B.style.display="none";B._nItemIndex=A.childNodes.length;A.appendChild(B);}if(!this._elList){var D=this._elBody;YAHOO.util.Event.purgeElement(D,true);D.innerHTML="";this._elList=D.appendChild(A);}};YAHOO.widget.AutoComplete.prototype._enableIntervalDetection=function(){var A=this;if(!A._queryInterval&&A.queryInterval){A._queryInterval=setInterval(function(){A._onInterval();},A.queryInterval);}};YAHOO.widget.AutoComplete.prototype._onInterval=function(){var A=this._elTextbox.value;var B=this._sLastTextboxValue;if(A!=B){this._sLastTextboxValue=A;this._sendQuery(A);}};YAHOO.widget.AutoComplete.prototype._clearInterval=function(){if(this._queryInterval){clearInterval(this._queryInterval);this._queryInterval=null;}};YAHOO.widget.AutoComplete.prototype._isIgnoreKey=function(A){if((A==9)||(A==13)||(A==16)||(A==17)||(A>=18&&A<=20)||(A==27)||(A>=33&&A<=35)||(A>=36&&A<=40)||(A>=44&&A<=45)||(A==229)){return true;}return false;};YAHOO.widget.AutoComplete.prototype._sendQuery=function(G){if(this.minQueryLength<0){this._toggleContainer(false);return ;}var I=(this.delimChar)?this.delimChar:null;if(I){var B=-1;for(var F=I.length-1;F>=0;F--){var D=G.lastIndexOf(I[F]);if(D>B){B=D;}}if(I[F]==" "){for(var E=I.length-1;E>=0;E--){if(G[B-1]==I[E]){B--;break;}}}if(B>-1){var H=B+1;while(G.charAt(H)==" "){H+=1;}this._sPastSelections=G.substring(0,H);G=G.substr(H);}else{this._sPastSelections="";}}if((G&&(G.length<this.minQueryLength))||(!G&&this.minQueryLength>0)){if(this._nDelayID!=-1){clearTimeout(this._nDelayID);}this._toggleContainer(false);return ;}G=encodeURIComponent(G);this._nDelayID=-1;if(this.dataSource.queryMatchSubset||this.queryMatchSubset){var A=this.getSubsetMatches(G);if(A){this.handleResponse(G,A,{query:G});return ;}}if(this.responseStripAfter){this.dataSource.doBeforeParseData=this.preparseRawResponse;}if(this.applyLocalFilter){this.dataSource.doBeforeCallback=this.filterResults;}var C=this.generateRequest(G);this.dataRequestEvent.fire(this,G,C);this.dataSource.sendRequest(C,{success:this.handleResponse,failure:this.handleResponse,scope:this,argument:{query:G}});};YAHOO.widget.AutoComplete.prototype._populateList=function(K,F,C){if(this._nTypeAheadDelayID!=-1){clearTimeout(this._nTypeAheadDelayID);}K=(C&&C.query)?C.query:K;var H=this.doBeforeLoadData(K,F,C);if(H&&!F.error){this.dataReturnEvent.fire(this,K,F.results);if(this._bFocused||(this._bFocused===null)){var M=decodeURIComponent(K);
this._sCurQuery=M;this._bItemSelected=false;var R=F.results,A=Math.min(R.length,this.maxResultsDisplayed),J=(this.dataSource.responseSchema.fields)?(this.dataSource.responseSchema.fields[0].key||this.dataSource.responseSchema.fields[0]):0;if(A>0){if(!this._elList||(this._elList.childNodes.length<A)){this._initListEl();}this._initContainerHelperEls();var I=this._elList.childNodes;for(var Q=A-1;Q>=0;Q--){var P=I[Q],E=R[Q];if(this.resultTypeList){var B=[];B[0]=(YAHOO.lang.isString(E))?E:E[J]||E[this.key];var L=this.dataSource.responseSchema.fields;if(YAHOO.lang.isArray(L)&&(L.length>1)){for(var N=1,S=L.length;N<S;N++){B[B.length]=E[L[N].key||L[N]];}}else{if(YAHOO.lang.isArray(E)){B=E;}else{if(YAHOO.lang.isString(E)){B=[E];}else{B[1]=E;}}}E=B;}P._sResultMatch=(YAHOO.lang.isString(E))?E:(YAHOO.lang.isArray(E))?E[0]:(E[J]||"");P._oResultData=E;P.innerHTML=this.formatResult(E,M,P._sResultMatch);P.style.display="";}if(A<I.length){var G;for(var O=I.length-1;O>=A;O--){G=I[O];G.style.display="none";}}this._nDisplayedItems=A;this.containerPopulateEvent.fire(this,K,R);if(this.autoHighlight){var D=this._elList.firstChild;this._toggleHighlight(D,"to");this.itemArrowToEvent.fire(this,D);this._typeAhead(D,K);}else{this._toggleHighlight(this._elCurListItem,"from");}H=this.doBeforeExpandContainer(this._elTextbox,this._elContainer,K,R);this._toggleContainer(H);}else{this._toggleContainer(false);}return ;}}else{this.dataErrorEvent.fire(this,K);}};YAHOO.widget.AutoComplete.prototype._clearSelection=function(){var C=this._elTextbox.value;var B=(this.delimChar)?this.delimChar[0]:null;var A=(B)?C.lastIndexOf(B,C.length-2):-1;if(A>-1){this._elTextbox.value=C.substring(0,A);}else{this._elTextbox.value="";}this._sPastSelections=this._elTextbox.value;this.selectionEnforceEvent.fire(this);};YAHOO.widget.AutoComplete.prototype._textMatchesOption=function(){var A=null;for(var B=this._nDisplayedItems-1;B>=0;B--){var C=this._elList.childNodes[B];var D=(""+C._sResultMatch).toLowerCase();if(D==this._sCurQuery.toLowerCase()){A=C;break;}}return(A);};YAHOO.widget.AutoComplete.prototype._typeAhead=function(B,D){if(!this.typeAhead||(this._nKeyCode==8)){return ;}var A=this,C=this._elTextbox;if(C.setSelectionRange||C.createTextRange){this._nTypeAheadDelayID=setTimeout(function(){var F=C.value.length;A._updateValue(B);var G=C.value.length;A._selectText(C,F,G);var E=C.value.substr(F,G);A.typeAheadEvent.fire(A,D,E);},(this.typeAheadDelay*1000));}};YAHOO.widget.AutoComplete.prototype._selectText=function(D,A,B){if(D.setSelectionRange){D.setSelectionRange(A,B);}else{if(D.createTextRange){var C=D.createTextRange();C.moveStart("character",A);C.moveEnd("character",B-D.value.length);C.select();}else{D.select();}}};YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers=function(D){var E=this._elContent.offsetWidth+"px";var B=this._elContent.offsetHeight+"px";if(this.useIFrame&&this._elIFrame){var C=this._elIFrame;if(D){C.style.width=E;C.style.height=B;C.style.padding="";}else{C.style.width=0;C.style.height=0;C.style.padding=0;}}if(this.useShadow&&this._elShadow){var A=this._elShadow;if(D){A.style.width=E;A.style.height=B;}else{A.style.width=0;A.style.height=0;}}};YAHOO.widget.AutoComplete.prototype._toggleContainer=function(I){var D=this._elContainer;if(this.alwaysShowContainer&&this._bContainerOpen){return ;}if(!I){this._toggleHighlight(this._elCurListItem,"from");this._nDisplayedItems=0;this._sCurQuery=null;if(!this._bContainerOpen){this._elContent.style.display="none";return ;}}var A=this._oAnim;if(A&&A.getEl()&&(this.animHoriz||this.animVert)){if(A.isAnimated()){A.stop(true);}var G=this._elContent.cloneNode(true);D.appendChild(G);G.style.top="-9000px";G.style.width="";G.style.height="";G.style.display="";var F=G.offsetWidth;var C=G.offsetHeight;var B=(this.animHoriz)?0:F;var E=(this.animVert)?0:C;A.attributes=(I)?{width:{to:F},height:{to:C}}:{width:{to:B},height:{to:E}};if(I&&!this._bContainerOpen){this._elContent.style.width=B+"px";this._elContent.style.height=E+"px";}else{this._elContent.style.width=F+"px";this._elContent.style.height=C+"px";}D.removeChild(G);G=null;var H=this;var J=function(){A.onComplete.unsubscribeAll();if(I){H._toggleContainerHelpers(true);H._bContainerOpen=I;H.containerExpandEvent.fire(H);}else{H._elContent.style.display="none";H._bContainerOpen=I;H.containerCollapseEvent.fire(H);}};this._toggleContainerHelpers(false);this._elContent.style.display="";A.onComplete.subscribe(J);A.animate();}else{if(I){this._elContent.style.display="";this._toggleContainerHelpers(true);this._bContainerOpen=I;this.containerExpandEvent.fire(this);}else{this._toggleContainerHelpers(false);this._elContent.style.display="none";this._bContainerOpen=I;this.containerCollapseEvent.fire(this);}}};YAHOO.widget.AutoComplete.prototype._toggleHighlight=function(A,C){if(A){var B=this.highlightClassName;if(this._elCurListItem){YAHOO.util.Dom.removeClass(this._elCurListItem,B);this._elCurListItem=null;}if((C=="to")&&B){YAHOO.util.Dom.addClass(A,B);this._elCurListItem=A;}}};YAHOO.widget.AutoComplete.prototype._togglePrehighlight=function(B,C){if(B==this._elCurListItem){return ;}var A=this.prehighlightClassName;if((C=="mouseover")&&A){YAHOO.util.Dom.addClass(B,A);}else{YAHOO.util.Dom.removeClass(B,A);}};YAHOO.widget.AutoComplete.prototype._updateValue=function(C){if(!this.suppressInputUpdate){var F=this._elTextbox;var E=(this.delimChar)?(this.delimChar[0]||this.delimChar):null;var B=C._sResultMatch;var D="";if(E){D=this._sPastSelections;D+=B+E;if(E!=" "){D+=" ";}}else{D=B;}F.value=D;if(F.type=="textarea"){F.scrollTop=F.scrollHeight;}var A=F.value.length;this._selectText(F,A,A);this._elCurListItem=C;}};YAHOO.widget.AutoComplete.prototype._selectItem=function(A){this._bItemSelected=true;this._updateValue(A);this._sPastSelections=this._elTextbox.value;this._clearInterval();this.itemSelectEvent.fire(this,A,A._oResultData);this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype._jumpSelection=function(){if(this._elCurListItem){this._selectItem(this._elCurListItem);
}else{this._toggleContainer(false);}};YAHOO.widget.AutoComplete.prototype._moveSelection=function(G){if(this._bContainerOpen){var F=this._elCurListItem;var E=-1;if(F){E=F._nItemIndex;}var C=(G==40)?(E+1):(E-1);if(C<-2||C>=this._nDisplayedItems){return ;}if(F){this._toggleHighlight(F,"from");this.itemArrowFromEvent.fire(this,F);}if(C==-1){if(this.delimChar){this._elTextbox.value=this._sPastSelections+this._sCurQuery;}else{this._elTextbox.value=this._sCurQuery;}return ;}if(C==-2){this._toggleContainer(false);return ;}var D=this._elList.childNodes[C];var A=this._elContent;var B=((YAHOO.util.Dom.getStyle(A,"overflow")=="auto")||(YAHOO.util.Dom.getStyle(A,"overflowY")=="auto"));if(B&&(C>-1)&&(C<this._nDisplayedItems)){if(G==40){if((D.offsetTop+D.offsetHeight)>(A.scrollTop+A.offsetHeight)){A.scrollTop=(D.offsetTop+D.offsetHeight)-A.offsetHeight;}else{if((D.offsetTop+D.offsetHeight)<A.scrollTop){A.scrollTop=D.offsetTop;}}}else{if(D.offsetTop<A.scrollTop){this._elContent.scrollTop=D.offsetTop;}else{if(D.offsetTop>(A.scrollTop+A.offsetHeight)){this._elContent.scrollTop=(D.offsetTop+D.offsetHeight)-A.offsetHeight;}}}}this._toggleHighlight(D,"to");this.itemArrowToEvent.fire(this,D);if(this.typeAhead){this._updateValue(D);}}};YAHOO.widget.AutoComplete.prototype._onContainerMouseover=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return ;case"li":if(C.prehighlightClassName){C._togglePrehighlight(D,"mouseover");}else{C._toggleHighlight(D,"to");}C.itemMouseOverEvent.fire(C,D);break;case"div":if(YAHOO.util.Dom.hasClass(D,"yui-ac-container")){C._bOverContainer=true;return ;}break;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerMouseout=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return ;case"li":if(C.prehighlightClassName){C._togglePrehighlight(D,"mouseout");}else{C._toggleHighlight(D,"from");}C.itemMouseOutEvent.fire(C,D);break;case"ul":C._toggleHighlight(C._elCurListItem,"to");break;case"div":if(YAHOO.util.Dom.hasClass(D,"yui-ac-container")){C._bOverContainer=false;return ;}break;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerClick=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return ;case"li":C._toggleHighlight(D,"to");C._selectItem(D);return ;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerScroll=function(A,B){B._elTextbox.focus();};YAHOO.widget.AutoComplete.prototype._onContainerResize=function(A,B){B._toggleContainerHelpers(B._bContainerOpen);};YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown=function(A,B){var C=A.keyCode;if(B._nTypeAheadDelayID!=-1){clearTimeout(B._nTypeAheadDelayID);}switch(C){case 9:if(!YAHOO.env.ua.opera&&(navigator.userAgent.toLowerCase().indexOf("mac")==-1)||(YAHOO.env.ua.webkit>420)){if(B._elCurListItem){if(B.delimChar&&(B._nKeyCode!=C)){if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);}}B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 13:if(!YAHOO.env.ua.opera&&(navigator.userAgent.toLowerCase().indexOf("mac")==-1)||(YAHOO.env.ua.webkit>420)){if(B._elCurListItem){if(B._nKeyCode!=C){if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);}}B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 27:B._toggleContainer(false);return ;case 39:B._jumpSelection();break;case 38:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);B._moveSelection(C);}break;case 40:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);B._moveSelection(C);}break;default:B._bItemSelected=false;B._toggleHighlight(B._elCurListItem,"from");B.textboxKeyEvent.fire(B,C);break;}if(C===18){B._enableIntervalDetection();}B._nKeyCode=C;};YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress=function(A,B){var C=A.keyCode;if(YAHOO.env.ua.opera||(navigator.userAgent.toLowerCase().indexOf("mac")!=-1)&&(YAHOO.env.ua.webkit<420)){switch(C){case 9:if(B._bContainerOpen){if(B.delimChar){YAHOO.util.Event.stopEvent(A);}if(B._elCurListItem){B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 13:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);if(B._elCurListItem){B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;default:break;}}else{if(C==229){B._enableIntervalDetection();}}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp=function(A,C){var B=this.value;C._initProps();var D=A.keyCode;if(C._isIgnoreKey(D)){return ;}if(C._nDelayID!=-1){clearTimeout(C._nDelayID);}C._nDelayID=setTimeout(function(){C._sendQuery(B);},(C.queryDelay*1000));};YAHOO.widget.AutoComplete.prototype._onTextboxFocus=function(A,B){if(!B._bFocused){B._elTextbox.setAttribute("autocomplete","off");B._bFocused=true;B._sInitInputValue=B._elTextbox.value;B.textboxFocusEvent.fire(B);}};YAHOO.widget.AutoComplete.prototype._onTextboxBlur=function(A,C){if(!C._bOverContainer||(C._nKeyCode==9)){if(!C._bItemSelected){var B=C._textMatchesOption();if(!C._bContainerOpen||(C._bContainerOpen&&(B===null))){if(C.forceSelection){C._clearSelection();}else{C.unmatchedItemSelectEvent.fire(C,C._sCurQuery);}}else{if(C.forceSelection){C._selectItem(B);}}}if(C._bContainerOpen){C._toggleContainer(false);}C._clearInterval();C._bFocused=false;if(C._sInitInputValue!==C._elTextbox.value){C.textboxChangeEvent.fire(C);}C.textboxBlurEvent.fire(C);}};YAHOO.widget.AutoComplete.prototype._onWindowUnload=function(A,B){if(B&&B._elTextbox&&B.allowBrowserAutocomplete){B._elTextbox.setAttribute("autocomplete","on");}};YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery=function(A){return this.generateRequest(A);};YAHOO.widget.AutoComplete.prototype.getListItems=function(){var C=[],B=this._elList.childNodes;for(var A=B.length-1;A>=0;A--){C[A]=B[A];}return C;};YAHOO.widget.AutoComplete._cloneObject=function(D){if(!YAHOO.lang.isValue(D)){return D;
}var F={};if(YAHOO.lang.isFunction(D)){F=D;}else{if(YAHOO.lang.isArray(D)){var E=[];for(var C=0,B=D.length;C<B;C++){E[C]=YAHOO.widget.AutoComplete._cloneObject(D[C]);}F=E;}else{if(YAHOO.lang.isObject(D)){for(var A in D){if(YAHOO.lang.hasOwnProperty(D,A)){if(YAHOO.lang.isValue(D[A])&&YAHOO.lang.isObject(D[A])||YAHOO.lang.isArray(D[A])){F[A]=YAHOO.widget.AutoComplete._cloneObject(D[A]);}else{F[A]=D[A];}}}}else{F=D;}}}return F;};YAHOO.register("autocomplete",YAHOO.widget.AutoComplete,{version:"2.6.0",build:"1321"});
/**
 * aheadWorks Co.
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the EULA
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://ecommerce.aheadworks.com/LICENSE-M1.txt
 *
 * @category   AW
 * @package    AW_Seacrhautocomplete
 * @copyright  Copyright (c) 2003-2010 aheadWorks Co. (http://www.aheadworks.com)
 * @license    http://ecommerce.aheadworks.com/LICENSE-M1.txt
 */

YAHOO.example.CustomFormatting = function(){
    var oDS = new YAHOO.util.ScriptNodeDataSource(installPath);

    oDS.responseSchema = {
        resultsList: 'ResultSet.Result',
        fields: ['content','url']
    };

    oDS.scriptCallbackParam = 'callback';


    var oAC = new YAHOO.widget.AutoComplete('myInput', 'myContainer', oDS);
    
    var lensBG = ($('myInput').getStyle('background-image'));

    oAC.generateRequest = function(sQuery) {
        return '?q=' + sQuery +'&storeId='+storeId;
    };

    oAC.maxResultsDisplayed  = maxResultsDisplayed;
    oAC.resultTypeList = false;
    oAC.queryDelay = queryDelay;
    oAC.minQueryLength = 3;
    oAC.setHeader(defaultHeader);
    oAC.setFooter(defaultFooter);
    oAC.openInNewWindow = openInNewWindow;
    oAC.emptyText = emptyText;

    oAC.formatResult = function(oResultData, sQuery, sResultMatch) {
        this.sQuery = sQuery;
        return oResultData.content;
    };

    var validateForm = function() {
        return true;
    };

    oAC.itemSelectEvent.subscribe(function(sType, aArgs) {
        document.getElementById('myInput').value = this.sQuery;
        if(aArgs[0].openInNewWindow) {
            var win = window.open(aArgs[2]['url'], '_blank', '');
            win.focus();
        }
        else window.location = aArgs[2]['url'];
    });

    oAC.textboxFocusEvent.subscribe(function() {
        var oInput = document.getElementById('myInput');
        oInput.style.backgroundImage = lensBG;
        oInput.style.backgroundPosition = 'left';
        if(oInput.value == this.emptyText) oInput.value = '';
    });

    oAC.textboxBlurEvent.subscribe(function() {
        var oInput = document.getElementById('myInput');
        if(oInput.value == '') oInput.value = this.emptyText;
    });

    oAC.dataRequestEvent.subscribe(function() {
        var myInput=document.getElementById('myInput');
        myInput.style.backgroundImage = 'url("'+preloaderImage+'")';
        myInput.style.backgroundRepeat = 'no-repeat';
        myInput.style.backgroundPosition = 'left';
        setTimeout(function getOut(){document.getElementById('myInput').style.backgroundImage = lensBG;document.getElementById('myInput').style.backgroundPosition = 'left';},10000);
    });

    oAC.dataReturnEvent.subscribe(function() {
        var myInput=document.getElementById('myInput');
        myInput.style.backgroundImage = lensBG;
        myInput.style.backgroundPosition = 'left';
    });

    oAC.dataErrorEvent.subscribe(function() {
        var myInput=document.getElementById('myInput');
        myInput.style.backgroundImage = lensBG;
         myInput.style.backgroundPosition = 'left';
    });

    return {
        oDS: oDS,
        oAC: oAC,
        validateForm: validateForm
    }
};


var Window=Class.create();Window.keepMultiModalWindow=false;Window.hasEffectLib=(typeof Effect!='undefined');Window.resizeEffectDuration=0.4;Window.prototype={initialize:function(){var id;var optionIndex=0;if(arguments.length>0){if(typeof arguments[0]=="string"){id=arguments[0];optionIndex=1;}
else
id=arguments[0]?arguments[0].id:null;}
if(!id)
id="window_"+new Date().getTime();if($(id))
alert("Window "+id+" is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor");this.options=Object.extend({className:"dialog",blurClassName:null,minWidth:100,minHeight:20,resizable:true,closable:true,minimizable:true,maximizable:true,draggable:true,userData:null,showEffect:(Window.hasEffectLib?Effect.Appear:Element.show),hideEffect:(Window.hasEffectLib?Effect.Fade:Element.hide),showEffectOptions:{},hideEffectOptions:{},effectOptions:null,parent:document.body,title:"&nbsp;",url:null,onload:Prototype.emptyFunction,width:200,height:300,opacity:1,recenterAuto:true,wiredDrag:false,closeCallback:null,destroyOnClose:false,gridX:1,gridY:1},arguments[optionIndex]||{});if(this.options.blurClassName)
this.options.focusClassName=this.options.className;if(typeof this.options.top=="undefined"&&typeof this.options.bottom=="undefined")
this.options.top=this._round(Math.random()*500,this.options.gridY);if(typeof this.options.left=="undefined"&&typeof this.options.right=="undefined")
this.options.left=this._round(Math.random()*500,this.options.gridX);if(this.options.effectOptions){Object.extend(this.options.hideEffectOptions,this.options.effectOptions);Object.extend(this.options.showEffectOptions,this.options.effectOptions);if(this.options.showEffect==Element.Appear)
this.options.showEffectOptions.to=this.options.opacity;}
if(Window.hasEffectLib){if(this.options.showEffect==Effect.Appear)
this.options.showEffectOptions.to=this.options.opacity;if(this.options.hideEffect==Effect.Fade)
this.options.hideEffectOptions.from=this.options.opacity;}
if(this.options.hideEffect==Element.hide)
this.options.hideEffect=function(){Element.hide(this.element);if(this.options.destroyOnClose)this.destroy();}.bind(this)
if(this.options.parent!=document.body)
this.options.parent=$(this.options.parent);this.element=this._createWindow(id);this.element.win=this;this.eventMouseDown=this._initDrag.bindAsEventListener(this);this.eventMouseUp=this._endDrag.bindAsEventListener(this);this.eventMouseMove=this._updateDrag.bindAsEventListener(this);this.eventOnLoad=this._getWindowBorderSize.bindAsEventListener(this);this.eventMouseDownContent=this.toFront.bindAsEventListener(this);this.eventResize=this._recenter.bindAsEventListener(this);this.topbar=$(this.element.id+"_top");this.bottombar=$(this.element.id+"_bottom");this.content=$(this.element.id+"_content");Event.observe(this.topbar,"mousedown",this.eventMouseDown);Event.observe(this.bottombar,"mousedown",this.eventMouseDown);Event.observe(this.content,"mousedown",this.eventMouseDownContent);Event.observe(window,"load",this.eventOnLoad);Event.observe(window,"resize",this.eventResize);Event.observe(window,"scroll",this.eventResize);Event.observe(this.options.parent,"scroll",this.eventResize);if(this.options.draggable){var that=this;[this.topbar,this.topbar.up().previous(),this.topbar.up().next()].each(function(element){element.observe("mousedown",that.eventMouseDown);element.addClassName("top_draggable");});[this.bottombar.up(),this.bottombar.up().previous(),this.bottombar.up().next()].each(function(element){element.observe("mousedown",that.eventMouseDown);element.addClassName("bottom_draggable");});}
if(this.options.resizable){this.sizer=$(this.element.id+"_sizer");Event.observe(this.sizer,"mousedown",this.eventMouseDown);}
this.useLeft=null;this.useTop=null;if(typeof this.options.left!="undefined"){this.element.setStyle({left:parseFloat(this.options.left)+'px'});this.useLeft=true;}
else{this.element.setStyle({right:parseFloat(this.options.right)+'px'});this.useLeft=false;}
if(typeof this.options.top!="undefined"){this.element.setStyle({top:parseFloat(this.options.top)+'px'});this.useTop=true;}
else{this.element.setStyle({bottom:parseFloat(this.options.bottom)+'px'});this.useTop=false;}
this.storedLocation=null;this.setOpacity(this.options.opacity);if(this.options.zIndex)
this.setZIndex(this.options.zIndex)
if(this.options.destroyOnClose)
this.setDestroyOnClose(true);this._getWindowBorderSize();this.width=this.options.width;this.height=this.options.height;this.visible=false;this.constraint=false;this.constraintPad={top:0,left:0,bottom:0,right:0};if(this.width&&this.height)
this.setSize(this.options.width,this.options.height);this.setTitle(this.options.title)
Windows.register(this);},destroy:function(){this._notify("onDestroy");Event.stopObserving(this.topbar,"mousedown",this.eventMouseDown);Event.stopObserving(this.bottombar,"mousedown",this.eventMouseDown);Event.stopObserving(this.content,"mousedown",this.eventMouseDownContent);Event.stopObserving(window,"load",this.eventOnLoad);Event.stopObserving(window,"resize",this.eventResize);Event.stopObserving(window,"scroll",this.eventResize);Event.stopObserving(this.content,"load",this.options.onload);if(this._oldParent){var content=this.getContent();var originalContent=null;for(var i=0;i<content.childNodes.length;i++){originalContent=content.childNodes[i];if(originalContent.nodeType==1)
break;originalContent=null;}
if(originalContent)
this._oldParent.appendChild(originalContent);this._oldParent=null;}
if(this.sizer)
Event.stopObserving(this.sizer,"mousedown",this.eventMouseDown);if(this.options.url)
this.content.src=null
if(this.iefix)
Element.remove(this.iefix);Element.remove(this.element);Windows.unregister(this);},setCloseCallback:function(callback){this.options.closeCallback=callback;},getContent:function(){return this.content;},setContent:function(id,autoresize,autoposition){var element=$(id);if(null==element)throw"Unable to find element '"+id+"' in DOM";this._oldParent=element.parentNode;var d=null;var p=null;if(autoresize)
d=Element.getDimensions(element);if(autoposition)
p=Position.cumulativeOffset(element);var content=this.getContent();this.setHTMLContent("");content=this.getContent();content.appendChild(element);element.show();if(autoresize)
this.setSize(d.width,d.height);if(autoposition)
this.setLocation(p[1]-this.heightN,p[0]-this.widthW);},setHTMLContent:function(html){if(this.options.url){this.content.src=null;this.options.url=null;var content="<div id=\""+this.getId()+"_content\" class=\""+this.options.className+"_content\"> </div>";$(this.getId()+"_table_content").innerHTML=content;this.content=$(this.element.id+"_content");}
this.getContent().innerHTML=html;},setAjaxContent:function(url,options,showCentered,showModal){this.showFunction=showCentered?"showCenter":"show";this.showModal=showModal||false;options=options||{};this.setHTMLContent("");this.onComplete=options.onComplete;if(!this._onCompleteHandler)
this._onCompleteHandler=this._setAjaxContent.bind(this);options.onComplete=this._onCompleteHandler;new Ajax.Request(url,options);options.onComplete=this.onComplete;},_setAjaxContent:function(originalRequest){Element.update(this.getContent(),originalRequest.responseText);if(this.onComplete)
this.onComplete(originalRequest);this.onComplete=null;this[this.showFunction](this.showModal)},setURL:function(url){if(this.options.url)
this.content.src=null;this.options.url=url;var content="<iframe frameborder='0' name='"+this.getId()+"_content'  id='"+this.getId()+"_content' src='"+url+"' width='"+this.width+"' height='"+this.height+"'> </iframe>";$(this.getId()+"_table_content").innerHTML=content;this.content=$(this.element.id+"_content");},getURL:function(){return this.options.url?this.options.url:null;},refresh:function(){if(this.options.url)
$(this.element.getAttribute('id')+'_content').src=this.options.url;},setCookie:function(name,expires,path,domain,secure){name=name||this.element.id;this.cookie=[name,expires,path,domain,secure];var value=WindowUtilities.getCookie(name)
if(value){var values=value.split(',');var x=values[0].split(':');var y=values[1].split(':');var w=parseFloat(values[2]),h=parseFloat(values[3]);var mini=values[4];var maxi=values[5];this.setSize(w,h);if(mini=="true")
this.doMinimize=true;else if(maxi=="true")
this.doMaximize=true;this.useLeft=x[0]=="l";this.useTop=y[0]=="t";this.element.setStyle(this.useLeft?{left:x[1]}:{right:x[1]});this.element.setStyle(this.useTop?{top:y[1]}:{bottom:y[1]});}},getId:function(){return this.element.id;},setDestroyOnClose:function(){this.options.destroyOnClose=true;},setConstraint:function(bool,padding){this.constraint=bool;this.constraintPad=Object.extend(this.constraintPad,padding||{});if(this.useTop&&this.useLeft)
this.setLocation(parseFloat(this.element.style.top),parseFloat(this.element.style.left));},_initDrag:function(event){if(Event.element(event)==this.sizer&&this.isMinimized())
return;if(Event.element(event)!=this.sizer&&this.isMaximized())
return;if(Prototype.Browser.IE&&this.heightN==0)
this._getWindowBorderSize();this.pointer=[this._round(Event.pointerX(event),this.options.gridX),this._round(Event.pointerY(event),this.options.gridY)];if(this.options.wiredDrag)
this.currentDrag=this._createWiredElement();else
this.currentDrag=this.element;if(Event.element(event)==this.sizer){this.doResize=true;this.widthOrg=this.width;this.heightOrg=this.height;this.bottomOrg=parseFloat(this.element.getStyle('bottom'));this.rightOrg=parseFloat(this.element.getStyle('right'));this._notify("onStartResize");}
else{this.doResize=false;var closeButton=$(this.getId()+'_close');if(closeButton&&Position.within(closeButton,this.pointer[0],this.pointer[1])){this.currentDrag=null;return;}
this.toFront();if(!this.options.draggable)
return;this._notify("onStartMove");}
Event.observe(document,"mouseup",this.eventMouseUp,false);Event.observe(document,"mousemove",this.eventMouseMove,false);WindowUtilities.disableScreen('__invisible__','__invisible__',this.overlayOpacity);document.body.ondrag=function(){return false;};document.body.onselectstart=function(){return false;};this.currentDrag.show();Event.stop(event);},_round:function(val,round){return round==1?val:val=Math.floor(val/round)*round;},_updateDrag:function(event){var pointer=[this._round(Event.pointerX(event),this.options.gridX),this._round(Event.pointerY(event),this.options.gridY)];var dx=pointer[0]-this.pointer[0];var dy=pointer[1]-this.pointer[1];if(this.doResize){var w=this.widthOrg+dx;var h=this.heightOrg+dy;dx=this.width-this.widthOrg
dy=this.height-this.heightOrg
if(this.useLeft)
w=this._updateWidthConstraint(w)
else
this.currentDrag.setStyle({right:(this.rightOrg-dx)+'px'});if(this.useTop)
h=this._updateHeightConstraint(h)
else
this.currentDrag.setStyle({bottom:(this.bottomOrg-dy)+'px'});this.setSize(w,h);this._notify("onResize");}
else{this.pointer=pointer;if(this.useLeft){var left=parseFloat(this.currentDrag.getStyle('left'))+dx;var newLeft=this._updateLeftConstraint(left);this.pointer[0]+=newLeft-left;this.currentDrag.setStyle({left:newLeft+'px'});}
else
this.currentDrag.setStyle({right:parseFloat(this.currentDrag.getStyle('right'))-dx+'px'});if(this.useTop){var top=parseFloat(this.currentDrag.getStyle('top'))+dy;var newTop=this._updateTopConstraint(top);this.pointer[1]+=newTop-top;this.currentDrag.setStyle({top:newTop+'px'});}
else
this.currentDrag.setStyle({bottom:parseFloat(this.currentDrag.getStyle('bottom'))-dy+'px'});this._notify("onMove");}
if(this.iefix)
this._fixIEOverlapping();this._removeStoreLocation();Event.stop(event);},_endDrag:function(event){WindowUtilities.enableScreen('__invisible__');if(this.doResize)
this._notify("onEndResize");else
this._notify("onEndMove");Event.stopObserving(document,"mouseup",this.eventMouseUp,false);Event.stopObserving(document,"mousemove",this.eventMouseMove,false);Event.stop(event);this._hideWiredElement();this._saveCookie()
document.body.ondrag=null;document.body.onselectstart=null;},_updateLeftConstraint:function(left){if(this.constraint&&this.useLeft&&this.useTop){var width=this.options.parent==document.body?WindowUtilities.getPageSize().windowWidth:this.options.parent.getDimensions().width;if(left<this.constraintPad.left)
left=this.constraintPad.left;if(left+this.width+this.widthE+this.widthW>width-this.constraintPad.right)
left=width-this.constraintPad.right-this.width-this.widthE-this.widthW;}
return left;},_updateTopConstraint:function(top){if(this.constraint&&this.useLeft&&this.useTop){var height=this.options.parent==document.body?WindowUtilities.getPageSize().windowHeight:this.options.parent.getDimensions().height;var h=this.height+this.heightN+this.heightS;if(top<this.constraintPad.top)
top=this.constraintPad.top;if(top+h>height-this.constraintPad.bottom)
top=height-this.constraintPad.bottom-h;}
return top;},_updateWidthConstraint:function(w){if(this.constraint&&this.useLeft&&this.useTop){var width=this.options.parent==document.body?WindowUtilities.getPageSize().windowWidth:this.options.parent.getDimensions().width;var left=parseFloat(this.element.getStyle("left"));if(left+w+this.widthE+this.widthW>width-this.constraintPad.right)
w=width-this.constraintPad.right-left-this.widthE-this.widthW;}
return w;},_updateHeightConstraint:function(h){if(this.constraint&&this.useLeft&&this.useTop){var height=this.options.parent==document.body?WindowUtilities.getPageSize().windowHeight:this.options.parent.getDimensions().height;var top=parseFloat(this.element.getStyle("top"));if(top+h+this.heightN+this.heightS>height-this.constraintPad.bottom)
h=height-this.constraintPad.bottom-top-this.heightN-this.heightS;}
return h;},_createWindow:function(id){var className=this.options.className;var win=document.createElement("div");win.setAttribute('id',id);win.className="dialog";var content;if(this.options.url)
content="<iframe frameborder=\"0\" name=\""+id+"_content\"  id=\""+id+"_content\" src=\""+this.options.url+"\"> </iframe>";else
content="<div id=\""+id+"_content\" class=\""+className+"_content\"> </div>";var closeDiv=this.options.closable?"<div class='"+className+"_close' id='"+id+"_close' onclick='Windows.close(\""+id+"\", event)'> </div>":"";var minDiv=this.options.minimizable?"<div class='"+className+"_minimize' id='"+id+"_minimize' onclick='Windows.minimize(\""+id+"\", event)'> </div>":"";var maxDiv=this.options.maximizable?"<div class='"+className+"_maximize' id='"+id+"_maximize' onclick='Windows.maximize(\""+id+"\", event)'> </div>":"";var seAttributes=this.options.resizable?"class='"+className+"_sizer' id='"+id+"_sizer'":"class='"+className+"_se'";var blank="../themes/default/blank.gif";win.innerHTML=closeDiv+minDiv+maxDiv+"\
      <table id='"+id+"_row1' class=\"top table_window\">\
        <tr>\
          <td class='"+className+"_nw'></td>\
          <td class='"+className+"_n'><div id='"+id+"_top' class='"+className+"_title title_window'>"+this.options.title+"</div></td>\
          <td class='"+className+"_ne'></td>\
        </tr>\
      </table>\
      <table id='"+id+"_row2' class=\"mid table_window\">\
        <tr>\
          <td class='"+className+"_w'></td>\
            <td id='"+id+"_table_content' class='"+className+"_content' valign='top'>"+content+"</td>\
          <td class='"+className+"_e'></td>\
        </tr>\
      </table>\
        <table id='"+id+"_row3' class=\"bot table_window\">\
        <tr>\
          <td class='"+className+"_sw'></td>\
            <td class='"+className+"_s'><div id='"+id+"_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td>\
            <td "+seAttributes+"></td>\
        </tr>\
      </table>\
    ";Element.hide(win);this.options.parent.insertBefore(win,this.options.parent.firstChild);Event.observe($(id+"_content"),"load",this.options.onload);return win;},changeClassName:function(newClassName){var className=this.options.className;var id=this.getId();$A(["_close","_minimize","_maximize","_sizer","_content"]).each(function(value){this._toggleClassName($(id+value),className+value,newClassName+value)}.bind(this));this._toggleClassName($(id+"_top"),className+"_title",newClassName+"_title");$$("#"+id+" td").each(function(td){td.className=td.className.sub(className,newClassName);});this.options.className=newClassName;},_toggleClassName:function(element,oldClassName,newClassName){if(element){element.removeClassName(oldClassName);element.addClassName(newClassName);}},setLocation:function(top,left){top=this._updateTopConstraint(top);left=this._updateLeftConstraint(left);var e=this.currentDrag||this.element;e.setStyle({top:top+'px'});e.setStyle({left:left+'px'});this.useLeft=true;this.useTop=true;},getLocation:function(){var location={};if(this.useTop)
location=Object.extend(location,{top:this.element.getStyle("top")});else
location=Object.extend(location,{bottom:this.element.getStyle("bottom")});if(this.useLeft)
location=Object.extend(location,{left:this.element.getStyle("left")});else
location=Object.extend(location,{right:this.element.getStyle("right")});return location;},getSize:function(){return{width:this.width,height:this.height};},setSize:function(width,height,useEffect){width=parseFloat(width);height=parseFloat(height);if(!this.minimized&&width<this.options.minWidth)
width=this.options.minWidth;if(!this.minimized&&height<this.options.minHeight)
height=this.options.minHeight;if(this.options.maxHeight&&height>this.options.maxHeight)
height=this.options.maxHeight;if(this.options.maxWidth&&width>this.options.maxWidth)
width=this.options.maxWidth;if(this.useTop&&this.useLeft&&Window.hasEffectLib&&Effect.ResizeWindow&&useEffect){new Effect.ResizeWindow(this,null,null,width,height,{duration:Window.resizeEffectDuration});}else{this.width=width;this.height=height;var e=this.currentDrag?this.currentDrag:this.element;e.setStyle({width:width+this.widthW+this.widthE+"px"})
e.setStyle({height:height+this.heightN+this.heightS+"px"})
if(!this.currentDrag||this.currentDrag==this.element){var content=$(this.element.id+'_content');content.setStyle({height:height+'px'});content.setStyle({width:width+'px'});}}},updateHeight:function(){this.setSize(this.width,this.content.scrollHeight,true);},updateWidth:function(){this.setSize(this.content.scrollWidth,this.height,true);},toFront:function(){if(this.element.style.zIndex<Windows.maxZIndex)
this.setZIndex(Windows.maxZIndex+1);if(this.iefix)
this._fixIEOverlapping();},getBounds:function(insideOnly){if(!this.width||!this.height||!this.visible)
this.computeBounds();var w=this.width;var h=this.height;if(!insideOnly){w+=this.widthW+this.widthE;h+=this.heightN+this.heightS;}
var bounds=Object.extend(this.getLocation(),{width:w+"px",height:h+"px"});return bounds;},computeBounds:function(){if(!this.width||!this.height){var size=WindowUtilities._computeSize(this.content.innerHTML,this.content.id,this.width,this.height,0,this.options.className)
if(this.height)
this.width=size+5
else
this.height=size+5}
this.setSize(this.width,this.height);if(this.centered)
this._center(this.centerTop,this.centerLeft);},show:function(modal){this.visible=true;if(modal){if(typeof this.overlayOpacity=="undefined"){var that=this;setTimeout(function(){that.show(modal)},10);return;}
Windows.addModalWindow(this);this.modal=true;this.setZIndex(Windows.maxZIndex+1);Windows.unsetOverflow(this);}
else
if(!this.element.style.zIndex)
this.setZIndex(Windows.maxZIndex+1);if(this.oldStyle)
this.getContent().setStyle({overflow:this.oldStyle});this.computeBounds();this._notify("onBeforeShow");if(this.options.showEffect!=Element.show&&this.options.showEffectOptions)
this.options.showEffect(this.element,this.options.showEffectOptions);else
this.options.showEffect(this.element);this._checkIEOverlapping();WindowUtilities.focusedWindow=this
this._notify("onShow");},showCenter:function(modal,top,left){this.centered=true;this.centerTop=top;this.centerLeft=left;this.show(modal);},isVisible:function(){return this.visible;},_center:function(top,left){var windowScroll=WindowUtilities.getWindowScroll(this.options.parent);var pageSize=WindowUtilities.getPageSize(this.options.parent);if(typeof top=="undefined")
top=(pageSize.windowHeight-(this.height+this.heightN+this.heightS))/2;top+=windowScroll.top
if(typeof left=="undefined")
left=(pageSize.windowWidth-(this.width+this.widthW+this.widthE))/2;left+=windowScroll.left
this.setLocation(top,left);this.toFront();},_recenter:function(event){if(this.centered){var pageSize=WindowUtilities.getPageSize(this.options.parent);var windowScroll=WindowUtilities.getWindowScroll(this.options.parent);if(this.pageSize&&this.pageSize.windowWidth==pageSize.windowWidth&&this.pageSize.windowHeight==pageSize.windowHeight&&this.windowScroll.left==windowScroll.left&&this.windowScroll.top==windowScroll.top)
return;this.pageSize=pageSize;this.windowScroll=windowScroll;if($('overlay_modal'))
$('overlay_modal').setStyle({height:(pageSize.pageHeight+'px')});if(this.options.recenterAuto)
this._center(this.centerTop,this.centerLeft);}},hide:function(){this.visible=false;if(this.modal){Windows.removeModalWindow(this);Windows.resetOverflow();}
this.oldStyle=this.getContent().getStyle('overflow')||"auto"
this.getContent().setStyle({overflow:"hidden"});this.options.hideEffect(this.element,this.options.hideEffectOptions);if(this.iefix)
this.iefix.hide();if(!this.doNotNotifyHide)
this._notify("onHide");},close:function(){if(this.visible){if(this.options.closeCallback&&!this.options.closeCallback(this))
return;if(this.options.destroyOnClose){var destroyFunc=this.destroy.bind(this);if(this.options.hideEffectOptions.afterFinish){var func=this.options.hideEffectOptions.afterFinish;this.options.hideEffectOptions.afterFinish=function(){func();destroyFunc()}}
else
this.options.hideEffectOptions.afterFinish=function(){destroyFunc()}}
Windows.updateFocusedWindow();this.doNotNotifyHide=true;this.hide();this.doNotNotifyHide=false;this._notify("onClose");}},minimize:function(){if(this.resizing)
return;var r2=$(this.getId()+"_row2");if(!this.minimized){this.minimized=true;var dh=r2.getDimensions().height;this.r2Height=dh;var h=this.element.getHeight()-dh;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,null,null,null,this.height-dh,{duration:Window.resizeEffectDuration});}else{this.height-=dh;this.element.setStyle({height:h+"px"});r2.hide();}
if(!this.useTop){var bottom=parseFloat(this.element.getStyle('bottom'));this.element.setStyle({bottom:(bottom+dh)+'px'});}}
else{this.minimized=false;var dh=this.r2Height;this.r2Height=null;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,null,null,null,this.height+dh,{duration:Window.resizeEffectDuration});}
else{var h=this.element.getHeight()+dh;this.height+=dh;this.element.setStyle({height:h+"px"})
r2.show();}
if(!this.useTop){var bottom=parseFloat(this.element.getStyle('bottom'));this.element.setStyle({bottom:(bottom-dh)+'px'});}
this.toFront();}
this._notify("onMinimize");this._saveCookie()},maximize:function(){if(this.isMinimized()||this.resizing)
return;if(Prototype.Browser.IE&&this.heightN==0)
this._getWindowBorderSize();if(this.storedLocation!=null){this._restoreLocation();if(this.iefix)
this.iefix.hide();}
else{this._storeLocation();Windows.unsetOverflow(this);var windowScroll=WindowUtilities.getWindowScroll(this.options.parent);var pageSize=WindowUtilities.getPageSize(this.options.parent);var left=windowScroll.left;var top=windowScroll.top;if(this.options.parent!=document.body){windowScroll={top:0,left:0,bottom:0,right:0};var dim=this.options.parent.getDimensions();pageSize.windowWidth=dim.width;pageSize.windowHeight=dim.height;top=0;left=0;}
if(this.constraint){pageSize.windowWidth-=Math.max(0,this.constraintPad.left)+Math.max(0,this.constraintPad.right);pageSize.windowHeight-=Math.max(0,this.constraintPad.top)+Math.max(0,this.constraintPad.bottom);left+=Math.max(0,this.constraintPad.left);top+=Math.max(0,this.constraintPad.top);}
var width=pageSize.windowWidth-this.widthW-this.widthE;var height=pageSize.windowHeight-this.heightN-this.heightS;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,top,left,width,height,{duration:Window.resizeEffectDuration});}
else{this.setSize(width,height);this.element.setStyle(this.useLeft?{left:left}:{right:left});this.element.setStyle(this.useTop?{top:top}:{bottom:top});}
this.toFront();if(this.iefix)
this._fixIEOverlapping();}
this._notify("onMaximize");this._saveCookie()},isMinimized:function(){return this.minimized;},isMaximized:function(){return(this.storedLocation!=null);},setOpacity:function(opacity){if(Element.setOpacity)
Element.setOpacity(this.element,opacity);},setZIndex:function(zindex){this.element.setStyle({zIndex:zindex});Windows.updateZindex(zindex,this);},setTitle:function(newTitle){if(!newTitle||newTitle=="")
newTitle="&nbsp;";Element.update(this.element.id+'_top',newTitle);},getTitle:function(){return $(this.element.id+'_top').innerHTML;},setStatusBar:function(element){var statusBar=$(this.getId()+"_bottom");if(typeof(element)=="object"){if(this.bottombar.firstChild)
this.bottombar.replaceChild(element,this.bottombar.firstChild);else
this.bottombar.appendChild(element);}
else
this.bottombar.innerHTML=element;},_checkIEOverlapping:function(){if(!this.iefix&&(navigator.appVersion.indexOf('MSIE')>0)&&(navigator.userAgent.indexOf('Opera')<0)&&(this.element.getStyle('position')=='absolute')){new Insertion.After(this.element.id,'<iframe id="'+this.element.id+'_iefix" '+'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" '+'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix=$(this.element.id+'_iefix');}
if(this.iefix)
setTimeout(this._fixIEOverlapping.bind(this),50);},_fixIEOverlapping:function(){Position.clone(this.element,this.iefix);this.iefix.style.zIndex=this.element.style.zIndex-1;this.iefix.show();},_getWindowBorderSize:function(event){var div=this._createHiddenDiv(this.options.className+"_n")
this.heightN=Element.getDimensions(div).height;div.parentNode.removeChild(div)
var div=this._createHiddenDiv(this.options.className+"_s")
this.heightS=Element.getDimensions(div).height;div.parentNode.removeChild(div)
var div=this._createHiddenDiv(this.options.className+"_e")
this.widthE=Element.getDimensions(div).width;div.parentNode.removeChild(div)
var div=this._createHiddenDiv(this.options.className+"_w")
this.widthW=Element.getDimensions(div).width;div.parentNode.removeChild(div);var div=document.createElement("div");div.className="overlay_"+this.options.className;document.body.appendChild(div);var that=this;setTimeout(function(){that.overlayOpacity=($(div).getStyle("opacity"));div.parentNode.removeChild(div);},10);if(Prototype.Browser.IE){this.heightS=$(this.getId()+"_row3").getDimensions().height;this.heightN=$(this.getId()+"_row1").getDimensions().height;}
if(Prototype.Browser.WebKit&&Prototype.Browser.WebKitVersion<420)
this.setSize(this.width,this.height);if(this.doMaximize)
this.maximize();if(this.doMinimize)
this.minimize();},_createHiddenDiv:function(className){var objBody=document.body;var win=document.createElement("div");win.setAttribute('id',this.element.id+"_tmp");win.className=className;win.style.display='none';win.innerHTML='';objBody.insertBefore(win,objBody.firstChild);return win;},_storeLocation:function(){if(this.storedLocation==null){this.storedLocation={useTop:this.useTop,useLeft:this.useLeft,top:this.element.getStyle('top'),bottom:this.element.getStyle('bottom'),left:this.element.getStyle('left'),right:this.element.getStyle('right'),width:this.width,height:this.height};}},_restoreLocation:function(){if(this.storedLocation!=null){this.useLeft=this.storedLocation.useLeft;this.useTop=this.storedLocation.useTop;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow)
new Effect.ResizeWindow(this,this.storedLocation.top,this.storedLocation.left,this.storedLocation.width,this.storedLocation.height,{duration:Window.resizeEffectDuration});else{this.element.setStyle(this.useLeft?{left:this.storedLocation.left}:{right:this.storedLocation.right});this.element.setStyle(this.useTop?{top:this.storedLocation.top}:{bottom:this.storedLocation.bottom});this.setSize(this.storedLocation.width,this.storedLocation.height);}
Windows.resetOverflow();this._removeStoreLocation();}},_removeStoreLocation:function(){this.storedLocation=null;},_saveCookie:function(){if(this.cookie){var value="";if(this.useLeft)
value+="l:"+(this.storedLocation?this.storedLocation.left:this.element.getStyle('left'))
else
value+="r:"+(this.storedLocation?this.storedLocation.right:this.element.getStyle('right'))
if(this.useTop)
value+=",t:"+(this.storedLocation?this.storedLocation.top:this.element.getStyle('top'))
else
value+=",b:"+(this.storedLocation?this.storedLocation.bottom:this.element.getStyle('bottom'))
value+=","+(this.storedLocation?this.storedLocation.width:this.width);value+=","+(this.storedLocation?this.storedLocation.height:this.height);value+=","+this.isMinimized();value+=","+this.isMaximized();WindowUtilities.setCookie(value,this.cookie)}},_createWiredElement:function(){if(!this.wiredElement){if(Prototype.Browser.IE)
this._getWindowBorderSize();var div=document.createElement("div");div.className="wired_frame "+this.options.className+"_wired_frame";div.style.position='absolute';this.options.parent.insertBefore(div,this.options.parent.firstChild);this.wiredElement=$(div);}
if(this.useLeft)
this.wiredElement.setStyle({left:this.element.getStyle('left')});else
this.wiredElement.setStyle({right:this.element.getStyle('right')});if(this.useTop)
this.wiredElement.setStyle({top:this.element.getStyle('top')});else
this.wiredElement.setStyle({bottom:this.element.getStyle('bottom')});var dim=this.element.getDimensions();this.wiredElement.setStyle({width:dim.width+"px",height:dim.height+"px"});this.wiredElement.setStyle({zIndex:Windows.maxZIndex+30});return this.wiredElement;},_hideWiredElement:function(){if(!this.wiredElement||!this.currentDrag)
return;if(this.currentDrag==this.element)
this.currentDrag=null;else{if(this.useLeft)
this.element.setStyle({left:this.currentDrag.getStyle('left')});else
this.element.setStyle({right:this.currentDrag.getStyle('right')});if(this.useTop)
this.element.setStyle({top:this.currentDrag.getStyle('top')});else
this.element.setStyle({bottom:this.currentDrag.getStyle('bottom')});this.currentDrag.hide();this.currentDrag=null;if(this.doResize)
this.setSize(this.width,this.height);}},_notify:function(eventName){if(this.options[eventName])
this.options[eventName](this);else
Windows.notify(eventName,this);}};var Windows={windows:[],modalWindows:[],observers:[],focusedWindow:null,maxZIndex:0,overlayShowEffectOptions:{duration:0.5},overlayHideEffectOptions:{duration:0.5},addObserver:function(observer){this.removeObserver(observer);this.observers.push(observer);},removeObserver:function(observer){this.observers=this.observers.reject(function(o){return o==observer});},notify:function(eventName,win){this.observers.each(function(o){if(o[eventName])o[eventName](eventName,win);});},getWindow:function(id){return this.windows.detect(function(d){return d.getId()==id});},getFocusedWindow:function(){return this.focusedWindow;},updateFocusedWindow:function(){this.focusedWindow=this.windows.length>=2?this.windows[this.windows.length-2]:null;},register:function(win){this.windows.push(win);},addModalWindow:function(win){if(this.modalWindows.length==0){WindowUtilities.disableScreen(win.options.className,'overlay_modal',win.overlayOpacity,win.getId(),win.options.parent);}
else{if(Window.keepMultiModalWindow){$('overlay_modal').style.zIndex=Windows.maxZIndex+1;Windows.maxZIndex+=1;WindowUtilities._hideSelect(this.modalWindows.last().getId());}
else
this.modalWindows.last().element.hide();WindowUtilities._showSelect(win.getId());}
this.modalWindows.push(win);},removeModalWindow:function(win){this.modalWindows.pop();if(this.modalWindows.length==0)
WindowUtilities.enableScreen();else{if(Window.keepMultiModalWindow){this.modalWindows.last().toFront();WindowUtilities._showSelect(this.modalWindows.last().getId());}
else
this.modalWindows.last().element.show();}},register:function(win){this.windows.push(win);},unregister:function(win){this.windows=this.windows.reject(function(d){return d==win});},closeAll:function(){this.windows.each(function(w){Windows.close(w.getId())});},closeAllModalWindows:function(){WindowUtilities.enableScreen();this.modalWindows.each(function(win){if(win)win.close()});},minimize:function(id,event){var win=this.getWindow(id)
if(win&&win.visible)
win.minimize();Event.stop(event);},maximize:function(id,event){var win=this.getWindow(id)
if(win&&win.visible)
win.maximize();Event.stop(event);},close:function(id,event){var win=this.getWindow(id);if(win)
win.close();if(event)
Event.stop(event);},blur:function(id){var win=this.getWindow(id);if(!win)
return;if(win.options.blurClassName)
win.changeClassName(win.options.blurClassName);if(this.focusedWindow==win)
this.focusedWindow=null;win._notify("onBlur");},focus:function(id){var win=this.getWindow(id);if(!win)
return;if(this.focusedWindow)
this.blur(this.focusedWindow.getId())
if(win.options.focusClassName)
win.changeClassName(win.options.focusClassName);this.focusedWindow=win;win._notify("onFocus");},unsetOverflow:function(except){this.windows.each(function(d){d.oldOverflow=d.getContent().getStyle("overflow")||"auto";d.getContent().setStyle({overflow:"hidden"})});if(except&&except.oldOverflow)
except.getContent().setStyle({overflow:except.oldOverflow});},resetOverflow:function(){this.windows.each(function(d){if(d.oldOverflow)d.getContent().setStyle({overflow:d.oldOverflow})});},updateZindex:function(zindex,win){if(zindex>this.maxZIndex){this.maxZIndex=zindex;if(this.focusedWindow)
this.blur(this.focusedWindow.getId())}
this.focusedWindow=win;if(this.focusedWindow)
this.focus(this.focusedWindow.getId())}};var Dialog={dialogId:null,onCompleteFunc:null,callFunc:null,parameters:null,confirm:function(content,parameters){if(content&&typeof content!="string"){Dialog._runAjaxRequest(content,parameters,Dialog.confirm);return}
content=content||"";parameters=parameters||{};var okLabel=parameters.okLabel?parameters.okLabel:"Ok";var cancelLabel=parameters.cancelLabel?parameters.cancelLabel:"Cancel";parameters=Object.extend(parameters,parameters.windowParameters||{});parameters.windowParameters=parameters.windowParameters||{};parameters.className=parameters.className||"alert";var okButtonClass="class ='"+(parameters.buttonClass?parameters.buttonClass+" ":"")+" ok_button'"
var cancelButtonClass="class ='"+(parameters.buttonClass?parameters.buttonClass+" ":"")+" cancel_button'"
var content="\
      <div class='"+parameters.className+"_message'>"+content+"</div>\
        <div class='"+parameters.className+"_buttons'>\
          <input type='button' value='"+okLabel+"' onclick='Dialog.okCallback()' "+okButtonClass+"/>\
          <input type='button' value='"+cancelLabel+"' onclick='Dialog.cancelCallback()' "+cancelButtonClass+"/>\
        </div>\
    ";return this._openDialog(content,parameters)},alert:function(content,parameters){if(content&&typeof content!="string"){Dialog._runAjaxRequest(content,parameters,Dialog.alert);return}
content=content||"";parameters=parameters||{};var okLabel=parameters.okLabel?parameters.okLabel:"Ok";parameters=Object.extend(parameters,parameters.windowParameters||{});parameters.windowParameters=parameters.windowParameters||{};parameters.className=parameters.className||"alert";var okButtonClass="class ='"+(parameters.buttonClass?parameters.buttonClass+" ":"")+" ok_button'"
var content="\
      <div class='"+parameters.className+"_message'>"+content+"</div>\
        <div class='"+parameters.className+"_buttons'>\
          <input type='button' value='"+okLabel+"' onclick='Dialog.okCallback()' "+okButtonClass+"/>\
        </div>";return this._openDialog(content,parameters)},info:function(content,parameters){if(content&&typeof content!="string"){Dialog._runAjaxRequest(content,parameters,Dialog.info);return}
content=content||"";parameters=parameters||{};parameters=Object.extend(parameters,parameters.windowParameters||{});parameters.windowParameters=parameters.windowParameters||{};parameters.className=parameters.className||"alert";var content="<div id='modal_dialog_message' class='"+parameters.className+"_message'>"+content+"</div>";if(parameters.showProgress)
content+="<div id='modal_dialog_progress' class='"+parameters.className+"_progress'>  </div>";parameters.ok=null;parameters.cancel=null;return this._openDialog(content,parameters)},setInfoMessage:function(message){$('modal_dialog_message').update(message);},closeInfo:function(){Windows.close(this.dialogId);},_openDialog:function(content,parameters){var className=parameters.className;if(!parameters.height&&!parameters.width){parameters.width=WindowUtilities.getPageSize(parameters.options.parent||document.body).pageWidth/2;}
if(parameters.id)
this.dialogId=parameters.id;else{var t=new Date();this.dialogId='modal_dialog_'+t.getTime();parameters.id=this.dialogId;}
if(!parameters.height||!parameters.width){var size=WindowUtilities._computeSize(content,this.dialogId,parameters.width,parameters.height,5,className)
if(parameters.height)
parameters.width=size+5
else
parameters.height=size+5}
parameters.effectOptions=parameters.effectOptions;parameters.resizable=parameters.resizable||false;parameters.minimizable=parameters.minimizable||false;parameters.maximizable=parameters.maximizable||false;parameters.draggable=parameters.draggable||false;parameters.closable=parameters.closable||false;var win=new Window(parameters);win.getContent().innerHTML=content;win.showCenter(true,parameters.top,parameters.left);win.setDestroyOnClose();win.cancelCallback=parameters.onCancel||parameters.cancel;win.okCallback=parameters.onOk||parameters.ok;return win;},_getAjaxContent:function(originalRequest){Dialog.callFunc(originalRequest.responseText,Dialog.parameters)},_runAjaxRequest:function(message,parameters,callFunc){if(message.options==null)
message.options={}
Dialog.onCompleteFunc=message.options.onComplete;Dialog.parameters=parameters;Dialog.callFunc=callFunc;message.options.onComplete=Dialog._getAjaxContent;new Ajax.Request(message.url,message.options);},okCallback:function(){var win=Windows.focusedWindow;if(!win.okCallback||win.okCallback(win)){$$("#"+win.getId()+" input").each(function(element){element.onclick=null;})
win.close();}},cancelCallback:function(){var win=Windows.focusedWindow;$$("#"+win.getId()+" input").each(function(element){element.onclick=null})
win.close();if(win.cancelCallback)
win.cancelCallback(win);}}
if(Prototype.Browser.WebKit){var array=navigator.userAgent.match(new RegExp(/AppleWebKit\/([\d\.\+]*)/));Prototype.Browser.WebKitVersion=parseFloat(array[1]);}
var WindowUtilities={getWindowScroll:function(parent){var T,L,W,H;parent=parent||document.body;if(parent!=document.body){T=parent.scrollTop;L=parent.scrollLeft;W=parent.scrollWidth;H=parent.scrollHeight;}
else{var w=window;with(w.document){if(w.document.documentElement&&documentElement.scrollTop){T=documentElement.scrollTop;L=documentElement.scrollLeft;}else if(w.document.body){T=body.scrollTop;L=body.scrollLeft;}
if(w.innerWidth){W=w.innerWidth;H=w.innerHeight;}else if(w.document.documentElement&&documentElement.clientWidth){W=documentElement.clientWidth;H=documentElement.clientHeight;}else{W=body.offsetWidth;H=body.offsetHeight}}}
return{top:T,left:L,width:W,height:H};},getPageSize:function(parent){parent=parent||document.body;var windowWidth,windowHeight;var pageHeight,pageWidth;if(parent!=document.body){windowWidth=parent.getWidth();windowHeight=parent.getHeight();pageWidth=parent.scrollWidth;pageHeight=parent.scrollHeight;}
else{var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=document.body.scrollWidth;yScroll=window.innerHeight+window.scrollMaxY;}else if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight;}else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight;}
if(self.innerHeight){windowWidth=self.innerWidth;windowHeight=self.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight;}else if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight;}
if(yScroll<windowHeight){pageHeight=windowHeight;}else{pageHeight=yScroll;}
if(xScroll<windowWidth){pageWidth=windowWidth;}else{pageWidth=xScroll;}}
return{pageWidth:pageWidth,pageHeight:pageHeight,windowWidth:windowWidth,windowHeight:windowHeight};},disableScreen:function(className,overlayId,overlayOpacity,contentId,parent){WindowUtilities.initLightbox(overlayId,className,function(){this._disableScreen(className,overlayId,overlayOpacity,contentId)}.bind(this),parent||document.body);},_disableScreen:function(className,overlayId,overlayOpacity,contentId){var objOverlay=$(overlayId);var pageSize=WindowUtilities.getPageSize(objOverlay.parentNode);if(contentId&&Prototype.Browser.IE){WindowUtilities._hideSelect();WindowUtilities._showSelect(contentId);}
objOverlay.style.height=(pageSize.pageHeight+'px');objOverlay.style.display='none';if(overlayId=="overlay_modal"&&Window.hasEffectLib&&Windows.overlayShowEffectOptions){objOverlay.overlayOpacity=overlayOpacity;new Effect.Appear(objOverlay,Object.extend({from:0,to:overlayOpacity},Windows.overlayShowEffectOptions));}
else
objOverlay.style.display="block";},enableScreen:function(id){id=id||'overlay_modal';var objOverlay=$(id);if(objOverlay){if(id=="overlay_modal"&&Window.hasEffectLib&&Windows.overlayHideEffectOptions)
new Effect.Fade(objOverlay,Object.extend({from:objOverlay.overlayOpacity,to:0},Windows.overlayHideEffectOptions));else{objOverlay.style.display='none';objOverlay.parentNode.removeChild(objOverlay);}
if(id!="__invisible__")
WindowUtilities._showSelect();}},_hideSelect:function(id){if(Prototype.Browser.IE){id=id==null?"":"#"+id+" ";$$(id+'select').each(function(element){if(!WindowUtilities.isDefined(element.oldVisibility)){element.oldVisibility=element.style.visibility?element.style.visibility:"visible";element.style.visibility="hidden";}});}},_showSelect:function(id){if(Prototype.Browser.IE){id=id==null?"":"#"+id+" ";$$(id+'select').each(function(element){if(WindowUtilities.isDefined(element.oldVisibility)){try{element.style.visibility=element.oldVisibility;}catch(e){element.style.visibility="visible";}
element.oldVisibility=null;}
else{if(element.style.visibility)
element.style.visibility="visible";}});}},isDefined:function(object){return typeof(object)!="undefined"&&object!=null;},initLightbox:function(id,className,doneHandler,parent){if($(id)){Element.setStyle(id,{zIndex:Windows.maxZIndex+1});Windows.maxZIndex++;doneHandler();}
else{var objOverlay=document.createElement("div");objOverlay.setAttribute('id',id);objOverlay.className="overlay_"+className
objOverlay.style.display='none';objOverlay.style.position='absolute';objOverlay.style.top='0';objOverlay.style.left='0';objOverlay.style.zIndex=Windows.maxZIndex+1;Windows.maxZIndex++;objOverlay.style.width='100%';parent.insertBefore(objOverlay,parent.firstChild);if(Prototype.Browser.WebKit&&id=="overlay_modal"){setTimeout(function(){doneHandler()},10);}
else
doneHandler();}},setCookie:function(value,parameters){document.cookie=parameters[0]+"="+escape(value)+
((parameters[1])?"; expires="+parameters[1].toGMTString():"")+
((parameters[2])?"; path="+parameters[2]:"")+
((parameters[3])?"; domain="+parameters[3]:"")+
((parameters[4])?"; secure":"");},getCookie:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null;}else{begin+=2;}
var end=document.cookie.indexOf(";",begin);if(end==-1){end=dc.length;}
return unescape(dc.substring(begin+prefix.length,end));},_computeSize:function(content,id,width,height,margin,className){var objBody=document.body;var tmpObj=document.createElement("div");tmpObj.setAttribute('id',id);tmpObj.className=className+"_content";if(height)
tmpObj.style.height=height+"px"
else
tmpObj.style.width=width+"px"
tmpObj.style.position='absolute';tmpObj.style.top='0';tmpObj.style.left='0';tmpObj.style.display='none';tmpObj.innerHTML=content;objBody.insertBefore(tmpObj,objBody.firstChild);var size;if(height)
size=$(tmpObj).getDimensions().width+margin;else
size=$(tmpObj).getDimensions().height+margin;objBody.removeChild(tmpObj);return size;}}
/*
 * Copyright (c) 2009 Simo Kinnunen.
 * Licensed under the MIT license.
 *
 * @version 1.09i
 */
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){var D=C.className;C.className=D+(D&&" ")+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(G){var E=document.createElement("style"),D,C,B;E.type="text/css";E.media=G;try{E.appendChild(document.createTextNode("/**/"))}catch(F){}C=g("head")[0];C.insertBefore(E,C.firstChild);D=(E.sheet||E.styleSheet);B=D&&!D.disabled;C.removeChild(E);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},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(){var B={uppercase:function(C){return C.toUpperCase()},lowercase:function(C){return C.toLowerCase()},capitalize:function(C){return C.replace(/\b./g,function(D){return D.toUpperCase()})}};return function(E,D){var C=B[D.get("textTransform")];return C?C(E):E}})(),whiteSpace:(function(){var D={inline:1,"inline-block":1,"run-in":1};var C=/^\s+/,B=/\s+$/;return function(H,F,G,E){if(E){if(E.nodeName.toLowerCase()=="br"){H=H.replace(C,"")}}if(D[F.get("display")]){return H}if(!G.previousSibling){H=H.replace(C,"")}if(!G.nextSibling){H=H.replace(B,"")}return H}})()};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(M,P){if(!n.recognizesMedia(P||"all")){return true}if(!M||M.disabled){return false}try{var Q=M.cssRules,O;if(Q){search:for(var L=0,K=Q.length;O=Q[L],L<K;++L){switch(O.type){case 2:break;case 3:if(!G(O.styleSheet,O.media.mediaText)){return false}break;default:break search}}}}catch(N){}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(D){var C=this.face=D.face,B={"\u0020":1,"\u00a0":1,"\u3000":1};this.glyphs=D.glyphs;this.w=D.w;this.baseSize=parseInt(C["units-per-em"],10);this.family=C["font-family"].toLowerCase();this.weight=C["font-weight"];this.style=C["font-style"]||"normal";this.viewBox=(function(){var F=C.bbox.split(/\s+/);var E={minX:parseInt(F[0],10),minY:parseInt(F[1],10),maxX:parseInt(F[2],10),maxY:parseInt(F[3],10)};E.width=E.maxX-E.minX;E.height=E.maxY-E.minY;E.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")};return E})();this.ascent=-parseInt(C.ascent,10);this.descent=-parseInt(C.descent,10);this.height=-this.ascent+this.descent;this.spacing=function(L,N,E){var O=this.glyphs,M,K,G,P=[],F=0,J=-1,I=-1,H;while(H=L[++J]){M=O[H]||this.missingGlyph;if(!M){continue}if(K){F-=G=K[H]||0;P[I]-=G}F+=P[++I]=~~(M.w||this.w)+N+(B[H]?E:0);K=M.k}P.total=F;return P}}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,G.type=="mouseover")}function E(F){C(this,F.type=="mouseenter")}function C(F,G){setTimeout(function(){var H=d.get(F).options;m.replace(F,G?h(H,H.hover):H,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(F,E){var B=n.quotedList(E.get("fontFamily").toLowerCase()),D;for(var C=0;D=B[C];++C){if(i[D]){return i[D].get(E.get("fontStyle"),E.get("fontWeight"))}}return null}function g(B){return document.getElementsByTagName(B)}function k(C,B){return C.hasOwnProperty(B)}function h(){var C={},B,F;for(var E=0,D=arguments.length;B=arguments[E],E<D;++E){for(F in B){if(k(B,F)){C[F]=B[F]}}}return C}function o(E,M,C,N,F,D){var K=document.createDocumentFragment(),H;if(M===""){return K}var L=N.separate;var I=M.split(p[L]),B=(L=="words");if(B&&t){if(/^\s/.test(M)){I.unshift("")}if(/\s$/.test(M)){I.push("")}}for(var J=0,G=I.length;J<G;++J){H=z[N.engine](E,B?n.textAlign(I[J],C,J,G):I[J],C,N,F,D,J<G-1);if(H){K.appendChild(H)}}return K}function l(D,M){var C=D.nodeName.toLowerCase();if(M.ignore[C]){return}var E=!M.textless[C];var B=n.getStyle(v(D,M)).extend(M);var F=c(D,B),G,K,I,H,L,J;if(!F){return}for(G=D.firstChild;G;G=I){K=G.nodeType;I=G.nextSibling;if(E&&K==3){if(H){H.appendData(G.data);D.removeChild(G)}else{H=G}if(I){continue}}if(H){D.replaceChild(o(F,n.whiteSpace(H.data,B,H,J),B,M,G,D),H);H=null}if(K==1){if(G.firstChild){if(G.nodeName.toLowerCase()=="cufon"){z[M.engine](F,null,B,M,G,D)}else{arguments.callee(G,M)}}J=G}}}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={autoDetect:false,engine:null,forceHitArea:false,hover:false,hoverables:{a:true},ignore:{applet:1,canvas:1,col:1,colgroup:1,head:1,iframe:1,map:1,optgroup:1,option:1,script:1,select:1,style:1,textarea:1,title:1,pre:1},printable:true,selector:(window.Sizzle||(window.jQuery&&function(B){return jQuery(B)})||(window.dojo&&dojo.query)||(window.Ext&&Ext.query)||(window.YAHOO&&YAHOO.util&&YAHOO.util.Selector&&YAHOO.util.Selector.query)||(window.$$&&function(B){return $$(B)})||(window.$&&function(B){return $(B)})||(document.querySelectorAll&&function(B){return document.querySelectorAll(B)})||g),separate:"words",textless:{dl:1,html:1,ol:1,table:1,tbody:1,thead:1,tfoot:1,tr:1,ul:1},textShadow:"none"};var p={words:/\s/.test("\u00a0")?/[^\S\u00a0]+/:/\s+/,characters:"",none:/^/};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){if(!D){return m}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.addClass(n.removeClass(x.root(),"cufon-loading"),"cufon-ready")});e=true}if(C.hover){C.forceHitArea=true}if(C.autoDetect){delete C.fontFamily}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)}else{delete C.textGradient}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("vml",(function(){var e=document.namespaces;if(!e){return}e.add("cvml","urn:schemas-microsoft-com:vml");e=null;var b=document.createElement("cvml:shape");b.style.behavior="url(#default#VML)";if(!b.coordsize){return}b=null;var h=(document.documentMode||0)<8;document.write(('<style type="text/css">cufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:'+(h?"middle":"text-bottom")+";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}</style>").replace(/;/g,"!important;"));function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloat(m)}var k=l.style.left,j=l.runtimeStyle.left;l.runtimeStyle.left=l.currentStyle.left;l.style.left=m.replace("%","em");var i=l.style.pixelLeft;l.style.left=k;l.runtimeStyle.left=j;return i}function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[i]=m=(m=="normal")?0:~~j.convertFrom(a(l,m))}return m}var g={};function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElement("cvml:fill"),i=[];o.type="gradient";o.angle=180;o.focus="0";o.method="sigma";o.color=n[0][1];for(var m=1,l=n.length-1;m<l;++m){i.push(n[m][0]*100+"% "+n[m][1])}o.colors=i.join(",");o.color2=n[l][1];g[q]=o}return g[q]}return function(ac,G,Y,C,K,ad,W){var n=(G===null);if(n){G=K.alt}var I=ac.viewBox;var p=Y.computedFontSize||(Y.computedFontSize=new Cufon.CSS.Size(c(ad,Y.get("fontSize"))+"px",ac.baseSize));var y,q;if(n){y=K;q=K.firstChild}else{y=document.createElement("cufon");y.className="cufon cufon-vml";y.alt=G;q=document.createElement("cufoncanvas");y.appendChild(q);if(C.printable){var Z=document.createElement("cufontext");Z.appendChild(document.createTextNode(G));y.appendChild(Z)}if(!W){y.appendChild(document.createElement("cvml:shape"))}}var ai=y.style;var R=q.style;var l=p.convert(I.height),af=Math.ceil(l);var V=af/l;var P=V*Cufon.CSS.fontStretch(Y.get("fontStretch"));var U=I.minX,T=I.minY;R.height=af;R.top=Math.round(p.convert(T-ac.ascent));R.left=Math.round(p.convert(U));ai.height=p.convert(ac.height)+"px";var F=Y.get("color");var ag=Cufon.CSS.textTransform(G,Y).split("");var L=ac.spacing(ag,f(ad,Y,p,"letterSpacing"),f(ad,Y,p,"wordSpacing"));if(!L.length){return null}var k=L.total;var x=-U+k+(I.width-L[L.length-1]);var ah=p.convert(x*P),X=Math.round(ah);var O=x+","+I.height,m;var J="r"+O+"ns";var u=C.textGradient&&d(C.textGradient);var o=ac.glyphs,S=0;var H=C.textShadow;var ab=-1,aa=0,w;while(w=ag[++ab]){var D=o[ag[ab]]||ac.missingGlyph,v;if(!D){continue}if(n){v=q.childNodes[aa];while(v.firstChild){v.removeChild(v.firstChild)}}else{v=document.createElement("cvml:shape");q.appendChild(v)}v.stroked="f";v.coordsize=O;v.coordorigin=m=(U-S)+","+T;v.path=(D.d?"m"+D.d+"xe":"")+"m"+m+J;v.fillcolor=F;if(u){v.appendChild(u.cloneNode(false))}var ae=v.style;ae.width=X;ae.height=af;if(H){var s=H[0],r=H[1];var B=Cufon.CSS.color(s.color),z;var N=document.createElement("cvml:shadow");N.on="t";N.color=B.color;N.offset=s.offX+","+s.offY;if(r){z=Cufon.CSS.color(r.color);N.type="double";N.color2=z.color;N.offset2=r.offX+","+r.offY}N.opacity=B.opacity||(z&&z.opacity)||1;v.appendChild(N)}S+=L[aa++]}var M=v.nextSibling,t,A;if(C.forceHitArea){if(!M){M=document.createElement("cvml:rect");M.stroked="f";M.className="cufon-vml-cover";t=document.createElement("cvml:fill");t.opacity=0;M.appendChild(t);q.appendChild(M)}A=M.style;A.width=X;A.height=af}else{if(M){q.removeChild(M)}}ai.width=Math.max(Math.ceil(p.convert(k*P)),0);if(h){var Q=Y.computedYAdjust;if(Q===undefined){var E=Y.get("lineHeight");if(E=="normal"){E="1em"}else{if(!isNaN(E)){E+="em"}}Y.computedYAdjust=Q=0.5*(a(ad,E)-parseFloat(ai.height))}if(Q){ai.marginTop=Math.ceil(Q)+"px";ai.marginBottom=Q+"px"}}return y}})());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{text-indent:0;}@media screen,projection{cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;"+(e?"":"font-size:1px;line-height:1px;")+"}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;overflow:hidden;text-indent:-10000in;}"+(a?"cufon canvas{position:relative;}":"cufon canvas{position:absolute;}")+"}@media print{cufon{padding:0;}cufon canvas{display:none;}}").replace(/;/g,"!important;")));document.getElementsByTagName("head")[0].appendChild(f);function d(p,h){var n=0,m=0;var g=[],o=/([mrvxe])([^a-z]*)/g,k;generate:for(var j=0;k=o.exec(p);++j){var l=k[2].split(",");switch(k[1]){case"v":g[j]={m:"bezierCurveTo",a:[n+~~l[0],m+~~l[1],n+~~l[2],m+~~l[3],n+=~~l[4],m+=~~l[5]]};break;case"r":g[j]={m:"lineTo",a:[n+=~~l[0],m+=~~l[1]]};break;case"m":g[j]={m:"moveTo",a:[n=~~l[0],m=~~l[1]]};break;case"x":g[j]={m:"closePath"};break;case"e":break generate}h[g[j].m].apply(h,g[j].a)}return g}function c(m,k){for(var j=0,h=m.length;j<h;++j){var g=m[j];k[g.m].apply(k,g.a)}}return function(V,w,P,t,C,W){var k=(w===null);if(k){w=C.getAttribute("alt")}var A=V.viewBox;var m=P.getSize("fontSize",V.baseSize);var B=0,O=0,N=0,u=0;var z=t.textShadow,L=[];if(z){for(var U=z.length;U--;){var F=z[U];var K=m.convertFrom(parseFloat(F.offX));var I=m.convertFrom(parseFloat(F.offY));L[U]=[K,I];if(I<B){B=I}if(K>O){O=K}if(I>N){N=I}if(K<u){u=K}}}var Z=Cufon.CSS.textTransform(w,P).split("");var E=V.spacing(Z,~~m.convertFrom(parseFloat(P.get("letterSpacing"))||0),~~m.convertFrom(parseFloat(P.get("wordSpacing"))||0));if(!E.length){return null}var h=E.total;O+=A.width-E[E.length-1];u+=A.minX;var s,n;if(k){s=C;n=C.firstChild}else{s=document.createElement("cufon");s.className="cufon cufon-canvas";s.setAttribute("alt",w);n=document.createElement("canvas");s.appendChild(n);if(t.printable){var S=document.createElement("cufontext");S.appendChild(document.createTextNode(w));s.appendChild(S)}}var aa=s.style;var H=n.style;var j=m.convert(A.height);var Y=Math.ceil(j);var M=Y/j;var G=M*Cufon.CSS.fontStretch(P.get("fontStretch"));var J=h*G;var Q=Math.ceil(m.convert(J+O-u));var o=Math.ceil(m.convert(A.height-B+N));n.width=Q;n.height=o;H.width=Q+"px";H.height=o+"px";B+=A.minY;H.top=Math.round(m.convert(B-V.ascent))+"px";H.left=Math.round(m.convert(u))+"px";var r=Math.max(Math.ceil(m.convert(J)),0)+"px";if(a){aa.width=r;aa.height=m.convert(V.height)+"px"}else{aa.paddingLeft=r;aa.paddingBottom=(m.convert(V.height)-1)+"px"}var X=n.getContext("2d"),D=j/A.height;X.scale(D,D*M);X.translate(-u,-B);X.save();function T(){var x=V.glyphs,ab,l=-1,g=-1,y;X.scale(G,1);while(y=Z[++l]){var ab=x[Z[l]]||V.missingGlyph;if(!ab){continue}if(ab.d){X.beginPath();if(ab.code){c(ab.code,X)}else{ab.code=d("m"+ab.d,X)}X.fill()}X.translate(E[++g],0)}X.restore()}if(z){for(var U=z.length;U--;){var F=z[U];X.save();X.fillStyle=F.color;X.translate.apply(X,L[U]);T()}}var q=t.textGradient;if(q){var v=q.stops,p=X.createLinearGradient(0,A.minY,0,A.maxY);for(var U=0,R=v.length;U<R;++U){p.addColorStop.apply(p,v[U])}X.fillStyle=p}else{X.fillStyle=P.get("color")}T();return s}})());
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (c) 1985, 1987, 1991, 1993, 1997 Adobe Systems Incorporated.  All
 * Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its
 * subsidiaries.
 * 
 * Trademark:
 * Created by Type-Designer 3.0
 */
Cufon.registerFont({"w":180,"face":{"font-family":"Helvetica-Condensed","font-weight":700,"font-stretch":"expanded","units-per-em":"360","panose-1":"2 11 8 0 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"5","bbox":"-13 -346 292 90","underline-thickness":"18","underline-position":"-18","unicode-range":"U+0020-U+00FD"},"glyphs":{" ":{"w":90},"!":{"d":"76,-70r7,-124r0,-76r-47,0r1,108r8,92r31,0xm84,0r0,-48r-47,0r0,48r47,0","w":119},"\"":{"d":"114,-168r0,-98r-42,0r0,98r42,0xm49,-168r0,-98r-43,0r0,98r43,0","w":119},"#":{"d":"160,-119r-27,0r4,-33r32,0r0,-36r-28,0r10,-78r-31,0r-9,78r-26,0r9,-78r-30,0r-10,78r-34,0r0,36r30,0r-4,33r-35,0r0,35r31,0r-10,84r30,0r10,-84r26,0r-10,84r31,0r10,-84r31,0r0,-35xm107,-152r-5,33r-25,0r4,-33r26,0"},"$":{"d":"100,-103v22,10,33,65,0,72r0,-72xm77,-266v-71,-1,-78,106,-28,134r29,21r0,80v-22,-6,-22,-21,-22,-49r-43,0v-4,49,17,84,64,86r0,39r25,0r0,-40v46,-6,66,-30,66,-81v0,-43,-35,-66,-68,-83r0,-71v17,4,20,15,20,36r42,0v3,-45,-18,-69,-60,-72r0,-23r-25,0r0,23xm78,-166v-18,-13,-31,-55,0,-64r0,64"},"%":{"d":"122,-199v0,-43,-13,-66,-56,-66v-42,0,-55,23,-55,66v0,42,13,66,55,66v43,0,56,-24,56,-66xm46,-199v0,-25,-2,-40,21,-40v22,0,20,15,20,40v0,26,2,40,-20,40v-23,0,-21,-15,-21,-40xm289,-66v0,-44,-13,-67,-55,-66v-42,0,-55,21,-55,66v0,44,13,66,55,66v42,0,55,-22,55,-66xm213,-66v0,-25,-2,-39,21,-39v23,0,21,14,21,39v0,25,1,40,-21,40v-22,0,-21,-15,-21,-40xm101,5r120,-275r-25,0r-121,275r26,0","w":299},"&":{"d":"113,-240v30,4,15,45,-3,54v-8,-14,-27,-51,3,-54xm23,-75v0,77,90,104,135,58r9,18r54,0r-32,-54v16,-27,24,-58,24,-91r-40,0v-1,18,-3,35,-8,50r-34,-59v23,-14,40,-34,41,-67v1,-33,-26,-56,-57,-56v-68,0,-75,77,-41,116v-29,22,-51,40,-51,85xm106,-34v-42,-2,-47,-76,-11,-89r44,74v-9,8,-18,15,-33,15","w":240},"'":{"d":"67,-168r0,-98r-43,0r0,98r43,0","w":90},"(":{"d":"101,71v-47,-85,-48,-262,-1,-347r-29,0v-33,46,-52,94,-52,167v-1,82,20,127,52,180r30,0","w":119},")":{"d":"19,-276v47,86,48,263,0,347r30,0v72,-81,65,-265,0,-347r-30,0","w":119},"*":{"d":"138,-166r-25,-33r39,-12r-10,-28r-38,13r0,-40r-29,0v0,13,-1,30,1,41r-39,-12r-9,27r39,12r-23,33r23,17r24,-34v6,13,15,22,23,33"},"+":{"d":"70,-109r-61,0r0,39r61,0r0,70r40,0r0,-70r61,0r0,-39r-61,0r0,-68r-40,0r0,68"},",":{"d":"62,0v0,21,-9,33,-26,36r0,16v50,-3,50,-47,48,-100r-48,0r0,48r26,0","w":119},"-":{"d":"103,-92r0,-41r-86,0r0,41r86,0","w":119},".":{"d":"84,0r0,-48r-48,0r0,48r48,0","w":119},"\/":{"d":"-4,34r31,0r85,-304r-31,0","w":100},"0":{"d":"90,-34v-19,0,-23,-15,-22,-38r0,-122v-1,-24,4,-37,22,-37v18,0,23,14,23,37r0,122v0,23,-4,37,-23,38xm90,-271v-97,0,-73,112,-73,199v0,53,22,77,73,77v51,0,75,-23,73,-77v-3,-87,25,-199,-73,-199"},"1":{"d":"90,-270v-9,33,-35,46,-74,47r0,36r61,0r0,187r50,0r0,-270r-37,0"},"2":{"d":"89,-231v28,-2,30,41,19,58v-32,53,-102,84,-96,173r147,0r0,-40r-94,0v15,-68,98,-79,98,-161v0,-43,-29,-70,-72,-70v-57,0,-80,33,-77,91r47,0v0,-30,0,-49,28,-51"},"3":{"d":"109,-201v0,30,-17,37,-47,37r0,39v43,-6,55,19,50,61v-2,17,-8,30,-26,30v-29,0,-28,-29,-29,-56r-47,0v-3,59,16,95,75,95v54,0,78,-32,78,-85v0,-37,-15,-60,-41,-66v25,-4,36,-27,36,-56v0,-46,-26,-69,-74,-69v-51,0,-73,28,-71,80r47,0v-2,-24,3,-40,25,-40v16,0,24,10,24,30"},"4":{"d":"45,-94r51,-110r0,110r-51,0xm90,-266r-82,172r0,39r88,0r0,55r50,0r0,-55r23,0r0,-39r-23,0r0,-172r-56,0"},"5":{"d":"98,-184v-20,0,-28,5,-40,16r4,-58r91,0r0,-40r-130,0r-7,142r44,0v1,-11,14,-20,26,-20v34,-1,29,45,27,79v-1,17,-9,32,-27,31v-24,-2,-26,-25,-26,-51r-47,0v1,63,15,90,77,90v59,0,75,-35,75,-95v0,-52,-14,-95,-67,-94"},"6":{"d":"91,-34v-33,0,-25,-41,-25,-79v0,-15,6,-30,24,-29v24,1,25,20,25,48v0,37,3,60,-24,60xm66,-202v-5,-30,50,-43,47,-8r47,0v0,-42,-26,-59,-67,-61v-89,-4,-78,88,-78,174v0,65,15,102,76,102v62,0,73,-36,74,-102v1,-52,-14,-84,-61,-85v-21,1,-28,7,-39,18"},"7":{"d":"97,0v5,-82,32,-170,66,-229r0,-37r-151,0r0,40r107,0v-37,62,-65,141,-74,226r52,0"},"8":{"d":"91,-34v-25,0,-26,-14,-26,-41v0,-32,-2,-52,25,-52v30,0,25,36,25,66v0,15,-8,27,-24,27xm113,-201v-1,20,-2,39,-23,38v-19,0,-23,-15,-22,-35v1,-20,4,-33,23,-33v16,0,22,12,22,30xm91,-271v-75,-8,-94,102,-38,125v-28,13,-39,28,-38,70v0,57,20,81,77,81v51,0,75,-27,74,-82v0,-39,-9,-62,-41,-68v25,-10,34,-24,34,-57v0,-48,-21,-64,-68,-69"},"9":{"d":"89,-231v33,-2,25,43,25,78v0,17,-7,30,-24,30v-24,0,-24,-20,-24,-49v0,-36,-4,-57,23,-59xm87,5v90,0,78,-87,78,-173v-1,-65,-13,-103,-75,-103v-61,0,-75,37,-75,103v0,51,15,83,61,84v22,0,29,-7,40,-18v-2,30,5,68,-26,68v-15,0,-22,-7,-22,-21r-47,0v-1,41,26,60,66,60"},":":{"d":"74,-153r0,-47r-48,0r0,47r48,0xm74,0r0,-48r-48,0r0,48r48,0","w":100},";":{"d":"51,0v0,21,-8,33,-25,36r0,16v50,-3,50,-47,48,-100r-48,0r0,48r25,0xm74,-153r0,-47r-48,0r0,47r48,0","w":100},"<":{"d":"58,-90r107,-60r0,-40r-150,82r0,36r150,81r0,-40"},"=":{"d":"171,-144r-162,0r0,39r162,0r0,-39xm171,-74r-162,0r0,39r162,0r0,-39"},">":{"d":"15,-31r0,40r150,-81r0,-36r-150,-82r0,40r107,60"},"?":{"d":"158,-210v0,-64,-82,-84,-121,-49v-13,13,-21,34,-18,60r44,0v2,-21,0,-41,25,-40v16,1,21,11,21,29v0,59,-65,65,-55,138r42,0v-4,-70,62,-69,62,-138xm53,-47r0,47r46,0r0,-47r-46,0"},"@":{"d":"14,-136v-3,107,107,173,207,127v20,-9,35,-25,49,-44r-35,0v-19,17,-41,33,-73,33v-73,0,-120,-43,-120,-116v0,-71,45,-112,114,-114v59,-2,104,37,102,98v-2,31,-15,58,-39,66v-5,1,-7,-4,-5,-8r19,-111r-35,0r-4,19v-42,-51,-122,-4,-122,64v0,58,66,90,105,44v-2,13,5,23,16,24v92,-3,123,-140,51,-192v-23,-17,-49,-31,-87,-30v-87,2,-141,54,-143,140xm142,-89v-54,-5,-29,-85,10,-85v22,-1,32,20,29,41v-2,20,-17,46,-39,44","w":299},"A":{"d":"57,0r14,-68r59,0r13,68r54,0r-61,-270r-68,0r-65,270r54,0xm78,-108r23,-132r21,132r-44,0","w":200,"k":{"\u00fd":6,"\u00dd":20,"y":6,"w":6,"v":6,"Y":20,"W":13,"V":13,"T":20}},"B":{"d":"130,-80v0,35,-18,45,-56,40r0,-81v37,-2,56,2,56,41xm125,-199v0,37,-17,39,-51,38r0,-69v30,-1,51,-1,51,31xm175,-202v6,-81,-77,-68,-152,-68r0,270r89,0v50,-1,70,-29,70,-82v1,-35,-12,-57,-39,-63v23,-8,30,-27,32,-57","w":200},"C":{"d":"108,6v61,0,75,-43,76,-102r-50,0v-3,26,2,62,-26,62v-54,0,-33,-82,-36,-134v-2,-35,2,-68,36,-68v23,0,23,27,25,50r50,0v1,-57,-22,-90,-75,-90v-89,0,-88,71,-88,158v0,78,13,124,88,124","w":200},"D":{"d":"146,-141v2,66,2,110,-70,101r0,-190r33,0v40,4,35,37,37,89xm198,-146v1,-69,-8,-124,-67,-124r-105,0r0,270r93,0v77,1,78,-70,79,-146","w":219},"E":{"d":"165,0r0,-40r-92,0r0,-83r85,0r0,-39r-85,0r0,-68r92,0r0,-40r-142,0r0,270r142,0"},"F":{"d":"77,0r0,-122r86,0r0,-40r-86,0r0,-68r92,0r0,-40r-143,0r0,270r51,0","k":{"\u00c3":13,"\u00c2":13,"\u00c1":13,"\u00c0":13,"A":13,".":40,",":40}},"G":{"d":"108,-276v-89,0,-88,71,-88,158v0,89,39,146,116,115v8,-6,15,-15,20,-28r0,31r38,0r0,-145r-84,0r0,40r35,0v0,38,-6,71,-37,71v-54,0,-33,-82,-36,-134v-2,-35,2,-68,36,-68v30,0,37,21,37,51r50,0v1,-65,-25,-91,-87,-91","w":219},"H":{"d":"75,0r0,-123r70,0r0,123r51,0r0,-270r-51,0r0,107r-70,0r0,-107r-51,0r0,270r51,0","w":219},"I":{"d":"75,0r0,-270r-50,0r0,270r50,0","w":100},"J":{"d":"88,-63v9,32,-35,40,-35,11r0,-34r-50,0v-5,56,10,92,59,92v57,0,76,-20,76,-79r0,-197r-50,0r0,207","w":159},"K":{"d":"75,0r0,-77r18,-30r47,107r57,0r-70,-154r67,-116r-57,0r-62,120r0,-120r-51,0r0,270r51,0","w":200},"L":{"d":"168,0r0,-40r-93,0r0,-230r-51,0r0,270r144,0","k":{"\u00fd":13,"\u00dd":33,"y":13,"Y":33,"W":27,"V":27,"T":27}},"M":{"d":"72,-246r53,246r31,0r54,-246v-5,71,-4,165,-4,246r50,0r0,-270r-80,0v-12,64,-29,118,-35,188v-8,-69,-25,-124,-37,-188r-80,0r0,270r51,0","w":280},"N":{"d":"75,0v2,-71,-8,-138,-7,-203v21,75,48,135,75,203r52,0r0,-270r-50,0v-2,72,7,140,7,206r-36,-108r-39,-98r-53,0r0,270r51,0","w":219},"O":{"d":"110,-276v-89,0,-88,71,-88,158v0,77,13,124,88,124v90,0,90,-72,88,-163v-2,-73,-13,-119,-88,-119xm110,-34v-53,0,-36,-81,-36,-134v0,-35,3,-68,36,-68v53,0,34,84,37,139v2,34,-5,63,-37,63","w":219},"P":{"d":"139,-195v0,40,-25,45,-64,42r0,-77v36,0,64,-5,64,35xm190,-193v-1,-45,-17,-77,-63,-77r-103,0r0,270r51,0r0,-113v71,6,116,-15,115,-80","w":200,"k":{"\u00c3":13,"\u00c2":13,"\u00c1":13,"\u00c0":13,"A":13,".":46,",":46}},"Q":{"d":"110,6v22,0,35,-1,48,-8r28,28r25,-24r-27,-28v17,-29,14,-83,14,-131v0,-73,-13,-119,-88,-119v-89,0,-88,71,-88,158v0,77,13,125,88,124xm110,-236v56,0,32,89,36,143v0,9,-1,18,-3,27v-10,-2,-20,16,-30,21r10,9v-63,14,-47,-71,-49,-132v0,-35,3,-68,36,-68","w":219},"R":{"d":"196,-205v2,-82,-95,-63,-172,-65r0,270r50,0r0,-116v47,-5,69,5,69,58v0,22,2,43,6,58r55,0v-22,-40,10,-136,-50,-140v31,-4,41,-30,42,-65xm143,-195v3,41,-30,41,-69,39r0,-74v36,1,75,-8,69,35","w":219,"k":{"\u00dd":6,"Y":6,"T":6}},"S":{"d":"98,-236v27,0,29,19,29,48r49,0v2,-56,-20,-88,-78,-88v-84,0,-102,93,-46,133v29,21,79,32,79,77v0,21,-10,32,-31,32v-30,0,-33,-28,-32,-61r-50,0v-4,65,18,101,82,101v84,0,111,-107,47,-145v-26,-23,-73,-31,-77,-72v-2,-18,10,-25,28,-25","w":200},"T":{"d":"6,-230r59,0r0,230r51,0r0,-230r58,0r0,-40r-168,0r0,40","k":{"\u00fd":20,"\u00fa":27,"\u00f9":27,"\u00f5":27,"\u00f4":27,"\u00f3":27,"\u00f2":27,"\u00ea":27,"\u00e9":27,"\u00e8":27,"\u00e3":27,"\u00e2":27,"\u00e1":27,"\u00e0":27,"\u00c3":20,"\u00c2":20,"\u00c1":20,"\u00c0":20,"y":20,"w":27,"u":27,"s":27,"r":27,"o":27,"i":6,"e":27,"c":27,"a":27,"A":20,";":27,":":27,".":33,"-":20,",":33}},"U":{"d":"111,6v65,0,85,-25,85,-88r0,-188r-51,0r0,184v2,30,-5,52,-34,52v-30,0,-36,-21,-36,-52r0,-184r-51,0r0,188v0,63,22,89,87,88","w":219},"V":{"d":"139,-270r-37,242r-9,-69r-31,-173r-54,0r59,270r68,0r58,-270r-54,0","w":200,"k":{"\u00fa":6,"\u00f9":6,"\u00f5":6,"\u00f4":6,"\u00f3":6,"\u00f2":6,"\u00ea":6,"\u00e9":6,"\u00e8":6,"\u00e3":6,"\u00e2":6,"\u00e1":6,"\u00e0":6,"\u00c3":13,"\u00c2":13,"\u00c1":13,"\u00c0":13,"u":6,"r":6,"o":6,"e":6,"a":6,"A":13,";":6,":":6,".":33,"-":6,",":33}},"W":{"d":"171,-270r-42,0r-36,236v-7,-83,-20,-159,-32,-236r-52,0r51,270r61,0r29,-193r11,86r20,107r61,0r50,-270r-53,0r-30,236v-5,-84,-24,-160,-38,-236","w":299,"k":{"\u00f5":6,"\u00f4":6,"\u00f3":6,"\u00f2":6,"\u00ea":6,"\u00e9":6,"\u00e8":6,"\u00e3":6,"\u00e2":6,"\u00e1":6,"\u00e0":6,"\u00c3":6,"\u00c2":6,"\u00c1":6,"\u00c0":6,"o":6,"e":6,"a":6,"A":6,".":27,"-":6,",":27}},"X":{"d":"137,-270v-12,31,-29,61,-37,95v-5,-38,-26,-63,-37,-95r-57,0r64,133r-66,137r55,0v13,-33,32,-62,40,-100v8,37,27,67,40,100r57,0r-67,-137r65,-133r-57,0","w":200},"Y":{"d":"59,-270r-55,0r71,155r0,115r50,0r0,-115r71,-155r-55,0v-13,38,-31,71,-41,112v-7,-39,-28,-77,-41,-112","w":200,"k":{"\u00fa":13,"\u00f9":13,"\u00f5":20,"\u00f4":20,"\u00f3":20,"\u00f2":20,"\u00ed":6,"\u00ec":6,"\u00ea":20,"\u00e9":20,"\u00e8":20,"\u00e3":20,"\u00e2":20,"\u00e1":20,"\u00e0":20,"\u00c3":20,"\u00c2":20,"\u00c1":20,"\u00c0":20,"v":6,"u":13,"q":20,"p":13,"o":20,"i":6,"e":20,"a":20,"A":20,";":13,":":13,".":40,"-":27,",":40}},"Z":{"d":"12,0r156,0r0,-40r-104,1v3,-4,8,-10,12,-18r89,-173r0,-40r-147,0r0,40r95,-1v-3,4,-7,10,-11,18r-90,173r0,40"},"[":{"d":"101,34r0,-28r-32,0r0,-249r32,0r0,-27r-72,0r0,304r72,0","w":119},"\\":{"d":"18,-270r-31,0r85,304r31,0","w":90},"]":{"d":"19,-270r0,27r32,0r0,249r-32,0r0,28r72,0r0,-304r-72,0","w":119},"^":{"d":"41,-117r49,-101r49,101r37,-17r-64,-136r-44,0r-64,136"},"_":{"d":"180,45r0,-18r-180,0r0,18r180,0"},"`":{"d":"0,-279r54,53r36,0r-34,-53r-56,0","w":119},"a":{"d":"111,-21v0,8,0,16,3,21r44,0v-9,-44,-2,-98,-4,-148v12,-67,-86,-76,-123,-43v-12,10,-14,26,-14,48r44,0v1,-20,4,-29,25,-29v16,-1,23,4,23,18v-15,47,-99,27,-94,99v-11,64,74,79,96,34xm84,-31v-27,2,-26,-36,-14,-50v6,-6,29,-19,38,-26v-3,31,8,73,-24,76"},"b":{"d":"113,-141v-4,41,13,101,-20,110v-36,-2,-22,-76,-22,-117v0,-13,7,-24,21,-24v20,0,18,12,21,31xm111,-208v-23,0,-32,9,-42,25r1,-87r-47,0r0,270r45,0r0,-22v9,18,20,26,43,27v63,0,49,-80,49,-141v0,-47,-10,-72,-49,-72"},"c":{"d":"64,-79v0,-35,-11,-90,18,-93v18,-2,16,22,16,40r47,0v3,-49,-17,-76,-64,-76v-71,0,-63,68,-63,137v0,50,17,75,63,76v53,1,67,-30,64,-84r-47,0v-1,22,4,48,-16,48v-19,-5,-18,-18,-18,-48","w":159},"d":{"d":"87,-172v38,0,22,67,22,105v0,24,-8,36,-23,36v-33,-9,-16,-70,-20,-110v3,-19,0,-31,21,-31xm68,5v24,0,31,-11,41,-27r0,22r47,0r0,-270r-47,0r1,87v-10,-16,-19,-24,-42,-25v-63,-2,-49,83,-49,145v0,36,10,68,49,68"},"e":{"d":"159,-92v3,-69,-2,-116,-72,-116v-66,0,-70,59,-68,128v2,58,20,84,75,85v47,0,64,-27,65,-74r-47,0v-1,23,-2,37,-22,38v-30,2,-23,-33,-24,-61r93,0xm88,-172v27,0,25,19,25,44r-47,0v1,-24,-3,-44,22,-44"},"f":{"d":"93,-270v-52,-5,-73,12,-67,67r-18,0r0,34r18,0r0,169r46,0r0,-169r21,0r0,-34r-21,0v0,-18,-4,-40,21,-30r0,-37","w":100},"g":{"d":"87,-172v38,0,22,67,22,105v0,24,-8,36,-23,36v-33,-9,-16,-70,-20,-110v3,-19,0,-31,21,-31xm88,35v-11,0,-20,-2,-20,-12r-47,0v2,32,25,45,59,45v53,0,76,-23,76,-74r0,-197r-47,0v-1,6,2,16,-1,21v-6,-18,-19,-26,-40,-26v-63,-2,-49,83,-49,145v0,37,10,69,49,68v24,0,34,-9,43,-26v0,26,4,57,-23,56"},"h":{"d":"158,-157v7,-57,-71,-67,-89,-25r0,-88r-47,0r0,270r47,0r0,-135v-1,-22,4,-37,23,-37v18,0,20,13,20,33r0,139r46,0r0,-157"},"i":{"d":"73,0r0,-203r-46,0r0,203r46,0xm73,-228r0,-42r-46,0r0,42r46,0","w":100},"j":{"d":"28,22v1,11,-7,9,-17,10r0,36v52,8,64,-15,64,-67r0,-204r-47,0r0,225xm75,-228r0,-42r-47,0r0,42r47,0","w":100},"k":{"d":"64,0r0,-62r13,-21r29,83r52,0r-50,-121r51,-82r-51,0r-45,81r1,-148r-47,0r0,270r47,0","w":159},"l":{"d":"73,0r0,-270r-46,0r0,270r46,0","w":100},"m":{"d":"160,-182v-9,-34,-79,-35,-89,0r0,-21r-47,0r0,203r47,0r0,-134v1,-24,1,-38,23,-38v20,0,23,13,23,32r0,140r46,0r0,-134v1,-24,3,-38,24,-38v20,0,22,15,23,35r0,137r46,0r0,-165v4,-50,-80,-58,-96,-17","w":280},"n":{"d":"158,-157v8,-57,-74,-67,-89,-25r0,-21r-47,0r0,203r47,0r0,-131v-1,-22,5,-38,23,-38v18,0,20,14,20,34r0,135r46,0r0,-157"},"o":{"d":"91,-31v-47,0,-16,-73,-25,-119v1,-14,9,-22,25,-22v41,2,23,68,23,106v0,25,0,35,-23,35xm19,-94v0,62,9,99,72,99v62,0,70,-38,70,-99v0,-67,-2,-114,-70,-114v-69,0,-72,45,-72,114"},"p":{"d":"111,-141v-4,41,14,102,-21,110v-36,-3,-18,-74,-22,-117v2,-12,7,-25,22,-24v20,0,18,12,21,31xm109,-208v-23,0,-33,8,-41,26r0,-21r-47,0r0,271r45,0r0,-89v11,17,19,26,43,26v62,0,49,-80,49,-141v0,-46,-10,-72,-49,-72"},"q":{"d":"86,-172v37,0,22,67,22,105v0,24,-8,36,-23,36v-33,-9,-16,-70,-20,-110v3,-19,0,-31,21,-31xm67,5v24,0,31,-11,41,-27r0,90r47,0r0,-271r-47,0v-1,6,2,16,-1,20v-8,-17,-18,-25,-40,-25v-63,-2,-49,83,-49,145v0,36,10,68,49,68"},"r":{"d":"115,-207v-27,1,-39,18,-48,40r0,-36r-45,0r0,203r46,0r0,-117v-1,-28,20,-38,47,-34r0,-56","w":119,"k":{"\u00fd":-6,"z":-7,"y":-6,"x":-7,"w":-6,"v":-6,".":27,"-":13,",":27}},"s":{"d":"79,-31v-22,0,-23,-13,-22,-36r-47,0v-2,48,22,67,66,72v76,8,92,-83,38,-112v-18,-16,-51,-22,-56,-49v-2,-12,9,-16,20,-16v19,0,20,11,21,31r47,0v0,-45,-22,-67,-65,-67v-57,0,-87,42,-60,85v16,24,51,39,72,59v12,11,5,33,-14,33","w":159},"t":{"d":"24,-31v0,34,33,37,67,32r0,-37v-9,0,-20,2,-20,-7r0,-126r20,0r0,-34r-20,0r0,-56r-47,0r0,56r-19,0r0,34r19,0r0,138","w":100},"u":{"d":"66,5v26,0,36,-16,45,-35r0,30r44,0r0,-203r-47,0r0,147v-2,12,-5,25,-21,25v-17,0,-20,-14,-19,-33r0,-139r-47,0r0,155v1,36,7,53,45,53"},"v":{"d":"51,0r58,0r47,-203r-48,0r-28,174v-5,-62,-16,-117,-26,-174r-50,0","w":159,"k":{".":20,",":20}},"w":{"d":"185,-203r-20,168v-5,-61,-19,-111,-28,-168r-38,0r-20,125v-3,12,-1,31,-5,44r-21,-169r-49,0r42,203r52,0r20,-133v6,55,14,85,22,133r51,0r41,-203r-47,0","w":240,"k":{".":13,",":13}},"x":{"d":"82,-148r-22,-55r-55,0r52,99r-54,104r54,0v8,-18,19,-45,24,-63v3,19,16,45,23,63r53,0r-52,-105r51,-98r-52,0v-8,16,-18,36,-22,55","w":159},"y":{"d":"51,-3v7,21,7,43,-24,35r0,36v54,12,67,-21,78,-65r49,-206r-47,0r-21,109v-4,17,-4,38,-8,53v-5,-66,-17,-104,-27,-162r-49,0","w":159,"k":{".":20,",":20}},"z":{"d":"132,-170r0,-33r-122,0r0,36r70,0r-72,130r0,37r124,0r0,-36r-74,0","w":140},"{":{"d":"86,-269v-41,-7,-71,4,-71,46v0,42,11,99,-27,106v65,7,-17,159,75,150v7,-1,18,2,23,-1v-60,-8,7,-135,-56,-150v64,-5,-7,-134,56,-151","w":98},"|":{"d":"27,-270r0,360r36,0r0,-360r-36,0","w":90},"}":{"d":"110,-117v-65,-7,18,-160,-73,-153v-8,1,-19,-2,-25,1v61,7,-9,139,57,152v-42,7,-30,65,-30,111v0,24,-10,33,-27,40v47,2,71,-4,71,-53v0,-39,-14,-96,27,-98","w":98},"~":{"d":"58,-85v27,7,64,40,91,14v7,-7,15,-19,22,-32r-21,-26v-6,10,-11,28,-25,26v-30,-4,-67,-41,-95,-11v-7,8,-15,19,-21,32r21,27v8,-15,11,-28,28,-30"},"\u00c0":{"d":"57,0r14,-68r59,0r13,68r54,0r-61,-270r-68,0r-65,270r54,0xm78,-108r23,-132r21,132r-44,0xm41,-346r53,53r36,0r-34,-53r-55,0","w":200,"k":{"\u00fd":6,"\u00dd":20,"y":6,"w":6,"v":6,"Y":20,"W":13,"V":13,"T":20}},"\u00c1":{"d":"57,0r14,-68r59,0r13,68r54,0r-61,-270r-68,0r-65,270r54,0xm78,-108r23,-132r21,132r-44,0xm70,-293r37,0r53,-53r-56,0","w":200,"k":{"\u00fd":6,"\u00dd":20,"y":6,"w":6,"v":6,"Y":20,"W":13,"V":13,"T":20}},"\u00c2":{"d":"57,0r14,-68r59,0r13,68r54,0r-61,-270r-68,0r-65,270r54,0xm78,-108r23,-132r21,132r-44,0xm74,-344r-41,52r40,0r23,-29r23,29r41,0r-41,-52r-45,0","w":200,"k":{"\u00fd":6,"\u00dd":20,"y":6,"w":6,"v":6,"Y":20,"W":13,"V":13,"T":20}},"\u00c3":{"d":"57,0r14,-68r59,0r13,68r54,0r-61,-270r-68,0r-65,270r54,0xm78,-108r23,-132r21,132r-44,0xm57,-289v18,-41,79,30,102,-24v3,-6,6,-13,7,-22r-23,0v-18,41,-64,-22,-94,14v-8,9,-13,18,-14,32r22,0","w":200,"k":{"\u00fd":6,"\u00dd":20,"y":6,"w":6,"v":6,"Y":20,"W":13,"V":13,"T":20}},"\u00c8":{"d":"165,0r0,-40r-92,0r0,-83r85,0r0,-39r-85,0r0,-68r92,0r0,-40r-142,0r0,270r142,0xm31,-346r53,53r36,0r-34,-53r-55,0"},"\u00c9":{"d":"165,0r0,-40r-92,0r0,-83r85,0r0,-39r-85,0r0,-68r92,0r0,-40r-142,0r0,270r142,0xm60,-293r36,0r54,-53r-56,0"},"\u00ca":{"d":"165,0r0,-40r-92,0r0,-83r85,0r0,-39r-85,0r0,-68r92,0r0,-40r-142,0r0,270r142,0xm67,-344r-40,52r40,0r23,-29r23,29r41,0r-42,-52r-45,0"},"\u00cc":{"d":"75,0r0,-270r-50,0r0,270r50,0xm-9,-346r53,53r36,0r-34,-53r-55,0","w":100},"\u00cd":{"d":"75,0r0,-270r-50,0r0,270r50,0xm20,-293r37,0r53,-53r-56,0","w":100},"\u00d2":{"d":"110,-276v-89,0,-88,71,-88,158v0,77,13,124,88,124v90,0,90,-72,88,-163v-2,-73,-13,-119,-88,-119xm110,-34v-53,0,-36,-81,-36,-134v0,-35,3,-68,36,-68v53,0,34,84,37,139v2,34,-5,63,-37,63xm50,-346r54,53r36,0r-34,-53r-56,0","w":219},"\u00d3":{"d":"110,-276v-89,0,-88,71,-88,158v0,77,13,124,88,124v90,0,90,-72,88,-163v-2,-73,-13,-119,-88,-119xm110,-34v-53,0,-36,-81,-36,-134v0,-35,3,-68,36,-68v53,0,34,84,37,139v2,34,-5,63,-37,63xm80,-293r36,0r54,-53r-56,0","w":219},"\u00d4":{"d":"110,-276v-89,0,-88,71,-88,158v0,77,13,124,88,124v90,0,90,-72,88,-163v-2,-73,-13,-119,-88,-119xm110,-34v-53,0,-36,-81,-36,-134v0,-35,3,-68,36,-68v53,0,34,84,37,139v2,34,-5,63,-37,63xm87,-344r-41,52r41,0r23,-29r22,29r42,0r-42,-52r-45,0","w":219},"\u00d5":{"d":"110,-276v-89,0,-88,71,-88,158v0,77,13,124,88,124v90,0,90,-72,88,-163v-2,-73,-13,-119,-88,-119xm110,-34v-53,0,-36,-81,-36,-134v0,-35,3,-68,36,-68v53,0,34,84,37,139v2,34,-5,63,-37,63xm67,-289v18,-41,79,30,102,-24v3,-6,6,-13,7,-22r-23,0v-19,41,-66,-24,-94,14v-9,8,-14,18,-15,32r23,0","w":219},"\u00d9":{"d":"111,6v65,0,85,-25,85,-88r0,-188r-51,0r0,184v2,30,-5,52,-34,52v-30,0,-36,-21,-36,-52r0,-184r-51,0r0,188v0,63,22,89,87,88xm50,-346r54,53r36,0r-34,-53r-56,0","w":219},"\u00da":{"d":"111,6v65,0,85,-25,85,-88r0,-188r-51,0r0,184v2,30,-5,52,-34,52v-30,0,-36,-21,-36,-52r0,-184r-51,0r0,188v0,63,22,89,87,88xm80,-293r36,0r54,-53r-56,0","w":219},"\u00dd":{"d":"59,-270r-55,0r71,155r0,115r50,0r0,-115r71,-155r-55,0v-13,38,-31,71,-41,112v-7,-39,-28,-77,-41,-112xm70,-293r37,0r53,-53r-56,0","w":200,"k":{"\u00fa":13,"\u00f9":13,"\u00f5":20,"\u00f4":20,"\u00f3":20,"\u00f2":20,"\u00ed":6,"\u00ec":6,"\u00ea":20,"\u00e9":20,"\u00e8":20,"\u00e3":20,"\u00e2":20,"\u00e1":20,"\u00e0":20,"\u00c3":20,"\u00c2":20,"\u00c1":20,"\u00c0":20,"u":13,"o":20,"i":6,"e":20,"a":20,"A":20,";":13,":":13,".":40,"-":27,",":40}},"\u00e0":{"d":"111,-21v0,8,0,16,3,21r44,0v-9,-44,-2,-98,-4,-148v12,-67,-86,-76,-123,-43v-12,10,-14,26,-14,48r44,0v1,-20,4,-29,25,-29v16,-1,23,4,23,18v-15,47,-99,27,-94,99v-11,64,74,79,96,34xm84,-31v-27,2,-26,-36,-14,-50v6,-6,29,-19,38,-26v-3,31,8,73,-24,76xm31,-279r53,53r36,0r-34,-53r-55,0"},"\u00e1":{"d":"111,-21v0,8,0,16,3,21r44,0v-9,-44,-2,-98,-4,-148v12,-67,-86,-76,-123,-43v-12,10,-14,26,-14,48r44,0v1,-20,4,-29,25,-29v16,-1,23,4,23,18v-15,47,-99,27,-94,99v-11,64,74,79,96,34xm84,-31v-27,2,-26,-36,-14,-50v6,-6,29,-19,38,-26v-3,31,8,73,-24,76xm60,-226r36,0r54,-53r-56,0"},"\u00e2":{"d":"111,-21v0,8,0,16,3,21r44,0v-9,-44,-2,-98,-4,-148v12,-67,-86,-76,-123,-43v-12,10,-14,26,-14,48r44,0v1,-20,4,-29,25,-29v16,-1,23,4,23,18v-15,47,-99,27,-94,99v-11,64,74,79,96,34xm84,-31v-27,2,-26,-36,-14,-50v6,-6,29,-19,38,-26v-3,31,8,73,-24,76xm67,-277r-40,52r40,0r23,-29r23,29r41,0r-42,-52r-45,0"},"\u00e3":{"d":"111,-21v0,8,0,16,3,21r44,0v-9,-44,-2,-98,-4,-148v12,-67,-86,-76,-123,-43v-12,10,-14,26,-14,48r44,0v1,-20,4,-29,25,-29v16,-1,23,4,23,18v-15,47,-99,27,-94,99v-11,64,74,79,96,34xm84,-31v-27,2,-26,-36,-14,-50v6,-6,29,-19,38,-26v-3,31,8,73,-24,76xm47,-222v18,-41,79,30,102,-24v3,-6,6,-13,7,-22r-23,0v-18,40,-64,-21,-94,14v-8,9,-14,18,-15,32r23,0"},"\u00e8":{"d":"159,-92v3,-69,-2,-116,-72,-116v-66,0,-70,59,-68,128v2,58,20,84,75,85v47,0,64,-27,65,-74r-47,0v-1,23,-2,37,-22,38v-30,2,-23,-33,-24,-61r93,0xm88,-172v27,0,25,19,25,44r-47,0v1,-24,-3,-44,22,-44xm31,-279r53,53r36,0r-34,-53r-55,0"},"\u00e9":{"d":"159,-92v3,-69,-2,-116,-72,-116v-66,0,-70,59,-68,128v2,58,20,84,75,85v47,0,64,-27,65,-74r-47,0v-1,23,-2,37,-22,38v-30,2,-23,-33,-24,-61r93,0xm88,-172v27,0,25,19,25,44r-47,0v1,-24,-3,-44,22,-44xm60,-226r36,0r54,-53r-56,0"},"\u00ea":{"d":"159,-92v3,-69,-2,-116,-72,-116v-66,0,-70,59,-68,128v2,58,20,84,75,85v47,0,64,-27,65,-74r-47,0v-1,23,-2,37,-22,38v-30,2,-23,-33,-24,-61r93,0xm88,-172v27,0,25,19,25,44r-47,0v1,-24,-3,-44,22,-44xm67,-277r-40,52r40,0r23,-29r23,29r41,0r-42,-52r-45,0"},"\u00ec":{"d":"73,0r0,-203r-46,0r0,203r46,0xm-9,-279r53,53r36,0r-34,-53r-55,0","w":100},"\u00ed":{"d":"73,0r0,-203r-46,0r0,203r46,0xm20,-226r37,0r53,-53r-56,0","w":100},"\u00f2":{"d":"91,-31v-47,0,-16,-73,-25,-119v1,-14,9,-22,25,-22v41,2,23,68,23,106v0,25,0,35,-23,35xm19,-94v0,62,9,99,72,99v62,0,70,-38,70,-99v0,-67,-2,-114,-70,-114v-69,0,-72,45,-72,114xm31,-279r53,53r36,0r-34,-53r-55,0"},"\u00f3":{"d":"91,-31v-47,0,-16,-73,-25,-119v1,-14,9,-22,25,-22v41,2,23,68,23,106v0,25,0,35,-23,35xm19,-94v0,62,9,99,72,99v62,0,70,-38,70,-99v0,-67,-2,-114,-70,-114v-69,0,-72,45,-72,114xm60,-226r36,0r54,-53r-56,0"},"\u00f4":{"d":"91,-31v-47,0,-16,-73,-25,-119v1,-14,9,-22,25,-22v41,2,23,68,23,106v0,25,0,35,-23,35xm19,-94v0,62,9,99,72,99v62,0,70,-38,70,-99v0,-67,-2,-114,-70,-114v-69,0,-72,45,-72,114xm67,-277r-40,52r40,0r23,-29r23,29r41,0r-42,-52r-45,0"},"\u00f5":{"d":"91,-31v-47,0,-16,-73,-25,-119v1,-14,9,-22,25,-22v41,2,23,68,23,106v0,25,0,35,-23,35xm19,-94v0,62,9,99,72,99v62,0,70,-38,70,-99v0,-67,-2,-114,-70,-114v-69,0,-72,45,-72,114xm47,-222v18,-41,79,30,102,-24v3,-6,6,-13,7,-22r-23,0v-18,40,-64,-21,-94,14v-8,9,-14,18,-15,32r23,0"},"\u00f9":{"d":"66,5v26,0,36,-16,45,-35r0,30r44,0r0,-203r-47,0r0,147v-2,12,-5,25,-21,25v-17,0,-20,-14,-19,-33r0,-139r-47,0r0,155v1,36,7,53,45,53xm31,-279r53,53r36,0r-34,-53r-55,0"},"\u00fa":{"d":"66,5v26,0,36,-16,45,-35r0,30r44,0r0,-203r-47,0r0,147v-2,12,-5,25,-21,25v-17,0,-20,-14,-19,-33r0,-139r-47,0r0,155v1,36,7,53,45,53xm60,-226r36,0r54,-53r-56,0"},"\u00fd":{"d":"51,-3v7,21,7,43,-24,35r0,36v54,12,67,-21,78,-65r49,-206r-47,0r-21,109v-4,17,-4,38,-8,53v-5,-66,-17,-104,-27,-162r-49,0xm50,-226r36,0r54,-53r-56,0","w":159,"k":{".":20,",":20}},"\u00a0":{"w":90}}});

// #### Created By: http://www.cufonfonts.com ####
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":875,"face":{"font-family":"PF Tempesta Seven Bold","font-weight":700,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1250 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":500},"A":{"d":"750,-750r0,750r-250,0r0,-375r-250,0r0,375r-250,0r0,-750r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0xm250,-500r250,0r0,-250r-250,0r0,250"},"B":{"d":"625,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-875r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm500,-500r0,-250r-250,0r0,250r250,0xm500,-125r0,-250r-250,0r0,250r250,0"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,125r-500,0r0,625r500,0r0,125r-625,0r0,-75"},"D":{"d":"625,0r-625,0r0,-875r625,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm250,-125r250,0r0,-625r-250,0r0,625"},"E":{"d":"625,-450r0,75r-375,0r0,250r500,0r0,125r-750,0r0,-875r750,0r0,125r-500,0r0,250r425,0r0,50r-50,0"},"F":{"d":"625,-450r0,75r-375,0r0,375r-250,0r0,-875r750,0r0,125r-500,0r0,250r425,0r0,50r-50,0","k":{"J":125}},"H":{"d":"500,-375r-250,0r0,375r-250,0r0,-875r250,0r0,375r250,0r0,-375r250,0r0,875r-250,0r0,-375"},"I":{"d":"0,-875r250,0r0,875r-250,0r0,-875","w":375},"J":{"d":"0,-125r375,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-500,0r0,-125","w":750},"K":{"d":"375,-249r-125,0r0,249r-250,0r0,-875r250,0r0,250r125,0r0,-125r125,0r0,-125r250,0r0,126r-125,0r0,125r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r125,0r0,125r-250,0r0,-124r-125,0r0,-125"},"L":{"d":"0,-875r250,0r0,750r375,0r0,125r-625,0r0,-875","w":750,"k":{"T":125,"V":125,"Y":125}},"M":{"d":"625,-750r125,0r0,-125r250,0r0,875r-250,0r0,-499r-125,0r0,124r-250,0r0,-124r-125,0r0,499r-250,0r0,-875r250,0r0,125r125,0r0,125r250,0r0,-125","w":1125},"N":{"d":"500,-125r0,-125r-125,0r0,-200r-50,0r0,-50r-75,0r0,500r-250,0r0,-875r250,0r0,125r125,0r0,125r125,0r0,150r100,0r0,100r25,0r0,-500r250,0r0,875r-250,0r0,-125r-125,0","w":1000},"Z":{"d":"0,-250r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-500,0r0,-125r750,0r0,250r-125,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,125r500,0r0,125r-750,0r0,-250"},"Y":{"d":"500,-675r0,-200r250,0r0,125r-25,0r0,100r-100,0r0,150r-125,0r0,500r-250,0r0,-500r-125,0r0,-150r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50r150,0r0,-50r50,0","k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"X":{"d":"450,-250r-150,0r0,50r-50,0r0,200r-250,0r0,-125r25,0r0,-100r100,0r0,-150r125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50r150,0r0,-50r50,0r0,-200r250,0r0,125r-25,0r0,100r-100,0r0,150r-125,0r0,125r125,0r0,150r100,0r0,100r25,0r0,125r-250,0r0,-200r-50,0r0,-50"},"V":{"d":"625,-125r-125,0r0,125r-250,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-500r250,0r0,575r50,0r0,50r150,0r0,-50r50,0r0,-575r250,0r0,500r-25,0r0,100r-100,0r0,150","k":{"J":125}},"U":{"d":"750,-125r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r250,0r0,-750r250,0r0,750"},"T":{"d":"0,-875r750,0r0,125r-250,0r0,750r-250,0r0,-750r-250,0r0,-125","k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r500,0r0,-250r-375,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r625,0r0,125r-500,0r0,250r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"Q":{"d":"500,50r-50,0r0,-50r-325,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-250,0r0,-75xm250,-750r0,625r250,0r0,-625r-250,0"},"P":{"d":"750,-750r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,375r-250,0r0,-875r625,0r0,75r50,0r0,50r75,0xm500,-750r-250,0r0,250r250,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50xm250,-750r0,625r250,0r0,-625r-250,0"},"G":{"d":"750,0r-625,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,125r-500,0r0,625r250,0r0,-250r-125,0r0,-125r375,0r0,500"},"!":{"d":"0,-875r250,0r0,625r-250,0r0,-625xm0,-125r250,0r0,125r-250,0r0,-125","w":375},"\"":{"d":"0,-875r250,0r0,250r-250,0r0,-250xm375,-875r250,0r0,250r-250,0r0,-250","w":750},"'":{"d":"0,-875r250,0r0,250r-250,0r0,-250","w":375},",":{"d":"0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"(":{"d":"250,0r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,875","w":500},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-500,0xm250,-750r0,625r250,0r0,-625r-250,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0xm250,-750r0,250r250,0r0,-250r-250,0xm250,-375r0,250r250,0r0,-250r-250,0"},"9":{"d":"500,-375r-375,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r425,0r0,-250xm500,-500r0,-250r-250,0r0,250r250,0"},"6":{"d":"250,-500r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r550,0r0,50r-50,0r0,75r-375,0r0,250xm250,-375r0,250r250,0r0,-250r-250,0"},"5":{"d":"0,-125r500,0r0,-250r-500,0r0,-500r750,0r0,125r-500,0r0,250r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"3":{"d":"0,-125r500,0r0,-250r-375,0r0,-75r-50,0r0,-50r425,0r0,-250r-500,0r0,-125r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"2":{"d":"0,-875r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,250r500,0r0,125r-750,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,-250r-500,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r375,0r0,875r-250,0","w":500},"7":{"d":"450,-675r50,0r0,-75r-500,0r0,-125r750,0r0,125r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r75,0r0,-50r50,0r0,-200r75,0r0,-50"},"{":{"d":"375,-375r0,375r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r-125,0r0,-125r125,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,375r-125,0r0,125r125,0","w":625},"|":{"d":"0,-1000r250,0r0,1125r-250,0r0,-1125","w":375},"[":{"d":"0,-1000r375,0r0,125r-125,0r0,875r125,0r0,125r-375,0r0,-1125","w":500},"]":{"d":"375,125r-375,0r0,-125r125,0r0,-875r-125,0r0,-125r375,0r0,1125","w":500},"W":{"d":"125,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r250,0r0,-750r250,0r0,750r250,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-375,0r0,-75","w":1375},":":{"d":"0,-125r250,0r0,125r-250,0r0,-125xm0,-625r250,0r0,125r-250,0r0,-125","w":375},";":{"d":"0,-625r250,0r0,125r-250,0r0,-125xm0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"+":{"d":"0,-500r250,0r0,-250r250,0r0,250r250,0r0,125r-250,0r0,250r-250,0r0,-250r-250,0r0,-125"},"-":{"d":"0,-375r500,0r0,125r-500,0r0,-125","w":625},"?":{"d":"250,-375r75,0r0,-50r50,0r0,-75r125,0r0,-250r-500,0r0,-125r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,125r-250,0r0,-125xm250,-125r250,0r0,125r-250,0r0,-125"},"=":{"d":"0,-375r500,0r0,125r-500,0r0,-125xm0,-625r500,0r0,125r-500,0r0,-125","w":625},"<":{"d":"250,-125r0,-125r-125,0r0,-125r-125,0r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0","w":625},">":{"d":"0,-125r0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,125r125,0r0,125r-125,0r0,125r-125,0r0,125r-250,0","w":625},"\/":{"d":"500,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0"},"\\":{"d":"350,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-250,0r0,-150r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r-125,0r0,-200r-50,0r0,-50r-75,0r0,-125r250,0r0,150r100,0"},"&":{"d":"625,-375r0,250r125,0r0,125r-125,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,250r125,0r0,25r100,0r0,100r50,0r0,-100r100,0r0,-25r125,0r0,125r-125,0xm375,-375r-125,0r0,250r125,0r0,-250"},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm625,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm750,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1125},"#":{"d":"500,-250r-125,0r0,250r-250,0r0,-250r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,-250r250,0r0,250r125,0r0,-250r250,0r0,250r125,0r0,125r-125,0r0,125r125,0r0,125r-125,0r0,250r-250,0r0,-250xm375,-375r125,0r0,-125r-125,0r0,125","w":1000},"$":{"d":"375,125r-125,0r0,-125r-250,0r0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r150,0r0,-100r100,0r0,-25r125,0r0,125r250,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-150,0r0,100r-100,0r0,25xm425,-125r75,0r0,-250r-75,0r0,50r-50,0r0,150r50,0r0,50xm375,-550r0,-150r-50,0r0,-50r-75,0r0,250r75,0r0,-50r50,0"},")":{"d":"125,-875r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-875","w":500},"*":{"d":"750,-500r-125,0r0,125r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,250r-250,0r0,-250r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,-250r250,0r0,250r75,0r0,-50r50,0r0,-75r125,0r0,125"},"}":{"d":"250,-375r0,-125r-125,0r0,-375r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,375r125,0r0,125r-125,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-375r125,0","w":625},"`":{"d":"250,-1000r-125,0r0,-75r-50,0r0,-50r-75,0r0,-125r125,0r0,25r100,0r0,100r25,0r0,125","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-500,0r0,125r-125,0r0,625r125,0r0,125r375,0r0,125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-325,0r0,-75xm625,-375r-250,0r0,125r250,0r0,-125","w":1125},"~":{"d":"0,-750r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,125r-125,0r0,-125","w":625},"^":{"d":"300,-800r0,50r75,0r0,125r-125,0r0,-125r-75,0r0,50r-50,0r0,75r-125,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0","w":500},"_":{"d":"0,-125r500,0r0,125r-500,0r0,-125","w":625},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r375,0r0,-125r-375,0r0,-75r-50,0r0,-50r550,0r0,75r50,0r0,50r75,0r0,500r-625,0r0,-75xm500,-125r0,-125r-250,0r0,125r250,0"},"b":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-25,0r0,125r-250,0xm500,-500r-200,0r0,50r-50,0r0,275r50,0r0,50r200,0r0,-375"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r625,0r0,125r-500,0r0,375r500,0r0,125r-625,0r0,-75"},"d":{"d":"500,-500r0,-250r25,0r0,-100r200,0r0,100r25,0r0,750r-250,0r0,-125r-25,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,25r100,0r0,100r25,0xm250,-125r200,0r0,-50r50,0r0,-275r-50,0r0,-50r-200,0r0,375"},"e":{"d":"675,-75r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,250r-500,0r0,125r425,0r0,50xm250,-375r250,0r0,-125r-250,0r0,125"},"f":{"d":"375,-750r0,125r250,0r0,125r-250,0r0,500r-250,0r0,-500r-125,0r0,-125r125,0r0,-125r75,0r0,-50r50,0r0,-75r375,0r0,125r-250,0","w":750},"g":{"d":"500,125r0,-250r-25,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,25r100,0r0,100r25,0r0,-125r250,0r0,750r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r425,0xm250,-125r200,0r0,-50r50,0r0,-275r-50,0r0,-50r-200,0r0,375"},"h":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-200,0r0,50r-50,0r0,450r-250,0"},"i":{"d":"0,-625r250,0r0,625r-250,0r0,-625xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"j":{"d":"125,175r0,75r-250,0r0,-125r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"k":{"d":"500,-125r-125,0r0,-125r-125,0r0,250r-250,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,375r125,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0r0,-125"},"l":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,750r-250,0","w":375},"m":{"d":"300,-500r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r100,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-200,0r0,50r-50,0r0,450r-250,0r0,-500r-200,0","w":1375},"n":{"d":"300,-500r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-200,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-500,0xm250,-500r0,375r250,0r0,-375r-250,0"},"p":{"d":"250,-625r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-25,0r0,250r-25,0r0,100r-200,0r0,-100r-25,0r0,-750r250,0xm500,-500r-200,0r0,50r-50,0r0,275r50,0r0,50r200,0r0,-375"},"q":{"d":"750,-625r0,750r-25,0r0,100r-200,0r0,-100r-25,0r0,-250r-25,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,25r100,0r0,100r25,0r0,-125r250,0xm250,-125r200,0r0,-50r50,0r0,-275r-50,0r0,-50r-200,0r0,375"},"r":{"d":"300,-500r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,125r-325,0","w":750},"s":{"d":"0,-125r500,0r0,-125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r625,0r0,125r-500,0r0,125r375,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"t":{"d":"125,-125r0,-375r-125,0r0,-125r125,0r0,-125r75,0r0,-50r100,0r0,50r75,0r0,125r250,0r0,125r-250,0r0,375r250,0r0,125r-375,0r0,-25r-100,0r0,-100r-25,0","w":750},"u":{"d":"375,-25r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r200,0r0,-50r50,0r0,-450r250,0r0,625r-250,0r0,-125r-25,0r0,100r-100,0"},"v":{"d":"625,-125r-125,0r0,125r-250,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-250r250,0r0,325r50,0r0,50r150,0r0,-50r50,0r0,-325r250,0r0,250r-25,0r0,100r-100,0r0,150"},"w":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r250,0r0,-500r250,0r0,500r250,0r0,-500r250,0r0,500r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-375,0r0,-75","w":1375},"x":{"d":"0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r250,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0r0,-125r-250,0r0,125r-250,0r0,-125"},"y":{"d":"500,125r0,-125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r250,0r0,-500r250,0r0,750r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r425,0"},"z":{"d":"750,-125r0,125r-750,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-375,0r0,-125r750,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,125r375,0"},"R":{"d":"750,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-250,0r0,-325r-50,0r0,-50r-200,0r0,375r-250,0r0,-875r625,0r0,75r50,0r0,50r75,0xm500,-750r-250,0r0,250r250,0r0,-250"},"4":{"d":"125,-600r0,-150r125,0r0,-125r375,0r0,500r125,0r0,125r-125,0r0,250r-250,0r0,-250r-375,0r0,-250r25,0r0,-100r100,0xm375,-375r0,-250r-75,0r0,50r-50,0r0,200r125,0"},".":{"d":"0,-125r250,0r0,125r-250,0r0,-125","w":375},"\u00a0":{"w":500}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":750,"face":{"font-family":"PF Tempesta Seven Compressed Bold","font-weight":700,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1000 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":375},"A":{"d":"625,-750r0,750r-250,0r0,-375r-125,0r0,375r-250,0r0,-750r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0xm250,-500r125,0r0,-250r-125,0r0,250"},"B":{"d":"500,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm375,-500r0,-250r-125,0r0,250r125,0xm375,-125r0,-250r-125,0r0,250r125,0"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,125r-250,0r0,625r250,0r0,125r-375,0r0,-75","w":625},"D":{"d":"500,0r-500,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm250,-125r125,0r0,-625r-125,0r0,625"},"E":{"d":"375,-450r0,75r-125,0r0,250r250,0r0,125r-500,0r0,-875r500,0r0,125r-250,0r0,250r175,0r0,50r-50,0","w":625},"F":{"d":"375,-450r0,75r-125,0r0,375r-250,0r0,-875r500,0r0,125r-250,0r0,250r175,0r0,50r-50,0","w":625,"k":{"J":125}},"H":{"d":"375,-375r-125,0r0,375r-250,0r0,-875r250,0r0,375r125,0r0,-375r250,0r0,875r-250,0r0,-375"},"I":{"d":"0,-875r250,0r0,875r-250,0r0,-875","w":375},"J":{"d":"0,-125r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-125","w":500},"K":{"d":"375,-675r0,-200r250,0r0,125r-25,0r0,100r-100,0r0,151r-125,0r0,124r125,0r0,150r100,0r0,100r25,0r0,125r-250,0r0,-200r-50,0r0,-49r-75,0r0,249r-250,0r0,-875r250,0r0,250r75,0r0,-50r50,0"},"L":{"d":"0,-875r250,0r0,750r125,0r0,125r-375,0r0,-875","w":500,"k":{"T":125,"V":125}},"M":{"d":"500,-750r125,0r0,-125r250,0r0,875r-250,0r0,-499r-125,0r0,124r-125,0r0,-124r-125,0r0,499r-250,0r0,-875r250,0r0,125r125,0r0,125r125,0r0,-125","w":1000},"N":{"d":"250,-750r0,750r-250,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,750r-250,0r0,-750r-125,0"},"Z":{"d":"250,-325r0,200r250,0r0,125r-500,0r0,-250r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-200r-250,0r0,-125r500,0r0,250r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0","w":625},"Y":{"d":"375,-125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0"},"X":{"d":"300,-625r75,0r0,-250r250,0r0,125r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,25r125,0r0,150r100,0r0,100r25,0r0,125r-250,0r0,-250r-75,0r0,50r-50,0r0,200r-250,0r0,-125r25,0r0,-100r100,0r0,-150r125,0r0,-25r-100,0r0,-100r-25,0r0,-150r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50"},"V":{"d":"500,-125r-125,0r0,125r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-500r250,0r0,575r50,0r0,50r75,0r0,-625r250,0r0,500r-25,0r0,100r-100,0r0,150","k":{"J":125}},"U":{"d":"625,-125r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r125,0r0,-750r250,0r0,750"},"T":{"d":"0,-875r500,0r0,125r-125,0r0,750r-250,0r0,-750r-125,0r0,-125","w":625,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-125","w":625},"Q":{"d":"375,50r-50,0r0,-50r-200,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-250,0r0,-75xm250,-750r0,625r125,0r0,-625r-125,0"},"P":{"d":"625,-750r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,375r-250,0r0,-875r500,0r0,75r50,0r0,50r75,0xm375,-750r-125,0r0,250r125,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50xm250,-750r0,625r125,0r0,-625r-125,0"},"G":{"d":"625,0r-500,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,625r125,0r0,-375r250,0r0,500"},"!":{"d":"0,-875r250,0r0,625r-250,0r0,-625xm0,-125r250,0r0,125r-250,0r0,-125","w":375},"\"":{"d":"0,-875r250,0r0,250r-250,0r0,-250xm375,-875r250,0r0,250r-250,0r0,-250"},"'":{"d":"0,-875r250,0r0,250r-250,0r0,-250","w":375},",":{"d":"0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"(":{"d":"250,0r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,875","w":500},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0xm250,-750r0,625r125,0r0,-625r-125,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-375,0xm250,-750r0,250r125,0r0,-250r-125,0xm250,-375r0,250r125,0r0,-250r-125,0"},"9":{"d":"375,-375r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0r0,-250xm375,-500r0,-250r-125,0r0,250r125,0"},"6":{"d":"250,-500r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r425,0r0,50r-50,0r0,75r-250,0r0,250xm250,-375r0,250r125,0r0,-250r-125,0"},"5":{"d":"0,-125r250,0r0,-250r-250,0r0,-500r500,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-125","w":625},"3":{"d":"0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r175,0r0,-250r-250,0r0,-125r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-125","w":625},"2":{"d":"0,-875r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,250r250,0r0,125r-500,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,-250r-250,0r0,-125","w":625},"1":{"d":"125,0r0,-750r-125,0r0,-125r375,0r0,875r-250,0","w":500},"7":{"d":"125,-375r25,0r0,-100r100,0r0,-275r-250,0r0,-125r500,0r0,375r-75,0r0,50r-50,0r0,450r-250,0r0,-375","w":625},"{":{"d":"375,-375r0,375r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r-125,0r0,-125r125,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,375r-125,0r0,125r125,0","w":625},"|":{"d":"0,-1000r250,0r0,1125r-250,0r0,-1125","w":375},"[":{"d":"0,-1000r375,0r0,125r-125,0r0,875r125,0r0,125r-375,0r0,-1125","w":500},"]":{"d":"375,125r-375,0r0,-125r125,0r0,-875r-125,0r0,-125r375,0r0,1125","w":500},"W":{"d":"125,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r125,0r0,-750r250,0r0,750r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75","w":1125},":":{"d":"0,-125r250,0r0,125r-250,0r0,-125xm0,-625r250,0r0,125r-250,0r0,-125","w":375},";":{"d":"0,-625r250,0r0,125r-250,0r0,-125xm0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"+":{"d":"0,-500r250,0r0,-250r250,0r0,250r250,0r0,125r-250,0r0,250r-250,0r0,-250r-250,0r0,-125","w":875},"-":{"d":"0,-375r500,0r0,125r-500,0r0,-125","w":625},"?":{"d":"125,-375r75,0r0,-50r50,0r0,-325r-250,0r0,-125r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,200r-250,0r0,-125xm125,-125r250,0r0,125r-250,0r0,-125","w":625},"=":{"d":"0,-375r500,0r0,125r-500,0r0,-125xm0,-625r500,0r0,125r-500,0r0,-125","w":625},"<":{"d":"250,-125r0,-125r-125,0r0,-125r-125,0r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0","w":625},">":{"d":"0,-125r0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,125r125,0r0,125r-125,0r0,125r-125,0r0,125r-250,0","w":625},"\/":{"d":"125,-125r0,-125r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-200r125,0r0,-125r250,0r0,126r-125,0r0,124r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0r0,201r-125,0r0,124r-250,0r0,-125r125,0","w":875},"\\":{"d":"350,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-250,0r0,-150r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r-125,0r0,-200r-50,0r0,-50r-75,0r0,-125r250,0r0,150r100,0","w":875},"&":{"d":"625,-375r0,250r125,0r0,125r-125,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,250r125,0r0,25r100,0r0,100r50,0r0,-100r100,0r0,-25r125,0r0,125r-125,0xm375,-375r-125,0r0,250r125,0r0,-250","w":875},"%":{"d":"500,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":875},"#":{"d":"500,-250r-125,0r0,250r-250,0r0,-250r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,-250r250,0r0,250r125,0r0,-250r250,0r0,250r125,0r0,125r-125,0r0,125r125,0r0,125r-125,0r0,250r-250,0r0,-250xm375,-375r125,0r0,-125r-125,0r0,125","w":1000},"$":{"d":"375,125r-250,0r0,-125r-125,0r0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-200r250,0r0,125r125,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,200","w":625},")":{"d":"125,-875r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-875","w":500},"*":{"d":"750,-500r-125,0r0,125r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,250r-250,0r0,-250r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,-250r250,0r0,250r75,0r0,-50r50,0r0,-75r125,0r0,125","w":875},"}":{"d":"250,-375r0,-125r-125,0r0,-375r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,375r125,0r0,125r-125,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-375r125,0","w":625},"`":{"d":"250,-1000r-125,0r0,-75r-50,0r0,-50r-75,0r0,-125r125,0r0,25r100,0r0,100r25,0r0,125","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,-125r-125,0r0,-75r-50,0r0,-50r175,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-375,0r0,125r-125,0r0,625r125,0r0,125r250,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-200,0r0,-75xm500,-375r-125,0r0,125r125,0r0,-125","w":1000},"~":{"d":"0,-750r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,125r-125,0r0,-125","w":625},"^":{"d":"300,-800r0,50r75,0r0,125r-125,0r0,-125r-75,0r0,50r-50,0r0,75r-125,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0","w":500},"_":{"d":"0,-125r500,0r0,125r-500,0r0,-125","w":625},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r425,0r0,75r50,0r0,50r75,0r0,500r-500,0r0,-75xm375,-125r0,-125r-125,0r0,125r125,0"},"b":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,125r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-500,0xm375,-125r0,-375r-125,0r0,375r125,0"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,125r-250,0r0,375r250,0r0,125r-375,0r0,-75","w":625},"d":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,-125r25,0r0,-100r200,0r0,100r25,0r0,750r-500,0r0,-75xm375,-125r0,-375r-125,0r0,375r125,0"},"e":{"d":"550,-75r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,250r-375,0r0,125r300,0r0,50xm250,-375r125,0r0,-125r-125,0r0,125"},"f":{"d":"375,-750r0,125r125,0r0,125r-125,0r0,500r-250,0r0,-500r-125,0r0,-125r125,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0","w":625},"g":{"d":"375,125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0xm375,-125r0,-375r-125,0r0,375r125,0"},"h":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,125r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-125,0r0,500r-250,0"},"i":{"d":"0,-625r250,0r0,625r-250,0r0,-625xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"j":{"d":"125,175r0,75r-250,0r0,-125r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"k":{"d":"625,-125r0,125r-250,0r0,-125r-125,0r0,125r-250,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,250r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0"},"l":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,750r-250,0","w":375},"m":{"d":"0,-625r375,0r0,25r100,0r0,100r50,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-125,0r0,500r-250,0r0,-500r-125,0r0,500r-250,0r0,-625","w":1125},"n":{"d":"250,-500r0,500r-250,0r0,-625r500,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-125,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0xm250,-500r0,375r125,0r0,-375r-125,0"},"p":{"d":"500,-625r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,125r-25,0r0,100r-200,0r0,-100r-25,0r0,-750r500,0xm375,-125r0,-375r-125,0r0,375r125,0"},"q":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,750r-25,0r0,100r-200,0r0,-100r-25,0r0,-125r-250,0r0,-75xm375,-125r0,-375r-125,0r0,375r125,0"},"r":{"d":"375,-500r-125,0r0,500r-250,0r0,-625r375,0r0,125","w":500},"s":{"d":"0,-125r250,0r0,-125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r375,0r0,125r-250,0r0,125r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-375,0r0,-125","w":625},"t":{"d":"125,-125r0,-375r-125,0r0,-125r125,0r0,-125r75,0r0,-50r100,0r0,50r75,0r0,125r125,0r0,125r-125,0r0,375r125,0r0,125r-250,0r0,-25r-100,0r0,-100r-25,0","w":625},"u":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,625r-500,0r0,-75"},"v":{"d":"500,-125r-125,0r0,125r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-250r250,0r0,325r50,0r0,50r75,0r0,-375r250,0r0,250r-25,0r0,100r-100,0r0,150"},"w":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,500r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75","w":1125},"x":{"d":"125,-400r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50r75,0r0,-250r250,0r0,125r-25,0r0,100r-100,0r0,175r100,0r0,100r25,0r0,125r-250,0r0,-250r-75,0r0,50r-50,0r0,200r-250,0r0,-125r25,0r0,-100r100,0r0,-175"},"y":{"d":"375,125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0"},"z":{"d":"500,-125r0,125r-500,0r0,-250r125,0r0,-125r125,0r0,-125r-250,0r0,-125r500,0r0,250r-125,0r0,125r-125,0r0,125r250,0","w":625},"R":{"d":"625,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-250,0r0,-325r-50,0r0,-50r-75,0r0,375r-250,0r0,-875r500,0r0,75r50,0r0,50r75,0xm375,-750r-125,0r0,250r125,0r0,-250"},"4":{"d":"125,-600r0,-150r125,0r0,-125r375,0r0,875r-250,0r0,-250r-375,0r0,-250r25,0r0,-100r100,0xm375,-375r0,-250r-75,0r0,50r-50,0r0,200r125,0"},".":{"d":"0,-125r250,0r0,125r-250,0r0,-125","w":375},"\u00a0":{"w":375}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":500,"face":{"font-family":"PF Tempesta Seven Compressed","font-weight":400,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 875 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":250},"A":{"d":"375,-750r0,750r-125,0r0,-375r-125,0r0,375r-125,0r0,-750r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0xm125,-500r125,0r0,-250r-125,0r0,250"},"B":{"d":"250,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,-875r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm250,-500r0,-250r-125,0r0,250r125,0xm125,-125r125,0r0,-249r-125,0r0,249"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,625r250,0r0,125r-250,0r0,-75"},"D":{"d":"250,0r-250,0r0,-875r250,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm125,-125r125,0r0,-625r-125,0r0,625"},"E":{"d":"250,-450r0,75r-125,0r0,250r250,0r0,125r-375,0r0,-875r375,0r0,125r-250,0r0,250r175,0r0,50r-50,0"},"F":{"d":"250,-450r0,75r-125,0r0,375r-125,0r0,-875r375,0r0,125r-250,0r0,250r175,0r0,50r-50,0","k":{"J":125}},"H":{"d":"250,-375r-125,0r0,375r-125,0r0,-875r125,0r0,375r125,0r0,-375r125,0r0,875r-125,0r0,-375"},"I":{"d":"0,-875r125,0r0,875r-125,0r0,-875","w":250},"J":{"d":"0,-125r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"K":{"d":"200,-375r-75,0r0,375r-125,0r0,-875r125,0r0,375r75,0r0,-50r50,0r0,-325r125,0r0,250r-25,0r0,100r-100,0r0,175r100,0r0,100r25,0r0,250r-125,0r0,-325r-50,0r0,-50"},"L":{"d":"0,-875r125,0r0,750r125,0r0,125r-250,0r0,-875","w":375,"k":{"T":125,"V":125,"Y":125}},"M":{"d":"375,0r-125,0r0,-750r-125,0r0,750r-125,0r0,-875r250,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,750r-125,0r0,-749r-125,0r0,749","w":750},"N":{"d":"125,-750r0,750r-125,0r0,-875r250,0r0,75r50,0r0,50r75,0r0,750r-125,0r0,-750r-125,0"},"Z":{"d":"0,-750r0,-125r375,0r0,250r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0r0,200r250,0r0,125r-375,0r0,-250r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-200r-250,0"},"Y":{"d":"251,0r-126,0r0,-525r-100,0r0,-100r-25,0r0,-250r125,0r0,325r50,0r0,50r75,0r0,-375r125,0r0,250r-25,0r0,100r-99,0r0,525","k":{"J":125}},"X":{"d":"350,-250r25,0r0,250r-125,0r0,-375r-75,0r0,50r-50,0r0,325r-125,0r0,-250r25,0r0,-100r100,0r0,-175r-100,0r0,-100r-25,0r0,-250r125,0r0,325r50,0r0,50r75,0r0,-375r125,0r0,250r-25,0r0,100r-99,0r0,175r99,0r0,100"},"V":{"d":"251,0r-126,0r0,-275r-100,0r0,-100r-25,0r0,-500r125,0r0,575r50,0r0,50r75,0r0,-625r125,0r0,500r-25,0r0,100r-99,0r0,275","k":{"J":125}},"U":{"d":"375,-875r0,750r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r125,0r0,-750r125,0"},"T":{"d":"0,-875r375,0r0,125r-125,0r0,750r-125,0r0,-750r-125,0r0,-125","k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,-125"},"Q":{"d":"250,50r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-125,0r0,-75xm125,-750r0,625r125,0r0,-625r-125,0"},"P":{"d":"375,-750r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,375r-125,0r0,-875r250,0r0,75r50,0r0,50r75,0xm250,-750r-125,0r0,250r125,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50xm125,-750r0,625r125,0r0,-625r-125,0"},"G":{"d":"125,-125r125,0r0,-375r125,0r0,500r-250,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,625"},"!":{"d":"0,-875r125,0r0,625r-125,0r0,-625xm0,-125r125,0r0,125r-125,0r0,-125","w":250},"\"":{"d":"0,-875r125,0r0,250r-125,0r0,-250xm250,-875r125,0r0,250r-125,0r0,-250"},"'":{"d":"0,-875r125,0r0,250r-125,0r0,-250","w":250},",":{"d":"125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"(":{"d":"125,0r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,875","w":375},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0xm125,-750r0,625r125,0r0,-625r-125,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-125,0xm125,-750r0,250r125,0r0,-250r-125,0xm125,-374r0,249r125,0r0,-249r-125,0"},"9":{"d":"250,-375r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r175,0r0,-250xm125,-750r0,250r125,0r0,-250r-125,0"},"6":{"d":"250,-825r0,75r-125,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r175,0r0,50r-50,0xm125,-375r0,250r125,0r0,-250r-125,0"},"5":{"d":"0,-125r250,0r0,-250r-250,0r0,-500r375,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,-125"},"3":{"d":"0,-125r250,0r0,-249r-125,0r0,-76r-50,0r0,-50r175,0r0,-250r-250,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,-125"},"2":{"d":"0,-875r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,250r250,0r0,125r-375,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,-250r-250,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r250,0r0,875r-125,0","w":375},"7":{"d":"125,-375r25,0r0,-100r100,0r0,-275r-250,0r0,-125r375,0r0,375r-75,0r0,50r-50,0r0,450r-125,0r0,-375"},"{":{"d":"0,-500r125,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,376r-125,0r0,124r125,0r0,375r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-374r-125,0r0,-126"},"|":{"d":"0,-1000r125,0r0,1125r-125,0r0,-1125","w":250},"[":{"d":"0,-1000r250,0r0,125r-125,0r0,875r125,0r0,125r-250,0r0,-1125","w":375},"]":{"d":"0,0r125,0r0,-875r-125,0r0,-125r250,0r0,1125r-250,0r0,-125","w":375},"W":{"d":"250,-75r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r125,0r0,-750r125,0r0,750r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-125,0r0,-124r-75,0r0,49r-50,0","w":750},":":{"d":"125,-125r125,0r0,125r-125,0r0,-125xm125,-625r125,0r0,125r-125,0r0,-125","w":375},";":{"d":"125,-625r125,0r0,125r-125,0r0,-125xm125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"+":{"d":"0,-500r250,0r0,-250r125,0r0,250r250,0r0,126r-250,0r0,249r-125,0r0,-249r-250,0r0,-126xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"-":{"d":"0,-375r375,0r0,125r-375,0r0,-125"},"?":{"d":"250,-475r0,-275r-250,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,200r-125,0r0,-125r25,0r0,-100r100,0xm125,-125r125,0r0,125r-125,0r0,-125"},"=":{"d":"0,-375r375,0r0,125r-375,0r0,-125xm0,-625r375,0r0,125r-375,0r0,-125"},"<":{"d":"125,-374r-125,0r0,-126r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125"},">":{"d":"250,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-125r125,0r0,-124r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,126r-125,0r0,125"},"\/":{"d":"125,-125r0,-125r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,126r-125,0r0,124r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0r0,201r-125,0r0,124r-125,0r0,-125r125,0","w":750},"\\":{"d":"225,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-124r-125,0r0,-125r-125,0r0,-201r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0","w":750},"&":{"d":"125,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,126r-125,0r0,249r125,0r0,125r-125,0r0,-124r-75,0r0,49r-50,0r0,75r-125,0r0,-75xm250,-125r0,-249r-125,0r0,249r125,0","w":625},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm500,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm625,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,125r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1000},"#":{"d":"0,-625r125,0r0,-250r125,0r0,250r125,0r0,-250r125,0r0,250r125,0r0,126r-125,0r0,124r125,0r0,126r-125,0r0,249r-125,0r0,-249r-125,0r0,249r-125,0r0,-249r-125,0r0,-126r125,0r0,-124r-125,0r0,-126xm375,-375r0,-124r-125,0r0,124r125,0xm375,-250r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-250r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,-500r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"$":{"d":"250,-500r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,200r-125,0r0,-125r-125,0r0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-200r125,0r0,125r125,0r0,125r-250,0r0,250r125,0"},")":{"d":"125,-875r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-875","w":375},"*":{"d":"250,-500r0,-250r125,0r0,250r125,0r0,-125r125,0r0,126r-125,0r0,124r125,0r0,125r-125,0r0,-124r-125,0r0,249r-125,0r0,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-124r-125,0r0,-126r125,0r0,125r125,0xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"}":{"d":"375,-374r-125,0r0,374r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-375r125,0r0,-124r-125,0r0,-376r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,375r125,0r0,126"},"`":{"d":"0,-1125r0,-125r125,0r0,75r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,-125r-125,0r0,-75r-50,0r0,-50r175,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-375,0r0,125r-125,0r0,625r125,0r0,125r250,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-200,0r0,-75xm500,-375r-125,0r0,125r125,0r0,-125","w":1000},"~":{"d":"375,-625r-125,0r0,-124r-125,0r0,99r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r125,0r0,-100r100,0r0,100r-50,0r0,50r-50,0r0,75","w":625},"^":{"d":"250,-800r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,75"},"_":{"d":"0,-125r375,0r0,125r-375,0r0,-125"},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,-125r-125,0r0,-75r-50,0r0,-50r175,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-75xm250,-125r0,-125r-125,0r0,125r125,0"},"b":{"d":"0,-850r100,0r0,100r25,0r0,125r125,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-850xm250,-125r0,-375r-125,0r0,375r125,0"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,375r250,0r0,125r-250,0r0,-75"},"d":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,-225r100,0r0,100r25,0r0,750r-250,0r0,-75xm125,-125r125,0r0,-375r-125,0r0,375"},"e":{"d":"300,-75r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,250r-250,0r0,125r175,0r0,50xm125,-375r125,0r0,-125r-125,0r0,125"},"f":{"d":"0,-625r125,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,125r125,0r0,126r-125,0r0,499r-125,0r0,-499r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0"},"g":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,750r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r175,0r0,-125r-125,0r0,-75xm125,-125r125,0r0,-375r-125,0r0,375"},"h":{"d":"125,-500r0,500r-125,0r0,-850r100,0r0,100r25,0r0,125r125,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-125,0"},"i":{"d":"0,-625r125,0r0,625r-125,0r0,-625xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"j":{"d":"0,175r0,75r-125,0r0,-125r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"k":{"d":"100,-850r0,100r25,0r0,375r75,0r0,-50r50,0r0,-200r125,0r0,125r-25,0r0,100r-100,0r0,175r100,0r0,100r25,0r0,125r-125,0r0,-200r-50,0r0,-50r-75,0r0,250r-125,0r0,-850r100,0"},"l":{"d":"100,-850r0,100r25,0r0,750r-125,0r0,-850r100,0","w":250},"m":{"d":"375,0r-125,0r0,-500r-125,0r0,500r-125,0r0,-625r250,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-499r-125,0r0,499","w":750},"n":{"d":"125,-500r0,500r-125,0r0,-625r250,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-125,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-125,0xm125,-500r0,375r125,0r0,-375r-125,0"},"p":{"d":"250,-625r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-125,0r0,125r-25,0r0,100r-100,0r0,-850r250,0xm250,-125r0,-375r-125,0r0,375r125,0"},"q":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,750r-25,0r0,100r-100,0r0,-225r-125,0r0,-75xm125,-500r0,375r125,0r0,-375r-125,0"},"r":{"d":"0,-625r250,0r0,125r-125,0r0,500r-125,0r0,-625","w":375},"s":{"d":"0,-125r250,0r0,-125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,125r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-250,0r0,-125"},"t":{"d":"0,-625r125,0r0,-175r50,0r0,50r75,0r0,125r125,0r0,126r-125,0r0,374r125,0r0,125r-125,0r0,-25r-100,0r0,-100r-25,0r0,-374r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0"},"u":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r125,0r0,-500r125,0r0,625r-250,0r0,-75"},"v":{"d":"251,0r-126,0r0,-275r-100,0r0,-100r-25,0r0,-250r125,0r0,325r50,0r0,50r75,0r0,-375r125,0r0,250r-25,0r0,100r-99,0r0,275"},"w":{"d":"250,-75r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r125,0r0,-500r125,0r0,500r125,0r0,-500r125,0r0,500r-75,0r0,50r-50,0r0,75r-125,0r0,-124r-75,0r0,49r-50,0","w":750},"x":{"d":"350,-125r25,0r0,125r-125,0r0,-250r-75,0r0,50r-50,0r0,200r-125,0r0,-125r25,0r0,-100r100,0r0,-175r-100,0r0,-100r-25,0r0,-125r125,0r0,200r50,0r0,50r75,0r0,-250r125,0r0,125r-25,0r0,100r-99,0r0,175r99,0r0,100"},"y":{"d":"250,125r0,-125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r125,0r0,-500r125,0r0,750r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r175,0"},"z":{"d":"125,-125r250,0r0,125r-375,0r0,-250r125,0r0,-125r125,0r0,-125r-250,0r0,-125r375,0r0,251r-125,0r0,125r-125,0r0,124"},"R":{"d":"375,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-125,0r0,-325r-50,0r0,-50r-75,0r0,375r-125,0r0,-875r250,0r0,75r50,0r0,50r75,0xm250,-750r-125,0r0,250r125,0r0,-250"},"4":{"d":"250,0r0,-250r-250,0r0,-250r25,0r0,-100r100,0r0,-150r125,0r0,-125r125,0r0,875r-125,0xm250,-625r-75,0r0,50r-50,0r0,200r125,0r0,-250"},".":{"d":"125,-125r125,0r0,125r-125,0r0,-125","w":375},"\u00a0":{"w":250}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":750,"face":{"font-family":"PF Tempesta Seven Condensed Bold","font-weight":700,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1000 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":375},"A":{"d":"625,-750r0,750r-250,0r0,-375r-125,0r0,375r-250,0r0,-750r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0xm250,-500r125,0r0,-250r-125,0r0,250"},"B":{"d":"500,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm375,-500r0,-250r-125,0r0,250r125,0xm375,-125r0,-250r-125,0r0,250r125,0"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,625r375,0r0,125r-500,0r0,-75"},"D":{"d":"500,0r-500,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm250,-125r125,0r0,-625r-125,0r0,625"},"E":{"d":"500,-450r0,75r-250,0r0,250r375,0r0,125r-625,0r0,-875r625,0r0,125r-375,0r0,250r300,0r0,50r-50,0"},"F":{"d":"500,-450r0,75r-250,0r0,375r-250,0r0,-875r625,0r0,125r-375,0r0,250r300,0r0,50r-50,0","k":{"J":125}},"H":{"d":"375,-375r-125,0r0,375r-250,0r0,-875r250,0r0,375r125,0r0,-375r250,0r0,875r-250,0r0,-375"},"I":{"d":"0,-875r250,0r0,875r-250,0r0,-875","w":375},"J":{"d":"0,-125r250,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-125","w":625},"K":{"d":"375,-675r0,-200r250,0r0,125r-25,0r0,100r-100,0r0,151r-125,0r0,124r125,0r0,150r100,0r0,100r25,0r0,125r-250,0r0,-200r-50,0r0,-49r-75,0r0,249r-250,0r0,-875r250,0r0,250r75,0r0,-50r50,0"},"L":{"d":"0,-875r250,0r0,750r250,0r0,125r-500,0r0,-875","w":625,"k":{"T":125,"V":125}},"M":{"d":"500,-750r125,0r0,-125r250,0r0,875r-250,0r0,-499r-125,0r0,124r-125,0r0,-124r-125,0r0,499r-250,0r0,-875r250,0r0,125r125,0r0,125r125,0r0,-125","w":1000},"N":{"d":"350,-625r25,0r0,125r125,0r0,-375r250,0r0,875r-250,0r0,-150r-100,0r0,-100r-25,0r0,-125r-125,0r0,375r-250,0r0,-875r250,0r0,150r100,0r0,100","w":875},"Z":{"d":"250,-325r0,200r250,0r0,125r-500,0r0,-250r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-200r-250,0r0,-125r500,0r0,250r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0","w":625},"Y":{"d":"375,-125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0"},"X":{"d":"300,-625r75,0r0,-250r250,0r0,125r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,25r125,0r0,150r100,0r0,100r25,0r0,125r-250,0r0,-250r-75,0r0,50r-50,0r0,200r-250,0r0,-125r25,0r0,-100r100,0r0,-150r125,0r0,-25r-100,0r0,-100r-25,0r0,-150r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50"},"V":{"d":"500,-125r-125,0r0,125r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-500r250,0r0,575r50,0r0,50r75,0r0,-625r250,0r0,500r-25,0r0,100r-100,0r0,150","k":{"J":125}},"U":{"d":"625,-125r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r125,0r0,-750r250,0r0,750"},"T":{"d":"0,-875r500,0r0,125r-125,0r0,750r-250,0r0,-750r-125,0r0,-125","w":625,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r375,0r0,-250r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,250r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"Q":{"d":"375,50r-50,0r0,-50r-200,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-250,0r0,-75xm250,-750r0,625r125,0r0,-625r-125,0"},"P":{"d":"625,-750r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,375r-250,0r0,-875r500,0r0,75r50,0r0,50r75,0xm375,-750r-125,0r0,250r125,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50xm250,-750r0,625r125,0r0,-625r-125,0"},"G":{"d":"625,0r-500,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,625r125,0r0,-375r250,0r0,500"},"!":{"d":"0,-875r250,0r0,625r-250,0r0,-625xm0,-125r250,0r0,125r-250,0r0,-125","w":375},"\"":{"d":"0,-875r250,0r0,250r-250,0r0,-250xm375,-875r250,0r0,250r-250,0r0,-250"},"'":{"d":"0,-875r250,0r0,250r-250,0r0,-250","w":375},",":{"d":"0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"(":{"d":"250,0r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,875","w":500},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0xm250,-750r0,625r125,0r0,-625r-125,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-375,0xm250,-750r0,250r125,0r0,-250r-125,0xm250,-375r0,250r125,0r0,-250r-125,0"},"9":{"d":"375,-375r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0r0,-250xm375,-500r0,-250r-125,0r0,250r125,0"},"6":{"d":"250,-500r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r425,0r0,50r-50,0r0,75r-250,0r0,250xm250,-375r0,250r125,0r0,-250r-125,0"},"5":{"d":"0,-125r375,0r0,-250r-375,0r0,-500r625,0r0,125r-375,0r0,250r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"3":{"d":"0,-125r375,0r0,-250r-250,0r0,-75r-50,0r0,-50r300,0r0,-250r-375,0r0,-125r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"2":{"d":"0,-875r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,250r375,0r0,125r-625,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,-250r-375,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r375,0r0,875r-250,0","w":500},"7":{"d":"375,-750r-375,0r0,-125r625,0r0,250r-75,0r0,50r-50,0r0,200r-25,0r0,100r-100,0r0,275r-250,0r0,-250r75,0r0,-50r50,0r0,-200r25,0r0,-100r100,0r0,-150"},"{":{"d":"375,-375r0,375r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r-125,0r0,-125r125,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,375r-125,0r0,125r125,0","w":625},"|":{"d":"0,-1000r250,0r0,1125r-250,0r0,-1125","w":375},"[":{"d":"0,-1000r375,0r0,125r-125,0r0,875r125,0r0,125r-375,0r0,-1125","w":500},"]":{"d":"375,125r-375,0r0,-125r125,0r0,-875r-125,0r0,-125r375,0r0,1125","w":500},"W":{"d":"125,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r125,0r0,-750r250,0r0,750r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75","w":1125},":":{"d":"0,-125r250,0r0,125r-250,0r0,-125xm0,-625r250,0r0,125r-250,0r0,-125","w":375},";":{"d":"0,-625r250,0r0,125r-250,0r0,-125xm0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"+":{"d":"0,-500r250,0r0,-250r250,0r0,250r250,0r0,125r-250,0r0,250r-250,0r0,-250r-250,0r0,-125","w":875},"-":{"d":"0,-375r500,0r0,125r-500,0r0,-125","w":625},"?":{"d":"125,-375r75,0r0,-50r50,0r0,-75r125,0r0,-250r-375,0r0,-125r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,125r-250,0r0,-125xm125,-125r250,0r0,125r-250,0r0,-125"},"=":{"d":"0,-375r500,0r0,125r-500,0r0,-125xm0,-625r500,0r0,125r-500,0r0,-125","w":625},"<":{"d":"250,-125r0,-125r-125,0r0,-125r-125,0r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0","w":625},">":{"d":"0,-125r0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,125r125,0r0,125r-125,0r0,125r-125,0r0,125r-250,0","w":625},"\/":{"d":"500,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":875},"\\":{"d":"350,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-250,0r0,-150r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r-125,0r0,-200r-50,0r0,-50r-75,0r0,-125r250,0r0,150r100,0","w":875},"&":{"d":"625,-375r0,250r125,0r0,125r-125,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,250r125,0r0,25r100,0r0,100r50,0r0,-100r100,0r0,-25r125,0r0,125r-125,0xm375,-375r-125,0r0,250r125,0r0,-250","w":875},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm625,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm750,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1125},"#":{"d":"500,-250r-125,0r0,250r-250,0r0,-250r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,-250r250,0r0,250r125,0r0,-250r250,0r0,250r125,0r0,125r-125,0r0,125r125,0r0,125r-125,0r0,250r-250,0r0,-250xm375,-375r125,0r0,-125r-125,0r0,125","w":1000},"$":{"d":"375,125r-125,0r0,-125r-250,0r0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r150,0r0,-100r100,0r0,-25r125,0r0,125r250,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-150,0r0,100r-100,0r0,25xm425,-125r75,0r0,-250r-75,0r0,50r-50,0r0,150r50,0r0,50xm375,-550r0,-150r-50,0r0,-50r-75,0r0,250r75,0r0,-50r50,0","w":875},")":{"d":"125,-875r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-875","w":500},"*":{"d":"750,-500r-125,0r0,125r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,250r-250,0r0,-250r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,-250r250,0r0,250r75,0r0,-50r50,0r0,-75r125,0r0,125","w":875},"}":{"d":"250,-375r0,-125r-125,0r0,-375r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,375r125,0r0,125r-125,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-375r125,0","w":625},"`":{"d":"250,-1000r-125,0r0,-75r-50,0r0,-50r-75,0r0,-125r125,0r0,25r100,0r0,100r25,0r0,125","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-500,0r0,125r-125,0r0,625r125,0r0,125r375,0r0,125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-325,0r0,-75xm625,-375r-250,0r0,125r250,0r0,-125","w":1125},"~":{"d":"0,-750r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,125r-125,0r0,-125","w":625},"^":{"d":"300,-800r0,50r75,0r0,125r-125,0r0,-125r-75,0r0,50r-50,0r0,75r-125,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0","w":500},"_":{"d":"0,-125r500,0r0,125r-500,0r0,-125","w":625},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r425,0r0,75r50,0r0,50r75,0r0,500r-500,0r0,-75xm375,-125r0,-125r-125,0r0,125r125,0"},"b":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,125r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-500,0xm375,-125r0,-375r-125,0r0,375r125,0"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,375r375,0r0,125r-500,0r0,-75"},"d":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,-125r25,0r0,-100r200,0r0,100r25,0r0,750r-500,0r0,-75xm375,-125r0,-375r-125,0r0,375r125,0"},"e":{"d":"550,-75r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,250r-375,0r0,125r300,0r0,50xm250,-375r125,0r0,-125r-125,0r0,125"},"f":{"d":"375,-750r0,125r125,0r0,125r-125,0r0,500r-250,0r0,-500r-125,0r0,-125r125,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0","w":625},"g":{"d":"375,125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0xm375,-125r0,-375r-125,0r0,375r125,0"},"h":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,125r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-125,0r0,500r-250,0"},"i":{"d":"0,-625r250,0r0,625r-250,0r0,-625xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"j":{"d":"125,175r0,75r-250,0r0,-125r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"k":{"d":"625,-125r0,125r-250,0r0,-125r-125,0r0,125r-250,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,250r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0"},"l":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,750r-250,0","w":375},"m":{"d":"0,-625r375,0r0,25r100,0r0,100r50,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-125,0r0,500r-250,0r0,-500r-125,0r0,500r-250,0r0,-625","w":1125},"n":{"d":"250,-500r0,500r-250,0r0,-625r500,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-125,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0xm250,-500r0,375r125,0r0,-375r-125,0"},"p":{"d":"500,-625r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,125r-25,0r0,100r-200,0r0,-100r-25,0r0,-750r500,0xm375,-125r0,-375r-125,0r0,375r125,0"},"q":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,750r-25,0r0,100r-200,0r0,-100r-25,0r0,-125r-250,0r0,-75xm375,-125r0,-375r-125,0r0,375r125,0"},"r":{"d":"375,-625r125,0r0,125r-200,0r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25","w":625},"s":{"d":"0,-125r375,0r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,125r250,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"t":{"d":"125,-125r0,-375r-125,0r0,-125r125,0r0,-125r75,0r0,-50r100,0r0,50r75,0r0,125r125,0r0,125r-125,0r0,375r125,0r0,125r-250,0r0,-25r-100,0r0,-100r-25,0","w":625},"u":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,625r-500,0r0,-75"},"v":{"d":"500,-125r-125,0r0,125r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-250r250,0r0,325r50,0r0,50r75,0r0,-375r250,0r0,250r-25,0r0,100r-100,0r0,150"},"w":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,500r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75","w":1125},"x":{"d":"125,-400r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50r75,0r0,-250r250,0r0,125r-25,0r0,100r-100,0r0,175r100,0r0,100r25,0r0,125r-250,0r0,-250r-75,0r0,50r-50,0r0,200r-250,0r0,-125r25,0r0,-100r100,0r0,-175"},"y":{"d":"375,125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r125,0r0,-500r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r300,0"},"z":{"d":"500,-125r0,125r-500,0r0,-250r125,0r0,-125r125,0r0,-125r-250,0r0,-125r500,0r0,250r-125,0r0,125r-125,0r0,125r250,0","w":625},"R":{"d":"625,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-250,0r0,-325r-50,0r0,-50r-75,0r0,375r-250,0r0,-875r500,0r0,75r50,0r0,50r75,0xm375,-750r-125,0r0,250r125,0r0,-250"},"4":{"d":"125,-600r0,-150r125,0r0,-125r375,0r0,875r-250,0r0,-250r-375,0r0,-250r25,0r0,-100r100,0xm375,-375r0,-250r-75,0r0,50r-50,0r0,200r125,0"},".":{"d":"0,-125r250,0r0,125r-250,0r0,-125","w":375},"\u00a0":{"w":375}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":625,"face":{"font-family":"PF Tempesta Seven Condensed","font-weight":400,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1000 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":375},"A":{"d":"500,-750r0,750r-125,0r0,-375r-250,0r0,375r-125,0r0,-750r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0xm125,-500r250,0r0,-250r-250,0r0,250"},"B":{"d":"375,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-875r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm375,-500r0,-250r-250,0r0,250r250,0xm125,-125r250,0r0,-249r-250,0r0,249"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,625r375,0r0,125r-375,0r0,-75"},"D":{"d":"375,0r-375,0r0,-875r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm125,-125r250,0r0,-625r-250,0r0,625"},"E":{"d":"375,-450r0,75r-250,0r0,250r375,0r0,125r-500,0r0,-875r500,0r0,125r-375,0r0,250r300,0r0,50r-50,0"},"F":{"d":"375,-450r0,75r-250,0r0,375r-125,0r0,-875r500,0r0,125r-375,0r0,250r300,0r0,50r-50,0","k":{"J":125}},"H":{"d":"375,-375r-250,0r0,375r-125,0r0,-875r125,0r0,375r250,0r0,-375r125,0r0,875r-125,0r0,-375"},"I":{"d":"0,-875r125,0r0,875r-125,0r0,-875","w":250},"J":{"d":"0,-125r250,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-125","w":500},"K":{"d":"375,-875r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,124r125,0r0,200r50,0r0,50r75,0r0,125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-124r-125,0r0,374r-125,0r0,-875r125,0r0,375r125,0r0,-125r25,0r0,-100r100,0r0,-150"},"L":{"d":"0,-875r125,0r0,750r250,0r0,125r-375,0r0,-875","w":500,"k":{"T":125,"V":125,"Y":125}},"M":{"d":"375,-625r0,-125r125,0r0,-125r125,0r0,875r-125,0r0,-624r-125,0r0,124r-125,0r0,-124r-125,0r0,624r-125,0r0,-875r125,0r0,125r125,0r0,125r125,0","w":750},"N":{"d":"425,-250r75,0r0,-625r125,0r0,875r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-200r-50,0r0,-50r-75,0r0,625r-125,0r0,-875r125,0r0,125r125,0r0,150r100,0r0,100r25,0r0,200r50,0r0,50","w":750},"Z":{"d":"375,-500r-75,0r0,50r-50,0r0,201r-125,0r0,124r375,0r0,125r-500,0r0,-250r125,0r0,-125r25,0r0,-100r100,0r0,-150r125,0r0,-125r-375,0r0,-125r500,0r0,251r-125,0r0,124"},"Y":{"d":"550,-750r0,50r-50,0r0,201r-125,0r0,499r-125,0r0,-499r-125,0r0,-201r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0r0,100r25,0r0,125r125,0r0,-125r25,0r0,-100r100,0r0,-150r125,0r0,125r-75,0","w":750,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"X":{"d":"125,-525r-100,0r0,-100r-25,0r0,-250r125,0r0,325r50,0r0,50r150,0r0,-50r50,0r0,-325r125,0r0,250r-25,0r0,100r-100,0r0,175r100,0r0,100r25,0r0,250r-125,0r0,-325r-50,0r0,-50r-150,0r0,50r-50,0r0,325r-125,0r0,-250r25,0r0,-100r100,0r0,-175"},"V":{"d":"500,-375r-25,0r0,100r-99,0r0,275r-126,0r0,-275r-100,0r0,-100r-25,0r0,-200r-50,0r0,-50r-75,0r0,-250r125,0r0,275r100,0r0,100r25,0r0,200r50,0r0,50r75,0r0,-250r25,0r0,-100r100,0r0,-275r125,0r0,250r-75,0r0,50r-50,0r0,200","w":750,"k":{"J":125}},"U":{"d":"500,-875r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r250,0r0,-750r125,0"},"T":{"d":"0,-875r625,0r0,125r-250,0r0,750r-125,0r0,-750r-250,0r0,-125","w":750,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r375,0r0,-250r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,250r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-125"},"Q":{"d":"375,50r-50,0r0,-50r-200,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-125,0r0,-75xm125,-750r0,625r250,0r0,-625r-250,0"},"P":{"d":"500,-750r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,375r-125,0r0,-875r375,0r0,75r50,0r0,50r75,0xm375,-750r-250,0r0,250r250,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-250,0r0,-75r-50,0r0,-50xm125,-750r0,625r250,0r0,-625r-250,0"},"G":{"d":"125,-125r250,0r0,-250r-125,0r0,-125r250,0r0,500r-375,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,625"},"!":{"d":"0,-875r125,0r0,625r-125,0r0,-625xm0,-125r125,0r0,125r-125,0r0,-125","w":250},"\"":{"d":"0,-875r125,0r0,250r-125,0r0,-250xm250,-875r125,0r0,250r-125,0r0,-250","w":500},"'":{"d":"0,-875r125,0r0,250r-125,0r0,-250","w":250},",":{"d":"125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"(":{"d":"125,0r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,875","w":375},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-250,0xm125,-750r0,625r250,0r0,-625r-250,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-250,0xm125,-750r0,250r250,0r0,-250r-250,0xm125,-374r0,249r250,0r0,-249r-250,0"},"9":{"d":"375,-375r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r300,0r0,-250xm375,-500r0,-250r-250,0r0,250r250,0"},"6":{"d":"125,-500r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r300,0r0,50r-50,0r0,75r-250,0r0,250xm125,-375r0,250r250,0r0,-250r-250,0"},"5":{"d":"0,-125r375,0r0,-250r-375,0r0,-500r500,0r0,125r-375,0r0,250r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-125"},"3":{"d":"0,-125r375,0r0,-249r-250,0r0,-76r-50,0r0,-50r300,0r0,-250r-375,0r0,-125r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-125"},"2":{"d":"0,-875r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,250r375,0r0,125r-500,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,-250r-375,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r250,0r0,875r-125,0","w":375},"7":{"d":"0,-750r0,-125r500,0r0,250r-75,0r0,50r-50,0r0,200r-25,0r0,100r-100,0r0,275r-125,0r0,-250r75,0r0,-50r50,0r0,-200r25,0r0,-100r100,0r0,-150r-375,0"},"{":{"d":"0,-500r125,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,376r-125,0r0,124r125,0r0,375r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-374r-125,0r0,-126","w":500},"|":{"d":"0,-1000r125,0r0,1125r-125,0r0,-1125","w":250},"[":{"d":"0,-1000r250,0r0,125r-125,0r0,875r125,0r0,125r-250,0r0,-1125","w":375},"]":{"d":"0,0r125,0r0,-875r-125,0r0,-125r250,0r0,1125r-250,0r0,-125","w":375},"W":{"d":"250,-75r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r125,0r0,-750r125,0r0,750r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-125,0r0,-124r-75,0r0,49r-50,0","w":750},":":{"d":"125,-125r125,0r0,125r-125,0r0,-125xm125,-625r125,0r0,125r-125,0r0,-125","w":375},";":{"d":"125,-625r125,0r0,125r-125,0r0,-125xm125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"+":{"d":"0,-500r250,0r0,-250r125,0r0,250r250,0r0,126r-250,0r0,249r-125,0r0,-249r-250,0r0,-126xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"-":{"d":"0,-375r375,0r0,125r-375,0r0,-125","w":500},"?":{"d":"125,-375r75,0r0,-50r50,0r0,-75r125,0r0,-250r-375,0r0,-125r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,125r-125,0r0,-125xm125,-125r125,0r0,125r-125,0r0,-125"},"=":{"d":"0,-375r375,0r0,125r-375,0r0,-125xm0,-625r375,0r0,125r-375,0r0,-125","w":500},"<":{"d":"125,-374r-125,0r0,-126r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125","w":500},">":{"d":"250,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-125r125,0r0,-124r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,126r-125,0r0,125","w":500},"\/":{"d":"125,-125r0,-125r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,126r-125,0r0,124r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0r0,201r-125,0r0,124r-125,0r0,-125r125,0","w":750},"\\":{"d":"225,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-124r-125,0r0,-125r-125,0r0,-201r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0","w":750},"&":{"d":"125,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,126r-125,0r0,249r125,0r0,125r-125,0r0,-124r-75,0r0,49r-50,0r0,75r-125,0r0,-75xm250,-125r0,-249r-125,0r0,249r125,0"},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm500,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm625,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,125r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1000},"#":{"d":"0,-625r125,0r0,-250r125,0r0,250r125,0r0,-250r125,0r0,250r125,0r0,126r-125,0r0,124r125,0r0,126r-125,0r0,249r-125,0r0,-249r-125,0r0,249r-125,0r0,-249r-125,0r0,-126r125,0r0,-124r-125,0r0,-126xm375,-375r0,-124r-125,0r0,124r125,0xm375,-250r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-250r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,-500r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"$":{"d":"0,-125r250,0r0,-249r-125,0r0,-76r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r125,0r0,-125r125,0r0,125r250,0r0,126r-250,0r0,249r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,76r-125,0r0,124r-125,0r0,-124r-250,0r0,-126xm250,-749r-125,0r0,249r125,0r0,-249xm500,-125r0,-249r-125,0r0,249r125,0xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,-750r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,0r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},")":{"d":"125,-875r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-875","w":375},"*":{"d":"250,-500r0,-250r125,0r0,250r125,0r0,-125r125,0r0,126r-125,0r0,124r125,0r0,125r-125,0r0,-124r-125,0r0,249r-125,0r0,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-124r-125,0r0,-126r125,0r0,125r125,0xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"}":{"d":"375,-374r-125,0r0,374r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-375r125,0r0,-124r-125,0r0,-376r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,375r125,0r0,126","w":500},"`":{"d":"0,-1125r0,-125r125,0r0,75r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-500,0r0,125r-125,0r0,625r125,0r0,125r375,0r0,125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-325,0r0,-75xm625,-375r-250,0r0,125r250,0r0,-125","w":1125},"~":{"d":"375,-625r-125,0r0,-124r-125,0r0,99r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r125,0r0,-100r100,0r0,100r-50,0r0,50r-50,0r0,75"},"^":{"d":"250,-800r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,75","w":500},"_":{"d":"0,-125r375,0r0,125r-375,0r0,-125","w":500},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r-375,0r0,-75xm375,-125r0,-125r-250,0r0,125r250,0"},"b":{"d":"100,-850r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-125,0r0,-25r-100,0r0,-100r-25,0r0,125r-125,0r0,-850r100,0xm375,-500r-200,0r0,50r-50,0r0,275r50,0r0,50r200,0r0,-375"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,375r375,0r0,125r-375,0r0,-75"},"d":{"d":"475,-850r0,100r25,0r0,750r-125,0r0,-125r-25,0r0,100r-100,0r0,25r-125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,25r100,0r0,100r25,0r0,-350r100,0xm125,-125r200,0r0,-50r50,0r0,-275r-50,0r0,-50r-200,0r0,375"},"e":{"d":"425,-75r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,250r-375,0r0,125r300,0r0,50xm125,-375r250,0r0,-125r-250,0r0,125"},"f":{"d":"0,-625r125,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,125r125,0r0,126r-125,0r0,499r-125,0r0,-499r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":500},"g":{"d":"375,125r0,-250r-25,0r0,100r-100,0r0,25r-125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,25r100,0r0,100r25,0r0,-125r125,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r300,0xm125,-125r200,0r0,-50r50,0r0,-275r-50,0r0,-50r-200,0r0,375"},"h":{"d":"100,-850r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-200,0r0,50r-50,0r0,450r-125,0r0,-850r100,0"},"i":{"d":"0,-625r125,0r0,625r-125,0r0,-625xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"j":{"d":"0,175r0,75r-125,0r0,-125r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"k":{"d":"100,-850r0,100r25,0r0,375r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125r-125,0r0,249r-125,0r0,-850r100,0"},"l":{"d":"100,-850r0,100r25,0r0,750r-125,0r0,-850r100,0","w":250},"m":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r100,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-200,0r0,50r-50,0r0,450r-125,0r0,-500r-200,0","w":1000},"n":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-200,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0xm125,-500r0,375r250,0r0,-375r-250,0"},"p":{"d":"125,-625r0,125r25,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-125,0r0,-25r-100,0r0,-100r-25,0r0,250r-25,0r0,100r-100,0r0,-850r125,0xm375,-500r-200,0r0,50r-50,0r0,275r50,0r0,50r200,0r0,-375"},"q":{"d":"350,-125r0,100r-100,0r0,25r-125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,25r100,0r0,100r25,0r0,-125r125,0r0,750r-25,0r0,100r-100,0r0,-350r-25,0xm125,-125r200,0r0,-50r50,0r0,-275r-50,0r0,-50r-200,0r0,375"},"r":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r125,0r0,125r-200,0","w":500},"s":{"d":"0,-125r375,0r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,125r250,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-375,0r0,-125"},"t":{"d":"0,-625r125,0r0,-175r50,0r0,50r75,0r0,125r125,0r0,126r-125,0r0,374r125,0r0,125r-125,0r0,-25r-100,0r0,-100r-25,0r0,-374r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":500},"u":{"d":"250,-25r0,25r-125,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r200,0r0,-50r50,0r0,-450r125,0r0,625r-125,0r0,-125r-25,0r0,100r-100,0"},"v":{"d":"125,0r0,-150r-100,0r0,-100r-25,0r0,-375r125,0r0,450r50,0r0,50r150,0r0,-50r50,0r0,-450r125,0r0,375r-25,0r0,100r-100,0r0,150r-250,0"},"w":{"d":"250,-75r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r125,0r0,-500r125,0r0,500r125,0r0,-500r125,0r0,500r-75,0r0,50r-50,0r0,75r-125,0r0,-124r-75,0r0,49r-50,0","w":750},"x":{"d":"125,-400r-100,0r0,-100r-25,0r0,-125r125,0r0,200r50,0r0,50r150,0r0,-50r50,0r0,-200r125,0r0,125r-25,0r0,100r-100,0r0,175r100,0r0,100r25,0r0,125r-125,0r0,-200r-50,0r0,-50r-150,0r0,50r-50,0r0,200r-125,0r0,-125r25,0r0,-100r100,0r0,-175"},"y":{"d":"375,125r0,-125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r250,0r0,-500r125,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r300,0"},"z":{"d":"125,-125r250,0r0,125r-375,0r0,-250r125,0r0,-125r125,0r0,-125r-250,0r0,-125r375,0r0,251r-125,0r0,125r-125,0r0,124","w":500},"R":{"d":"500,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-125,0r0,-325r-50,0r0,-50r-200,0r0,375r-125,0r0,-875r375,0r0,75r50,0r0,50r75,0xm375,-750r-250,0r0,250r250,0r0,-250"},"4":{"d":"125,-750r125,0r0,-125r125,0r0,500r125,0r0,126r-125,0r0,249r-125,0r0,-249r-250,0r0,-251r25,0r0,-100r100,0r0,-150xm250,-625r-75,0r0,50r-50,0r0,200r125,0r0,-250xm375,-250r0,-124r-25,0r0,99r-100,0r0,25r125,0"},".":{"d":"125,-125r125,0r0,125r-125,0r0,-125","w":375},"\u00a0":{"w":375}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":1000,"face":{"font-family":"PF Tempesta Seven Extended Bold","font-weight":700,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1250 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":625},"A":{"d":"875,-750r0,750r-250,0r0,-375r-375,0r0,375r-250,0r0,-750r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0xm250,-500r375,0r0,-250r-375,0r0,250"},"B":{"d":"750,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-750,0r0,-875r750,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm625,-500r0,-250r-375,0r0,250r375,0xm625,-125r0,-250r-375,0r0,250r375,0"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r750,0r0,125r-625,0r0,625r625,0r0,125r-750,0r0,-75"},"D":{"d":"750,0r-750,0r0,-875r750,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm250,-125r375,0r0,-625r-375,0r0,625"},"E":{"d":"750,-450r0,75r-500,0r0,250r625,0r0,125r-875,0r0,-875r875,0r0,125r-625,0r0,250r550,0r0,50r-50,0"},"F":{"d":"750,-450r0,75r-500,0r0,375r-250,0r0,-875r875,0r0,125r-625,0r0,250r550,0r0,50r-50,0","k":{"J":125}},"H":{"d":"625,-375r-375,0r0,375r-250,0r0,-875r250,0r0,375r375,0r0,-375r250,0r0,875r-250,0r0,-375"},"I":{"d":"0,-875r250,0r0,875r-250,0r0,-875","w":375},"J":{"d":"0,-125r500,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-625,0r0,-125","w":875},"K":{"d":"0,-875r250,0r0,375r125,0r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,125r-250,0r0,-125r-125,0r0,-125r-125,0r0,-125r-125,0r0,375r-250,0r0,-875"},"L":{"d":"0,-875r250,0r0,750r500,0r0,125r-750,0r0,-875","w":875,"k":{"t":125,"T":125,"V":125,"Y":125}},"M":{"d":"625,-500r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,875r-250,0r0,-499r-125,0r0,124r-125,0r0,125r-125,0r0,-125r-125,0r0,-124r-125,0r0,499r-250,0r0,-875r250,0r0,125r125,0r0,125r125,0r0,125r125,0","w":1250},"N":{"d":"750,-375r0,-500r250,0r0,875r-250,0r0,-125r-125,0r0,-125r-125,0r0,-125r-125,0r0,-125r-125,0r0,500r-250,0r0,-875r250,0r0,125r125,0r0,125r125,0r0,125r125,0r0,125r125,0","w":1125},"Z":{"d":"0,-250r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-500,0r0,-125r750,0r0,250r-125,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,125r500,0r0,125r-750,0r0,-250","w":875},"Y":{"d":"375,0r0,-500r-125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,125r250,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,500r-250,0","w":1125,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"X":{"d":"625,-250r-250,0r0,125r-125,0r0,125r-250,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,125r250,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,125r-250,0r0,-125r-125,0r0,-125","w":1125},"V":{"d":"500,-375r75,0r0,-50r50,0r0,-450r250,0r0,375r-25,0r0,100r-100,0r0,150r-125,0r0,125r-125,0r0,125r-125,0r0,-125r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-375r250,0r0,450r50,0r0,50r75,0r0,125r125,0r0,-125","k":{"J":125}},"U":{"d":"875,-125r-75,0r0,50r-50,0r0,75r-625,0r0,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r375,0r0,-750r250,0r0,750"},"T":{"d":"0,-875r1000,0r0,125r-375,0r0,750r-250,0r0,-750r-375,0r0,-125","w":1125,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r625,0r0,-250r-500,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r750,0r0,125r-625,0r0,250r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-750,0r0,-125"},"Q":{"d":"625,50r-50,0r0,-50r-450,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-250,0r0,-75xm250,-750r0,625r375,0r0,-625r-375,0"},"P":{"d":"875,-750r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,375r-250,0r0,-875r750,0r0,75r50,0r0,50r75,0xm625,-750r-375,0r0,250r375,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-625,0r0,-75r-50,0r0,-50xm250,-750r0,625r375,0r0,-625r-375,0"},"G":{"d":"875,0r-750,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r750,0r0,125r-625,0r0,625r375,0r0,-250r-125,0r0,-25r-100,0r0,-100r475,0r0,500"},"!":{"d":"0,-875r250,0r0,625r-250,0r0,-625xm0,-125r250,0r0,125r-250,0r0,-125","w":375},"\"":{"d":"0,-875r250,0r0,250r-250,0r0,-250xm375,-875r250,0r0,250r-250,0r0,-250","w":750},"'":{"d":"0,-875r250,0r0,250r-250,0r0,-250","w":375},",":{"d":"0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"(":{"d":"250,0r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,875","w":500},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-625,0xm250,-750r0,625r375,0r0,-625r-375,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-625,0xm250,-750r0,250r375,0r0,-250r-375,0xm250,-375r0,250r375,0r0,-250r-375,0"},"9":{"d":"625,-375r-500,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-625,0r0,-75r-50,0r0,-50r550,0r0,-250xm625,-500r0,-250r-375,0r0,250r375,0"},"6":{"d":"250,-500r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r675,0r0,50r-50,0r0,75r-500,0r0,250xm250,-375r0,250r375,0r0,-250r-375,0"},"5":{"d":"0,-125r625,0r0,-250r-625,0r0,-500r875,0r0,125r-625,0r0,250r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-750,0r0,-125"},"3":{"d":"0,-125r625,0r0,-250r-500,0r0,-75r-50,0r0,-50r550,0r0,-250r-625,0r0,-125r750,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-750,0r0,-125"},"2":{"d":"0,-875r750,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,250r625,0r0,125r-875,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,-250r-625,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r375,0r0,875r-250,0","w":500},"7":{"d":"875,-750r-25,0r0,100r-100,0r0,150r-75,0r0,50r-50,0r0,200r-75,0r0,50r-50,0r0,200r-250,0r0,-250r125,0r0,-125r25,0r0,-100r100,0r0,-150r75,0r0,-50r50,0r0,-75r-625,0r0,-125r875,0r0,125"},"{":{"d":"375,-375r0,375r125,0r0,125r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r-125,0r0,-125r125,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,125r-125,0r0,375r-125,0r0,125r125,0","w":625},"|":{"d":"0,-1000r250,0r0,1125r-250,0r0,-1125","w":375},"[":{"d":"0,-1000r375,0r0,125r-125,0r0,875r125,0r0,125r-375,0r0,-1125","w":500},"]":{"d":"375,125r-375,0r0,-125r125,0r0,-875r-125,0r0,-125r375,0r0,1125","w":500},"W":{"d":"125,-75r-50,0r0,-50r-75,0r0,-750r250,0r0,750r250,0r0,-750r250,0r0,750r250,0r0,-750r250,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-375,0r0,-75","w":1375},":":{"d":"0,-125r250,0r0,125r-250,0r0,-125xm0,-625r250,0r0,125r-250,0r0,-125","w":375},";":{"d":"0,-625r250,0r0,125r-250,0r0,-125xm0,0r25,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-125","w":375},"+":{"d":"0,-500r250,0r0,-250r250,0r0,250r250,0r0,125r-250,0r0,250r-250,0r0,-250r-250,0r0,-125","w":875},"-":{"d":"0,-375r500,0r0,125r-500,0r0,-125","w":625},"?":{"d":"250,-375r75,0r0,-50r50,0r0,-75r250,0r0,-250r-625,0r0,-125r750,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,125r-250,0r0,-125xm250,-125r250,0r0,125r-250,0r0,-125"},"=":{"d":"0,-375r500,0r0,125r-500,0r0,-125xm0,-625r500,0r0,125r-500,0r0,-125","w":625},"<":{"d":"250,-125r0,-125r-125,0r0,-125r-125,0r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0","w":625},">":{"d":"0,-125r0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,125r125,0r0,125r-125,0r0,125r-125,0r0,125r-250,0","w":625},"\/":{"d":"500,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":875},"\\":{"d":"350,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-250,0r0,-150r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r-125,0r0,-200r-50,0r0,-50r-75,0r0,-125r250,0r0,150r100,0","w":875},"&":{"d":"625,-375r0,250r125,0r0,125r-125,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0r0,250r125,0r0,25r100,0r0,100r50,0r0,-100r100,0r0,-25r125,0r0,125r-125,0xm375,-375r-125,0r0,250r125,0r0,-250","w":875},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm625,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm750,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r250,0r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,125r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1125},"#":{"d":"500,-250r-125,0r0,250r-250,0r0,-250r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,-250r250,0r0,250r125,0r0,-250r250,0r0,250r125,0r0,125r-125,0r0,125r125,0r0,125r-125,0r0,250r-250,0r0,-250xm375,-375r125,0r0,-125r-125,0r0,125"},"$":{"d":"375,125r-125,0r0,-125r-250,0r0,-125r250,0r0,-250r-125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r150,0r0,-100r100,0r0,-25r125,0r0,125r250,0r0,125r-250,0r0,250r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-150,0r0,100r-100,0r0,25xm425,-125r75,0r0,-250r-75,0r0,50r-50,0r0,150r50,0r0,50xm375,-550r0,-150r-50,0r0,-50r-75,0r0,250r75,0r0,-50r50,0","w":875},")":{"d":"125,-875r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-875","w":500},"*":{"d":"750,-500r-125,0r0,125r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,250r-250,0r0,-250r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-125r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,-250r250,0r0,250r75,0r0,-50r50,0r0,-75r125,0r0,125","w":875},"}":{"d":"250,-375r0,-125r-125,0r0,-375r-125,0r0,-125r250,0r0,75r50,0r0,50r75,0r0,375r125,0r0,125r-125,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-125r125,0r0,-375r125,0","w":625},"`":{"d":"250,-1000r-125,0r0,-75r-50,0r0,-50r-75,0r0,-125r125,0r0,25r100,0r0,100r25,0r0,125","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-500,0r0,125r-125,0r0,625r125,0r0,125r375,0r0,125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-325,0r0,-75xm625,-375r-250,0r0,125r250,0r0,-125","w":1125},"~":{"d":"0,-750r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0r0,125r-125,0r0,-125","w":625},"^":{"d":"300,-800r0,50r75,0r0,125r-125,0r0,-125r-75,0r0,50r-50,0r0,75r-125,0r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0","w":500},"_":{"d":"0,-125r500,0r0,125r-500,0r0,-125","w":625},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r500,0r0,-125r-500,0r0,-75r-50,0r0,-50r675,0r0,75r50,0r0,50r75,0r0,500r-750,0r0,-75xm625,-125r0,-125r-375,0r0,125r375,0"},"b":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-25,0r0,125r-250,0xm625,-500r-325,0r0,50r-50,0r0,275r50,0r0,50r325,0r0,-375"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r750,0r0,125r-625,0r0,375r625,0r0,125r-750,0r0,-75"},"d":{"d":"625,-500r0,-250r25,0r0,-100r200,0r0,100r25,0r0,750r-250,0r0,-125r-25,0r0,100r-100,0r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,25r100,0r0,100r25,0xm250,-125r325,0r0,-50r50,0r0,-275r-50,0r0,-50r-325,0r0,375"},"e":{"d":"800,-75r-50,0r0,75r-625,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,250r-625,0r0,125r550,0r0,50xm250,-375r375,0r0,-125r-375,0r0,125"},"f":{"d":"375,-750r0,125r375,0r0,125r-375,0r0,500r-250,0r0,-500r-125,0r0,-125r125,0r0,-125r75,0r0,-50r50,0r0,-75r500,0r0,125r-375,0","w":875},"g":{"d":"625,125r0,-250r-25,0r0,100r-100,0r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,25r100,0r0,100r25,0r0,-125r250,0r0,750r-75,0r0,50r-50,0r0,75r-625,0r0,-75r-50,0r0,-50r550,0xm250,-125r325,0r0,-50r50,0r0,-275r-50,0r0,-50r-325,0r0,375"},"h":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-325,0r0,50r-50,0r0,450r-250,0"},"i":{"d":"0,-625r250,0r0,625r-250,0r0,-625xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"j":{"d":"125,175r0,75r-250,0r0,-125r125,0r0,-750r250,0r0,750r-75,0r0,50r-50,0xm0,-875r250,0r0,125r-250,0r0,-125","w":375},"k":{"d":"750,-25r-100,0r0,-100r-150,0r0,-25r-100,0r0,-99r-150,0r0,249r-250,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,375r150,0r0,-100r100,0r0,-25r150,0r0,-100r100,0r0,-25r125,0r0,125r-75,0r0,50r-50,0r0,75r-200,0r0,50r-50,0r0,75r250,0r0,75r50,0r0,50r75,0r0,125r-125,0r0,-25"},"l":{"d":"0,0r0,-750r25,0r0,-100r200,0r0,100r25,0r0,750r-250,0","w":375},"m":{"d":"300,-500r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r100,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-200,0r0,50r-50,0r0,450r-250,0r0,-500r-200,0","w":1375},"n":{"d":"300,-500r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,500r-250,0r0,-500r-325,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r625,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-625,0xm250,-500r0,375r375,0r0,-375r-375,0"},"p":{"d":"250,-625r0,125r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-25,0r0,250r-25,0r0,100r-200,0r0,-100r-25,0r0,-750r250,0xm625,-500r-325,0r0,50r-50,0r0,275r50,0r0,50r325,0r0,-375"},"q":{"d":"875,-625r0,750r-25,0r0,100r-200,0r0,-100r-25,0r0,-250r-25,0r0,100r-100,0r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,25r100,0r0,100r25,0r0,-125r250,0xm250,-125r325,0r0,-50r50,0r0,-275r-50,0r0,-50r-325,0r0,375"},"r":{"d":"300,-500r0,50r-50,0r0,450r-250,0r0,-625r250,0r0,125r25,0r0,-100r100,0r0,-25r375,0r0,125r-450,0","w":875},"s":{"d":"0,-125r625,0r0,-125r-500,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r750,0r0,125r-625,0r0,125r500,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-750,0r0,-125"},"t":{"d":"125,-125r0,-375r-125,0r0,-125r125,0r0,-125r75,0r0,-50r100,0r0,50r75,0r0,125r375,0r0,125r-375,0r0,375r375,0r0,125r-500,0r0,-25r-100,0r0,-100r-25,0","w":875},"u":{"d":"500,-25r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r325,0r0,-50r50,0r0,-450r250,0r0,625r-250,0r0,-125r-25,0r0,100r-100,0"},"v":{"d":"500,-375r75,0r0,-50r50,0r0,-200r250,0r0,125r-25,0r0,100r-100,0r0,150r-125,0r0,125r-125,0r0,125r-125,0r0,-125r-125,0r0,-125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-125r250,0r0,200r50,0r0,50r75,0r0,125r125,0r0,-125"},"w":{"d":"125,-75r-50,0r0,-50r-75,0r0,-500r250,0r0,500r250,0r0,-500r250,0r0,500r250,0r0,-500r250,0r0,500r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-50,0r0,100r-100,0r0,25r-375,0r0,-75","w":1375},"x":{"d":"425,-375r75,0r0,-125r125,0r0,-125r250,0r0,125r-125,0r0,125r-125,0r0,125r125,0r0,125r125,0r0,125r-250,0r0,-125r-125,0r0,-125r-75,0r0,50r-50,0r0,75r-125,0r0,125r-250,0r0,-125r125,0r0,-125r125,0r0,-125r-125,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,75r50,0r0,50"},"y":{"d":"1000,-500r-125,0r0,125r-25,0r0,100r-100,0r0,150r-125,0r0,125r-25,0r0,100r-100,0r0,150r-250,0r0,-125r75,0r0,-50r50,0r0,-200r-125,0r0,-150r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r250,0r0,125r125,0r0,200r50,0r0,50r150,0r0,-50r50,0r0,-200r125,0r0,-125r250,0r0,125","w":1125},"z":{"d":"750,-125r0,125r-750,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-375,0r0,-125r750,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,125r375,0","w":875},"R":{"d":"875,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-250,0r0,-325r-50,0r0,-50r-325,0r0,375r-250,0r0,-875r750,0r0,75r50,0r0,50r75,0xm625,-750r-375,0r0,250r375,0r0,-250"},"4":{"d":"0,-375r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r250,0r0,500r125,0r0,125r-125,0r0,250r-250,0r0,-250r-500,0r0,-125xm375,-375r125,0r0,-125r-125,0r0,125"},".":{"d":"0,-125r250,0r0,125r-250,0r0,-125","w":375},"\u00a0":{"w":625}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":875,"face":{"font-family":"PF Tempesta Seven Extended","font-weight":400,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1125 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":625},"A":{"d":"750,-750r0,750r-125,0r0,-375r-500,0r0,375r-125,0r0,-750r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0xm125,-500r500,0r0,-250r-500,0r0,250"},"B":{"d":"625,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-875r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm625,-500r0,-250r-500,0r0,250r500,0xm125,-125r500,0r0,-249r-500,0r0,249"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,125r-625,0r0,625r625,0r0,125r-625,0r0,-75"},"D":{"d":"625,0r-625,0r0,-875r625,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm125,-125r500,0r0,-625r-500,0r0,625"},"E":{"d":"625,-450r0,75r-500,0r0,250r625,0r0,125r-750,0r0,-875r750,0r0,125r-625,0r0,250r550,0r0,50r-50,0"},"F":{"d":"625,-450r0,75r-500,0r0,375r-125,0r0,-875r750,0r0,125r-625,0r0,250r550,0r0,50r-50,0","k":{"J":125}},"H":{"d":"625,-375r-500,0r0,375r-125,0r0,-875r125,0r0,375r500,0r0,-375r125,0r0,875r-125,0r0,-375"},"I":{"d":"0,-875r125,0r0,875r-125,0r0,-875","w":250},"J":{"d":"0,-125r500,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-500,0r0,-125","w":750},"K":{"d":"500,-150r-100,0r0,-100r-150,0r0,-124r-125,0r0,374r-125,0r0,-875r125,0r0,375r125,0r0,125r125,0r0,75r50,0r0,50r200,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-26xm425,-625r0,50r-50,0r0,75r-125,0r0,-125r150,0r0,-100r100,0r0,-25r125,0r0,-125r125,0r0,126r-125,0r0,124r-200,0"},"L":{"d":"0,-875r125,0r0,750r500,0r0,125r-625,0r0,-875","w":750,"k":{"t":125,"T":125,"V":125,"Y":125}},"M":{"d":"875,-499r-125,0r0,125r-125,0r0,124r-125,0r0,-124r-125,0r0,-125r-125,0r0,-125r-125,0r0,624r-125,0r0,-875r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,875r-125,0r0,-624r-125,0r0,125","w":1250},"N":{"d":"625,-249r-125,0r0,-125r-125,0r0,-125r-125,0r0,-125r-125,0r0,624r-125,0r0,-875r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,-625r125,0r0,875r-125,0r0,-124r-125,0r0,-125","w":1000},"Z":{"d":"0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-625,0r0,-125r875,0r0,125r-125,0r0,126r-125,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,124r625,0r0,125r-875,0r0,-125","w":1000},"Y":{"d":"625,-499r-125,0r0,499r-125,0r0,-499r-125,0r0,-125r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,125","w":1000,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"X":{"d":"500,-375r125,0r0,125r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125r-125,0r0,-125r-125,0r0,125r-125,0r0,125r-125,0r0,124r-125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-124r-125,0r0,-125r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,125r-125,0r0,124","w":1000},"V":{"d":"375,-150r-100,0r0,-100r-25,0r0,-150r-100,0r0,-100r-25,0r0,-150r-100,0r0,-100r-25,0r0,-125r125,0r0,200r50,0r0,50r75,0r0,200r50,0r0,50r75,0r0,200r50,0r0,50r75,0r0,-250r75,0r0,-50r50,0r0,-200r75,0r0,-50r50,0r0,-200r125,0r0,125r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-25,0r0,100r-99,0r0,150r-126,0r0,-150","w":1000,"k":{"J":125}},"U":{"d":"750,-875r0,750r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r500,0r0,-750r125,0"},"T":{"d":"0,-875r875,0r0,125r-375,0r0,750r-125,0r0,-750r-375,0r0,-125","w":1000,"k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r625,0r0,-250r-500,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r625,0r0,125r-625,0r0,250r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"Q":{"d":"625,50r-50,0r0,-50r-450,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-125,0r0,-75xm125,-750r0,625r500,0r0,-625r-500,0"},"P":{"d":"750,-750r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,375r-125,0r0,-875r625,0r0,75r50,0r0,50r75,0xm625,-750r-500,0r0,250r500,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50xm125,-750r0,625r500,0r0,-625r-500,0"},"G":{"d":"375,-500r375,0r0,500r-625,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r625,0r0,125r-625,0r0,625r500,0r0,-250r-250,0r0,-125"},"!":{"d":"0,-875r125,0r0,625r-125,0r0,-625xm0,-125r125,0r0,125r-125,0r0,-125","w":250},"\"":{"d":"0,-875r125,0r0,250r-125,0r0,-250xm250,-875r125,0r0,250r-125,0r0,-250","w":500},"'":{"d":"0,-875r125,0r0,250r-125,0r0,-250","w":250},",":{"d":"125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"(":{"d":"125,0r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,875","w":375},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-500,0xm125,-750r0,625r500,0r0,-625r-500,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0xm125,-750r0,250r500,0r0,-250r-500,0xm125,-374r0,249r500,0r0,-249r-500,0"},"9":{"d":"625,-375r-500,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r550,0r0,-250xm625,-500r0,-250r-500,0r0,250r500,0"},"6":{"d":"125,-500r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r550,0r0,50r-50,0r0,75r-500,0r0,250xm125,-375r0,250r500,0r0,-250r-500,0"},"5":{"d":"0,-125r625,0r0,-250r-625,0r0,-500r750,0r0,125r-625,0r0,250r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"3":{"d":"0,-125r625,0r0,-249r-500,0r0,-76r-50,0r0,-50r550,0r0,-250r-625,0r0,-125r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"2":{"d":"0,-875r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,250r625,0r0,125r-750,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,-250r-625,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r250,0r0,875r-125,0","w":375},"7":{"d":"575,-675r50,0r0,-75r-625,0r0,-125r750,0r0,125r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r75,0r0,-50r50,0r0,-200r75,0r0,-50"},"{":{"d":"0,-500r125,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,376r-125,0r0,124r125,0r0,375r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-374r-125,0r0,-126","w":500},"|":{"d":"0,-1000r125,0r0,1125r-125,0r0,-1125","w":250},"[":{"d":"0,-1000r250,0r0,125r-125,0r0,875r125,0r0,125r-250,0r0,-1125","w":375},"]":{"d":"0,0r125,0r0,-875r-125,0r0,-125r250,0r0,1125r-250,0r0,-125","w":375},"W":{"d":"500,-75r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r375,0r0,-750r125,0r0,750r375,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-124r-75,0r0,49r-50,0","w":1250},":":{"d":"125,-125r125,0r0,125r-125,0r0,-125xm125,-625r125,0r0,125r-125,0r0,-125","w":375},";":{"d":"125,-625r125,0r0,125r-125,0r0,-125xm125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"+":{"d":"0,-500r250,0r0,-250r125,0r0,250r250,0r0,126r-250,0r0,249r-125,0r0,-249r-250,0r0,-126xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"-":{"d":"0,-375r375,0r0,125r-375,0r0,-125","w":500},"?":{"d":"250,-375r75,0r0,-50r50,0r0,-75r250,0r0,-250r-625,0r0,-125r625,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-250,0r0,125r-125,0r0,-125xm250,-125r125,0r0,125r-125,0r0,-125"},"=":{"d":"0,-375r375,0r0,125r-375,0r0,-125xm0,-625r375,0r0,125r-375,0r0,-125","w":500},"<":{"d":"125,-374r-125,0r0,-126r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125","w":500},">":{"d":"250,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-125r125,0r0,-124r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,126r-125,0r0,125","w":500},"\/":{"d":"500,-725r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,125r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":750},"\\":{"d":"225,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-124r-125,0r0,-125r-125,0r0,-201r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0","w":750},"&":{"d":"500,-125r250,0r0,125r-250,0r0,-124r-75,0r0,49r-50,0r0,75r-250,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-500,0r0,250r250,0r0,75r50,0r0,50r75,0r0,-125r250,0r0,126r-250,0r0,249xm375,-374r-250,0r0,249r250,0r0,-249"},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm500,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm625,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,125r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1000},"#":{"d":"0,-625r125,0r0,-250r125,0r0,250r250,0r0,-250r125,0r0,250r125,0r0,126r-125,0r0,124r125,0r0,126r-125,0r0,249r-125,0r0,-249r-250,0r0,249r-125,0r0,-249r-125,0r0,-126r125,0r0,-124r-125,0r0,-126xm500,-375r0,-124r-250,0r0,124r250,0xm500,-250r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-250r0,-124r-25,0r0,99r-100,0r0,25r125,0xm500,-500r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0"},"$":{"d":"0,-125r375,0r0,-249r-250,0r0,-76r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r250,0r0,-125r125,0r0,125r375,0r0,126r-375,0r0,249r250,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,76r-250,0r0,124r-125,0r0,-124r-375,0r0,-126xm375,-749r-250,0r0,249r250,0r0,-249xm750,-125r0,-249r-250,0r0,249r250,0xm500,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0xm500,-750r0,-124r-25,0r0,99r-100,0r0,25r125,0xm500,0r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":1000},")":{"d":"125,-875r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-875","w":375},"*":{"d":"250,-500r0,-250r125,0r0,250r125,0r0,-125r125,0r0,126r-125,0r0,124r125,0r0,125r-125,0r0,-124r-125,0r0,249r-125,0r0,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-124r-125,0r0,-126r125,0r0,125r125,0xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"}":{"d":"375,-374r-125,0r0,374r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-375r125,0r0,-124r-125,0r0,-376r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,375r125,0r0,126","w":500},"`":{"d":"0,-1125r0,-125r125,0r0,75r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-500,0r0,125r-125,0r0,625r125,0r0,125r375,0r0,125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-325,0r0,-75xm625,-375r-250,0r0,125r250,0r0,-125","w":1125},"~":{"d":"375,-625r-125,0r0,-124r-125,0r0,99r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r125,0r0,-100r100,0r0,100r-50,0r0,50r-50,0r0,75","w":625},"^":{"d":"250,-800r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,75","w":500},"_":{"d":"0,-125r375,0r0,125r-375,0r0,-125","w":500},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r500,0r0,-125r-500,0r0,-75r-50,0r0,-50r550,0r0,75r50,0r0,50r75,0r0,500r-625,0r0,-75xm625,-125r0,-125r-500,0r0,125r500,0"},"b":{"d":"100,-850r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-25,0r0,125r-125,0r0,-850r100,0xm625,-500r-450,0r0,50r-50,0r0,275r50,0r0,50r450,0r0,-375"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r625,0r0,125r-625,0r0,375r625,0r0,125r-625,0r0,-75"},"d":{"d":"725,-850r0,100r25,0r0,750r-125,0r0,-125r-25,0r0,100r-100,0r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,25r100,0r0,100r25,0r0,-350r100,0xm125,-125r450,0r0,-50r50,0r0,-275r-50,0r0,-50r-450,0r0,375"},"e":{"d":"675,-75r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,250r-625,0r0,125r550,0r0,50xm125,-375r500,0r0,-125r-500,0r0,125"},"f":{"d":"0,-625r125,0r0,-125r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,125r375,0r0,126r-375,0r0,499r-125,0r0,-499r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"g":{"d":"625,125r0,-250r-25,0r0,100r-100,0r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,25r100,0r0,100r25,0r0,-125r125,0r0,750r-75,0r0,50r-50,0r0,75r-500,0r0,-75r-50,0r0,-50r550,0xm125,-125r450,0r0,-50r50,0r0,-275r-50,0r0,-50r-450,0r0,375"},"h":{"d":"100,-850r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-450,0r0,50r-50,0r0,450r-125,0r0,-850r100,0"},"i":{"d":"0,-625r125,0r0,625r-125,0r0,-625xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"j":{"d":"0,175r0,75r-125,0r0,-125r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"k":{"d":"625,-25r-100,0r0,-100r-150,0r0,-25r-100,0r0,-99r-150,0r0,249r-125,0r0,-850r100,0r0,100r25,0r0,375r150,0r0,-100r100,0r0,-25r150,0r0,-100r100,0r0,-25r125,0r0,125r-200,0r0,50r-50,0r0,75r-200,0r0,50r-50,0r0,75r250,0r0,75r50,0r0,50r200,0r0,125r-125,0r0,-25"},"l":{"d":"100,-850r0,100r25,0r0,750r-125,0r0,-850r100,0","w":250},"m":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r100,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-325,0r0,50r-50,0r0,450r-125,0r0,-500r-325,0","w":1250},"n":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-450,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-500,0xm125,-500r0,375r500,0r0,-375r-500,0"},"p":{"d":"125,-625r0,125r25,0r0,-100r100,0r0,-25r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0r0,-25r-100,0r0,-100r-25,0r0,250r-25,0r0,100r-100,0r0,-850r125,0xm625,-500r-450,0r0,50r-50,0r0,275r50,0r0,50r450,0r0,-375"},"q":{"d":"600,-125r0,100r-100,0r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,25r100,0r0,100r25,0r0,-125r125,0r0,750r-25,0r0,100r-100,0r0,-350r-25,0xm125,-125r450,0r0,-50r50,0r0,-275r-50,0r0,-50r-450,0r0,375"},"r":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r375,0r0,125r-450,0","w":750},"s":{"d":"0,-125r625,0r0,-125r-500,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r625,0r0,125r-625,0r0,125r500,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-625,0r0,-125"},"t":{"d":"0,-625r125,0r0,-175r50,0r0,50r75,0r0,125r375,0r0,126r-375,0r0,374r375,0r0,125r-375,0r0,-25r-100,0r0,-100r-25,0r0,-374r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":750},"u":{"d":"500,-25r0,25r-375,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r450,0r0,-50r50,0r0,-450r125,0r0,625r-125,0r0,-125r-25,0r0,100r-100,0"},"v":{"d":"250,-275r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r125,0r0,125r-125,0r0,-125r-125,0r0,-150xm750,-500r0,125r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0xm875,-500r-125,0r0,-125r125,0r0,125","w":1000},"w":{"d":"500,-75r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r375,0r0,-500r125,0r0,500r375,0r0,-500r125,0r0,500r-75,0r0,50r-50,0r0,75r-375,0r0,-124r-75,0r0,49r-50,0","w":1250},"x":{"d":"500,-500r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-126r-250,0r0,-124r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r250,0r0,-125xm0,-125r125,0r0,-125r125,0r0,126r-125,0r0,124r-125,0r0,-125"},"y":{"d":"750,-500r0,125r-25,0r0,100r-100,0r0,151r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-199r-125,0r0,-151r-100,0r0,-100r-25,0r0,-125r-125,0r0,-125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0xm875,-500r-125,0r0,-125r125,0r0,125","w":1000},"z":{"d":"0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-375,0r0,-125r625,0r0,125r-125,0r0,126r-125,0r0,125r-125,0r0,124r375,0r0,125r-625,0r0,-125","w":750},"R":{"d":"750,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-125,0r0,-325r-50,0r0,-50r-450,0r0,375r-125,0r0,-875r625,0r0,75r50,0r0,50r75,0xm625,-750r-500,0r0,250r500,0r0,-250"},"4":{"d":"250,-750r125,0r0,-125r250,0r0,500r125,0r0,125r-125,0r0,250r-125,0r0,-250r-500,0r0,-250r125,0r0,-125r125,0r0,-125xm250,-499r-125,0r0,124r375,0r0,-374r-125,0r0,125r-125,0r0,125"},".":{"d":"125,-125r125,0r0,125r-125,0r0,-125","w":375},"\u00a0":{"w":625}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved.
 * 
 * Manufacturer:
 * Yusuke Kamiyamane
 */
Cufon.registerFont({"w":750,"face":{"font-family":"PF Tempesta Seven","font-weight":400,"font-stretch":"normal","units-per-em":"1000","panose-1":"0 0 4 0 0 0 0 0 0 0","ascent":"800","descent":"-200","bbox":"-125 -1250 1000 250","underline-thickness":"125","underline-position":"-126","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":500},"A":{"d":"625,-750r0,750r-125,0r0,-375r-375,0r0,375r-125,0r0,-750r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0xm125,-500r375,0r0,-250r-375,0r0,250"},"B":{"d":"500,-450r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0xm500,-500r0,-250r-375,0r0,250r375,0xm125,-125r375,0r0,-249r-375,0r0,249"},"C":{"d":"125,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,125r-500,0r0,625r500,0r0,125r-500,0r0,-75"},"D":{"d":"500,0r-500,0r0,-875r500,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75xm125,-125r375,0r0,-625r-375,0r0,625"},"E":{"d":"500,-450r0,75r-375,0r0,250r500,0r0,125r-625,0r0,-875r625,0r0,125r-500,0r0,250r425,0r0,50r-50,0"},"F":{"d":"500,-450r0,75r-375,0r0,375r-125,0r0,-875r625,0r0,125r-500,0r0,250r425,0r0,50r-50,0","k":{"J":125}},"H":{"d":"500,-375r-375,0r0,375r-125,0r0,-875r125,0r0,375r375,0r0,-375r125,0r0,875r-125,0r0,-375"},"I":{"d":"0,-875r125,0r0,875r-125,0r0,-875","w":250},"J":{"d":"0,-125r375,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-125","w":625},"K":{"d":"375,-249r-125,0r0,-125r-125,0r0,374r-125,0r0,-875r125,0r0,375r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125"},"L":{"d":"0,-875r125,0r0,750r375,0r0,125r-500,0r0,-875","w":625,"k":{"T":125,"V":125,"Y":125}},"M":{"d":"500,-625r125,0r0,-125r125,0r0,-125r125,0r0,875r-125,0r0,-624r-125,0r0,125r-125,0r0,124r-125,0r0,-124r-125,0r0,-125r-125,0r0,624r-125,0r0,-875r125,0r0,125r125,0r0,125r125,0r0,125r125,0r0,-125","w":1000},"N":{"d":"375,-450r-50,0r0,-50r-75,0r0,-124r-125,0r0,624r-125,0r0,-875r125,0r0,125r125,0r0,125r125,0r0,150r100,0r0,100r25,0r0,125r125,0r0,-625r125,0r0,875r-125,0r0,-125r-125,0r0,-124r-125,0r0,-201","w":875},"Z":{"d":"0,-250r125,0r0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-500,0r0,-125r625,0r0,251r-125,0r0,125r-125,0r0,125r-125,0r0,125r-125,0r0,124r500,0r0,125r-625,0r0,-250"},"Y":{"d":"550,-750r0,50r-50,0r0,201r-125,0r0,499r-125,0r0,-499r-125,0r0,-201r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0r0,100r25,0r0,125r125,0r0,-125r25,0r0,-100r100,0r0,-150r125,0r0,125r-75,0","k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"X":{"d":"625,-750r-25,0r0,100r-100,0r0,151r-125,0r0,124r125,0r0,150r100,0r0,100r25,0r0,125r-125,0r0,-200r-50,0r0,-50r-75,0r0,-125r-125,0r0,-124r-125,0r0,-151r-100,0r0,-100r-25,0r0,-125r125,0r0,200r50,0r0,50r75,0r0,125r125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,125xm250,-375r0,125r-75,0r0,50r-50,0r0,200r-125,0r0,-125r25,0r0,-100r100,0r0,-150r125,0"},"V":{"d":"500,-375r-25,0r0,100r-99,0r0,275r-126,0r0,-275r-100,0r0,-100r-25,0r0,-200r-50,0r0,-50r-75,0r0,-250r125,0r0,275r100,0r0,100r25,0r0,200r50,0r0,50r75,0r0,-250r25,0r0,-100r100,0r0,-275r125,0r0,250r-75,0r0,50r-50,0r0,200","k":{"J":125}},"U":{"d":"625,-875r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r375,0r0,-750r125,0"},"T":{"d":"0,-875r625,0r0,125r-250,0r0,750r-125,0r0,-750r-250,0r0,-125","k":{"z":125,"y":125,"x":125,"w":125,"v":125,"u":125,"t":125,"s":125,"r":125,"q":125,"p":125,"o":125,"n":125,"m":125,"g":125,"e":125,"d":125,"c":125,"a":125,"J":125}},"S":{"d":"0,-125r500,0r0,-250r-375,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r500,0r0,125r-500,0r0,250r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"Q":{"d":"500,50r-50,0r0,-50r-325,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r125,0r0,125r-125,0r0,-75xm125,-750r0,625r375,0r0,-625r-375,0"},"P":{"d":"625,-750r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,375r-125,0r0,-875r500,0r0,75r50,0r0,50r75,0xm500,-750r-375,0r0,250r375,0r0,-250","k":{"J":125}},"O":{"d":"75,-125r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50xm125,-750r0,625r375,0r0,-625r-375,0"},"G":{"d":"625,0r-500,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r500,0r0,125r-500,0r0,625r375,0r0,-250r-125,0r0,-25r-100,0r0,-100r350,0r0,500"},"!":{"d":"0,-875r125,0r0,625r-125,0r0,-625xm0,-125r125,0r0,125r-125,0r0,-125","w":250},"\"":{"d":"0,-875r125,0r0,250r-125,0r0,-250xm250,-875r125,0r0,250r-125,0r0,-250","w":500},"'":{"d":"0,-875r125,0r0,250r-125,0r0,-250","w":250},",":{"d":"125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"(":{"d":"125,0r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-875r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,875","w":375},"0":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0xm125,-750r0,625r375,0r0,-625r-375,0"},"8":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-375,0xm125,-750r0,250r375,0r0,-250r-375,0xm125,-374r0,249r375,0r0,-249r-375,0"},"9":{"d":"500,-375r-375,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r425,0r0,-250xm500,-500r0,-250r-375,0r0,250r375,0"},"6":{"d":"125,-500r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r425,0r0,50r-50,0r0,75r-375,0r0,250xm125,-375r0,250r375,0r0,-250r-375,0"},"5":{"d":"0,-125r500,0r0,-250r-500,0r0,-500r625,0r0,125r-500,0r0,250r375,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"3":{"d":"0,-125r500,0r0,-249r-375,0r0,-76r-50,0r0,-50r425,0r0,-250r-500,0r0,-125r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r125,0r0,250r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"2":{"d":"0,-875r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-375,0r0,250r500,0r0,125r-625,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,-250r-500,0r0,-125"},"1":{"d":"125,0r0,-750r-125,0r0,-125r250,0r0,875r-125,0","w":375},"7":{"d":"450,-675r50,0r0,-75r-500,0r0,-125r625,0r0,125r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r75,0r0,-50r50,0r0,-200r75,0r0,-50"},"{":{"d":"0,-500r125,0r0,-375r75,0r0,-50r50,0r0,-75r125,0r0,125r-125,0r0,376r-125,0r0,124r125,0r0,375r125,0r0,125r-125,0r0,-75r-50,0r0,-50r-75,0r0,-374r-125,0r0,-126","w":500},"|":{"d":"0,-1000r125,0r0,1125r-125,0r0,-1125","w":250},"[":{"d":"0,-1000r250,0r0,125r-125,0r0,875r125,0r0,125r-250,0r0,-1125","w":375},"]":{"d":"0,0r125,0r0,-875r-125,0r0,-125r250,0r0,1125r-250,0r0,-125","w":375},"W":{"d":"375,-75r0,75r-250,0r0,-75r-50,0r0,-50r-75,0r0,-750r125,0r0,750r250,0r0,-750r125,0r0,750r250,0r0,-750r125,0r0,750r-75,0r0,50r-50,0r0,75r-250,0r0,-124r-75,0r0,49r-50,0","w":1000},":":{"d":"125,-125r125,0r0,125r-125,0r0,-125xm125,-625r125,0r0,125r-125,0r0,-125","w":375},";":{"d":"125,-625r125,0r0,125r-125,0r0,-125xm125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r-125,0","w":375},"+":{"d":"0,-500r250,0r0,-250r125,0r0,250r250,0r0,126r-250,0r0,249r-125,0r0,-249r-250,0r0,-126xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0"},"-":{"d":"0,-375r375,0r0,125r-375,0r0,-125","w":500},"?":{"d":"250,-375r75,0r0,-50r50,0r0,-75r125,0r0,-250r-500,0r0,-125r500,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,75r-125,0r0,125r-125,0r0,-125xm250,-125r125,0r0,125r-125,0r0,-125"},"=":{"d":"0,-375r375,0r0,125r-375,0r0,-125xm0,-625r375,0r0,125r-375,0r0,-125","w":500},"<":{"d":"125,-374r-125,0r0,-126r125,0r0,-125r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-125","w":500},">":{"d":"250,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-125r125,0r0,-124r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,126r-125,0r0,125","w":500},"\/":{"d":"500,-725r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,125r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0"},"\\":{"d":"225,-725r0,100r25,0r0,125r125,0r0,125r125,0r0,200r50,0r0,50r75,0r0,125r-125,0r0,-150r-100,0r0,-100r-25,0r0,-124r-125,0r0,-125r-125,0r0,-201r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0"},"&":{"d":"125,-75r-50,0r0,-50r-75,0r0,-250r125,0r0,-75r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r375,0r0,125r-375,0r0,250r250,0r0,75r50,0r0,50r75,0r0,-125r125,0r0,126r-125,0r0,249r125,0r0,125r-125,0r0,-124r-75,0r0,49r-50,0r0,75r-250,0r0,-75xm375,-125r0,-249r-250,0r0,249r250,0"},"%":{"d":"0,-625r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm500,-125r0,-125r75,0r0,-50r50,0r0,-75r125,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-75,0xm125,-750r0,125r125,0r0,-125r-125,0xm625,-250r0,125r125,0r0,-125r-125,0xm625,-725r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,201r-125,0r0,125r-125,0r0,124r-25,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-200r125,0r0,-125r125,0r0,-125r25,0r0,-100r100,0","w":1000},"#":{"d":"0,-625r125,0r0,-250r125,0r0,250r125,0r0,-250r125,0r0,250r125,0r0,126r-125,0r0,124r125,0r0,126r-125,0r0,249r-125,0r0,-249r-125,0r0,249r-125,0r0,-249r-125,0r0,-126r125,0r0,-124r-125,0r0,-126xm375,-375r0,-124r-125,0r0,124r125,0xm375,-250r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-250r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,-500r125,0r0,-124r-25,0r0,99r-100,0r0,25xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0"},"$":{"d":"0,-125r250,0r0,-249r-125,0r0,-76r-50,0r0,-50r-75,0r0,-250r75,0r0,-50r50,0r0,-75r125,0r0,-125r125,0r0,125r250,0r0,126r-250,0r0,249r125,0r0,75r50,0r0,50r75,0r0,250r-75,0r0,50r-50,0r0,76r-125,0r0,124r-125,0r0,-124r-250,0r0,-126xm250,-749r-125,0r0,249r125,0r0,-249xm500,-125r0,-249r-125,0r0,249r125,0xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,-750r0,-124r-25,0r0,99r-100,0r0,25r125,0xm375,0r0,-124r-25,0r0,99r-100,0r0,25r125,0"},")":{"d":"125,-875r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,875r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-875","w":375},"*":{"d":"250,-500r0,-250r125,0r0,250r125,0r0,-125r125,0r0,126r-125,0r0,124r125,0r0,125r-125,0r0,-124r-125,0r0,249r-125,0r0,-249r-125,0r0,124r-125,0r0,-125r125,0r0,-124r-125,0r0,-126r125,0r0,125r125,0xm375,-375r0,-124r-25,0r0,99r-100,0r0,25r125,0"},"}":{"d":"375,-374r-125,0r0,374r-75,0r0,50r-50,0r0,75r-125,0r0,-125r125,0r0,-375r125,0r0,-124r-125,0r0,-376r-125,0r0,-125r125,0r0,75r50,0r0,50r75,0r0,375r125,0r0,126","w":500},"`":{"d":"0,-1125r0,-125r125,0r0,75r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0","w":375},"@":{"d":"375,-200r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,-125r-250,0r0,-75r-50,0r0,-50r300,0r0,75r50,0r0,50r75,0r0,500r125,0r0,-625r-125,0r0,-125r-500,0r0,125r-125,0r0,625r125,0r0,125r375,0r0,125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-75r-50,0r0,-50r-75,0r0,-625r75,0r0,-50r50,0r0,-75r75,0r0,-50r50,0r0,-75r500,0r0,75r50,0r0,50r75,0r0,75r50,0r0,50r75,0r0,625r-75,0r0,50r-50,0r0,75r-125,0r0,-75r-50,0r0,-50r-325,0r0,-75xm625,-375r-250,0r0,125r250,0r0,-125","w":1125},"~":{"d":"375,-625r-125,0r0,-124r-125,0r0,99r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,125r125,0r0,-100r100,0r0,100r-50,0r0,50r-50,0r0,75","w":625},"^":{"d":"250,-800r50,0r0,50r50,0r0,100r-100,0r0,-100r-125,0r0,100r-100,0r0,-100r50,0r0,-50r50,0r0,-75r125,0r0,75","w":500},"_":{"d":"0,-125r375,0r0,125r-375,0r0,-125","w":500},"a":{"d":"125,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r375,0r0,-125r-375,0r0,-75r-50,0r0,-50r425,0r0,75r50,0r0,50r75,0r0,500r-500,0r0,-75xm500,-125r0,-125r-375,0r0,125r375,0"},"b":{"d":"100,-850r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-25,0r0,125r-125,0r0,-850r100,0xm500,-500r-325,0r0,50r-50,0r0,275r50,0r0,50r325,0r0,-375"},"c":{"d":"125,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r500,0r0,125r-500,0r0,375r500,0r0,125r-500,0r0,-75"},"d":{"d":"600,-850r0,100r25,0r0,750r-125,0r0,-125r-25,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,25r100,0r0,100r25,0r0,-350r100,0xm125,-125r325,0r0,-50r50,0r0,-275r-50,0r0,-50r-325,0r0,375"},"e":{"d":"550,-75r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,250r-500,0r0,125r425,0r0,50xm125,-375r375,0r0,-125r-375,0r0,125"},"f":{"d":"0,-625r125,0r0,-125r75,0r0,-50r50,0r0,-75r250,0r0,125r-250,0r0,125r250,0r0,126r-250,0r0,499r-125,0r0,-499r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":625},"g":{"d":"500,125r0,-250r-25,0r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,25r100,0r0,100r25,0r0,-125r125,0r0,750r-75,0r0,50r-50,0r0,75r-375,0r0,-75r-50,0r0,-50r425,0xm125,-125r325,0r0,-50r50,0r0,-275r-50,0r0,-50r-325,0r0,375"},"h":{"d":"100,-850r0,100r25,0r0,250r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-325,0r0,50r-50,0r0,450r-125,0r0,-850r100,0"},"i":{"d":"0,-625r125,0r0,625r-125,0r0,-625xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"j":{"d":"0,175r0,75r-125,0r0,-125r125,0r0,-750r125,0r0,750r-75,0r0,50r-50,0xm0,-875r125,0r0,125r-125,0r0,-125","w":250},"k":{"d":"500,0r0,-75r-50,0r0,-50r-200,0r0,-124r-125,0r0,249r-125,0r0,-850r100,0r0,100r25,0r0,375r125,0r0,-125r200,0r0,-50r50,0r0,-75r125,0r0,125r-150,0r0,100r-100,0r0,26r-125,0r0,124r125,0r0,25r100,0r0,100r150,0r0,125r-125,0"},"l":{"d":"100,-850r0,100r25,0r0,750r-125,0r0,-850r100,0","w":250},"m":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r100,0r0,-100r100,0r0,-25r125,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-200,0r0,50r-50,0r0,450r-125,0r0,-500r-200,0","w":1000},"n":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,500r-125,0r0,-500r-325,0"},"o":{"d":"125,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r375,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-375,0xm125,-500r0,375r375,0r0,-375r-375,0"},"p":{"d":"125,-625r0,125r25,0r0,-100r100,0r0,-25r250,0r0,75r50,0r0,50r75,0r0,375r-75,0r0,50r-50,0r0,75r-250,0r0,-25r-100,0r0,-100r-25,0r0,250r-25,0r0,100r-100,0r0,-850r125,0xm500,-500r-325,0r0,50r-50,0r0,275r50,0r0,50r325,0r0,-375"},"q":{"d":"475,-125r0,100r-100,0r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-375r75,0r0,-50r50,0r0,-75r250,0r0,25r100,0r0,100r25,0r0,-125r125,0r0,750r-25,0r0,100r-100,0r0,-350r-25,0xm125,-125r325,0r0,-50r50,0r0,-275r-50,0r0,-50r-325,0r0,375"},"r":{"d":"175,-500r0,50r-50,0r0,450r-125,0r0,-625r125,0r0,125r25,0r0,-100r100,0r0,-25r250,0r0,125r-325,0","w":625},"s":{"d":"0,-125r500,0r0,-125r-375,0r0,-75r-50,0r0,-50r-75,0r0,-125r75,0r0,-50r50,0r0,-75r500,0r0,125r-500,0r0,125r375,0r0,75r50,0r0,50r75,0r0,125r-75,0r0,50r-50,0r0,75r-500,0r0,-125"},"t":{"d":"0,-625r125,0r0,-175r50,0r0,50r75,0r0,125r250,0r0,126r-250,0r0,374r250,0r0,125r-250,0r0,-25r-100,0r0,-100r-25,0r0,-374r-125,0r0,-126xm250,-500r0,-124r-25,0r0,99r-100,0r0,25r125,0","w":625},"u":{"d":"375,-25r0,25r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r325,0r0,-50r50,0r0,-450r125,0r0,625r-125,0r0,-125r-25,0r0,100r-100,0"},"v":{"d":"500,-250r-25,0r0,100r-99,0r0,150r-126,0r0,-150r-100,0r0,-100r-25,0r0,-200r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0r0,100r25,0r0,200r50,0r0,50r75,0r0,-250r25,0r0,-100r100,0r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,200"},"w":{"d":"375,-75r0,75r-250,0r0,-75r-50,0r0,-50r-75,0r0,-500r125,0r0,500r250,0r0,-500r125,0r0,500r250,0r0,-500r125,0r0,500r-75,0r0,50r-50,0r0,75r-250,0r0,-124r-75,0r0,49r-50,0","w":1000},"x":{"d":"375,-500r125,0r0,-125r125,0r0,126r-125,0r0,125r-125,0r0,124r125,0r0,125r125,0r0,125r-125,0r0,-124r-125,0r0,-126r-125,0r0,-124r-125,0r0,-125r-125,0r0,-126r125,0r0,125r125,0r0,125r125,0r0,-125xm0,-125r125,0r0,-125r125,0r0,126r-125,0r0,124r-125,0r0,-125"},"y":{"d":"150,-150r0,-100r-25,0r0,-200r-50,0r0,-50r-75,0r0,-125r125,0r0,150r100,0r0,100r25,0r0,200r50,0r0,50r75,0r0,-250r25,0r0,-100r100,0r0,-150r125,0r0,125r-75,0r0,50r-50,0r0,200r-25,0r0,100r-99,0r0,150r-26,0r0,100r-100,0r0,150r-125,0r0,-125r75,0r0,-50r50,0r0,-225r-100,0"},"z":{"d":"0,-125r125,0r0,-125r125,0r0,-125r125,0r0,-125r-375,0r0,-125r625,0r0,125r-125,0r0,126r-125,0r0,125r-125,0r0,124r375,0r0,125r-625,0r0,-125"},"R":{"d":"625,-750r0,250r-75,0r0,50r-50,0r0,100r100,0r0,100r25,0r0,250r-125,0r0,-325r-50,0r0,-50r-325,0r0,375r-125,0r0,-875r500,0r0,75r50,0r0,50r75,0xm500,-750r-375,0r0,250r375,0r0,-250"},"4":{"d":"125,-550r0,-200r125,0r0,-125r250,0r0,500r125,0r0,126r-125,0r0,249r-125,0r0,-249r-375,0r0,-251r75,0r0,-50r50,0xm375,-749r-125,0r0,124r-25,0r0,100r-100,0r0,150r250,0r0,-374xm500,-250r0,-124r-25,0r0,99r-100,0r0,25r125,0"},".":{"d":"125,-125r125,0r0,125r-125,0r0,-125","w":375},"\u00a0":{"w":500}}});

// -----------------------------------------------------------------------------------
//
//    Lightbox v2.04
//    by Lokesh Dhakar - http://www.lokeshdhakar.com
//    Last Modification: 2/9/08
//
//    For more information, visit:
//    http://lokeshdhakar.com/projects/lightbox2/
//
//    Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
//      - Free for use in both personal and commercial projects
//        - Attribution requires leaving author name, author link, and the license info intact.
//    
//  Thanks: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets.
//          Artemy Tregubenko (arty.name) for cleanup and help in updating to latest ver of proto-aculous.
//
// -----------------------------------------------------------------------------------

var Lightbox = Class.create();

Lightbox.prototype = {
    imageArray: [],
    activeImage: undefined,
    options: {
        overlayOpacity: 0.8,   // controls transparency of shadow overlay
        animate: true,         // toggles resizing animations
        resizeSpeed: 7,        // controls the speed of the image resizing animations (1=slowest and 10=fastest)
        borderSize: 10,
        // When grouping images this is used to write: Image # of #.
        // Change it for non-english localization
        labelImage: "Image",
        labelOf: "of"
    },
    
    // initialize()
    // Constructor runs on completion of the DOM loading. Calls updateImageList and then
    // the function inserts html at the bottom of the page which is used to display the shadow 
    // overlay and the image container.
    //
    initialize: function(params) {
        Object.extend(this.options, params || {});
        this.animating = false;
        this.keyboardAction = this.keyboardAction.bindAsEventListener(this);
        
        if (this.options.resizeSpeed > 10) this.options.resizeSpeed = 10;
        if (this.options.resizeSpeed < 1)  this.options.resizeSpeed = 1;

        this.resizeDuration = this.options.animate ? ((11 - this.options.resizeSpeed) * 0.15) : 0;
        this.overlayDuration = this.options.animate ? 0.2 : 0;  // shadow fade in/out duration

        // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.
        // If animations are turned off, it will be hidden as to prevent a flicker of a
        // white 250 by 250 box.
        var size = (this.options.animate ? 250 : 1) + 'px';
        
        this.pageScroll = document.viewport.getScrollOffsets();
        this.pageHeight = document.viewport.getHeight();
        

        // Code inserts html at the bottom of the page that looks similar to this:
        //
        //  <div id="overlay"></div>
        //  <div id="lightbox">
        //      <div id="outerImageContainer">
        //          <div id="imageContainer">
        //              <img id="lightboxImage">
        //              <div style="" id="hoverNav">
        //                  <a href="#" id="prevLink"></a>
        //                  <a href="#" id="nextLink"></a>
        //              </div>
        //              <div id="loading">
        //                  <a href="#" id="loadingLink">
        //                      <img src="images/loading.gif">
        //                  </a>
        //              </div>
        //          </div>
        //      </div>
        //      <div id="imageDataContainer">
        //          <div id="imageData">
        //              <div id="imageDetails">
        //                  <span id="caption"></span>
        //                  <span id="numberDisplay"></span>
        //              </div>
        //              <div id="bottomNav">
        //                  <a href="#" id="bottomNavClose">
        //                      <img src="images/close.gif">
        //                  </a>
        //              </div>
        //          </div>
        //      </div>
        //  </div>


        var objBody = $$('body')[0];

        objBody.appendChild(Builder.node('div',{id:'overlay'}));

        objBody.appendChild(Builder.node('div',{id:'lightbox'}, [
            Builder.node('div',{id:'outerImageContainer'}, 
                Builder.node('div',{id:'imageContainer', style: 'padding: ' + this.options.borderSize + 'px'}, [
                    Builder.node('img',{id:'lightboxImage'}), 
                    Builder.node('div',{id:'hoverNav'}, [
                        Builder.node('a',{id:'prevLink', href: '#' }),
                        Builder.node('a',{id:'nextLink', href: '#' })
                    ]),
                    Builder.node('div',{id:'loading'}, 
                        Builder.node('a',{id:'loadingLink', href: '#' }, 
                            Builder.node('img', {src: this.options.fileLoadingImage})
                        )
                    )
                ])
            ),
            Builder.node('div', {id:'imageDataContainer'},
                Builder.node('div',{id:'imageData'}, [
                    Builder.node('div',{id:'imageDetails'}, [
                        Builder.node('span',{id:'caption'}),
                        Builder.node('span',{id:'numberDisplay'})
                    ]),
                    Builder.node('div',{id:'bottomNav'},
                        Builder.node('a',{id:'bottomNavClose', href: '#' },
                            Builder.node('img', { src: this.options.fileBottomNavCloseImage })
                        )
                    )
                ])
            )
        ]));

        $('overlay').hide().observe('click', (function() { this.end(); }).bind(this));
        $('lightbox').hide().observe('click', (function(event) { if (event.element().id == 'lightbox') this.end(); }).bind(this));
        $('outerImageContainer').setStyle({ width: size, height: size });
        $('prevLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage - 1); }).bindAsEventListener(this));
        $('nextLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage + 1); }).bindAsEventListener(this));
        $('loadingLink').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
        $('bottomNavClose').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
        
        var th = this;
        var ids = 
            'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink ' + 
            'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';   
        $w(ids).each(function(id){ 
            th[id] = $(id); 
        });
        
        this.updateImageList();
    },

    //
    // updateImageList()
    // Loops through anchor tags looking for 'lightbox' references and applies onclick
    // events to appropriate links. You can rerun after dynamically adding images w/ajax.
    //
    updateImageList: function() { 
        this.updateImageList = Prototype.emptyFunction;
        document.observe('click', (function(event){
            var target = event.findElement('a[rel^=lightbox]') || event.findElement('area[rel^=lightbox]');
            if (target) {
                event.stop();
                this.start(target);
            }
        }).bind(this));
    },
    
    //
    //  start()
    //  Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
    //
    start: function(imageLink) {
        if (this.animating) {
            return false;
        }
        $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' });

        // stretch overlay to fill page and fade in
        var arrayPageSize = this.getPageSize();
        this.overlay.setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });
        
        new Effect.Appear(this.overlay, { duration: this.overlayDuration, from: 0.0, to: this.options.overlayOpacity });
        
        this.imageArray = [];
        var imageNum = 0;       
        
        if ((imageLink.rel == 'lightbox')){
            // if image is NOT part of a set, add single image to imageArray
            this.imageArray.push([imageLink.href, imageLink.title]);
        } else {
            // if image is part of a set..
            this.imageArray = 
                $$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]').
                collect(function(anchor){ return [anchor.href, anchor.title]; }).
                uniq();		
            while (this.imageArray[imageNum][0] != imageLink.href) { imageNum++; }
        }
        
		
        // calculate top and left offset for the lightbox 
        // var lightboxTop = this.pageScroll[1] + (this.pageHeight / 10);
        // var lightboxLeft = this.pageScroll[0];
        // this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show();
		
        // calculate top and left offset for the lightbox 
        var arrayPageScroll = document.viewport.getScrollOffsets();
        var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10);
        var lightboxLeft = arrayPageScroll[0];
        this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show();

        
        this.changeImage(imageNum);
    },

    //
    //  changeImage()
    //  Hide most elements and preload image in preparation for resizing image container.
    //
    changeImage: function(imageNum) {   
        this.activeImage = imageNum; // update global var
        
        // hide elements during transition
        if (this.options.animate) this.loading.show();
        this.lightboxImage.hide();
        this.hoverNav.hide();
        this.prevLink.hide();
        this.nextLink.hide();
        // HACK: Opera9 does not currently support scriptaculous opacity and appear fx
        this.imageDataContainer.setStyle({opacity: .0001});
        this.numberDisplay.hide();      
        
        var imgPreloader = new Image();
        // once image is preloaded, resize image container
        imgPreloader.onload = (function(){
            this.lightboxImage.src = this.imageArray[this.activeImage][0];
            this.resizeImageContainer(imgPreloader.width, imgPreloader.height);
        }).bind(this);
        imgPreloader.src = this.imageArray[this.activeImage][0];
    },

    //
    //  resizeImageContainer()
    //
    resizeImageContainer: function(imgWidth, imgHeight) {
        // get current width and height
        var widthCurrent  = this.outerImageContainer.getWidth() || (this.options.animate ? 250 : 1);
        var heightCurrent = this.outerImageContainer.getHeight() || (this.options.animate ? 250 : 1);

        // get new width and height
        var widthNew  = (imgWidth  + this.options.borderSize * 2);
        var heightNew = (imgHeight + this.options.borderSize * 2);
        
        // scalars based on change from old to new
        var xScale = (widthNew  / widthCurrent)  * 100;
        var yScale = (heightNew / heightCurrent) * 100;
        
        // calculate size difference between new and old image, and resize if necessary
        var wDiff = widthCurrent - widthNew;
        var hDiff = heightCurrent - heightNew;
        
        if (hDiff != 0) {
            this.animating = true;
            new Effect.Scale(this.outerImageContainer, yScale, {
                scaleX: false, 
                duration: this.resizeDuration, 
                queue: 'front',
                afterFinish: function() {
                    this.outerImageContainer.setStyle({ height: heightNew + 'px' }); //invalid height fix;
                    this.animating = false;
                }.bind(this)
            }); 
        }
        if (wDiff != 0) {
            this.animating = true;
            new Effect.Scale(this.outerImageContainer, xScale, {
                scaleY : false,
                duration : this.resizeDuration,
                delay : this.resizeDuration,
                afterFinish: function() {
                    this.outerImageContainer.setStyle({ width: widthNew + 'px' }); //invalid width fix;
                    this.animating = false;
                }.bind(this)
            });
        }
        
        // if new and old image are same size and no scaling transition is necessary, 
        // do a quick pause to prevent image flicker.
        var timeout = 0;
        if ((hDiff == 0) && (wDiff == 0)){
            timeout = 100;
            if (Prototype.Browser.IE) timeout = 250;   
        }
        (function(){
            this.prevLink.setStyle({ height: imgHeight + 'px' });
            this.nextLink.setStyle({ height: imgHeight + 'px' });
            this.imageDataContainer.setStyle({ width: widthNew + 'px' });
            this.showImage();
        }).bind(this).delay(timeout / 1000);
    },
    
    //
    //  showImage()
    //  Display image and begin preloading neighbors.
    //
    showImage: function(){
        this.loading.hide();
        new Effect.Appear(this.lightboxImage, { 
            duration: this.resizeDuration, 
            queue: 'end', 
            afterFinish: (function(){ this.updateDetails(); }).bind(this) 
        });
        this.preloadNeighborImages();
    },

    //
    //  updateDetails()
    //  Display caption, image number, and bottom nav.
    //
    updateDetails: function() {
    
        // if caption is not null
        if (this.imageArray[this.activeImage][1] != ""){
            this.caption.update(this.imageArray[this.activeImage][1]).show();
        }
        
        // if image is part of set display 'Image x of x' 
        if (this.imageArray.length > 1){
            this.numberDisplay.update( this.options.labelImage + ' ' + (this.activeImage + 1) + ' ' + this.options.labelOf + '  ' + this.imageArray.length).show();
        }

        new Effect.Parallel(
            [ 
                new Effect.SlideDown(this.imageDataContainer, { sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0 }), 
                new Effect.Appear(this.imageDataContainer, { sync: true, duration: this.resizeDuration }) 
            ], 
            { 
                duration: this.resizeDuration, 
                afterFinish: (function() {
                    // update overlay size and update nav
                    var arrayPageSize = this.getPageSize();
                    this.overlay.setStyle({ height: arrayPageSize[1] + 'px' });
                    this.updateNav();
                }).bind(this)
            } 
        );
    },

    //
    //  updateNav()
    //  Display appropriate previous and next hover navigation.
    //
    updateNav: function() {

        this.hoverNav.show();               

        // if not first image in set, display prev image button
        if (this.activeImage > 0) this.prevLink.show();

        // if not last image in set, display next image button
        if (this.activeImage < (this.imageArray.length - 1)) this.nextLink.show();
        
        this.enableKeyboardNav();
    },

    //
    //  enableKeyboardNav()
    //
    enableKeyboardNav: function() {
        document.observe('keydown', this.keyboardAction); 
    },

    //
    //  disableKeyboardNav()
    //
    disableKeyboardNav: function() {
        document.stopObserving('keydown', this.keyboardAction); 
    },

    //
    //  keyboardAction()
    //
    keyboardAction: function(event) {
        var keycode = event.keyCode;

        var escapeKey;
        if (event.DOM_VK_ESCAPE) {  // mozilla
            escapeKey = event.DOM_VK_ESCAPE;
        } else { // ie
            escapeKey = 27;
        }

        var key = String.fromCharCode(keycode).toLowerCase();
        
        if (key.match(/x|o|c/) || (keycode == escapeKey)){ // close lightbox
            this.end();
        } else if ((key == 'p') || (keycode == 37)){ // display previous image
            if (this.activeImage != 0){
                this.disableKeyboardNav();
                this.changeImage(this.activeImage - 1);
            }
        } else if ((key == 'n') || (keycode == 39)){ // display next image
            if (this.activeImage != (this.imageArray.length - 1)){
                this.disableKeyboardNav();
                this.changeImage(this.activeImage + 1);
            }
        }
    },

    //
    //  preloadNeighborImages()
    //  Preload previous and next images.
    //
    preloadNeighborImages: function(){
        var preloadNextImage, preloadPrevImage;
        if (this.imageArray.length > this.activeImage + 1){
            preloadNextImage = new Image();
            preloadNextImage.src = this.imageArray[this.activeImage + 1][0];
        }
        if (this.activeImage > 0){
            preloadPrevImage = new Image();
            preloadPrevImage.src = this.imageArray[this.activeImage - 1][0];
        }
    
    },

    //
    //  end()
    //
    end: function() {
        this.disableKeyboardNav();
        this.lightbox.hide();
        new Effect.Fade(this.overlay, { duration: this.overlayDuration });
        $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' });
    },

    //
    //  getPageSize()
    //
    getPageSize: function() {
            
         var xScroll, yScroll;
        
        if (window.innerHeight && window.scrollMaxY) {    
            xScroll = window.innerWidth + window.scrollMaxX;
            yScroll = window.innerHeight + window.scrollMaxY;
        } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
            xScroll = document.body.scrollWidth;
            yScroll = document.body.scrollHeight;
        } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
            xScroll = document.body.offsetWidth;
            yScroll = document.body.offsetHeight;
        }
        
        var windowWidth, windowHeight;
        
        if (self.innerHeight) {    // all except Explorer
            if(document.documentElement.clientWidth){
                windowWidth = document.documentElement.clientWidth; 
            } else {
                windowWidth = self.innerWidth;
            }
            windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
            windowWidth = document.documentElement.clientWidth;
            windowHeight = document.documentElement.clientHeight;
        } else if (document.body) { // other Explorers
            windowWidth = document.body.clientWidth;
            windowHeight = document.body.clientHeight;
        }    
        
        // for small pages with total height less then height of the viewport
        if(yScroll < windowHeight){
            pageHeight = windowHeight;
        } else { 
            pageHeight = yScroll;
        }
    
        // for small pages with total width less then width of the viewport
        if(xScroll < windowWidth){    
            pageWidth = xScroll;        
        } else {
            pageWidth = windowWidth;
        }

        return [pageWidth,pageHeight];
    }
}

