


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

var Scriptaculous = {
  Version: '1.8.3'
};

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-Cms-Is': 'Cybershade',
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (Object.isFunction(extras.push))
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  status:      0,
  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

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

  getHeader: Ajax.Request.prototype.getHeader,

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

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

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

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

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

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

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

    $super(url, options);
  },

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

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

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

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  initialize: function($super, container, url, options) {
    $super(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = { };
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

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

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (Object.isString(element))
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(Element.extend(query.snapshotItem(i)));
    return results;
  };
}

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

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

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

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

Element.cache = { };

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

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

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

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

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

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

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

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

    var content, insert, tagName, childNodes;

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

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

      content = Object.toHTML(content);

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

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

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

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

    return element;
  },

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

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $(element).select("*");
  },

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

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (Object.isString(selector))
      selector = new Selector(selector);
    return selector.match($(element));
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.blank();
  },

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

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

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

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

    return false;
  },

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

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

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

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

    return element;
  },

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

  getDimensions: function(element) {
    element = $(element);
    var display = element.getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (Prototype.Browser.Opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
    if (element._overflow !== 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if (element.tagName.toUpperCase() == 'BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p !== 'static') break;
      }
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

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

    var offsets = element.positionedOffset();
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
    return element;
  },

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

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
    return element;
  },

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

  getOffsetParent: function(element) {
    if (element.offsetParent) return $(element.offsetParent);
    if (element == document.body) return $(element);

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return $(element);

    return $(document.body);
  },

  viewportOffset: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent == document.body &&
        Element.getStyle(element, 'position') == 'absolute') break;

    } while (element = element.offsetParent);

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

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

  clonePosition: function(element, source) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || { });

    // find page position of source
    source = $(source);
    var p = source.viewportOffset();

    // find coordinate system to use
    element = $(element);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(element, 'position') == 'absolute') {
      parent = element.getOffsetParent();
      delta = parent.viewportOffset();
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
    return element;
  }
};

Element.Methods.identify.counter = 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  Element._attributeTranslations.has = {};

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

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

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

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

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

    return element;
  };

  // Safari returns margins on body which is incorrect if the child is absolutely
  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
  // KHTML/WebKit only.
  Element.Methods.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

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

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

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

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

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

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

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

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  },

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

    var e = this.expression;

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

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

    return true;
  },

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

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

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

    return true;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return match;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  getElements: function(form) {
    return $A($(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

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

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

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

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

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

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

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

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

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

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

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

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

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

Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
};

Form.Element.Methods = {
  serialize: function(element) {
    element = $(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = { };
        pair[element.name] = value;
        return Object.toQueryString(pair);
      }
    }
    return '';
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Abstract.EventObserver = Class.create({
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback, this);
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
});

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

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

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,
  KEY_INSERT:   45,

  cache: { },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

      return element;
    },

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

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

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

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

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

      destroyWrapper(id, eventName, handler);

      return element;
    },

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

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

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

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

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

Object.extend(Event, Event.Methods);

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

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

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

  var timer;

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

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

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

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

  } else {
    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();

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

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

var Builder = {
  NODEMAP: {
    AREA: 'map',
    CAPTION: 'table',
    COL: 'table',
    COLGROUP: 'table',
    LEGEND: 'fieldset',
    OPTGROUP: 'select',
    OPTION: 'select',
    PARAM: 'object',
    TBODY: 'table',
    TD: 'table',
    TFOOT: 'table',
    TH: 'table',
    THEAD: 'table',
    TR: 'table'
  },
  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
  //       due to a Firefox bug
  node: function(elementName) {
    elementName = elementName.toUpperCase();
    
    // try innerHTML approach
    var parentTag = this.NODEMAP[elementName] || 'div';
    var parentElement = document.createElement(parentTag);
    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
    } catch(e) {}
    var element = parentElement.firstChild || null;
      
    // see if browser added wrapping tags
    if(element && (element.tagName.toUpperCase() != elementName))
      element = element.getElementsByTagName(elementName)[0];
    
    // fallback to createElement approach
    if(!element) element = document.createElement(elementName);
    
    // abort if nothing could be created
    if(!element) return;

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

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

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

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

  _attributes: function(attributes) {
    var attrs = [];
    for(attribute in attributes)
      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
          '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
    return attrs.join(" ");
  },
  _children: function(element, children) {
    if(children.tagName) {
      element.appendChild(children);
      return;
    }
    if(typeof children=='object') { // array can hold nodes and text
      children.flatten().each( function(e) {
        if(typeof e=='object')
          element.appendChild(e)
        else
          if(Builder._isStringOrNumber(e))
            element.appendChild(Builder._text(e));
      });
    } else
      if(Builder._isStringOrNumber(children))
        element.appendChild(Builder._text(children));
  },
  _isStringOrNumber: function(param) {
    return(typeof param=='string' || typeof param=='number');
  },
  build: function(html) {
    var element = this.node('div');
    $(element).update(html.strip());
    return element.down();
  },
  dump: function(scope) { 
    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
  
    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
  
    tags.each( function(tag){ 
      scope[tag] = function() { 
        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
      } 
    });
  }
}


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

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// 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) + 0.5;
    },
    reverse: function(pos) {
      return 1-pos;
    },
    flicker: function(pos) {
      var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
      return pos > 1 ? 1 : pos;
    },
    wobble: function(pos) {
      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
    },
    pulse: function(pos, pulses) { 
      pulses = pulses || 5; 
      return (
        ((pos % (1/pulses)) * pulses).round() == 0 ? 
              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
        );
    },
    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;
    
    eval('this.render = function(pos){ '+
      'if (this.state=="idle"){this.state="running";'+
      codeForEvent(this.options,'beforeSetup')+
      (this.setup ? 'this.setup();':'')+ 
      codeForEvent(this.options,'afterSetup')+
      '};if (this.state=="running"){'+
      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
      'this.position=pos;'+
      codeForEvent(this.options,'beforeUpdate')+
      (this.update ? 'this.update(pos);':'')+
      codeForEvent(this.options,'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(),
    max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();  

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

  return new Effect.Tween(null,
    scrollOffsets.top,
    elementOffsets[1] > max ? max : 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] || { };
  var oldOpacity = element.getInlineOpacity();
  var transition = options.transition || Effect.Transitions.sinoidal;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
  reverser.bind(transition);
  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.1, Thu Jan 03 22:07:12 -0500 2008

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2007 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(document, "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(document, "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){
    var s = Sortable.options(element);
    
    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,
      
	  // patched by Tankut Koray (tankut@gmail.com)
	  markDropZone: true,
	  
	  /* patched by Gavin Dibley (gavin@gigastorm.net) */
	  dropZoneCss: 'emptyPlaceMarker',
	  
      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;

	var sortable = Sortable.options(dropon);
	var isghosting = sortable && sortable.ghosting;
	
    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
	    /* Patched by Tankut Koray (tankut@gmail.com) */
        Sortable.createGuide(element);
        /* } */ 
		dropon.parentNode.insertBefore(element, dropon);
   	    /* Patched by Tankut Koray (tankut@gmail.com) {*/
		dropon.parentNode.insertBefore(Sortable._guide, element);
		
        Sortable.markEmptyPlace(element, isghosting);
        /* } */ 
        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
	    /* Patched by Tankut Koray (tankut@gmail.com) */
        Sortable.createGuide(element);
        /* } */ 
        dropon.parentNode.insertBefore(element, nextElement);
        /* Patched by Tankut Koray (tankut@gmail.com) {*/
		dropon.parentNode.insertBefore(Sortable._guide, element);

        Sortable.markEmptyPlace(element, isghosting);
        /* } */ 
	    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 sortable = Sortable.options(dropon);
	  var isghosting = sortable && sortable.ghosting;
	
      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;
          }
        }
      }
      /* Patched by Tankut Koray (tankut@gmail.com) {*/        
  	  Sortable.createGuide(element);
	  /* } */
	  dropon.insertBefore(element, child);
      /* Patched by Tankut Koray (tankut@gmail.com) {*/        
	  dropon.insertBefore(Sortable._guide, element);
      Sortable.markEmptyPlace(element,isghosting);
      /* } */
      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },
  /* Patched by Tankut Koray (tankut@gmail.com) {*/        
  createGuide : function (element) {
    if(!Sortable._guide) {
		Sortable._guide = $('_guide') || document.createElement('DIV');
		Sortable._guide.style.position = 'relative';
		Sortable._guide.style.width = '1px';
		Sortable._guide.style.height = '0px';
		Sortable._guide.style.cssFloat = 'left';
		Sortable._guide.id = 'guide';

		document.getElementsByTagName("body").item(0).appendChild(Sortable._guide);
    }
    
  },
  
  markEmptyPlace: function(element, isghosting) {

    if(!Sortable._emptyPlaceMarker) {
 	  /* patched  by Gavin Dibley (gavin@gigastorm.net) */
      Sortable._emptyPlaceMarker = $(Sortable.options(element).dropZoneCss) || document.createElement('DIV');

	  Element.hide(Sortable._emptyPlaceMarker);
	  
	  /* patched  by Gavin Dibley (gavin@gigastorm.net) */
      Element.addClassName(Sortable._emptyPlaceMarker, Sortable.options(element).dropZoneCss);
	  
      Sortable._emptyPlaceMarker.style.position = 'absolute';
      document.getElementsByTagName("body").item(0).appendChild(Sortable._emptyPlaceMarker);
    } else {
	  // reset emptyPlaceMarker margins
	  Sortable._emptyPlaceMarker.style.margin = '';
	}

	if(isghosting && Sortable._guide.previousSibling != null) {
		var pos = Position.cumulativeOffset(Sortable._guide.previousSibling);
		
		// as we use previous sibling as guide and previous sibling is in the right position 
		// we dont need to copy margin info 
	} else {
		var pos = Position.cumulativeOffset(Sortable._guide);
		var md = Element.getStyle(element, 'margin');
		// TODO burada butun margin ve padding elemanlarini kopyala
		// TODO bununu icin prototype da method var mi var.
		if(md != null) 
			Sortable._emptyPlaceMarker.style.margin = md;
	}

	Sortable._emptyPlaceMarker.style.left = (pos[0]) + 'px';
	Sortable._emptyPlaceMarker.style.top = (pos[1]) + 'px';

    var d = {};
    d.width = (Element.getDimensions(element).width) + 'px';
    d.height = (Element.getDimensions(element).height) + 'px';

    Sortable._emptyPlaceMarker.setStyle(d);
	
	if(Sortable.options(element).markDropZone)
	    Element.show(Sortable._emptyPlaceMarker);
  },
  /* } */

  unmark: function() {
    if(Sortable._marker) Sortable._marker.hide();
    /* Patched by Tankut Koray (tankut@gmail.com) {*/        
    if(Sortable._guide && Sortable._guide.parentNode){
        Sortable._guide.parentNode.removeChild(Sortable._guide);
    }
    if(Sortable._emptyPlaceMarker) Sortable._emptyPlaceMarker.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.1, Thu Jan 03 22:07:12 -0500 2008

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005-2007 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);
  },
  
  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;
	fld.onKeyUp = new ResizeableTextarea(fld);
    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();
  },
  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;
  },
  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.1, Thu Jan 03 22:07:12 -0500 2008

// Copyright (c) 2005-2007 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);
    document.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(document, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
  },
  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;
  }
});


/**
 * k.Growler 1.0.0
 *
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Written by Kevin Armstrong <kevin@kevinandre.com>
 * Last updated: 2008.10.14
 *
 * Growler is a PrototypeJS based class that displays unobtrusive notices on a page. 
 * It functions much like the Growl (http://growl.info) available on the Mac OS X. 
 *
 * Changes in 1.0.1:
 * - 
 *
 * @todo
 */
window.k = window.k || {};
;(function(){

var noticeOptions = {
	header: 			'&nbsp;'
	,speedin: 			0.3
	,speedout: 			0.5
	,outDirection: 		{ y: -20 }
	,life: 				5
	,sticky: 			false
	,className: 		""
};
var growlerOptions = {
	location: 			"tr"
	,width: 			"250px"
};
var IE = (Prototype.Browser.IE) ? parseFloat(navigator.appVersion.split("MSIE ")[1]) || 0 : 0;
function removeNotice(n, o){
	o = o || noticeOptions;
	new Effect.Parallel([
		new Effect.Move(n, Object.extend({ sync: true, mode: 'relative' }, o.outDirection)),
		new Effect.Opacity(n, { sync: true, to: 0 }) 
	], {
		duration: o.speedout
		,afterFinish: function(){
			try {
				var ne = n.down("div.notice-exit");
				if(ne != undefined){
					ne.stopObserving("click", removeNotice);
				}
				if(o.created && Object.isFunction(o.created)){
					n.stopObserving("notice:created", o.created);
				}
				if(o.destroyed && Object.isFunction(o.destroyed)){
					n.fire("notice:destroyed");
					n.stopObserving("notice:destroyed", o.destroyed);
				}
			} catch(e){}
			try {
				n.remove();
			} catch(e){}
		}
	});
}
function createNotice(growler, msg, options){
	var opt = Object.clone(noticeOptions);
	options = options || {};
	Object.extend(opt, options);
	var notice;
	if (opt.className != ""){
		notice = new Element("div", {"class": opt.className}).setStyle({display: "block", opacity: 0});
	} else {
		notice = new Element("div", {"class": "Growler-notice"}).setStyle({display: "block", opacity: 0});
	}
	if(opt.created && Object.isFunction(opt.created)){
		notice.observe("notice:created", opt.created);
	}
	if(opt.destroyed && Object.isFunction(opt.destroyed)){
		notice.observe("notice:destroyed", opt.destroyed);
	}
	if (opt.sticky){
		var noticeExit = new Element("div", {"class": "Growler-notice-exit"}).update("&times;");
		noticeExit.observe("click", function(){ removeNotice(notice, opt); });
		notice.insert(noticeExit);
	}
	notice.insert(new Element("div", {"class": "Growler-notice-head"}).update(opt.header));
	notice.insert(new Element("div", {"class": "Growler-notice-body"}).update(msg));
	growler.insert(notice);
	new Effect.Opacity(notice, { to: 0.85, duration: opt.speedin });
	if (!opt.sticky){
		removeNotice.delay(opt.life, notice, opt);
	}
	notice.fire("notice:created");
	return notice;
}
function specialNotice(g, m, o, t, b, c){
	o.header = o.header || t;
	var n = createNotice(g, m, o);
	n.setStyle({ backgroundColor: b, color: c });
	return n;
}
k.Growler = Class.create({
	initialize: function(options){
		var opt = Object.clone(growlerOptions);
		options = options || {};
		Object.extend(opt, options);
		
		
            this.growler = new Element("div", { "class": "Growler", "id": "Growler" });
            this.growler.setStyle({ position: ((IE==6)?"absolute":"fixed"), padding: "10px", "width": opt.width, "z-index": "99999" });
        
		if(IE==6){
			var offset = { w: parseInt(this.growler.style.width)+parseInt(this.growler.style.padding)*3, h: parseInt(this.growler.style.height)+parseInt(this.growler.style.padding)*3 };
			switch(opt.location){
				case "br":
					this.growler.style.setExpression("left", "( 0 - Growler.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px'");
				  	this.growler.style.setExpression("top", "( 0 - Growler.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px'");
					break;
				case "tl":
					this.growler.style.setExpression("left", "( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px'");
				  	this.growler.style.setExpression("top", "( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px'");
					break;
				case "bl":
					this.growler.style.setExpression("left", "( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px'");
				  	this.growler.style.setExpression("top", "( 0 - Growler.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px'");
					break;
				default:
					this.growler.setStyle({right: "auto", bottom: "auto"});
					this.growler.style.setExpression("left", "( 0 - Growler.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px'");
				  	this.growler.style.setExpression("top", "( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px'");
					break;
			}
		} else {
			switch(opt.location){
				case "br":
					this.growler.setStyle({bottom: 0, right: 0});
					break;
				case "tl":
					this.growler.setStyle({top: 0, left: 0});
					break;
				case "bl":
					this.growler.setStyle({top: 0, right: 0});
					break;
				case "tc":
					this.growler.setStyle({top: 0, left: "25%", width: "50%"});
					break;
				case "bc":
					this.growler.setStyle({bottom: 0, left: "25%", width: "50%"});
					break;
				case "nu":
                    this.growler.setStyle({top:"19px",right:"5%"});
                    break;
				default:
					this.growler.setStyle({top: 0, right: 0});
					break;
			}
		}
		this.growler.wrap( document.body );		
	}
	,growl: function(msg, options) {
		return createNotice(this.growler, msg, options);
	}
	,warn: function(msg, options){
		return specialNotice(this.growler, msg, options, "Warning!", "#F6BD6F", "#000");
	}
	,error: function(msg, options){
		return specialNotice(this.growler, msg, options, "Critical!", "#F66F82", "#000");
	}
	,info: function(msg, options){
		return specialNotice(this.growler, msg, options, "Information!", "#BBF66F", "#000");
	}
	,ungrowl: function(n, o){
		removeNotice(n, o);
	}
});

})();


// Compression: minified
function _phpjs_shared_bc(){var libbcmath={PLUS:'+',MINUS:'-',BASE:10,scale:0,bc_num:function(){this.n_sign=null;this.n_len=null;this.n_scale=null;this.n_value=null;this.toString=function(){var r,tmp;tmp=this.n_value.join('');r=((this.n_sign==libbcmath.PLUS)?'':this.n_sign)+tmp.substr(0,this.n_len);if(this.n_scale>0){r+='.'+tmp.substr(this.n_len,this.n_scale);}
return r;};},bc_add:function(n1,n2,scale_min){var sum,cmp_res,res_scale;if(n1.n_sign===n2.n_sign){sum=libbcmath._bc_do_add(n1,n2,scale_min);sum.n_sign=n1.n_sign;}else{cmp_res=libbcmath._bc_do_compare(n1,n2,false,false);switch(cmp_res){case-1:sum=libbcmath._bc_do_sub(n2,n1,scale_min);sum.n_sign=n2.n_sign;break;case 0:res_scale=libbcmath.MAX(scale_min,libbcmath.MAX(n1.n_scale,n2.n_scale));sum=libbcmath.bc_new_num(1,res_scale);libbcmath.memset(sum.n_value,0,0,res_scale+1);break;case 1:sum=libbcmath._bc_do_sub(n1,n2,scale_min);sum.n_sign=n1.n_sign;}}
return sum;},bc_compare:function(n1,n2){return libbcmath._bc_do_compare(n1,n2,true,false);},_one_mult:function(num,n_ptr,size,digit,result,r_ptr){var carry,value;var nptr,rptr;if(digit===0){libbcmath.memset(result,0,0,size);}else{if(digit==1){libbcmath.memcpy(result,r_ptr,num,n_ptr,size);}else{nptr=n_ptr+size-1;rptr=r_ptr+size-1;carry=0;while(size-->0){value=num[nptr--]*digit+carry;result[rptr--]=value%libbcmath.BASE;carry=Math.floor(value/libbcmath.BASE);}
if(carry!==0){result[rptr]=carry;}}}},bc_divide:function(n1,n2,scale){var quot;var qval;var num1,num2;var ptr1,ptr2,n2ptr,qptr;var scale1,val;var len1,len2,scale2,qdigits,extra,count;var qdig,qguess,borrow,carry;var mval;var zero;var norm;var ptrs;if(libbcmath.bc_is_zero(n2)){return-1;}
if(libbcmath.bc_is_zero(n1)){return libbcmath.bc_new_num(1,scale);}
if(n2.n_scale===0){if(n2.n_len===1&&n2.n_value[0]===1){qval=libbcmath.bc_new_num(n1.n_len,scale);qval.n_sign=(n1.n_sign==n2.n_sign?libbcmath.PLUS:libbcmath.MINUS);libbcmath.memset(qval.n_value,n1.n_len,0,scale);libbcmath.memcpy(qval.n_value,0,n1.n_value,0,n1.n_len+libbcmath.MIN(n1.n_scale,scale));}}
scale2=n2.n_scale;n2ptr=n2.n_len+scale2-1;while((scale2>0)&&(n2.n_value[n2ptr--]===0)){scale2--;}
len1=n1.n_len+scale2;scale1=n1.n_scale-scale2;if(scale1<scale){extra=scale-scale1;}else{extra=0;}
num1=libbcmath.safe_emalloc(1,n1.n_len+n1.n_scale,extra+2);if(num1===null){libbcmath.bc_out_of_memory();}
libbcmath.memset(num1,0,0,n1.n_len+n1.n_scale+extra+2);libbcmath.memcpy(num1,1,n1.n_value,0,n1.n_len+n1.n_scale);len2=n2.n_len+scale2;num2=libbcmath.safe_emalloc(1,len2,1);if(num2===null){libbcmath.bc_out_of_memory();}
libbcmath.memcpy(num2,0,n2.n_value,0,len2);num2[len2]=0;n2ptr=0;while(num2[n2ptr]===0){n2ptr++;len2--;}
if(len2>len1+scale){qdigits=scale+1;zero=true;}else{zero=false;if(len2>len1){qdigits=scale+1;}else{qdigits=len1-len2+scale+1;}}
qval=libbcmath.bc_new_num(qdigits-scale,scale);libbcmath.memset(qval.n_value,0,0,qdigits);mval=libbcmath.safe_emalloc(1,len2,1);if(mval===null){libbcmath.bc_out_of_memory();}
if(!zero){norm=Math.floor(10/(n2.n_value[n2ptr]+1));if(norm!=1){libbcmath._one_mult(num1,0,len1+scale1+extra+1,norm,num1,0);libbcmath._one_mult(n2.n_value,n2ptr,len2,norm,n2.n_value,n2ptr);}
qdig=0;if(len2>len1){qptr=len2-len1;}else{qptr=0;}
while(qdig<=len1+scale-len2){if(n2.n_value[n2ptr]==num1[qdig]){qguess=9;}else{qguess=Math.floor((num1[qdig]*10+num1[qdig+1])/n2.n_value[n2ptr]);}
if(n2.n_value[n2ptr+1]*qguess>(num1[qdig]*10+num1[qdig+1]-n2.n_value[n2ptr]*qguess)*10+num1[qdig+2]){qguess--;if(n2.n_value[n2ptr+1]*qguess>(num1[qdig]*10+num1[qdig+1]-n2.n_value[n2ptr]*qguess)*10+num1[qdig+2]){qguess--;}}
borrow=0;if(qguess!==0){mval[0]=0;libbcmath._one_mult(n2.n_value,n2ptr,len2,qguess,mval,1);ptr1=qdig+len2;ptr2=len2;for(count=0;count<len2+1;count++){if(ptr2<0){val=num1[ptr1]-0-borrow;}else{val=num1[ptr1]-mval[ptr2--]-borrow;}
if(val<0){val+=10;borrow=1;}else{borrow=0;}
num1[ptr1--]=val;}}
if(borrow==1){qguess--;ptr1=qdig+len2;ptr2=len2-1;carry=0;for(count=0;count<len2;count++){if(ptr2<0){val=num1[ptr1]+0+carry;}else{val=num1[ptr1]+n2.n_value[ptr2--]+carry;}
if(val>9){val-=10;carry=1;}else{carry=0;}
num1[ptr1--]=val;}
if(carry==1){num1[ptr1]=(num1[ptr1]+1)%10;}}
qval.n_value[qptr++]=qguess;qdig++;}}
qval.n_sign=(n1.n_sign==n2.n_sign?libbcmath.PLUS:libbcmath.MINUS);if(libbcmath.bc_is_zero(qval)){qval.n_sign=libbcmath.PLUS;}
libbcmath._bc_rm_leading_zeros(qval);return qval;},MUL_BASE_DIGITS:80,MUL_SMALL_DIGITS:(this.MUL_BASE_DIGITS/4),bc_multiply:function(n1,n2,scale){var pval;var len1,len2;var full_scale,prod_scale;len1=n1.n_len+n1.n_scale;len2=n2.n_len+n2.n_scale;full_scale=n1.n_scale+n2.n_scale;prod_scale=libbcmath.MIN(full_scale,libbcmath.MAX(scale,libbcmath.MAX(n1.n_scale,n2.n_scale)));pval=libbcmath._bc_rec_mul(n1,len1,n2,len2,full_scale);pval.n_sign=(n1.n_sign==n2.n_sign?libbcmath.PLUS:libbcmath.MINUS);pval.n_len=len2+len1+1-full_scale;pval.n_scale=prod_scale;libbcmath._bc_rm_leading_zeros(pval);if(libbcmath.bc_is_zero(pval)){pval.n_sign=libbcmath.PLUS;}
return pval;},new_sub_num:function(length,scale,value){var temp=new libbcmath.bc_num();temp.n_sign=libbcmath.PLUS;temp.n_len=length;temp.n_scale=scale;temp.n_value=value;return temp;},_bc_simp_mul:function(n1,n1len,n2,n2len,full_scale){var prod;var n1ptr,n2ptr,pvptr;var n1end,n2end;var indx,sum,prodlen;prodlen=n1len+n2len+1;prod=libbcmath.bc_new_num(prodlen,0);n1end=n1len-1;n2end=n2len-1;pvptr=prodlen-1;sum=0;for(indx=0;indx<prodlen-1;indx++){n1ptr=n1end-libbcmath.MAX(0,indx-n2len+1);n2ptr=n2end-libbcmath.MIN(indx,n2len-1);while((n1ptr>=0)&&(n2ptr<=n2end)){sum+=n1.n_value[n1ptr--]*n2.n_value[n2ptr++];}
prod.n_value[pvptr--]=Math.floor(sum%libbcmath.BASE);sum=Math.floor(sum/libbcmath.BASE);}
prod.n_value[pvptr]=sum;return prod;},_bc_shift_addsub:function(accum,val,shift,sub){var accp,valp;var count,carry;count=val.n_len;if(val.n_value[0]===0){count--;}
if(accum.n_len+accum.n_scale<shift+count){throw new Error("len + scale < shift + count");}
accp=accum.n_len+accum.n_scale-shift-1;valp=val.n_len=1;carry=0;if(sub){while(count--){accum.n_value[accp]-=val.n_value[valp--]+carry;if(accum.n_value[accp]<0){carry=1;accum.n_value[accp--]+=libbcmath.BASE;}else{carry=0;accp--;}}
while(carry){accum.n_value[accp]-=carry;if(accum.n_value[accp]<0){accum.n_value[accp--]+=libbcmath.BASE;}else{carry=0;}}}else{while(count--){accum.n_value[accp]+=val.n_value[valp--]+carry;if(accum.n_value[accp]>(libbcmath.BASE-1)){carry=1;accum.n_value[accp--]-=libbcmath.BASE;}else{carry=0;accp--;}}
while(carry){accum.n_value[accp]+=carry;if(accum.n_value[accp]>(libbcmath.BASE-1)){accum.n_value[accp--]-=libbcmath.BASE;}else{carry=0;}}}
return true;},_bc_rec_mul:function(u,ulen,v,vlen,full_scale){var prod;var u0,u1,v0,v1;var u0len,v0len;var m1,m2,m3,d1,d2;var n,prodlen,m1zero;var d1len,d2len;if((ulen+vlen)<libbcmath.MUL_BASE_DIGITS||ulen<libbcmath.MUL_SMALL_DIGITS||vlen<libbcmath.MUL_SMALL_DIGITS){return libbcmath._bc_simp_mul(u,ulen,v,vlen,full_scale);}
n=Math.floor((libbcmath.MAX(ulen,vlen)+1)/2);if(ulen<n){u1=libbcmath.bc_init_num();u0=libbcmath.new_sub_num(ulen,0,u.n_value);}else{u1=libbcmath.new_sub_num(ulen-n,0,u.n_value);u0=libbcmath.new_sub_num(n,0,u.n_value+ulen-n);}
if(vlen<n){v1=libbcmath.bc_init_num();v0=libbcmath.new_sub_num(vlen,0,v.n_value);}else{v1=libbcmath.new_sub_num(vlen-n,0,v.n_value);v0=libbcmath.new_sub_num(n,0,v.n_value+vlen-n);}
libbcmath._bc_rm_leading_zeros(u1);libbcmath._bc_rm_leading_zeros(u0);u0len=u0.n_len;libbcmath._bc_rm_leading_zeros(v1);libbcmath._bc_rm_leading_zeros(v0);v0len=v0.n_len;m1zero=libbcmath.bc_is_zero(u1)||libbcmath.bc_is_zero(v1);d1=libbcmath.bc_init_num();d2=libbcmath.bc_init_num();d1=libbcmath.bc_sub(u1,u0,0);d1len=d1.n_len;d2=libbcmath.bc_sub(v0,v1,0);d2len=d2.n_len;if(m1zero){m1=libbcmath.bc_init_num();}else{m1=libbcmath._bc_rec_mul(u1,u1.n_len,v1,v1.n_len,0);}
if(libbcmath.bc_is_zero(d1)||libbcmath.bc_is_zero(d2)){m2=libbcmath.bc_init_num();}else{m2=libbcmath._bc_rec_mul(d1,d1len,d2,d2len,0);}
if(libbcmath.bc_is_zero(u0)||libbcmath.bc_is_zero(v0)){m3=libbcmath.bc_init_num();}else{m3=libbcmath._bc_rec_mul(u0,u0.n_len,v0,v0.n_len,0);}
prodlen=ulen+vlen+1;prod=libbcmath.bc_new_num(prodlen,0);if(!m1zero){libbcmath._bc_shift_addsub(prod,m1,2*n,0);libbcmath._bc_shift_addsub(prod,m1,n,0);}
libbcmath._bc_shift_addsub(prod,m3,n,0);libbcmath._bc_shift_addsub(prod,m3,0,0);libbcmath._bc_shift_addsub(prod,m2,n,d1.n_sign!=d2.n_sign);return prod;},_bc_do_compare:function(n1,n2,use_sign,ignore_last){var n1ptr,n2ptr;var count;if(use_sign&&(n1.n_sign!=n2.n_sign)){if(n1.n_sign==libbcmath.PLUS){return(1);}else{return(-1);}}
if(n1.n_len!=n2.n_len){if(n1.n_len>n2.n_len){if(!use_sign||(n1.n_sign==libbcmath.PLUS)){return(1);}else{return(-1);}}else{if(!use_sign||(n1.n_sign==libbcmath.PLUS)){return(-1);}else{return(1);}}}
count=n1.n_len+Math.min(n1.n_scale,n2.n_scale);n1ptr=0;n2ptr=0;while((count>0)&&(n1.n_value[n1ptr]==n2.n_value[n2ptr])){n1ptr++;n2ptr++;count--;}
if(ignore_last&&(count==1)&&(n1.n_scale==n2.n_scale)){return(0);}
if(count!==0){if(n1.n_value[n1ptr]>n2.n_value[n2ptr]){if(!use_sign||n1.n_sign==libbcmath.PLUS){return(1);}else{return(-1);}}else{if(!use_sign||n1.n_sign==libbcmath.PLUS){return(-1);}else{return(1);}}}
if(n1.n_scale!=n2.n_scale){if(n1.n_scale>n2.n_scale){for(count=(n1.n_scale-n2.n_scale);count>0;count--){if(n1.n_value[n1ptr++]!==0){if(!use_sign||n1.n_sign==libbcmath.PLUS){return(1);}else{return(-1);}}}}else{for(count=(n2.n_scale-n1.n_scale);count>0;count--){if(n2.n_value[n2ptr++]!==0){if(!use_sign||n1.n_sign==libbcmath.PLUS){return(-1);}else{return(1);}}}}}
return(0);},bc_sub:function(n1,n2,scale_min){var diff;var cmp_res,res_scale;if(n1.n_sign!=n2.n_sign){diff=libbcmath._bc_do_add(n1,n2,scale_min);diff.n_sign=n1.n_sign;}else{cmp_res=libbcmath._bc_do_compare(n1,n2,false,false);switch(cmp_res){case-1:diff=libbcmath._bc_do_sub(n2,n1,scale_min);diff.n_sign=(n2.n_sign==libbcmath.PLUS?libbcmath.MINUS:libbcmath.PLUS);break;case 0:res_scale=libbcmath.MAX(scale_min,libbcmath.MAX(n1.n_scale,n2.n_scale));diff=libbcmath.bc_new_num(1,res_scale);libbcmath.memset(diff.n_value,0,0,res_scale+1);break;case 1:diff=libbcmath._bc_do_sub(n1,n2,scale_min);diff.n_sign=n1.n_sign;break;}}
return diff;},_bc_do_add:function(n1,n2,scale_min){var sum;var sum_scale,sum_digits;var n1ptr,n2ptr,sumptr;var carry,n1bytes,n2bytes;var tmp;sum_scale=libbcmath.MAX(n1.n_scale,n2.n_scale);sum_digits=libbcmath.MAX(n1.n_len,n2.n_len)+1;sum=libbcmath.bc_new_num(sum_digits,libbcmath.MAX(sum_scale,scale_min));n1bytes=n1.n_scale;n2bytes=n2.n_scale;n1ptr=(n1.n_len+n1bytes-1);n2ptr=(n2.n_len+n2bytes-1);sumptr=(sum_scale+sum_digits-1);if(n1bytes!=n2bytes){if(n1bytes>n2bytes){while(n1bytes>n2bytes){sum.n_value[sumptr--]=n1.n_value[n1ptr--];n1bytes--;}}else{while(n2bytes>n1bytes){sum.n_value[sumptr--]=n2.n_value[n2ptr--];n2bytes--;}}}
n1bytes+=n1.n_len;n2bytes+=n2.n_len;carry=0;while((n1bytes>0)&&(n2bytes>0)){tmp=n1.n_value[n1ptr--]+n2.n_value[n2ptr--]+carry;if(tmp>=libbcmath.BASE){carry=1;tmp-=libbcmath.BASE;}else{carry=0;}
sum.n_value[sumptr]=tmp;sumptr--;n1bytes--;n2bytes--;}
if(n1bytes===0){while(n2bytes-->0){tmp=n2.n_value[n2ptr--]+carry;if(tmp>=libbcmath.BASE){carry=1;tmp-=libbcmath.BASE;}else{carry=0;}
sum.n_value[sumptr--]=tmp;}}else{while(n1bytes-->0){tmp=n1.n_value[n1ptr--]+carry;if(tmp>=libbcmath.BASE){carry=1;tmp-=libbcmath.BASE;}else{carry=0;}
sum.n_value[sumptr--]=tmp;}}
if(carry==1){sum.n_value[sumptr]+=1;}
libbcmath._bc_rm_leading_zeros(sum);return sum;},_bc_do_sub:function(n1,n2,scale_min){var diff;var diff_scale,diff_len;var min_scale,min_len;var n1ptr,n2ptr,diffptr;var borrow,count,val;diff_len=libbcmath.MAX(n1.n_len,n2.n_len);diff_scale=libbcmath.MAX(n1.n_scale,n2.n_scale);min_len=libbcmath.MIN(n1.n_len,n2.n_len);min_scale=libbcmath.MIN(n1.n_scale,n2.n_scale);diff=libbcmath.bc_new_num(diff_len,libbcmath.MAX(diff_scale,scale_min));n1ptr=(n1.n_len+n1.n_scale-1);n2ptr=(n2.n_len+n2.n_scale-1);diffptr=(diff_len+diff_scale-1);borrow=0;if(n1.n_scale!=min_scale){for(count=n1.n_scale-min_scale;count>0;count--){diff.n_value[diffptr--]=n1.n_value[n1ptr--];}}else{for(count=n2.n_scale-min_scale;count>0;count--){val=0-n2.n_value[n2ptr--]-borrow;if(val<0){val+=libbcmath.BASE;borrow=1;}else{borrow=0;diff.n_value[diffptr--]=val;}}}
for(count=0;count<min_len+min_scale;count++){val=n1.n_value[n1ptr--]-n2.n_value[n2ptr--]-borrow;if(val<0){val+=libbcmath.BASE;borrow=1;}else{borrow=0;}
diff.n_value[diffptr--]=val;}
if(diff_len!=min_len){for(count=diff_len-min_len;count>0;count--){val=n1.n_value[n1ptr--]-borrow;if(val<0){val+=libbcmath.BASE;borrow=1;}else{borrow=0;}
diff.n_value[diffptr--]=val;}}
libbcmath._bc_rm_leading_zeros(diff);return diff;},bc_new_num:function(length,scale){var temp;temp=new libbcmath.bc_num();temp.n_sign=libbcmath.PLUS;temp.n_len=length;temp.n_scale=scale;temp.n_value=libbcmath.safe_emalloc(1,length+scale,0);libbcmath.memset(temp.n_value,0,0,length+scale);return temp;},safe_emalloc:function(size,len,extra){return Array((size*len)+extra);},bc_init_num:function(){return new libbcmath.bc_new_num(1,0);},_bc_rm_leading_zeros:function(num){while((num.n_value[0]===0)&&(num.n_len>1)){num.n_value.shift();num.n_len--;}},php_str2num:function(str){var p;p=str.indexOf('.');if(p==-1){return libbcmath.bc_str2num(str,0);}else{return libbcmath.bc_str2num(str,(str.length-p));}},CH_VAL:function(c){return c-'0';},BCD_CHAR:function(d){return d+'0';},isdigit:function(c){return(isNaN(parseInt(c,10))?false:true);},bc_str2num:function(str_in,scale){var str,num,ptr,digits,strscale,zero_int,nptr;str=str_in.split('');ptr=0;digits=0;strscale=0;zero_int=false;if((str[ptr]==='+')||(str[ptr]==='-')){ptr++;}
while(str[ptr]==='0'){ptr++;}
while((str[ptr])%1===0){ptr++;digits++;}
if(str[ptr]==='.'){ptr++;}
while((str[ptr])%1===0){ptr++;strscale++;}
if((str[ptr])||(digits+strscale===0)){return libbcmath.bc_init_num();}
strscale=libbcmath.MIN(strscale,scale);if(digits===0){zero_int=true;digits=1;}
num=libbcmath.bc_new_num(digits,strscale);ptr=0;if(str[ptr]==='-'){num.n_sign=libbcmath.MINUS;ptr++;}else{num.n_sign=libbcmath.PLUS;if(str[ptr]==='+'){ptr++;}}
while(str[ptr]==='0'){ptr++;}
nptr=0;if(zero_int){num.n_value[nptr++]=0;digits=0;}
for(;digits>0;digits--){num.n_value[nptr++]=libbcmath.CH_VAL(str[ptr++]);}
if(strscale>0){ptr++;for(;strscale>0;strscale--){num.n_value[nptr++]=libbcmath.CH_VAL(str[ptr++]);}}
return num;},cint:function(v){if(typeof(v)=='undefined'){v=0;}
var x=parseInt(v,10);if(isNaN(x)){x=0;}
return x;},MIN:function(a,b){return((a>b)?b:a);},MAX:function(a,b){return((a>b)?a:b);},ODD:function(a){return(a&1);},memset:function(r,ptr,chr,len){var i;for(i=0;i<len;i++){r[ptr+i]=chr;}},memcpy:function(dest,ptr,src,srcptr,len){var i;for(i=0;i<len;i++){dest[ptr+i]=src[srcptr+i];}
return true;},bc_is_zero:function(num){var count;var nptr;count=num.n_len+num.n_scale;nptr=0;while((count>0)&&(num.n_value[nptr++]===0)){count--;}
if(count!==0){return false;}else{return true;}},bc_out_of_memory:function(){throw new Error("(BC) Out of memory");}};return libbcmath;}
function abs(mixed_number){return Math.abs(mixed_number)||0;}
function acos(arg){return Math.acos(arg);}
function acosh(arg){return Math.log(arg+Math.sqrt(arg*arg-1));}
function addcslashes(str,charlist){var target='',chrs=[],i=0,j=0,c='',next='',rangeBegin='',rangeEnd='',chr='',begin=0,end=0,octalLength=0,postOctalPos=0,cca=0,escHexGrp=[],encoded='',percentHex=/%([\dA-Fa-f]+)/g;var _pad=function(n,c){if((n=n+"").length<c){return new Array(++c-n.length).join("0")+n;}else{return n;}};for(i=0;i<charlist.length;i++){c=charlist.charAt(i);next=charlist.charAt(i+1);if(c==='\\'&&next&&(/\d/).test(next)){rangeBegin=charlist.slice(i+1).match(/^\d+/)[0];octalLength=rangeBegin.length;postOctalPos=i+octalLength+1;if(charlist.charAt(postOctalPos)+charlist.charAt(postOctalPos+1)==='..'){begin=rangeBegin.charCodeAt(0);if((/\\\d/).test(charlist.charAt(postOctalPos+2)+charlist.charAt(postOctalPos+3))){rangeEnd=charlist.slice(postOctalPos+3).match(/^\d+/)[0];i+=1;}
else if(charlist.charAt(postOctalPos+2)){rangeEnd=charlist.charAt(postOctalPos+2);}
else{throw'Range with no end point';}
end=rangeEnd.charCodeAt(0);if(end>begin){for(j=begin;j<=end;j++){chrs.push(String.fromCharCode(j));}}
else{chrs.push('.',rangeBegin,rangeEnd);}
i+=rangeEnd.length+2;}
else{chr=String.fromCharCode(parseInt(rangeBegin,8));chrs.push(chr);}
i+=octalLength;}
else if(next+charlist.charAt(i+2)==='..'){rangeBegin=c;begin=rangeBegin.charCodeAt(0);if((/\\\d/).test(charlist.charAt(i+3)+charlist.charAt(i+4))){rangeEnd=charlist.slice(i+4).match(/^\d+/)[0];i+=1;}
else if(charlist.charAt(i+3)){rangeEnd=charlist.charAt(i+3);}
else{throw'Range with no end point';}
end=rangeEnd.charCodeAt(0);if(end>begin){for(j=begin;j<=end;j++){chrs.push(String.fromCharCode(j));}}
else{chrs.push('.',rangeBegin,rangeEnd);}
i+=rangeEnd.length+2;}
else{chrs.push(c);}}
for(i=0;i<str.length;i++){c=str.charAt(i);if(chrs.indexOf(c)!==-1){target+='\\';cca=c.charCodeAt(0);if(cca<32||cca>126){switch(c){case'\n':target+='n';break;case'\t':target+='t';break;case'\u000D':target+='r';break;case'\u0007':target+='a';break;case'\v':target+='v';break;case'\b':target+='b';break;case'\f':target+='f';break;default:encoded=encodeURIComponent(c);if((escHexGrp=percentHex.exec(encoded))!==null){target+=_pad(parseInt(escHexGrp[1],16).toString(8),3);}
while((escHexGrp=percentHex.exec(encoded))!==null){target+='\\'+_pad(parseInt(escHexGrp[1],16).toString(8),3);}
break;}}
else{target+=c;}}
else{target+=c;}}
return target;}
function addslashes(str){return(str+'').replace(/([\\"'])/g,"\\$1").replace(/\u0000/g,"\\0");}
function aggregate(obj,class_name){var p='',record={},pos=-1;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];this.php_js.aggregateClasses.push(getFuncName(class_name));for(p in class_name){if(!(p in obj)&&p!=='prototype'&&p[0]!=='_'){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){if(!(p in obj)&&p[0]!=='_'){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregate_info(obj){var idx=-1,p='',infoObj={},retObj={},i=0,name='';if(!this.php_js||!this.php_js.aggregateRecords||!this.php_js.aggregateKeys||!this.php_js.aggregateClasses){return false;}
idx=this.php_js.aggregateKeys.indexOf(obj);if(idx===-1){return false;}
for(i=0;i<this.php_js.aggregateClasses[idx].length;i++){name=this.php_js.aggregateClasses[idx][i];infoObj={methods:[],properties:[]};for(p in this.php_js.aggregateRecords[idx][i]){if(typeof this.php_js.aggregateRecords[idx][i][p]==='function'){infoObj.methods.push(p);}
else{infoObj.properties.push(p);}}
retObj[name]=infoObj;}
return retObj;}
function aggregate_methods(obj,class_name){var p='',record={},pos=-1;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];this.php_js.aggregateClasses.push(getFuncName(class_name));for(p in class_name){if(!(p in obj)&&typeof class_name[p]==='function'&&p[0]!=='_'){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){if(!(p in obj)&&typeof class_name.prototype[p]==='function'&&p[0]!=='_'){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregate_methods_by_list(obj,class_name,properties_list,exclude){var p='',i=0,record={},pos=-1;if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};this.php_js.aggregateClasses.push(getFuncName(class_name));if(exclude){for(p in class_name){if(!(p in obj)&&typeof class_name[p]==='function'&&p[0]!=='_'&&properties_list.indexOf(p)===-1){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){if(!(p in obj)&&typeof class_name.prototype[p]==='function'&&p[0]!=='_'&&properties_list.indexOf(p)===-1){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}}else{for(i=0;i<properties_list.length;i++){p=properties_list[i];if(!(p in obj)&&p in class_name&&p[0]!=='_'&&typeof class_name.prototype[p]==='function'){obj[p]=class_name[p];record[p]=class_name[p];}else if(!(p in obj)&&p in class_name.prototype&&p[0]!=='_'&&typeof class_name.prototype[p]==='function'){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregate_methods_by_regexp(obj,class_name,regexp,exclude){var p='',test=false,record={},pos=-1;if(typeof regexp==='string'){regexp=eval(regexp);}
if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};this.php_js.aggregateClasses.push(getFuncName(class_name));for(p in class_name){test=exclude?!regexp.test(p):regexp.test(p);if(!(p in obj)&&typeof class_name[p]==='function'&&p[0]!=='_'&&test){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){test=exclude?!regexp.test(p):regexp.test(p);if(!(p in obj)&&typeof class_name.prototype[p]==='function'&&p[0]!=='_'&&test){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregate_properties(obj,class_name){var p='',record={},pos=-1;if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};this.php_js.aggregateClasses.push(getFuncName(class_name));for(p in class_name){if(!(p in obj)&&typeof class_name[p]!=='function'&&p[0]!=='_'){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){if(!(p in obj)&&typeof class_name.prototype[p]!=='function'&&p[0]!=='_'){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregate_properties_by_list(obj,class_name,properties_list,exclude){var p='',i=0,record={},pos=-1;if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};this.php_js.aggregateClasses.push(getFuncName(class_name));if(exclude){for(p in class_name){if(!(p in obj)&&typeof class_name[p]!=='function'&&p[0]!=='_'&&properties_list.indexOf(p)===-1){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){if(!(p in obj)&&typeof class_name.prototype[p]!=='function'&&p[0]!=='_'&&properties_list.indexOf(p)===-1){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}}else{for(i=0;i<properties_list.length;i++){p=properties_list[i];if(!(p in obj)&&p in class_name&&p[0]!=='_'&&typeof class_name.prototype[p]!=='function'){obj[p]=class_name[p];record[p]=class_name[p];}else if(!(p in obj)&&p in class_name.prototype&&p[0]!=='_'&&typeof class_name.prototype[p]!=='function'){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregate_properties_by_regexp(obj,class_name,regexp,exclude){var p='',test=false,record={},pos=-1;if(typeof regexp==='string'){regexp=eval(regexp);}
if(typeof class_name==='string'){class_name=this.window[class_name];}
this.php_js=this.php_js||{};this.php_js.aggregateKeys=this.php_js.aggregateKeys||[];this.php_js.aggregateRecords=this.php_js.aggregateRecords||[];this.php_js.aggregateClasses=this.php_js.aggregateClasses||[];var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};for(p in class_name){test=exclude?!regexp.test(p):regexp.test(p);if(!(p in obj)&&typeof class_name[p]!=='function'&&p[0]!=='_'&&test){obj[p]=class_name[p];record[p]=class_name[p];}}
for(p in class_name.prototype){test=exclude?!regexp.test(p):regexp.test(p);if(!(p in obj)&&typeof class_name.prototype[p]!=='function'&&p[0]!=='_'&&test){obj[p]=class_name.prototype[p];record[p]=class_name.prototype[p];}}
pos=this.php_js.aggregateKeys.indexOf(obj);if(pos!==-1){this.php_js.aggregateRecords[pos].push(record);this.php_js.aggregateClasses[pos].push(getFuncName(class_name));}else{this.php_js.aggregateKeys.push(obj);this.php_js.aggregateRecords.push([record]);this.php_js.aggregateClasses[0]=[];this.php_js.aggregateClasses[0].push(getFuncName(class_name));}}
function aggregation_info(obj){return this.aggregate_info(obj);}
function array(){return Array.prototype.slice.call(arguments);}
function array_change_key_case(array){var case_fn,tmp_ar={},argc=arguments.length,argv=arguments,key;if(array instanceof Array){return array;}
if(array instanceof Object){if(argc===1||argv[1]==='CASE_LOWER'||argv[1]===0){case_fn="toLowerCase";}else{case_fn="toUpperCase";}
for(key in array){tmp_ar[key[case_fn]()]=array[key];}
return tmp_ar;}
return false;}
function array_chunk(input,size){for(var x,i=0,c=-1,l=input.length,n=[];i<l;i++){(x=i%size)?n[c][x]=input[i]:n[++c]=[input[i]];}
return n;}
function array_combine(keys,values){var new_array={},keycount=keys&&keys.length,i=0;if(typeof keys!=='object'||typeof values!=='object'||typeof keycount!=='number'||typeof values.length!=='number'||!keycount){return false;}
if(keycount!=values.length){return false;}
for(i=0;i<keycount;i++){new_array[keys[i]]=values[i];}
return new_array;}
function array_count_values(array){var tmp_arr={},key='',t='';var __getType=function(obj){var t=typeof obj;t=t.toLowerCase();if(t=="object"){t="array";}
return t;};var __countValue=function(value){switch(typeof(value)){case"number":if(Math.floor(value)!=value){return;}
case"string":if(value in this){++this[value];}else{this[value]=1;}}};t=__getType(array);if(t=='array'){for(key in array){__countValue.call(tmp_arr,array[key]);}}
return tmp_arr;}
function array_diff(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_diff_assoc(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&k===k1){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_diff_key(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(k===k1){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_diff_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr={},i=1,k1='',k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&cb(k,k1)===0){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_diff_ukey(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr={},i=1,k1='',k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(k,k1)===0){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_fill(start_index,num,mixed_val){var key,tmp_arr={};if(!isNaN(start_index)&&!isNaN(num)){for(key=0;key<num;key++){tmp_arr[(key+start_index)]=mixed_val;}}
return tmp_arr;}
function array_fill_keys(keys,value){var retObj={},key='';for(key in keys){retObj[keys[key]]=value;}
return retObj;}
function array_filter(arr,func){var retObj={},k;for(k in arr){if(func(arr[k])){retObj[k]=arr[k];}}
return retObj;}
function array_flip(trans){var key,tmp_ar={};for(key in trans){tmp_ar[trans[key]]=key;}
return tmp_ar;}
function array_intersect(){var arr1=arguments[0],retArr={};var k1='',arr={},i=0,k='';arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]){if(i===arguments.length-1){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_intersect_assoc(){var arr1=arguments[0],retArr={};var k1='',arr={},i=0,k='';arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&k===k1){if(i===arguments.length-1){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_intersect_key(){var arr1=arguments[0],retArr={};var k1='',arr={},i=0,k='';arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(k===k1){if(i===arguments.length-1){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_intersect_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&cb(k,k1)===0){if(i===arguments.length-2){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_intersect_ukey(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(k,k1)===0){if(i===arguments.length-2){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_key_exists(key,search){if(!search||(search.constructor!==Array&&search.constructor!==Object)){return false;}
return key in search;}
function array_keys(input,search_value,argStrict){var tmp_arr={},strict=!!argStrict,include=true,cnt=0;var key='';for(key in input){include=true;if(search_value!=undefined){if(strict&&input[key]!==search_value){include=false;}else if(input[key]!=search_value){include=false;}}
if(include){tmp_arr[cnt]=key;cnt++;}}
return tmp_arr;}
function array_map(callback){var argc=arguments.length,argv=arguments;var j=argv[1].length,i=0,k=1,m=0;var tmp=[],tmp_ar=[];while(i<j){while(k<argc){tmp[m++]=argv[k++][i];}
m=0;k=1;if(callback){if(typeof callback==='string'){callback=this.window[callback];}
tmp_ar[i++]=callback.apply(null,tmp);}else{tmp_ar[i++]=tmp;}
tmp=[];}
return tmp_ar;}
function array_merge(){var args=Array.prototype.slice.call(arguments);var retObj={},k,j=0,i=0;var retArr;for(i=0,retArr=true;i<args.length;i++){if(!(args[i]instanceof Array)){retArr=false;break;}}
if(retArr){return args;}
var ct=0;for(i=0,ct=0;i<args.length;i++){if(args[i]instanceof Array){for(j=0;j<args[i].length;j++){retObj[ct++]=args[i][j];}}else{for(k in args[i]){if(this.is_int(k)){retObj[ct++]=args[i][k];}else{retObj[k]=args[i][k];}}}}
return retObj;}
function array_merge_recursive(arr1,arr2){var idx='';if((arr1&&(arr1 instanceof Array))&&(arr2&&(arr2 instanceof Array))){for(idx in arr2){arr1.push(arr2[idx]);}}else if((arr1&&(arr1 instanceof Object))&&(arr2&&(arr2 instanceof Object))){for(idx in arr2){if(idx in arr1){if(typeof arr1[idx]=='object'&&typeof arr2=='object'){arr1[idx]=this.array_merge(arr1[idx],arr2[idx]);}else{arr1[idx]=arr2[idx];}}else{arr1[idx]=arr2[idx];}}}
return arr1;}
function array_multisort(arr){var flags={'SORT_REGULAR':16,'SORT_NUMERIC':17,'SORT_STRING':18,'SORT_ASC':32,'SORT_DESC':40},sortArrs=[[]],sortFlag=[0],sortKeys=[[]],g=0,i=0,j=0,k='',l=0,thingsToSort=[],vkey=0,zlast=null,args=arguments,nLastSort=[],lastSort=[],lastSorts=[],tmpArray=[],elIndex=0,sortDuplicator=function(a,b){return nLastSort.shift();};var sortFunctions=[[function(a,b){lastSort.push(a>b?1:(a<b?-1:0));return a>b?1:(a<b?-1:0);},function(a,b){lastSort.push(b>a?1:(b<a?-1:0));return b>a?1:(b<a?-1:0);}],[function(a,b){lastSort.push(a-b);return a-b;},function(a,b){lastSort.push(b-a);return b-a;}],[function(a,b){lastSort.push((a+'')>(b+'')?1:((a+'')<(b+'')?-1:0));return(a+'')>(b+'')?1:((a+'')<(b+'')?-1:0);},function(a,b){lastSort.push((b+'')>(a+'')?1:((b+'')<(a+'')?-1:0));return(b+'')>(a+'')?1:((b+'')<(a+'')?-1:0);}]];if(arr instanceof Array){sortArrs[0]=arr;}
else if(arr instanceof Object){for(i in arr){if(arr.hasOwnProperty(i)){sortKeys[0].push(i);sortArrs[0].push(arr[i]);}}}
else{return false;}
var arrMainLength=sortArrs[0].length,sortComponents=[0,arrMainLength];for(j=1;j<arguments.length;j++){if(arguments[j]instanceof Array){sortArrs[j]=arguments[j];sortFlag[j]=0;if(arguments[j].length!==arrMainLength){return false;}}else if(arguments[j]instanceof Object){sortKeys[j]=[];sortArrs[j]=[];sortFlag[j]=0;for(i in arguments[j]){if(arguments[j].hasOwnProperty(i)){sortKeys[j].push(i);sortArrs[j].push(arguments[j][i]);}}
if(sortArrs[j].length!==arrMainLength){return false;}}else if(typeof arguments[j]==='string'){var lFlag=sortFlag.pop();if(typeof flags[arguments[j]]==='undefined'||((((flags[arguments[j]])>>>4)&(lFlag>>>4))>0)){return false;}
sortFlag.push(lFlag+flags[arguments[j]]);}else{return false;}}
for(i=0;i!==arrMainLength;i++){thingsToSort.push(true);}
for(i in sortArrs){if(sortArrs.hasOwnProperty(i)){lastSorts=[];tmpArray=[];elIndex=0;nLastSort=[];lastSort=[];if(sortComponents.length===0){if(arguments[i]instanceof Array){args[i]=sortArrs[i];}
else{for(k in arguments[i]){if(arguments[i].hasOwnProperty(k)){delete arguments[i][k];}}
for(j=0,vkey=0;j<sortArrs[i].length;j++){vkey=sortKeys[i][j];args[i][vkey]=sortArrs[i][j];}}
delete sortArrs[i];delete sortKeys[i];continue;}
var sFunction=sortFunctions[(sortFlag[i]&3)][((sortFlag[i]&8)>0)?1:0];for(l=0;l!==sortComponents.length;l+=2){tmpArray=sortArrs[i].slice(sortComponents[l],sortComponents[l+1]+1);tmpArray.sort(sFunction);lastSorts[l]=[].concat(lastSort);elIndex=sortComponents[l];for(g in tmpArray){if(tmpArray.hasOwnProperty(g)){sortArrs[i][elIndex]=tmpArray[g];elIndex++;}}}
sFunction=sortDuplicator;for(j in sortArrs){if(sortArrs.hasOwnProperty(j)){if(sortArrs[j]===sortArrs[i]){continue;}
for(l=0;l!==sortComponents.length;l+=2){tmpArray=sortArrs[j].slice(sortComponents[l],sortComponents[l+1]+1);nLastSort=[].concat(lastSorts[l]);tmpArray.sort(sFunction);elIndex=sortComponents[l];for(g in tmpArray){if(tmpArray.hasOwnProperty(g)){sortArrs[j][elIndex]=tmpArray[g];elIndex++;}}}}}
for(j in sortKeys){if(sortKeys.hasOwnProperty(j)){for(l=0;l!==sortComponents.length;l+=2){tmpArray=sortKeys[j].slice(sortComponents[l],sortComponents[l+1]+1);nLastSort=[].concat(lastSorts[l]);tmpArray.sort(sFunction);elIndex=sortComponents[l];for(g in tmpArray){if(tmpArray.hasOwnProperty(g)){sortKeys[j][elIndex]=tmpArray[g];elIndex++;}}}}}
zlast=null;sortComponents=[];for(j in sortArrs[i]){if(sortArrs[i].hasOwnProperty(j)){if(!thingsToSort[j]){if((sortComponents.length&1)){sortComponents.push(j-1);}
zlast=null;continue;}
if(!(sortComponents.length&1)){if(zlast!==null){if(sortArrs[i][j]===zlast){sortComponents.push(j-1);}
else{thingsToSort[j]=false;}}
zlast=sortArrs[i][j];}else{if(sortArrs[i][j]!==zlast){sortComponents.push(j-1);zlast=sortArrs[i][j];}}}}
if(sortComponents.length&1){sortComponents.push(j);}
if(arguments[i]instanceof Array){args[i]=sortArrs[i];}
else{for(j in arguments[i]){if(arguments[i].hasOwnProperty(j)){delete arguments[i][j];}}
for(j=0,vkey=0;j<sortArrs[i].length;j++){vkey=sortKeys[i][j];args[i][vkey]=sortArrs[i][j];}}
delete sortArrs[i];delete sortKeys[i];}}
return true;}
function array_pad(input,pad_size,pad_value){var pad=[],newArray=[],newLength,i=0;if(input instanceof Array&&!isNaN(pad_size)){newLength=((pad_size<0)?(pad_size*-1):pad_size);if(newLength>input.length){for(i=0;i<(newLength-input.length);i++){newArray[i]=pad_value;}
pad=((pad_size<0)?newArray.concat(input):input.concat(newArray));}else{pad=input;}}
return pad;}
function array_pop(inputArr){var key='',lastKey='';if(inputArr.hasOwnProperty('length')){if(!inputArr.length){return null;}
return inputArr.pop();}else{for(key in inputArr){if(inputArr.hasOwnProperty(key)){lastKey=key;}}
if(lastKey){var tmp=inputArr[lastKey];delete(inputArr[lastKey]);return tmp;}else{return null;}}}
function array_product(input){var Index=0,product=1;if(input instanceof Array){while(Index<input.length){product*=(!isNaN(input[Index])?input[Index]:0);Index++;}}else{product=null;}
return product;}
function array_push(inputArr){var i=0,pr='',argv=arguments,argc=argv.length,allDigits=/^\d$/,size=0,highestIdx=0,len=0;if(inputArr.hasOwnProperty('length')){for(i=1;i<argc;i++){inputArr[inputArr.length]=argv[i];}
return inputArr.length;}
for(pr in inputArr){if(inputArr.hasOwnProperty(pr)){++len;if(allDigits.test(pr)){size=parseInt(pr,10);highestIdx=size>highestIdx?size:highestIdx;}}}
for(i=1;i<argc;i++){inputArr[++highestIdx]=argv[i];}
return len+i-1;}
function array_rand(input,num_req){var indexes=[];var ticks=num_req||1;var checkDuplicate=function(input,value){var exist=false,index=0;while(index<input.length){if(input[index]===value){exist=true;break;}
index++;}
return exist;};if(input instanceof Array&&ticks<=input.length){while(true){var rand=Math.floor((Math.random()*input.length));if(indexes.length===ticks){break;}
if(!checkDuplicate(indexes,rand)){indexes.push(rand);}}}else{indexes=null;}
return((ticks==1)?indexes.join():indexes);}
function array_reduce(a_input,callback){var lon=a_input.length;var res=0,i=0;var tmp=[];for(i=0;i<lon;i+=2){tmp[0]=a_input[i];if(a_input[(i+1)]){tmp[1]=a_input[(i+1)];}else{tmp[1]=0;}
res+=callback.apply(null,tmp);tmp=[];}
return res;}
function array_replace(arr){if(arguments.length<2){throw new Error('There should be at least 2 arguments passed to array_replace()');}
var retObj={};for(var prop in arr){retObj[prop]=arr[prop];}
for(var i=1;i<arguments.length;i++){for(var p in arguments[i]){retObj[p]=arguments[i][p];}}
return retObj;}
function array_replace_recursive(arr){if(arguments.length<2){throw new Error('There should be at least 2 arguments passed to array_replace_recursive()');}
var retObj={};for(var prop in arr){retObj[prop]=arr[prop];}
for(var i=1;i<arguments.length;i++){for(var p in arguments[i]){if(typeof retObj[p]==='object'&&retObj[p]!==null){retObj[p]=this.array_replace_recursive(retObj[p],arguments[i][p]);}
else{retObj[p]=arguments[i][p];}}}
return retObj;}
function array_reverse(array,preserve_keys){var arr_len=array.length,newkey=0,tmp_arr={},key='';preserve_keys=!!preserve_keys;for(key in array){newkey=arr_len-key-1;tmp_arr[preserve_keys?key:newkey]=array[key];}
return tmp_arr;}
function array_search(needle,haystack,argStrict){var strict=!!argStrict;var key='';for(key in haystack){if((strict&&haystack[key]===needle)||(!strict&&haystack[key]==needle)){return key;}}
return false;}
function array_shift(array){if(array.length>0){return array.shift();}
return null;}
function array_slice(arr,offst,lgth,preserve_keys){var key='';if(!(arr instanceof Array)||(preserve_keys&&offst!==0)){var lgt=0,newAssoc={};for(key in arr){lgt+=1;newAssoc[key]=arr[key];}
arr=newAssoc;offst=(offst<0)?lgt+offst:offst;lgth=lgth===undefined?lgt:(lgth<0)?lgt+lgth-offst:lgth;var assoc={};var start=false,it=-1,arrlgth=0,no_pk_idx=0;for(key in arr){++it;if(arrlgth>=lgth){break;}
if(it==offst){start=true;}
if(!start){continue;}
++arrlgth;if(this.is_int(key)&&!preserve_keys){assoc[no_pk_idx++]=arr[key];}else{assoc[key]=arr[key];}}
return assoc;}
if(lgth===undefined){return arr.slice(offst);}else if(lgth>=0){return arr.slice(offst,offst+lgth);}else{return arr.slice(offst,lgth);}}
function array_splice(arr,offst,lgth,replacement){var _checkToUpIndices=function(arr,ct,key){if(arr[ct]!==undefined){var tmp=ct;ct+=1;if(ct===key){ct+=1;}
ct=_checkToUpIndices(arr,ct,key);arr[ct]=arr[tmp];delete arr[tmp];}
return ct;};if(replacement&&typeof replacement!=='object'){replacement=[replacement];}
if(lgth===undefined){lgth=offst>=0?arr.length-offst:-offst;}else if(lgth<0){lgth=(offst>=0?arr.length-offst:-offst)+lgth;}
if(!(arr instanceof Array)){var lgt=0,ct=-1,rmvd=[],rmvdObj={},repl_ct=-1,int_ct=-1;var returnArr=true,rmvd_ct=0,rmvd_lgth=0,key='';for(key in arr){lgt+=1;}
offst=(offst>=0)?offst:lgt+offst;for(key in arr){ct+=1;if(ct<offst){if(this.is_int(key)){int_ct+=1;if(parseInt(key,10)===int_ct){continue;}
_checkToUpIndices(arr,int_ct,key);arr[int_ct]=arr[key];delete arr[key];}
continue;}
if(returnArr&&this.is_int(key)){rmvd.push(arr[key]);rmvdObj[rmvd_ct++]=arr[key];}else{rmvdObj[key]=arr[key];returnArr=false;}
rmvd_lgth+=1;if(replacement&&replacement[++repl_ct]){arr[key]=replacement[repl_ct];}else{delete arr[key];}}
return returnArr?rmvd:rmvdObj;}
if(replacement){replacement.unshift(offst,lgth);return Array.prototype.splice.apply(arr,replacement);}
return arr.splice(offst,lgth);}
function array_sum(array){var key,sum=0;if(typeof array!=='object'){return null;}
for(key in array){sum+=(array[key]*1);}
return sum;}
function array_udiff(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr='',i=1,k1='',k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_udiff_assoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr={},i=1,k1='',k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0&&k===k1){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_udiff_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1],cb0=arguments[arguments.length-2];var k1='',i=1,k='',arr={};cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;cb0=(typeof cb0==='string')?this.window[cb0]:(cb0 instanceof Array)?this.window[cb0[0]][cb0[1]]:cb0;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-2;i++){arr=arguments[i];for(k in arr){if(cb0(arr[k],arr1[k1])===0&&cb(k,k1)===0){continue arr1keys;}}
retArr[k1]=arr1[k1];}}
return retArr;}
function array_uintersect(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0){if(i===arguments.length-2){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_uintersect_assoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0&&k===k1){if(i===arguments.length-2){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_uintersect_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1],cb0=arguments[arguments.length-2];var k1='',i=1,k='',arr={};cb=(typeof cb==='string')?this.window[cb]:(cb instanceof Array)?this.window[cb[0]][cb[1]]:cb;cb0=(typeof cb0==='string')?this.window[cb0]:(cb0 instanceof Array)?this.window[cb0[0]][cb0[1]]:cb0;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-2;i++){arr=arguments[i];for(k in arr){if(cb0(arr[k],arr1[k1])===0&&cb(k,k1)===0){if(i===arguments.length-3){retArr[k1]=arr1[k1];}
continue arrs;}}
continue arr1keys;}}
return retArr;}
function array_unique(inputArr){var key='',tmp_arr2={},val='';var __array_search=function(needle,haystack){var fkey='';for(fkey in haystack){if(haystack.hasOwnProperty){if((haystack[fkey]+'')===(needle+'')){return fkey;}}}
return false;};for(key in inputArr){if(inputArr.hasOwnProperty){val=inputArr[key];if(false===__array_search(val,tmp_arr2)){tmp_arr2[key]=val;}}}
return tmp_arr2;}
function array_unshift(array){var argc=arguments.length,argv=arguments,i;for(i=1;i<argc;i++){array.unshift(argv[i]);}
return(array.length);}
function array_values(input){var tmp_arr=[],cnt=0;var key='';for(key in input){tmp_arr[cnt]=input[key];cnt++;}
return tmp_arr;}
function array_walk(array,funcname,userdata){var key;if(typeof array!=='object'||array===null){return false;}
for(key in array){if(typeof(userdata)!=='undefined'){eval(funcname+'( array [key] , key , userdata  )');}else{eval(funcname+'(  userdata ) ');}}
return true;}
function array_walk_recursive(array,funcname,userdata){var key;if(typeof array!='object'){return false;}
for(key in array){if(typeof array[key]=='object'){return this.array_walk_recursive(array[key],funcname,userdata);}
if(typeof(userdata)!='undefined'){eval(funcname+'( array [key] , key , userdata  )');}else{eval(funcname+'(  userdata ) ');}}
return true;}
function arsort(inputArr,sort_flags){var valArr=[],keyArr=[],k,i,ret,sorter,that=this,strictForIn=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return that.strnatcmp(b,a);};break;case'SORT_LOCALE_STRING':var loc=this.i18n_loc_get_default();sorter=this.php_js.i18nLocales[loc].sorting;break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b){return 1;}
if(a<b){return-1;}
return 0;};break;}
var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=sorter(inputArr[j+1],inputArr[j]);if(ret>0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);keyArr.push(k);if(strictForIn){delete inputArr[k];}}}
try{bubbleSort(keyArr,valArr);}catch(e){return false;}
for(i=0;i<valArr.length;i++){populateArr[keyArr[i]]=valArr[i];}
return strictForIn?true:populateArr;}
function asin(arg){return Math.asin(arg);}
function asinh(arg){return Math.log(arg+Math.sqrt(arg*arg+1));}
function asort(inputArr,sort_flags){var valArr=[],keyArr=[],k,i,ret,sorter,that=this,strictForIn=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return that.strnatcmp(a,b);};break;case'SORT_LOCALE_STRING':var loc=this.i18n_loc_get_default();sorter=this.php_js.i18nLocales[loc].sorting;break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b){return 1;}
if(a<b){return-1;}
return 0;};break;}
var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=sorter(inputArr[j+1],inputArr[j]);if(ret<0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);keyArr.push(k);if(strictForIn){delete inputArr[k];}}}
try{bubbleSort(keyArr,valArr);}catch(e){return false;}
for(i=0;i<valArr.length;i++){populateArr[keyArr[i]]=valArr[i];}
return strictForIn?true:populateArr;}
function assert(assertion){var result=false,callback,retVal,err=undefined;this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};this.php_js.assert_values=this.php_js.assert_values||{};var getOption=function(value){if(this.php_js.assert_values[value]){return this.php_js.assert_values[value];}
if(this.php_js.ini[value]){return this.php_js.ini[value].local_value;}
switch(value){case'assert.active':return 1;case'assert.warning':throw'We have not yet implemented warnings in JavaScript (assert())';case'assert.bail':return 0;case'assert.quiet_eval':return 0;case'assert.callback':return null;default:throw'There was some problem';}};if(!getOption('assert.active')){return false;}
try{result=typeof assertion==='string'?eval(assertion):assertion;}
catch(e){if(!getOption('assert.quiet_eval')){throw e;}
err=e;result=false;}
retVal=result!==false;if(retVal===false){if(getOption('assert.bail')){throw'Assertion bailed';}
callback=getOption('assert.callback');if(typeof callback==='string'){callback=this.window[callback];}
callback(this.window.location.href,err&&err.lineNumber,(typeof assertion==='string'?assertion:''));}
return retVal;}
function assert_options(what,value){this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};this.php_js.assert_values=this.php_js.assert_values||{};var ini,dflt;switch(what){case'ASSERT_ACTIVE':ini='assert.active';dflt=1;break;case'ASSERT_WARNING':ini='assert.warning';dflt=1;throw'We have not yet implemented warnings for us to throw in JavaScript (assert_options())';case'ASSERT_BAIL':ini='assert.bail';dflt=0;break;case'ASSERT_QUIET_EVAL':ini='assert.quiet_eval';dflt=0;break;case'ASSERT_CALLBACK':ini='assert.callback';dflt=null;break;default:throw'Improper type for assert_options()';}
var originalValue=this.php_js.assert_values[ini]||(this.php_js.ini[ini]&&this.php_js.ini[ini].local_value)||dflt;if(value){this.php_js.assert_values[ini]=value;}
return originalValue;}
function atan(arg){return Math.atan(arg);}
function atan2(y,x){return Math.atan2(y,x);}
function atanh(arg){return 0.5*Math.log((1+arg)/(1-arg));}
function base64_decode(data){var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o1,o2,o3,h1,h2,h3,h4,bits,i=0,ac=0,dec="",tmp_arr=[];if(!data){return data;}
data+='';do{h1=b64.indexOf(data.charAt(i++));h2=b64.indexOf(data.charAt(i++));h3=b64.indexOf(data.charAt(i++));h4=b64.indexOf(data.charAt(i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;if(h3==64){tmp_arr[ac++]=String.fromCharCode(o1);}else if(h4==64){tmp_arr[ac++]=String.fromCharCode(o1,o2);}else{tmp_arr[ac++]=String.fromCharCode(o1,o2,o3);}}while(i<data.length);dec=tmp_arr.join('');dec=this.utf8_decode(dec);return dec;}
function base64_encode(data){var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o1,o2,o3,h1,h2,h3,h4,bits,i=0,ac=0,enc="",tmp_arr=[];if(!data){return data;}
data=this.utf8_encode(data+'');do{o1=data.charCodeAt(i++);o2=data.charCodeAt(i++);o3=data.charCodeAt(i++);bits=o1<<16|o2<<8|o3;h1=bits>>18&0x3f;h2=bits>>12&0x3f;h3=bits>>6&0x3f;h4=bits&0x3f;tmp_arr[ac++]=b64.charAt(h1)+b64.charAt(h2)+b64.charAt(h3)+b64.charAt(h4);}while(i<data.length);enc=tmp_arr.join('');switch(data.length%3){case 1:enc=enc.slice(0,-2)+'==';break;case 2:enc=enc.slice(0,-1)+'=';break;}
return enc;}
function base_convert(number,frombase,tobase){return parseInt(number+'',frombase+0).toString(tobase+0);}
function basename(path,suffix){var b=path.replace(/^.*[\/\\]/g,'');if(typeof(suffix)=='string'&&b.substr(b.length-suffix.length)==suffix){b=b.substr(0,b.length-suffix.length);}
return b;}
function bcadd(left_operand,right_operand,scale){var libbcmath=this._phpjs_shared_bc();var first,second,result;if(typeof(scale)=='undefined'){scale=libbcmath.scale;}
scale=((scale<0)?0:scale);first=libbcmath.bc_init_num();second=libbcmath.bc_init_num();result=libbcmath.bc_init_num();first=libbcmath.php_str2num(left_operand.toString());second=libbcmath.php_str2num(right_operand.toString());result=libbcmath.bc_add(first,second,scale);if(result.n_scale>scale){result.n_scale=scale;}
return result.toString();}
function bccomp(left_operand,right_operand,scale){var libbcmath=this._phpjs_shared_bc();var first,second;if(typeof(scale)=='undefined'){scale=libbcmath.scale;}
scale=((scale<0)?0:scale);first=libbcmath.bc_init_num();second=libbcmath.bc_init_num();first=libbcmath.bc_str2num(left_operand.toString(),scale);second=libbcmath.bc_str2num(right_operand.toString(),scale);return libbcmath.bc_compare(first,second,scale);}
function bcdiv(left_operand,right_operand,scale){var libbcmath=this._phpjs_shared_bc();var first,second,result;if(typeof(scale)=='undefined'){scale=libbcmath.scale;}
scale=((scale<0)?0:scale);first=libbcmath.bc_init_num();second=libbcmath.bc_init_num();result=libbcmath.bc_init_num();first=libbcmath.php_str2num(left_operand.toString());second=libbcmath.php_str2num(right_operand.toString());result=libbcmath.bc_divide(first,second,scale);if(result===-1){throw new Error(11,"(BC) Division by zero");}
if(result.n_scale>scale){result.n_scale=scale;}
return result.toString();}
function bcmul(left_operand,right_operand,scale){var libbcmath=this._phpjs_shared_bc();var first,second,result;if(typeof(scale)=='undefined'){scale=libbcmath.scale;}
scale=((scale<0)?0:scale);first=libbcmath.bc_init_num();second=libbcmath.bc_init_num();result=libbcmath.bc_init_num();first=libbcmath.php_str2num(left_operand.toString());second=libbcmath.php_str2num(right_operand.toString());result=libbcmath.bc_multiply(first,second,scale);if(result.n_scale>scale){result.n_scale=scale;}
return result.toString();}
function bcround(val,precision){var libbcmath=this._phpjs_shared_bc();var temp,result,digit;var right_operand;temp=libbcmath.bc_init_num();temp=libbcmath.php_str2num(val.toString());if(precision>=temp.n_scale){while(temp.n_scale<precision){temp.n_value[temp.n_len+temp.n_scale]=0;temp.n_scale++;}
return temp.toString();}
digit=temp.n_value[temp.n_len+precision];right_operand=libbcmath.bc_init_num();right_operand=libbcmath.bc_new_num(1,precision);if(digit>=5){right_operand.n_value[right_operand.n_len+right_operand.n_scale-1]=1;if(temp.n_sign==libbcmath.MINUS){right_operand.n_sign=libbcmath.MINUS;}
result=libbcmath.bc_add(temp,right_operand,precision);}else{result=temp;}
if(result.n_scale>precision){result.n_scale=precision;}
return result.toString();}
function bcscale(scale){var libbcmath=this._phpjs_shared_bc();scale=parseInt(scale,10);if(isNaN(scale)){return false;}
if(scale<0){return false;}
libbcmath.scale=scale;return true;}
function bcsub(left_operand,right_operand,scale){var libbcmath=this._phpjs_shared_bc();var first,second,result;if(typeof(scale)=='undefined'){scale=libbcmath.scale;}
scale=((scale<0)?0:scale);first=libbcmath.bc_init_num();second=libbcmath.bc_init_num();result=libbcmath.bc_init_num();first=libbcmath.php_str2num(left_operand.toString());second=libbcmath.php_str2num(right_operand.toString());result=libbcmath.bc_sub(first,second,scale);if(result.n_scale>scale){result.n_scale=scale;}
return result.toString();}
function bin2hex(s){var i,f=0,a=[];s+='';f=s.length;for(i=0;i<f;i++){a[i]=s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");}
return a.join('');}
function bindec(binary_string){binary_string=(binary_string+'').replace(/[^01]/gi,'');return parseInt(binary_string,2);}
function call_user_func(cb,parameters){var func;if(typeof cb=='string'){if(typeof this[cb]=='function'){func=this[cb];}else{func=(new Function(null,'return '+cb))();}}else if(cb instanceof Array){func=eval(cb[0]+"['"+cb[1]+"']");}
if(typeof func!='function'){throw new Error(func+' is not a valid function');}
return func.apply(null,Array.prototype.slice.call(arguments,1));}
function call_user_func_array(cb,parameters){var func;if(typeof cb=='string'){if(typeof this[cb]=='function'){func=this[cb];}else{func=(new Function(null,'return '+cb))();}}else if(cb instanceof Array){func=eval(cb[0]+"['"+cb[1]+"']");}
if(typeof func!='function'){throw new Error(func+' is not a valid function');}
return func.apply(null,parameters);}
function ceil(value){return Math.ceil(value);}
function checkdate(m,d,y){return m>0&&m<13&&y>0&&y<32768&&d>0&&d<=(new Date(y,m,0)).getDate();}
function chop(str,charlist){return this.rtrim(str,charlist);}
function chr(codePt){if(codePt>0xFFFF){codePt-=0x10000;return String.fromCharCode(0xD800+(codePt>>10),0xDC00+(codePt&0x3FF));}
else{return String.fromCharCode(codePt);}}
function chunk_split(body,chunklen,end){chunklen=parseInt(chunklen,10)||76;end=end||'\r\n';if(chunklen<1){return false;}
return body.match(new RegExp(".{0,"+chunklen+"}","g")).join(end);}
function class_alias(clss,alias,autoload){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(autoload&&typeof this.window.__autoload==='function'){this.window.__autoload(clss);}
if(typeof clss==='string'){clss=this.window[clss];}
if(typeof clss==='undefined'){throw"Class '"+getFuncName(clss)+"' not found";return false;}
if(typeof clss!=='function'){throw'First argument of class_alias() must be a name of user defined class';return false;}
if(typeof this.window[alias]==='function'){throw'Cannot redeclare class '+alias;return false;}
this.window[alias]=clss;return true;}
function class_exists(cls){var i='';cls=this.window[cls];if(typeof cls!=='function'){return false;}
for(i in cls.prototype){return true;}
for(i in cls){if(i!=='prototype'){return true;}}
if(cls.toSource&&cls.toSource().match(/this\./)){return true;}
return false;}
function classkit_import(file){eval(this.file_get_contents(file));}
function classkit_method_add(classname,methodname,args,code,flags){var func,argmnts=[];switch(flags){case'CLASSKIT_ACC_PROTECTED':throw'Protected not supported';case'CLASSKIT_ACC_PRIVATE':throw'Private not supported';case'CLASSKIT_ACC_PUBLIC':default:break;}
argmnts=args.split(/,\s*/);if(typeof classname==='string'){classname=this.window[classname];}
func=Function.apply(null,argmnts.concat(code));classname.prototype[methodname]=func;return true;}
function classkit_method_copy(dClass,dMethod,sClass,sMethod){sMethod=sMethod||dMethod;if(typeof dClass==='string'){dClass=this.window[dClass];}
if(typeof sClass==='string'){sClass=this.window[sClass];}
dClass.prototype[dMethod]=sClass.prototype[sMethod];return true;}
function classkit_method_redefine(classname,methodname,args,code,flags){var argmnts=[],func;switch(flags){case'CLASSKIT_ACC_PROTECTED':throw'Protected not supported';case'CLASSKIT_ACC_PRIVATE':throw'Private not supported';case'CLASSKIT_ACC_PUBLIC':default:break;}
argmnts=args.split(/,\s*/);if(typeof classname==='string'){classname=this.window[classname];}
func=Function.apply(null,argmnts.concat(code));classname.prototype[methodname]=func;return true;}
function classkit_method_remove(classname,methodname){if(typeof classname==='string'){classname=this.window[classname];}
delete classname.prototype[methodname];return true;}
function classkit_method_rename(classname,methodname,newname){if(typeof classname==='string'){classname=this.window[classname];}
var method=classname.prototype[methodname];classname.prototype[newname]=method;delete classname.prototype[methodname];return true;}
function compact(){var matrix={},that=this;var process=function(value){var i=0,l=value.length,key_value='';for(i=0;i<l;i++){key_value=value[i];if(key_value instanceof Array){process(key_value);}else{if(typeof that.window[key_value]!=='undefined'){matrix[key_value]=that.window[key_value];}}}
return true;};process(arguments);return matrix;}
function constant(name){var clssPos=0,clssCnst=null;if((clssPos=name.indexOf('::'))!==-1){clssCnst=name.slice(clssPos+2);name=name.slice(0,clssPos);}
if(this.window[name]===undefined){return null;}
if(clssCnst){return this.window[name][clssCnst];}
return this.window[name];}
function convert_cyr_string(str,from,to){var _cyr_win1251=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,154,174,190,46,159,189,46,46,179,191,180,157,46,46,156,183,46,46,182,166,173,46,46,158,163,152,164,155,46,46,46,167,225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,184,186,32,179,191,32,32,32,32,32,180,162,32,32,32,32,168,170,32,178,175,32,32,32,32,32,165,161,169,254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218,],_cyr_cp866=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,35,35,35,124,124,124,124,43,43,124,124,43,43,43,43,43,43,45,45,124,45,43,124,124,43,43,45,45,124,45,43,45,45,45,45,43,43,43,43,43,43,43,43,35,35,124,124,35,210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,179,163,180,164,183,167,190,174,32,149,158,32,152,159,148,154,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,205,186,213,241,243,201,32,245,187,212,211,200,190,32,247,198,199,204,181,240,242,185,32,244,203,207,208,202,216,32,246,32,238,160,161,230,164,165,228,163,229,168,169,170,171,172,173,174,175,239,224,225,226,227,166,162,236,235,167,232,237,233,231,234,158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154,],_cyr_iso88595=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,179,32,32,32,32,32,32,32,32,32,32,32,32,32,32,225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,32,163,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,241,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,161,32,32,32,32,32,32,32,32,32,32,32,32,238,208,209,230,212,213,228,211,229,216,217,218,219,220,221,222,223,239,224,225,226,227,214,210,236,235,215,232,237,233,231,234,206,176,177,198,180,181,196,179,197,184,185,186,187,188,189,190,191,207,192,193,194,195,182,178,204,203,183,200,205,201,199,202,],_cyr_mac=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,179,163,209,193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,160,161,162,222,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,221,180,181,182,183,184,185,186,187,188,189,190,191,254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,239,223,240,241,242,243,230,226,252,251,231,248,253,249,247,250,158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154,];var from_table=null,to_table=null,tmp,i=0,retStr='';switch(from.toUpperCase()){case'W':from_table=_cyr_win1251;break;case'A':case'D':from_table=_cyr_cp866;break;case'I':from_table=_cyr_iso88595;break;case'M':from_table=_cyr_mac;break;case'K':break;default:throw'Unknown source charset: '+from;break;}
switch(to.toUpperCase()){case'W':to_table=_cyr_win1251;break;case'A':case'D':to_table=_cyr_cp866;break;case'I':to_table=_cyr_iso88595;break;case'M':to_table=_cyr_mac;break;case'K':break;default:throw'Unknown destination charset: '+to;}
if(!str){return str;}
for(i=0;i<str.length;i++){tmp=(from_table===null)?str.charAt(i):String.fromCharCode(from_table[str.charAt(i).charCodeAt(0)]);retStr+=(to_table===null)?tmp:String.fromCharCode(to_table[tmp.charCodeAt(0)+256]);}
return retStr;}
function convert_uuencode(str){var chr=function(c){return String.fromCharCode(c);};if(!str||str==""){return chr(0);}else if(!this.is_scalar(str)){return false;}
var c=0,u=0,i=0,a=0;var encoded="",tmp1="",tmp2="",bytes={};var chunk=function(){bytes=str.substr(u,45);for(i in bytes){bytes[i]=bytes[i].charCodeAt(0);}
if(bytes.length!=0){return bytes.length;}else{return 0;}};while(chunk()!==0){c=chunk();u+=45;encoded+=chr(c+32);for(i in bytes){tmp1=bytes[i].charCodeAt(0).toString(2);while(tmp1.length<8){tmp1="0"+tmp1;}
tmp2+=tmp1;}
while(tmp2.length%6){tmp2=tmp2+"0";}
for(i=0;i<=(tmp2.length/6)-1;i++){tmp1=tmp2.substr(a,6);if(tmp1=="000000"){encoded+=chr(96);}else{encoded+=chr(parseInt(tmp1,2)+32);}
a+=6;}
a=0;tmp2="";encoded+="\n";}
encoded+=chr(96)+"\n";return encoded;}
function cos(arg){return Math.cos(arg);}
function cosh(arg){return(Math.exp(arg)+Math.exp(-arg))/2;}
function count(mixed_var,mode){var key,cnt=0;if(mixed_var===null){return 0;}else if(mixed_var.constructor!==Array&&mixed_var.constructor!==Object){return 1;}
if(mode==='COUNT_RECURSIVE'){mode=1;}
if(mode!=1){mode=0;}
for(key in mixed_var){cnt++;if(mode==1&&mixed_var[key]&&(mixed_var[key].constructor===Array||mixed_var[key].constructor===Object)){cnt+=this.count(mixed_var[key],1);}}
return cnt;}
function count_chars(str,mode){var result={},resultArr=[],i;str=(''+str).split('').sort().join('').match(/(.)\1*/g);if((mode&1)==0){for(i=0;i!=256;i++){result[i]=0;}}
if(mode===2||mode===4){for(i=0;i!=str.length;i+=1){delete result[str[i].charCodeAt(0)];}
for(i in result){result[i]=(mode===4)?String.fromCharCode(i):0;}}else if(mode===3){for(i=0;i!=str.length;i+=1){result[i]=str[i].slice(0,1);}}else{for(i=0;i!=str.length;i+=1){result[str[i].charCodeAt(0)]=str[i].length;}}
if(mode<3){return result;}
for(i in result){resultArr.push(result[i]);}
return resultArr.join('');}
function crc32(str){str=this.utf8_encode(str);var table="00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D";var crc=0;var x=0;var y=0;crc=crc^(-1);for(var i=0,iTop=str.length;i<iTop;i++){y=(crc^str.charCodeAt(i))&0xFF;x="0x"+table.substr(y*9,8);crc=(crc>>>8)^x;}
return crc^(-1);}
function create_function(args,code){try{return Function.apply(null,args.split(',').concat(code));}
catch(e){return false;}}
function ctype_alnum(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.an.test(text);}
function ctype_alpha(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.al.test(text);}
function ctype_cntrl(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.ct.test(text);}
function ctype_digit(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.dg.test(text);}
function ctype_graph(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.gr.test(text);}
function ctype_lower(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.lw.test(text);}
function ctype_print(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.pr.test(text);}
function ctype_punct(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.pu.test(text);}
function ctype_space(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.sp.test(text);}
function ctype_upper(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.up.test(text);}
function ctype_xdigit(text){if(typeof text!=='string'){return false;}
this.setlocale('LC_ALL',0);return this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.xd.test(text);}
function current(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}
var arrpos=pointers.indexOf(arr);var cursor=pointers[arrpos+1];if(arr instanceof Array){return arr[cursor]||false;}
var ct=0;for(var k in arr){if(ct===cursor){return arr[k];}
ct++;}
return false;}
function date(format,timestamp){var that=this,jsdate=((typeof timestamp==='undefined')?new Date():(timestamp instanceof Date)?new Date(timestamp):new Date(timestamp*1000)),formatChr=/\\?([a-z])/gi,formatChrCb=function(t,s){return f[t]?f[t]():s;},_pad=function(n,c){if((n=n+"").length<c){return new Array((++c)-n.length).join("0")+n;}else{return n;}},txt_words=["Sun","Mon","Tues","Wednes","Thurs","Fri","Satur","January","February","March","April","May","June","July","August","September","October","November","December"],txt_ordin={1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"},f={d:function(){return _pad(f.j(),2);},D:function(){return f.l().slice(0,3);},j:function(){return jsdate.getDate();},l:function(){return txt_words[f.w()]+'day';},N:function(){return f.w()||7;},S:function(){return txt_ordin[f.j()]||'th';},w:function(){return jsdate.getDay();},z:function(){return(jsdate-new Date(f.Y(),0,1))/864e5>>0;},W:function(){var c=new Date(f.Y(),f.n()-1,f.j()-f.N()+3);return 1+Math.round((c-(new Date(c.getFullYear(),0,4)))/864e5/7);},F:function(){return txt_words[6+f.n()];},m:function(){return _pad(f.n(),2);},M:function(){return f.F().slice(0,3);},n:function(){return jsdate.getMonth()+1;},t:function(){return(new Date(f.Y(),f.n()+1,0)).getDate();},L:function(){var y=f.Y();return(!(y&3)&&(y%1e2||!(y%4e2)))?1:0;},o:function(){return f.Y()+(f.n()===12&&f.W()<9?-1:(f.n()===1&&f.W()>9?1:0));},Y:function(){return jsdate.getFullYear();},y:function(){return(jsdate.getFullYear()+"").slice(2);},a:function(){return jsdate.getHours()>11?"pm":"am";},A:function(){return f.a().toUpperCase();},B:function(){return _pad(Math.floor(((jsdate.getUTCHours()*36e2)+(jsdate.getUTCMinutes()*60)+
jsdate.getUTCSeconds()+36e2)/86.4)%1e3,3);},g:function(){return jsdate.getHours()%12||12;},G:function(){return jsdate.getHours();},h:function(){return _pad(f.g(),2);},H:function(){return _pad(f.G(),2);},i:function(){return _pad(jsdate.getMinutes(),2);},s:function(){return _pad(jsdate.getSeconds(),2);},u:function(){return _pad(jsdate.getMilliseconds()*1000,6);},e:function(){return'UTC';},I:function(){return 0+(((new Date(f.Y(),0))-Date.UTC(f.Y(),0))!==((new Date(f.Y(),6))-Date.UTC(f.Y(),6)));},O:function(){var a=jsdate.getTimezoneOffset();return(a>0?"-":"+")+_pad(Math.abs(a/60*100),4);},P:function(){var O=f.O();return(O.substr(0,3)+":"+O.substr(3,2));},T:function(){return'UTC';},Z:function(){return-jsdate.getTimezoneOffset()*60;},c:function(){return'Y-m-d\\Th:i:sP'.replace(formatChr,formatChrCb);},r:function(){return'D, d M Y H:i:s O'.replace(formatChr,formatChrCb);},U:function(){return Math.round(jsdate.getTime()/1000);}};return format.replace(formatChr,formatChrCb);}
function date_default_timezone_get(){var tal={},abbr='',i=0,curr_offset=-(new Date()).getTimezoneOffset()*60;if(this.php_js){if(this.php_js.default_timezone){return this.php_js.default_timezone;}
if(this.php_js.ENV&&this.php_js.ENV.TZ){return this.php_js.ENV.TZ;}
if(this.php_js.ini&&this.php_js.ini['date.timezone']){return this.php_js.ini['date.timezone'].local_value?this.php_js.ini['date.timezone'].local_value:this.php_js.ini['date.timezone'].global_value;}}
tal=this.timezone_abbreviations_list();for(abbr in tal){for(i=0;i<tal[abbr].length;i++){if(tal[abbr][i].offset===curr_offset){return tal[abbr][i].timezone_id;}}}
return'UTC';}
function date_default_timezone_set(tz){var tal={},abbr='',i=0;this.php_js=this.php_js||{};tal=this.timezone_abbreviations_list();for(abbr in tal){for(i=0;i<tal[abbr].length;i++){if(tal[abbr][i].timezone_id===tz){this.php_js.default_timezone=tz;return true;}}}
return false;}
function date_parse(date){this.php_js=this.php_js||{};var warningsOffset=this.php_js.warnings?this.php_js.warnings.length:null;var errorsOffset=this.php_js.errors?this.php_js.errors.length:null;try{var ts=this.strtotime(date);}
finally{if(!ts){return false;}}
var dt=new Date(ts*1000);var retObj={warning_count:warningsOffset!==null?this.php_js.warnings.slice(warningsOffset).length:0,warnings:warningsOffset!==null?this.php_js.warnings.slice(warningsOffset):[],error_count:errorsOffset!==null?this.php_js.errors.slice(errorsOffset).length:0,errors:errorsOffset!==null?this.php_js.errors.slice(errorsOffset):[]};retObj.year=dt.getFullYear();retObj.month=dt.getMonth()+1;retObj.day=dt.getDate();retObj.hour=dt.getHours();retObj.minute=dt.getMinutes();retObj.second=dt.getSeconds();retObj.fraction=parseFloat('0.'+dt.getMilliseconds());retObj.is_localtime=dt.getTimezoneOffset!==0;return retObj;}
function deaggregate(obj,class_name){var p='',idx=-1,pos=-1,i=0;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(!this.php_js||!this.php_js.aggregateRecords||!this.php_js.aggregateKeys||!this.php_js.aggregateClasses){return;}
idx=this.php_js.aggregateKeys.indexOf(obj);if(idx===-1){return;}
if(class_name){if(typeof class_name==='string'){class_name=this.window[class_name];}
pos=this.php_js.aggregateClasses[idx].indexOf(getFuncName(class_name));if(pos!==-1){for(p in this.php_js.aggregateRecords[idx][pos]){delete obj[p];}
this.php_js.aggregateClasses[idx].splice(pos,1);this.php_js.aggregateRecords[idx].splice(pos,1);}}
else{for(i=0;i<this.php_js.aggregateClasses[idx].length;i++){for(p in this.php_js.aggregateRecords[idx][i]){delete obj[p];}}
this.php_js.aggregateClasses.splice(idx,1);this.php_js.aggregateRecords.splice(idx,1);}}
function decbin(number){if(number<0){number=0xFFFFFFFF+number+1;}
return parseInt(number,10).toString(2);}
function dechex(number){if(number<0){number=0xFFFFFFFF+number+1;}
return parseInt(number,10).toString(16);}
function decoct(number){if(number<0){number=0xFFFFFFFF+number+1;}
return parseInt(number,10).toString(8);}
function define(name,value){var defn,replace,script,that=this,d=this.window.document;var toString=function(name,value){return'const '+name+'='+(/^(null|true|false|(\+|\-)?\d+(\.\d+)?)$/.test(value=String(value))?value:'"'+replace(value)+'"');};try{eval('const e=1');replace=function(value){var replace={"\x08":"b","\x0A":"\\n","\x0B":"v","\x0C":"f","\x0D":"\\r",'"':'"',"\\":"\\"};return value.replace(/\x08|[\x0A-\x0D]|"|\\/g,function(value){return"\\"+replace[value];});};defn=function(name,value){if(d.createElementNS){script=d.createElementNS('http://www.w3.org/1999/xhtml','script');}else{script=d.createElement('script');}
script.type='text/javascript';script.appendChild(d.createTextNode(toString(name,value)));d.documentElement.appendChild(script);d.documentElement.removeChild(script);};}catch(e){replace=function(value){var replace={"\x0A":"\\n","\x0D":"\\r"};return value.replace(/"/g,'""').replace(/\n|\r/g,function(value){return replace[value];});};defn=(this.execScript?function(name,value){that.execScript(toString(name,value),'VBScript');}:function(name,value){eval(toString(name,value).substring(6));});}
defn(name,value);}
function defined(constant_name){var tmp=this.window[constant_name];this.window[constant_name]=this.window[constant_name]?'changed'+this.window[constant_name].toString():'changed';var returnval=this.window[constant_name]===tmp;if(!returnval){this.window[constant_name]=tmp;}
return returnval;}
function deg2rad(angle){return(angle/180)*Math.PI;}
function die(status){return this.exit(status);}
function dirname(path){return path.replace(/\\/g,'/').replace(/\/[^\/]*\/?$/,'');}
function doubleval(mixed_var){return this.floatval(mixed_var);}
function each(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}
var arrpos=pointers.indexOf(arr);var cursor=pointers[arrpos+1];var pos=0;if(!(arr instanceof Array)){var ct=0;for(var k in arr){if(ct===cursor){pointers[arrpos+1]+=1;if(each.returnArrayOnly){return[k,arr[k]];}else{return{1:arr[k],value:arr[k],0:k,key:k};}}
ct++;}
return false;}
if(arr.length===0||cursor===arr.length){return false;}
pos=cursor;pointers[arrpos+1]+=1;if(each.returnArrayOnly){return[pos,arr[pos]];}else{return{1:arr[pos],value:arr[pos],0:pos,key:pos};}}
function echo(){var arg='',argc=arguments.length,argv=arguments,i=0;var win=this.window;var d=win.document;var ns_xhtml='http://www.w3.org/1999/xhtml';var ns_xul='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';var holder;var stringToDOM=function(str,parent,ns,container){var extraNSs='';if(ns===ns_xul){extraNSs=' xmlns:html="'+ns_xhtml+'"';}
var stringContainer='<'+container+' xmlns="'+ns+'"'+extraNSs+'>'+str+'</'+container+'>';if(win.DOMImplementationLS&&win.DOMImplementationLS.createLSInput&&win.DOMImplementationLS.createLSParser){var lsInput=DOMImplementationLS.createLSInput();lsInput.stringData=stringContainer;var lsParser=DOMImplementationLS.createLSParser(1,null);return lsParser.parse(lsInput).firstChild;}
else if(win.DOMParser){return new DOMParser().parseFromString(stringContainer,'text/xml').documentElement.firstChild;}
else if(win.ActiveXObject){var d=new ActiveXObject('MSXML2.DOMDocument');d.loadXML(str);return d.documentElement;}
else{if(d.createElementNS&&d.documentElement.namespaceURI&&(d.documentElement.namespaceURI!==null||d.documentElement.nodeName.toLowerCase()!=='html'||(d.contentType&&d.contentType!=='text/html'))){holder=d.createElementNS(ns,container);}
else{holder=d.createElement(container);}
holder.innerHTML=str;while(holder.firstChild){parent.appendChild(holder.firstChild);}
return false;}};var ieFix=function(node){if(node.nodeType===1){var newNode=d.createElement(node.nodeName);var i,len;if(node.attributes&&node.attributes.length>0){for(i=0,len=node.attributes.length;i<len;i++){newNode.setAttribute(node.attributes[i].nodeName,node.getAttribute(node.attributes[i].nodeName));}}
if(node.childNodes&&node.childNodes.length>0){for(i=0,len=node.childNodes.length;i<len;i++){newNode.appendChild(ieFix(node.childNodes[i]));}}
return newNode;}
else{return d.createTextNode(node.nodeValue);}};for(i=0;i<argc;i++){arg=argv[i];if(this.php_js&&this.php_js.ini&&this.php_js.ini['phpjs.echo_embedded_vars']){arg=arg.replace(/(.?)\{\$(.*?)\}/g,function(s,m1,m2){if(m1!=='\\'){return m1+eval(m2);}
else{return s;}});}
if(d.appendChild){if(d.body){if(win.navigator.appName=='Microsoft Internet Explorer'){d.body.appendChild(stringToDOM(ieFix(arg)));}
else{var unappendedLeft=stringToDOM(arg,d.body,ns_xhtml,'div').cloneNode(true);if(unappendedLeft){d.body.appendChild(unappendedLeft);}}}else{d.documentElement.appendChild(stringToDOM(arg,d.documentElement,ns_xul,'description'));}}else if(d.write){d.write(arg);}}}
function empty(mixed_var){var key;if(mixed_var===""||mixed_var===0||mixed_var==="0"||mixed_var===null||mixed_var===false||typeof mixed_var==='undefined'){return true;}
if(typeof mixed_var=='object'){for(key in mixed_var){return false;}
return true;}
return false;}
function end(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}
var arrpos=pointers.indexOf(arr);if(!(arr instanceof Array)){var ct=0;for(var k in arr){ct++;var val=arr[k];}
if(ct===0){return false;}
pointers[arrpos+1]=ct-1;return val;}
if(arr.length===0){return false;}
pointers[arrpos+1]=arr.length-1;return arr[pointers[arrpos+1]];}
function error_get_last(){return this.php_js&&this.php_js.last_error?this.php_js.last_error:null;}
function error_reporting(level){return this.ini_set('error_reporting',level);}
function escapeshellarg(arg){var ret='';ret=arg.replace(/[^\\]'/g,function(m,i,s){return m.slice(0,1)+'\\\'';});return"'"+ret+"'";}
function exit(status){var i;if(typeof status==='string'){alert(status);}
this.window.addEventListener('error',function(e){e.preventDefault();e.stopPropagation();},false);var handlers=['copy','cut','paste','beforeunload','blur','change','click','contextmenu','dblclick','focus','keydown','keypress','keyup','mousedown','mousemove','mouseout','mouseover','mouseup','resize','scroll','DOMNodeInserted','DOMNodeRemoved','DOMNodeRemovedFromDocument','DOMNodeInsertedIntoDocument','DOMAttrModified','DOMCharacterDataModified','DOMElementNameChanged','DOMAttributeNameChanged','DOMActivate','DOMFocusIn','DOMFocusOut','online','offline','textInput','abort','close','dragdrop','load','paint','reset','select','submit','unload'];function stopPropagation(e){e.stopPropagation();}
for(i=0;i<handlers.length;i++){this.window.addEventListener(handlers[i],function(e){stopPropagation(e);},true);}
if(this.window.stop){this.window.stop();}
throw'';}
function exp(arg){return Math.exp(arg);}
function explode(delimiter,string,limit){var emptyArray={0:''};if(arguments.length<2||typeof arguments[0]=='undefined'||typeof arguments[1]=='undefined')
{return null;}
if(delimiter===''||delimiter===false||delimiter===null)
{return false;}
if(typeof delimiter=='function'||typeof delimiter=='object'||typeof string=='function'||typeof string=='object')
{return emptyArray;}
if(delimiter===true){delimiter='1';}
if(!limit){return string.toString().split(delimiter.toString());}else{var splitted=string.toString().split(delimiter.toString());var partA=splitted.splice(0,limit-1);var partB=splitted.join(delimiter.toString());partA.push(partB);return partA;}}
function expm1(x){var ret=0,n=50;var factorial=function factorial(n){if((n===0)||(n===1)){return 1;}
else{var result=(n*factorial(n-1));return result;}};for(var i=1;i<n;i++){ret+=Math.pow(x,i)/factorial(i);}
return ret;}
function extract(arr,type,prefix){if(arr instanceof Array&&(type!=='EXTR_PREFIX_ALL'&&type!=='EXTR_PREFIX_INVALID')){return 0;}
var targetObj=this.window;if(this.php_js&&this.php_js.ini&&this.php_js.ini['phpjs.extractTargetObj']&&this.php_js.ini['phpjs.extractTargetObj'].local_value){targetObj=this.php_js.ini['phpjs.extractTargetObj'].local_value;}
var chng=0;for(var i in arr){var validIdent=/^[_a-zA-Z$][\w|$]*$/;var prefixed=prefix+'_'+i;try{switch(type){case'EXTR_PREFIX_SAME'||2:if(targetObj[i]!==undefined){if(prefixed.match(validIdent)!==null){targetObj[prefixed]=arr[i];++chng;}}
else{targetObj[i]=arr[i];++chng;}
break;case'EXTR_SKIP'||1:if(targetObj[i]===undefined){targetObj[i]=arr[i];++chng;}
break;case'EXTR_PREFIX_ALL'||3:if(prefixed.match(validIdent)!==null){targetObj[prefixed]=arr[i];++chng;}
break;case'EXTR_PREFIX_INVALID'||4:if(i.match(validIdent)!==null){if(prefixed.match(validIdent)!==null){targetObj[prefixed]=arr[i];++chng;}}
else{targetObj[i]=arr[i];++chng;}
break;case'EXTR_IF_EXISTS'||6:if(targetObj[i]!==undefined){targetObj[i]=arr[i];++chng;}
break;case'EXTR_PREFIX_IF_EXISTS'||5:if(targetObj[i]!==undefined&&prefixed.match(validIdent)!==null){targetObj[prefixed]=arr[i];++chng;}
break;case'EXTR_REFS'||256:throw'The EXTR_REFS type will not work in JavaScript';case'EXTR_OVERWRITE'||0:default:targetObj[i]=arr[i];++chng;break;}}
catch(e){}}
return chng;}
function fclose(handle){if(!handle||handle.opener!=='fopen'){return false;}
try{delete this.php_js.resourceDataPointer[handle.id];delete this.php_js.resourceData[handle.id];}
catch(e){return false;}
return true;}
function feof(handle){if(!handle||!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer){return true;}
return!this.php_js.resourceData[handle.id][this.php_js.resourceDataPointer[handle.id]];}
function fgetc(handle){if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer){return false;}
var start=this.php_js.resourceDataPointer[handle.id];if(start===undefined||!this.php_js.resourceData[handle.id][start]){return false;}
var length=1;this.php_js.resourceDataPointer[handle.id]+=length;var chr=this.php_js.resourceData[handle.id].substr(start,length);var nextChr=this.php_js.resourceData[handle.id].substr(start+1,1);var prevChr=start===0?false:this.php_js.resourceData[handle.id].substr(start-1,1);var code=chr.charCodeAt(0);if(0xD800<=code&&code<=0xDBFF){if(!nextChr){throw'High surrogate without following low surrogate (fgetc)';}
var next=nextChr.charCodeAt(0);if(0xDC00>next||next>0xDFFF){throw'High surrogate without following low surrogate (fgetc)';}
this.php_js.resourceDataPointer[handle.id]+=length;return chr+nextChr;}
else if(0xDC00<=code&&code<=0xDFFF){if(prevChr===false){throw'Low surrogate without preceding high surrogate (fgetc)';}
var prev=prevChr.charCodeAt(0);if(0xD800>prev||prev>0xDBFF){throw'Low surrogate without preceding high surrogate (fgetc)';}
return prevChr+chr;}
return chr;}
function fgetcsv(handle,length,delimiter,enclosure,escape){var start=0,fullline='';if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||length!==undefined&&!length){return false;}
start=this.php_js.resourceDataPointer[handle.id];if(start===undefined||!this.php_js.resourceData[handle.id][start]){return false;}
fullline=this.php_js.resourceData[handle.id].slice(start,this.php_js.resourceData[handle.id].indexOf('\n',start)+1);if(fullline===''){fullline=this.php_js.resourceData[handle.id].slice(start);}
length=(length===undefined||fullline.length<length)?fullline.length:Math.floor(length/2)||1;this.php_js.resourceDataPointer[handle.id]+=length;return this.str_getcsv(this.php_js.resourceData[handle.id].substr(start,length),delimiter,enclosure,escape);}
function fgets(handle,length){var start=0,fullline='',endlinePos=-1,content='';if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||length!==undefined&&!length){return false;}
start=this.php_js.resourceDataPointer[handle.id];if(start===undefined||!this.php_js.resourceData[handle.id][start]){return false;}
content=this.php_js.resourceData[handle.id].slice(start);endlinePos=content.search(/\r\n?|\n/)+start+1;fullline=this.php_js.resourceData[handle.id].slice(start,endlinePos+1);if(fullline===''){fullline=this.php_js.resourceData[handle.id].slice(start);}
length=(length===undefined||fullline.length<length)?fullline.length:Math.floor(length/2)||1;this.php_js.resourceDataPointer[handle.id]+=length;return this.php_js.resourceData[handle.id].substr(start,length);}
function fgetss(handle,length,allowable_tags){var start=0,fullline='';if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||length!==undefined&&!length){return false;}
start=this.php_js.resourceDataPointer[handle.id];if(start===undefined||!this.php_js.resourceData[handle.id][start]){return false;}
fullline=this.php_js.resourceData[handle.id].slice(start,this.php_js.resourceData[handle.id].indexOf('\n',start)+1);if(fullline===''){fullline=this.php_js.resourceData[handle.id].slice(start);}
length=(length===undefined||fullline.length<length)?fullline.length:Math.floor(length/2)||1;this.php_js.resourceDataPointer[handle.id]+=length-1;return this.strip_tags(this.php_js.resourceData[handle.id].substr(start,length),allowable_tags);}
function file(url){var req=this.window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
req.open("GET",url,false);req.send(null);return req.responseText.split('\n');}
function file_exists(url){var req=this.window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
req.open('HEAD',url,false);req.send(null);if(req.status==200){return true;}
return false;}
function file_get_contents(url,flags,context,offset,maxLen){var tmp,headers=[],newTmp=[],k=0,i=0,href='',pathPos=-1,flagNames=0,content=null,http_stream=false;var func=function(value){return value.substring(1)!=='';};this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};var ini=this.php_js.ini;context=context||this.php_js.default_streams_context||null;if(!flags){flags=0;}
var OPTS={FILE_USE_INCLUDE_PATH:1,FILE_TEXT:32,FILE_BINARY:64};if(typeof flags==='number'){flagNames=flags;}
else{flags=[].concat(flags);for(i=0;i<flags.length;i++){if(OPTS[flags[i]]){flagNames=flagNames|OPTS[flags[i]];}}}
if(flagNames&OPTS.FILE_BINARY&&(flagNames&OPTS.FILE_TEXT)){throw'You cannot pass both FILE_BINARY and FILE_TEXT to file_get_contents()';}
if((flagNames&OPTS.FILE_USE_INCLUDE_PATH)&&ini.include_path&&ini.include_path.local_value){var slash=ini.include_path.local_value.indexOf('/')!==-1?'/':'\\';url=ini.include_path.local_value+slash+url;}
else if(!/^(https?|file):/.test(url)){href=this.window.location.href;pathPos=url.indexOf('/')===0?href.indexOf('/',8)-1:href.lastIndexOf('/');url=href.slice(0,pathPos+1)+url;}
if(context){var http_options=context.stream_options&&context.stream_options.http;http_stream=!!http_options;}
if(!context||http_stream){var req=this.window.ActiveXObject?new ActiveXObject('Microsoft.XMLHTTP'):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
var method=http_stream?http_options.method:'GET';var async=!!(context&&context.stream_params&&context.stream_params['phpjs.async']);if(ini['phpjs.ajaxBypassCache']&&ini['phpjs.ajaxBypassCache'].local_value){url+=(url.match(/\?/)==null?"?":"&")+(new Date()).getTime();}
req.open(method,url,async);if(async){var notification=context.stream_params.notification;if(typeof notification==='function'){if(0&&req.addEventListener){}
else{req.onreadystatechange=function(aEvt){var objContext={responseText:req.responseText,responseXML:req.responseXML,status:req.status,statusText:req.statusText,readyState:req.readyState,evt:aEvt};var bytes_transferred;switch(req.readyState){case 0:notification.call(objContext,0,0,'',0,0,0);break;case 1:notification.call(objContext,0,0,'',0,0,0);break;case 2:notification.call(objContext,0,0,'',0,0,0);break;case 3:bytes_transferred=req.responseText.length*2;notification.call(objContext,7,0,'',0,bytes_transferred,0);break;case 4:if(req.status>=200&&req.status<400){bytes_transferred=req.responseText.length*2;notification.call(objContext,8,0,'',req.status,bytes_transferred,0);}
else if(req.status===403){notification.call(objContext,10,2,'',req.status,0,0);}
else{notification.call(objContext,9,2,'',req.status,0,0);}
break;default:throw'Unrecognized ready state for file_get_contents()';}}}}}
if(http_stream){var sendHeaders=http_options.header&&http_options.header.split(/\r?\n/);var userAgentSent=false;for(i=0;i<sendHeaders.length;i++){var sendHeader=sendHeaders[i];var breakPos=sendHeader.search(/:\s*/);var sendHeaderName=sendHeader.substring(0,breakPos);req.setRequestHeader(sendHeaderName,sendHeader.substring(breakPos+1));if(sendHeaderName==='User-Agent'){userAgentSent=true;}}
if(!userAgentSent){var user_agent=http_options.user_agent||(ini.user_agent&&ini.user_agent.local_value);if(user_agent){req.setRequestHeader('User-Agent',user_agent);}}
content=http_options.content||null;}
if(flagNames&OPTS.FILE_TEXT){var content_type='text/html';if(http_options&&http_options['phpjs.override']){content_type=http_options['phpjs.override'];}
else{var encoding=(ini['unicode.stream_encoding']&&ini['unicode.stream_encoding'].local_value)||'UTF-8';if(http_options&&http_options.header&&(/^content-type:/im).test(http_options.header)){content_type=http_options.header.match(/^content-type:\s*(.*)$/im)[1];}
if(!(/;\s*charset=/).test(content_type)){content_type+='; charset='+encoding;}}
req.overrideMimeType(content_type);}
else if(flagNames&OPTS.FILE_BINARY){req.overrideMimeType('text/plain; charset=x-user-defined');}
if(http_options&&http_options['phpjs.sendAsBinary']){req.sendAsBinary(content);}
else{req.send(content);}
tmp=req.getAllResponseHeaders();if(tmp){tmp=tmp.split('\n');for(k=0;k<tmp.length;k++){if(func(tmp[k])){newTmp.push(tmp[k]);}}
tmp=newTmp;for(i=0;i<tmp.length;i++){headers[i]=tmp[i];}
this.$http_response_header=headers;}
if(offset||maxLen){if(maxLen){return req.responseText.substr(offset||0,maxLen);}
return req.responseText.substr(offset);}
return req.responseText;}
return false;}
function filemtime(file){var headers={};headers=this.get_headers(file,1);return(headers&&headers['Last-Modified']&&Date.parse(headers['Last-Modified'])/1000)||false;}
function filesize(url){var req=this.window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
req.open('HEAD',url,false);req.send(null);if(!req.getResponseHeader){try{throw new Error('No getResponseHeader!');}catch(e){return false;}}else if(!req.getResponseHeader('Content-Length')){try{throw new Error('No Content-Length!');}catch(e2){return false;}}else{return req.getResponseHeader('Content-Length');}}
function floatval(mixed_var){return(parseFloat(mixed_var)||0);}
function floor(value){return Math.floor(value);}
function fmod(x,y){var tmp,tmp2,p=0,pY=0,l=0.0,l2=0.0;tmp=x.toExponential().match(/^.\.?(.*)e(.+)$/);p=parseInt(tmp[2],10)-(tmp[1]+'').length;tmp=y.toExponential().match(/^.\.?(.*)e(.+)$/);pY=parseInt(tmp[2],10)-(tmp[1]+'').length;if(pY>p){p=pY;}
tmp2=(x%y);if(p<-100||p>20){l=Math.round(Math.log(tmp2)/Math.log(10));l2=Math.pow(10,l);return(tmp2/l2).toFixed(l-p)*l2;}else{return parseFloat(tmp2.toFixed(-p));}}
function fopen(filename,mode,use_include_path,context){var resource={},i=0,that=this;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};var file_get_contents=function(url){var req=that.window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
if(!(/^http/).test(url)){url=that.window.location.href+'/'+url;}
req.open("GET",url,false);req.send(null);return req.responseText;};if(use_include_path===1||use_include_path==='1'||use_include_path===true){}
if(context){}
for(i=0;i<mode.length;i++){if(mode[i]==='r'&&(!mode[i+1]||mode[i+1]!=='+')){continue;}
switch(mode[i]){case'r':case'w':case'a':case'x':throw'Writing is not implemented';case'b':case't':throw'Windows-only modes are not supported';default:throw'Unrecognized file mode passed to '+getFuncName(arguments.caller)+'()';}}
this.php_js=this.php_js||{};this.php_js.resourceData=this.php_js.resourceData||{};this.php_js.resourceDataPointer=this.php_js.resourceDataPointer||{};this.php_js.resourceIdCounter=this.php_js.resourceIdCounter||0;function PHPJS_Resource(type,id,opener){this.type=type;this.id=id;this.opener=opener;}
PHPJS_Resource.prototype.toString=function(){return'Resource id #'+this.id;};PHPJS_Resource.prototype.get_resource_type=function(){return this.type;};PHPJS_Resource.prototype.var_dump=function(){return'resource('+this.id+') of type ('+this.type+')';};this.php_js.resourceIdCounter++;this.php_js.resourceData[this.php_js.resourceIdCounter]=this.file_get_contents(filename);this.php_js.resourceDataPointer[this.php_js.resourceIdCounter]=0;resource=new PHPJS_Resource('stream',this.php_js.resourceIdCounter,'fopen');resource.mode=mode;return resource;}
function forward_static_call(cb,parameters){var func;if(typeof cb=='string'){if(typeof this[cb]=='function'){func=this[cb];}else{func=(new Function(null,'return '+cb))();}}else if(cb instanceof Array){func=eval(cb[0]+"['"+cb[1]+"']");}
if(typeof func!='function'){throw new Error(func+' is not a valid function');}
return func.apply(null,Array.prototype.slice.call(arguments,1));}
function forward_static_call_array(cb,parameters){var func;if(typeof cb=='string'){if(typeof this[cb]=='function'){func=this[cb];}else{func=(new Function(null,'return '+cb))();}}else if(cb instanceof Array){func=eval(cb[0]+"['"+cb[1]+"']");}
if(typeof func!='function'){throw new Error(func+' is not a valid function');}
return func.apply(null,parameters);}
function fpassthru(handle){if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||!handle||!handle.id){return false;}
var chrs=this.php_js.resourceData[handle.id].slice(this.php_js.resourceDataPointer[handle.id]);this.echo(chrs);this.php_js.resourceDataPointer[handle.id]=this.php_js.resourceData[handle.id].length;return chrs;}
function fread(handle,length){if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer){return false;}
length=length<8192?(Math.floor(length/2)||1):4096;var start=this.php_js.resourceDataPointer[handle.id];if(start===undefined){return false;}
if(!this.php_js.resourceData[handle.id][start]){return'';}
this.php_js.resourceDataPointer[handle.id]+=length;return this.php_js.resourceData[handle.id].substr(start,length);}
function fseek(handle,offset,whence){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||!handle||!handle.constructor||getFuncName(handle.constructor)!=='PHPJS_Resource'){return-1;}
switch(whence){case undefined:case'SEEK_SET':this.php_js.resourceDataPointer[handle.id]=offset/2+1;break;case'SEEK_CUR':this.php_js.resourceDataPointer[handle.id]+=offset/2+1;break;case'SEEK_END':this.php_js.resourceDataPointer[handle.id]=this.php_js.resourceData[handle.id].length+offset/2+1;break;default:throw'Unrecognized whence value for fseek()';}
return 0;}
function ftell(handle){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||!handle||!handle.constructor||getFuncName(handle.constructor)!=='PHPJS_Resource'){return false;}
return this.php_js.resourceDataPointer[handle.id]*2-1;}
function func_get_arg(num){if(!arguments.callee.caller){try{throw new Error('Either you are using this in a browser which does not support the "caller" property or you are calling this from a global context');}catch(e){return false;}}
if(num>arguments.callee.caller.arguments.length-1){try{throw new Error('Argument number is greater than the number of arguments actually passed');}catch(e2){return false;}}
return arguments.callee.caller.arguments[num];}
function func_get_args(){if(!arguments.callee.caller){try{throw new Error('Either you are using this in a browser which does not support the "caller" property or you are calling this from a global context');}catch(e){return false;}}
return Array.prototype.slice.call(arguments.callee.caller.arguments);}
function func_num_args(){if(!arguments.callee.caller){try{throw new Error('Either you are using this in a browser which does not support the "caller" property or you are calling this from a global context');}catch(e){return false;}}
return arguments.callee.caller.arguments.length;}
function function_exists(function_name){if(typeof function_name=='string'){return(typeof this.window[function_name]=='function');}else{return(function_name instanceof Function);}}
function get_cfg_var(varname){if(this.php_js&&this.php_js.ini&&this.php_js.ini[varname].global_value!==undefined){if(this.php_js.ini[varname].global_value===null){return'';}
return this.php_js.ini[varname].global_value;}
return'';}
function get_class(obj){if(obj instanceof Object&&!(obj instanceof Array)&&!(obj instanceof Function)&&obj.constructor&&obj!=this.window){var arr=obj.constructor.toString().match(/function\s*(\w+)/);if(arr&&arr.length==2){return arr[1];}}
return false;}
function get_class_methods(name){var constructor,retArr={},method='';if(typeof name==='function'){constructor=name;}else if(typeof name==='string'){constructor=this.window[name];}else if(typeof name==='object'){constructor=name;for(method in constructor.constructor){if(typeof constructor.constructor[method]==='function'){retArr[method]=constructor.constructor[method];}}}
for(method in constructor){if(typeof constructor[method]==='function'){retArr[method]=constructor[method];}}
for(method in constructor.prototype){if(typeof constructor.prototype[method]==='function'){retArr[method]=constructor.prototype[method];}}
return retArr;}
function get_class_vars(name){var constructor,retArr={},prop='';if(typeof name==='function'){constructor=name;}else if(typeof name==='string'){constructor=this.window[name];}
for(prop in constructor){if(typeof constructor[prop]!=='function'&&prop!=='prototype'){retArr[prop]=constructor[prop];}}
if(constructor.prototype){for(prop in constructor.prototype){if(typeof constructor.prototype[prop]!=='function'){retArr[prop]=constructor.prototype[prop];}}}
return retArr;}
function get_declared_classes(){var i='',j='',arr=[],already={};for(i in this.window){try{if(typeof this.window[i]==='function'){if(!already[i]&&this.class_exists(i)){already[i]=1;arr.push(i);}}else if(typeof this.window[i]==='object'){for(j in this.window[i]){if(typeof this.window[j]==='function'&&this.window[j]&&!already[j]&&this.class_exists(j)){already[j]=1;arr.push(j);}}}}catch(e){}}
return arr;}
function get_defined_constants(categorize){var ext='',cnst='',constObj={},flatConstObj={},win,thisExt=false;constObj={'internal':{'E_ERROR':1,'E_RECOVERABLE_ERROR':4096,'E_WARNING':2,'E_PARSE':4,'E_NOTICE':8,'E_STRICT':2048,'E_CORE_ERROR':16,'E_CORE_WARNING':32,'E_COMPILE_ERROR':64,'E_COMPILE_WARNING':128,'E_USER_ERROR':256,'E_USER_WARNING':512,'E_USER_NOTICE':1024,'E_ALL':6143,'ZEND_THREAD_SAFE':true,'PHP_VERSION':'5.2.6','PHP_OS':'WINNT','PHP_SAPI':'apache2handler','DEFAULT_INCLUDE_PATH':'.;C:\\php5\\pear','PEAR_INSTALL_DIR':'C:\\php5\\pear','PEAR_EXTENSION_DIR':'C:\\php5','PHP_EXTENSION_DIR':'C:\\php5','PHP_PREFIX':'C:\\php5','PHP_BINDIR':'C:\\php5','PHP_LIBDIR':'C:\\php5','PHP_DATADIR':'C:\\php5','PHP_SYSCONFDIR':'C:\\php5','PHP_LOCALSTATEDIR':'C:\\php5','PHP_CONFIG_FILE_PATH':'C:\\Windows','PHP_CONFIG_FILE_SCAN_DIR':'','PHP_SHLIB_SUFFIX':'dll','PHP_EOL':'\n','PHP_INT_MAX':2147483647,'PHP_INT_SIZE':4,'PHP_OUTPUT_HANDLER_START':1,'PHP_OUTPUT_HANDLER_CONT':2,'PHP_OUTPUT_HANDLER_END':4,'UPLOAD_ERR_OK':0,'UPLOAD_ERR_INI_SIZE':1,'UPLOAD_ERR_FORM_SIZE':2,'UPLOAD_ERR_PARTIAL':3,'UPLOAD_ERR_NO_FILE':4,'UPLOAD_ERR_NO_TMP_DIR':6,'UPLOAD_ERR_CANT_WRITE':7,'UPLOAD_ERR_EXTENSION':8},'pcre':{'PREG_PATTERN_ORDER':1,'PREG_SET_ORDER':2,'PREG_OFFSET_CAPTURE':256,'PREG_SPLIT_NO_EMPTY':1,'PREG_SPLIT_DELIM_CAPTURE':2,'PREG_SPLIT_OFFSET_CAPTURE':4,'PREG_GREP_INVERT':1,'PREG_NO_ERROR':0,'PREG_INTERNAL_ERROR':1,'PREG_BACKTRACK_LIMIT_ERROR':2,'PREG_RECURSION_LIMIT_ERROR':3,'PREG_BAD_UTF8_ERROR':4,'PCRE_VERSION':'7.6 2008-01-28'},'session':{'DATE_ATOM':'Y-m-d\\TH:i:sP','DATE_COOKIE':'l, d-M-y H:i:s T','DATE_ISO8601':'Y-m-d\\TH:i:sO','DATE_RFC822':'D, d M y H:i:s O','DATE_RFC850':'l, d-M-y H:i:s T','DATE_RFC1036':'D, d M y H:i:s O','DATE_RFC1123':'D, d M Y H:i:s O','DATE_RFC2822':'D, d M Y H:i:s O','DATE_RFC3339':'Y-m-d\\TH:i:sP','DATE_RSS':'D, d M Y H:i:s O','DATE_W3C':'Y-m-d\\TH:i:sP','SUNFUNCS_RET_TIMESTAMP':0,'SUNFUNCS_RET_STRING':1,'SUNFUNCS_RET_DOUBLE':2},'standard':{'CONNECTION_ABORTED':1,'CONNECTION_NORMAL':0,'CONNECTION_TIMEOUT':2,'INI_USER':1,'INI_PERDIR':2,'INI_SYSTEM':4,'INI_ALL':7,'PHP_URL_SCHEME':0,'PHP_URL_HOST':1,'PHP_URL_PORT':2,'PHP_URL_USER':3,'PHP_URL_PASS':4,'PHP_URL_PATH':5,'PHP_URL_QUERY':6,'PHP_URL_FRAGMENT':7,'M_E':2.718281828459,'M_LOG2E':1.442695040889,'M_LOG10E':0.43429448190325,'M_LN2':0.69314718055995,'M_LN10':2.302585092994,'M_PI':3.1415926535898,'M_PI_2':1.5707963267949,'M_PI_4':0.78539816339745,'M_1_PI':0.31830988618379,'M_2_PI':0.63661977236758,'M_SQRTPI':1.7724538509055,'M_2_SQRTPI':1.1283791670955,'M_LNPI':1.1447298858494,'M_EULER':0.57721566490153,'M_SQRT2':1.4142135623731,'M_SQRT1_2':0.70710678118655,'M_SQRT3':1.7320508075689,'INF':Number.POSITIVE_INFINITY,'NAN':0,'INFO_GENERAL':1,'INFO_CREDITS':2,'INFO_CONFIGURATION':4,'INFO_MODULES':8,'INFO_ENVIRONMENT':16,'INFO_VARIABLES':32,'INFO_LICENSE':64,'INFO_ALL':-1,'CREDITS_GROUP':1,'CREDITS_GENERAL':2,'CREDITS_SAPI':4,'CREDITS_MODULES':8,'CREDITS_DOCS':16,'CREDITS_FULLPAGE':32,'CREDITS_QA':64,'CREDITS_ALL':-1,'HTML_SPECIALCHARS':0,'HTML_ENTITIES':1,'ENT_COMPAT':2,'ENT_QUOTES':3,'ENT_NOQUOTES':0,'STR_PAD_LEFT':0,'STR_PAD_RIGHT':1,'STR_PAD_BOTH':2,'PATHINFO_DIRNAME':1,'PATHINFO_BASENAME':2,'PATHINFO_EXTENSION':4,'PATHINFO_FILENAME':8,'CHAR_MAX':127,'LC_CTYPE':2,'LC_NUMERIC':4,'LC_TIME':5,'LC_COLLATE':1,'LC_MONETARY':3,'LC_ALL':0,'SEEK_SET':0,'SEEK_CUR':1,'SEEK_END':2,'LOCK_SH':1,'LOCK_EX':2,'LOCK_UN':3,'LOCK_NB':4,'STREAM_NOTIFY_CONNECT':2,'STREAM_NOTIFY_AUTH_REQUIRED':3,'STREAM_NOTIFY_AUTH_RESULT':10,'STREAM_NOTIFY_MIME_TYPE_IS':4,'STREAM_NOTIFY_FILE_SIZE_IS':5,'STREAM_NOTIFY_REDIRECTED':6,'STREAM_NOTIFY_PROGRESS':7,'STREAM_NOTIFY_FAILURE':9,'STREAM_NOTIFY_COMPLETED':8,'STREAM_NOTIFY_RESOLVE':1,'STREAM_NOTIFY_SEVERITY_INFO':0,'STREAM_NOTIFY_SEVERITY_WARN':1,'STREAM_NOTIFY_SEVERITY_ERR':2,'STREAM_FILTER_READ':1,'STREAM_FILTER_WRITE':2,'STREAM_FILTER_ALL':3,'STREAM_CLIENT_PERSISTENT':1,'STREAM_CLIENT_ASYNC_CONNECT':2,'STREAM_CLIENT_CONNECT':4,'STREAM_CRYPTO_METHOD_SSLv2_CLIENT':0,'STREAM_CRYPTO_METHOD_SSLv3_CLIENT':1,'STREAM_CRYPTO_METHOD_SSLv23_CLIENT':2,'STREAM_CRYPTO_METHOD_TLS_CLIENT':3,'STREAM_CRYPTO_METHOD_SSLv2_SERVER':4,'STREAM_CRYPTO_METHOD_SSLv3_SERVER':5,'STREAM_CRYPTO_METHOD_SSLv23_SERVER':6,'STREAM_CRYPTO_METHOD_TLS_SERVER':7,'STREAM_SHUT_RD':0,'STREAM_SHUT_WR':1,'STREAM_SHUT_RDWR':2,'STREAM_PF_INET':2,'STREAM_PF_INET6':23,'STREAM_PF_UNIX':1,'STREAM_IPPROTO_IP':0,'STREAM_IPPROTO_TCP':6,'STREAM_IPPROTO_UDP':17,'STREAM_IPPROTO_ICMP':1,'STREAM_IPPROTO_RAW':255,'STREAM_SOCK_STREAM':1,'STREAM_SOCK_DGRAM':2,'STREAM_SOCK_RAW':3,'STREAM_SOCK_SEQPACKET':5,'STREAM_SOCK_RDM':4,'STREAM_PEEK':2,'STREAM_OOB':1,'STREAM_SERVER_BIND':4,'STREAM_SERVER_LISTEN':8,'FILE_USE_INCLUDE_PATH':1,'FILE_IGNORE_NEW_LINES':2,'FILE_SKIP_EMPTY_LINES':4,'FILE_APPEND':8,'FILE_NO_DEFAULT_CONTEXT':16,'PSFS_PASS_ON':2,'PSFS_FEED_ME':1,'PSFS_ERR_FATAL':0,'PSFS_FLAG_NORMAL':0,'PSFS_FLAG_FLUSH_INC':1,'PSFS_FLAG_FLUSH_CLOSE':2,'CRYPT_SALT_LENGTH':12,'CRYPT_STD_DES':1,'CRYPT_EXT_DES':0,'CRYPT_MD5':1,'CRYPT_BLOWFISH':0,'DIRECTORY_SEPARATOR':'\\','PATH_SEPARATOR':';','GLOB_BRACE':128,'GLOB_MARK':8,'GLOB_NOSORT':32,'GLOB_NOCHECK':16,'GLOB_NOESCAPE':4096,'GLOB_ERR':4,'GLOB_ONLYDIR':1073741824,'GLOB_AVAILABLE_FLAGS':1073746108,'LOG_EMERG':1,'LOG_ALERT':1,'LOG_CRIT':1,'LOG_ERR':4,'LOG_WARNING':5,'LOG_NOTICE':6,'LOG_INFO':6,'LOG_DEBUG':6,'LOG_KERN':0,'LOG_USER':8,'LOG_MAIL':16,'LOG_DAEMON':24,'LOG_AUTH':32,'LOG_SYSLOG':40,'LOG_LPR':48,'LOG_NEWS':56,'LOG_UUCP':64,'LOG_CRON':72,'LOG_AUTHPRIV':80,'LOG_PID':1,'LOG_CONS':2,'LOG_ODELAY':4,'LOG_NDELAY':8,'LOG_NOWAIT':16,'LOG_PERROR':32,'EXTR_OVERWRITE':0,'EXTR_SKIP':1,'EXTR_PREFIX_SAME':2,'EXTR_PREFIX_ALL':3,'EXTR_PREFIX_INVALID':4,'EXTR_PREFIX_IF_EXISTS':5,'EXTR_IF_EXISTS':6,'EXTR_REFS':256,'SORT_ASC':4,'SORT_DESC':3,'SORT_REGULAR':0,'SORT_NUMERIC':1,'SORT_STRING':2,'SORT_LOCALE_STRING':5,'CASE_LOWER':0,'CASE_UPPER':1,'COUNT_NORMAL':0,'COUNT_RECURSIVE':1,'ASSERT_ACTIVE':1,'ASSERT_CALLBACK':2,'ASSERT_BAIL':3,'ASSERT_WARNING':4,'ASSERT_QUIET_EVAL':5,'STREAM_USE_PATH':1,'STREAM_IGNORE_URL':2,'STREAM_ENFORCE_SAFE_MODE':4,'STREAM_REPORT_ERRORS':8,'STREAM_MUST_SEEK':16,'STREAM_URL_STAT_LINK':1,'STREAM_URL_STAT_QUIET':2,'STREAM_MKDIR_RECURSIVE':1,'STREAM_IS_URL':1,'IMAGETYPE_GIF':1,'IMAGETYPE_JPEG':2,'IMAGETYPE_PNG':3,'IMAGETYPE_SWF':4,'IMAGETYPE_PSD':5,'IMAGETYPE_BMP':6,'IMAGETYPE_TIFF_II':7,'IMAGETYPE_TIFF_MM':8,'IMAGETYPE_JPC':9,'IMAGETYPE_JP2':10,'IMAGETYPE_JPX':11,'IMAGETYPE_JB2':12,'IMAGETYPE_SWC':13,'IMAGETYPE_IFF':14,'IMAGETYPE_WBMP':15,'IMAGETYPE_JPEG2000':9,'IMAGETYPE_XBM':16}};if(this.php_js&&this.php_js.ini&&this.php_js.ini['phpjs.get_defined_constants.setConstants']&&this.php_js.ini['phpjs.get_defined_constants.setConstants'].local_value){if(this.php_js.ini['phpjs.get_defined_constants.setConstants'].local_value==='this'){win=this;}
else if(this.php_js.ini['phpjs.get_defined_constants.setConstants'].local_value==='thisExt'){win=this;thisExt=true;}
else{win=this.window;}
for(ext in constObj){if(thisExt){for(cnst in constObj[ext]){if(!win[ext]){win[ext]={};}
win[ext][cnst]=constObj[ext][cnst];}}
else{for(cnst in constObj[ext]){if(this===this.window){this.define(cnst,constObj[ext][cnst]);}
else{win[cnst]=constObj[ext][cnst];}}}}}
if(typeof categorize!=='undefined'){return constObj;}
for(ext in constObj){for(cnst in constObj[ext]){flatConstObj[cnst]=constObj[ext][cnst];}}
return flatConstObj;}
function get_defined_functions(){var i='',arr=[],already={};for(i in this.window){try{if(typeof this.window[i]==='function'){if(!already[i]){already[i]=1;arr.push(i);}}
else if(typeof this.window[i]==='object'){for(var j in this.window[i]){if(typeof this.window[j]==='function'&&this.window[j]&&!already[j]){already[j]=1;arr.push(j);}}}}
catch(e){}}
return arr;}
function get_defined_vars(){var i='',arr=[],already={};for(i in this.window){try{if(typeof this.window[i]==='function'){if(!already[i]){already[i]=1;arr.push(i);}}
else if(typeof this.window[i]==='object'){for(var j in this.window[i]){if(typeof this.window[j]==='function'&&this.window[j]&&!already[j]){already[j]=1;arr.push(j);}}}}
catch(e){}}
return arr;}
function get_extension_funcs(module_name){this.php_js=this.php_js||{};this.php_js.exts=this.php_js.exts||{array:['array_change_key_case','array_chunk','array_combine','array_count_values','array_diff_assoc','array_diff_key','array_diff_uassoc','array_diff_ukey','array_diff','array_fill_keys','array_fill','array_filter','array_flip','array_intersect_assoc','array_intersect_key','array_intersect_uassoc','array_intersect_ukey','array_intersect','array_key_exists','array_keys','array_map','array_merge_recursive','array_merge','array_multisort','array_pad','array_pop','array_product','array_push','array_rand','array_reduce','array_replace_recursive','array_replace','array_reverse','array_search','array_shift','array_slice','array_splice','array_sum','array_udiff_assoc','array_udiff_uassoc','array_udiff','array_uintersect_assoc','array_uintersect_uassoc','array_uintersect','array_unique','array_unshift','array_values','array_walk_recursive','array_walk','array','arsort','asort','compact','count','current','each','end','extract','in_array','key','krsort','ksort','list','natcasesort','natsort','next','pos','prev','range','reset','rsort','shuffle','sizeof','sort','uasort','uksort','usort'],bc:['bcadd','bccomp','bcdiv','bcmod','bcmul','bcpow','bcpowmod','bcscale','bcsqrt','bcsub'],classkit:['classkit_import','classkit_method_add','classkit_method_copy','classkit_method_redefine','classkit_method_remove','classkit_method_rename'],classobj:['call_user_method_array','call_user_method','class_alias','class_exists','get_called_class','get_class_methods','get_class_vars','get_class','get_declared_classes','get_declared_interfaces','get_object_vars','get_parent_class','interface_exists','is_a','is_subclass_of','method_exists','property_exists'],ctype:['ctype_alnum','ctype_alpha','ctype_cntrl','ctype_digit','ctype_graph','ctype_lower','ctype_print','ctype_punct','ctype_space','ctype_upper','ctype_xdigit'],datetime:['checkdate','date_add','date_create_from_format','date_create','date_date_set','date_default_timezone_get','date_default_timezone_set','date_diff','date_format','date_get_last_errors','date_interval_create_from_date_string','date_interval_format','date_isodate_set','date_modify','date_offset_get','date_parse_from_format','date_parse','date_sub','date_sun_info','date_sunrise','date_sunset','date_time_set','date_timestamp_get','date_timestamp_set','date_timezone_get','date_timezone_set','date','getdate','gettimeofday','gmdate','gmmktime','gmstrftime','idate','localtime','microtime','mktime','strftime','strptime','strtotime','time','timezone_abbreviations_list','timezone_identifiers_list','timezone_location_get','timezone_name_from_abbr','timezone_name_get','timezone_offset_get','timezone_open','timezone_transitions_get','timezone_version_get'],dir:['chdir','chroot','dir','closedir','getcwd','opendir','readdir','rewinddir','scandir'],errorfunc:['debug_backtrace','debug_print_backtrace','error_get_last','error_log','error_reporting','restore_error_handler','restore_exception_handler','set_error_handler','set_exception_handler','trigger_error','user_error'],exec:['escapeshellarg','escapeshellcmd','exec','passthru','proc_close','proc_get_status','proc_nice','proc_open','proc_terminate','shell_exec','system'],filesystem:['basename','chgrp','chmod','chown','clearstatcache','copy','delete','dirname','disk_free_space','disk_total_space','diskfreespace','fclose','feof','fflush','fgetc','fgetcsv','fgets','fgetss','file_exists','file_get_contents','file_put_contents','file','fileatime','filectime','filegroup','fileinode','filemtime','fileowner','fileperms','filesize','filetype','flock','fnmatch','fopen','fpassthru','fputcsv','fputs','fread','fscanf','fseek','fstat','ftell','ftruncate','fwrite','glob','is_dir','is_executable','is_file','is_link','is_readable','is_uploaded_file','is_writable','is_writeable','lchgrp','lchown','link','linkinfo','lstat','mkdir','move_uploaded_file','parse_ini_file','parse_ini_string','pathinfo','pclose','popen','readfile','readlink','realpath','rename','rewind','rmdir','set_file_buffer','stat','symlink','tempnam','tmpfile','touch','umask','unlink'],funchand:['call_user_func_array','call_user_func','create_function','forward_static_call_array','forward_static_call','func_get_arg','func_get_args','func_num_args','function_exists','get_defined_functions','register_shutdown_function','register_tick_function','unregister_tick_function'],i18n:['locale_get_default','locale_set_default'],inclued:['inclued_get_data'],info:['assert_options','assert','dl','extension_loaded','gc_collect_cycles','gc_disable','gc_enable','gc_enabled','get_cfg_var','get_current_user','get_defined_constants','get_extension_funcs','get_include_path','get_included_files','get_loaded_extensions','get_magic_quotes_gpc','get_magic_quotes_runtime','get_required_files','getenv','getlastmod','getmygid','getmyinode','getmypid','getmyuid','getopt','getrusage','ini_alter','ini_get_all','ini_get','ini_restore','ini_set','magic_quotes_runtime','main','memory_get_peak_usage','memory_get_usage','php_ini_loaded_file','php_ini_scanned_files','php_logo_guid','php_sapi_name','php_uname','phpcredits','phpinfo','phpversion','putenv','restore_include_path','set_include_path','set_magic_quotes_runtime','set_time_limit','sys_get_temp_dir','version_compare','zend_logo_guid','zend_thread_id','zend_version'],json:['json_decode','json_encode','json_last_error'],language:['at','clone','declare','foreach','goto','include','include_once','php_user_filter','require','require_once','stdClass','ErrorException','Exception','HEREDOC','$_SESSION','__CLASS__','__DIR__','__FILE__','__FUNCTION__','__LINE__','__METHOD__',],math:['abs','acos','acosh','asin','asinh','atan2','atan','atanh','base_convert','bindec','ceil','cos','cosh','decbin','dechex','decoct','deg2rad','exp','expm1','floor','fmod','getrandmax','hexdec','hypot','is_finite','is_infinite','is_nan','lcg_value','log10','log1p','log','max','min','mt_getrandmax','mt_rand','mt_srand','octdec','pi','pow','rad2deg','rand','round','sin','sinh','sqrt','srand','tan','tanh'],misc:['connection_aborted','connection_status','connection_timeout','constant','define','defined','die','eval','exit','get_browser','__halt_compiler','highlight_file','highlight_string','ignore_user_abort','pack','php_check_syntax','php_strip_whitespace','show_source','sleep','sys_getloadavg','time_nanosleep','time_sleep_until','uniqid','unpack','usleep'],'net-gopher':['gopher_parsedir'],network:['checkdnsrr','closelog','define_syslog_variables','dns_check_record','dns_get_mx','dns_get_record','fsockopen','gethostbyaddr','gethostbyname','gethostbynamel','gethostname','getmxrr','getprotobyname','getprotobynumber','getservbyname','getservbyport','header_remove','header','headers_list','headers_sent','inet_ntop','inet_pton','ip2long','long2ip','openlog','pfsockopen','setcookie','setrawcookie','socket_get_status','socket_set_blocking','socket_set_timeout','syslog'],objaggregation:['aggregate_info','aggregate_methods_by_list','aggregate_methods_by_regexp','aggregate_methods','aggregate_properties_by_list','aggregate_properties_by_regexp','aggregate_properties','aggregate','aggregation_info','deaggregate'],outcontrol:['flush','ob_clean','ob_end_clean','ob_end_flush','ob_flush','ob_get_clean','ob_get_contents','ob_get_flush','ob_get_length','ob_get_level','ob_get_status','ob_gzhandler','ob_implicit_flush','ob_list_handlers','ob_start','output_add_rewrite_var','output_reset_rewrite_vars'],overload:['overload'],pcre:['preg_filter','preg_grep','preg_last_error','preg_match_all','preg_match','preg_quote','preg_replace_callback','preg_replace','preg_split'],runkit:['Runkit_Sandbox','Runkit_Sandbox_Parent','runkit_class_adopt','runkit_class_emancipate','runkit_constant_add','runkit_constant_redefine','runkit_constant_remove','runkit_function_add','runkit_function_copy','runkit_function_redefine','runkit_function_remove','runkit_function_rename','runkit_import','runkit_lint_file','runkit_lint','runkit_method_add','runkit_method_copy','runkit_method_redefine','runkit_method_remove','runkit_method_rename','runkit_return_value_used','runkit_sandbox_output_handler','runkit_superglobals'],session:['session_cache_expire','session_cache_limiter','session_commit','session_decode','session_destroy','session_encode','session_get_cookie_params','session_id','session_is_registered','session_module_name','session_name','session_regenerate_id','session_register','session_save_path','session_set_cookie_params','session_set_save_handler','session_start','session_unregister','session_unset','session_write_close'],stream:['set_socket_blocking','stream_bucket_append','stream_bucket_make_writeable','stream_bucket_new','stream_bucket_prepend','stream_context_create','stream_context_get_default','stream_context_get_options','stream_context_get_params','stream_context_set_default','stream_context_set_option','stream_context_set_params','stream_copy_to_stream','stream_encoding','stream_filter_append','stream_filter_prepend','stream_filter_register','stream_filter_remove','stream_get_contents','stream_get_filters','stream_get_line','stream_get_meta_data','stream_get_transports','stream_get_wrappers','stream_is_local','stream_notification_callback','stream_register_wrapper','stream_resolve_include_path','stream_select','stream_set_blocking','stream_set_timeout','stream_set_write_buffer','stream_socket_accept','stream_socket_client','stream_socket_enable_crypto','stream_socket_get_name','stream_socket_pair','stream_socket_recvfrom','stream_socket_sendto','stream_socket_server','stream_socket_shutdown','stream_supports_lock','stream_wrapper_register','stream_wrapper_restore','stream_wrapper_unregister'],strings:['addcslashes','addslashes','bin2hex','chop','chr','chunk_split','convert_cyr_string','convert_uudecode','convert_uuencode','count_chars','crc32','crypt','echo','explode','fprintf','get_html_translation_table','hebrev','hebrevc','html_entity_decode','htmlentities','htmlspecialchars_decode','htmlspecialchars','implode','join','lcfirst','levenshtein','localeconv','ltrim','md5_file','md5','metaphone','money_format','nl_langinfo','nl2br','number_format','ord','parse_str','print','printf','quoted_printable_decode','quoted_printable_encode','quotemeta','rtrim','setlocale','sha1_file','sha1','similar_text','soundex','sprintf','sscanf','str_getcsv','str_ireplace','str_pad','str_repeat','str_replace','str_rot13','str_shuffle','str_split','str_word_count','strcasecmp','strchr','strcmp','strcoll','strcspn','strip_tags','stripcslashes','stripos','stripslashes','stristr','strlen','strnatcasecmp','strnatcmp','strncasecmp','strncmp','strpbrk','strpos','strrchr','strrev','strripos','strrpos','strspn','strstr','strtok','strtolower','strtoupper','strtr','substr_compare','substr_count','substr_replace','substr','trim','ucfirst','ucwords','vfprintf','vprintf','vsprintf','wordwrap'],tokenizer:['token_get_all','token_name'],url:['base64_decode','base64_encode','get_headers','get_meta_tags','http_build_query','parse_url','rawurldecode','rawurlencode','urldecode','urlencode'],'var':['debug_zval_dump','doubleval','empty','floatval','get_defined_vars','get_resource_type','gettype','import_request_variables','intval','is_array','is_binary','is_bool','is_buffer','is_callable','is_double','is_float','is_int','is_integer','is_long','is_null','is_numeric','is_object','is_real','is_resource','is_scalar','is_string','is_unicode','isset','print_r','serialize','settype','strval','unserialize','unset','var_dump','var_export'],xml:['utf8_decode','utf8_encode','xml_error_string','xml_get_current_byte_index','xml_get_current_column_number','xml_get_current_line_number','xml_get_error_code','xml_parse_into_struct','xml_parse','xml_parser_create_ns','xml_parser_create','xml_parser_free','xml_parser_get_option','xml_parser_set_option','xml_set_character_data_handler','xml_set_default_handler','xml_set_element_handler','xml_set_end_namespace_decl_handler','xml_set_external_entity_ref_handler','xml_set_notation_decl_handler','xml_set_object','xml_set_processing_instruction_handler','xml_set_start_namespace_decl_handler','xml_set_unparsed_entity_decl_handler'],xmlreader:['XMLReader'],xmlwriter:['xmlwriter_end_attribute','xmlwriter_end_cdata','xmlwriter_end_comment','xmlwriter_end_document','xmlwriter_end_dtd_attlist','xmlwriter_end_dtd_element','xmlwriter_end_dtd_entity','xmlwriter_end_dtd','xmlwriter_end_element','xmlwriter_end_pi','xmlwriter_flush','xmlwriter_full_end_element','xmlwriter_open_memory','xmlwriter_open_uri','xmlwriter_output_memory','xmlwriter_set_indent_string','xmlwriter_set_indent','xmlwriter_start_attribute_ns','xmlwriter_start_attribute','xmlwriter_start_cdata','xmlwriter_start_comment','xmlwriter_start_document','xmlwriter_start_dtd_attlist','xmlwriter_start_dtd_element','xmlwriter_start_dtd_entity','xmlwriter_start_dtd','xmlwriter_start_element_ns','xmlwriter_start_element','xmlwriter_start_pi','xmlwriter_text','xmlwriter_write_attribute_ns','xmlwriter_write_attribute','xmlwriter_write_cdata','xmlwriter_write_comment','xmlwriter_write_dtd_attlist','xmlwriter_write_dtd_element','xmlwriter_write_dtd_entity','xmlwriter_write_dtd','xmlwriter_write_element_ns','xmlwriter_write_element','xmlwriter_write_pi','xmlwriter_write_raw']};return this.php_js.exts[module_name]||false;}
function get_headers(url,format){var req=this.window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
var tmp,headers,pair,i,j=0;req.open('HEAD',url,false);req.send(null);if(req.readyState<3){return false;}
tmp=req.getAllResponseHeaders();tmp=tmp.split('\n');tmp=this.array_filter(tmp,function(value){return value.substring(1)!=='';});headers=format?{}:[];for(i in tmp){if(format){pair=tmp[i].split(':');headers[pair.splice(0,1)]=pair.join(':').substring(1);}else{headers[j++]=tmp[i];}}
return headers;}
function get_html_translation_table(table,quote_style){var entities={},hash_map={},decimal=0,symbol='';var constMappingTable={},constMappingQuoteStyle={};var useTable={},useQuoteStyle={};constMappingTable[0]='HTML_SPECIALCHARS';constMappingTable[1]='HTML_ENTITIES';constMappingQuoteStyle[0]='ENT_NOQUOTES';constMappingQuoteStyle[2]='ENT_COMPAT';constMappingQuoteStyle[3]='ENT_QUOTES';useTable=!isNaN(table)?constMappingTable[table]:table?table.toUpperCase():'HTML_SPECIALCHARS';useQuoteStyle=!isNaN(quote_style)?constMappingQuoteStyle[quote_style]:quote_style?quote_style.toUpperCase():'ENT_COMPAT';if(useTable!=='HTML_SPECIALCHARS'&&useTable!=='HTML_ENTITIES'){throw new Error("Table: "+useTable+' not supported');}
entities['38']='&amp;';if(useTable==='HTML_ENTITIES'){entities['160']='&nbsp;';entities['161']='&iexcl;';entities['162']='&cent;';entities['163']='&pound;';entities['164']='&curren;';entities['165']='&yen;';entities['166']='&brvbar;';entities['167']='&sect;';entities['168']='&uml;';entities['169']='&copy;';entities['170']='&ordf;';entities['171']='&laquo;';entities['172']='&not;';entities['173']='&shy;';entities['174']='&reg;';entities['175']='&macr;';entities['176']='&deg;';entities['177']='&plusmn;';entities['178']='&sup2;';entities['179']='&sup3;';entities['180']='&acute;';entities['181']='&micro;';entities['182']='&para;';entities['183']='&middot;';entities['184']='&cedil;';entities['185']='&sup1;';entities['186']='&ordm;';entities['187']='&raquo;';entities['188']='&frac14;';entities['189']='&frac12;';entities['190']='&frac34;';entities['191']='&iquest;';entities['192']='&Agrave;';entities['193']='&Aacute;';entities['194']='&Acirc;';entities['195']='&Atilde;';entities['196']='&Auml;';entities['197']='&Aring;';entities['198']='&AElig;';entities['199']='&Ccedil;';entities['200']='&Egrave;';entities['201']='&Eacute;';entities['202']='&Ecirc;';entities['203']='&Euml;';entities['204']='&Igrave;';entities['205']='&Iacute;';entities['206']='&Icirc;';entities['207']='&Iuml;';entities['208']='&ETH;';entities['209']='&Ntilde;';entities['210']='&Ograve;';entities['211']='&Oacute;';entities['212']='&Ocirc;';entities['213']='&Otilde;';entities['214']='&Ouml;';entities['215']='&times;';entities['216']='&Oslash;';entities['217']='&Ugrave;';entities['218']='&Uacute;';entities['219']='&Ucirc;';entities['220']='&Uuml;';entities['221']='&Yacute;';entities['222']='&THORN;';entities['223']='&szlig;';entities['224']='&agrave;';entities['225']='&aacute;';entities['226']='&acirc;';entities['227']='&atilde;';entities['228']='&auml;';entities['229']='&aring;';entities['230']='&aelig;';entities['231']='&ccedil;';entities['232']='&egrave;';entities['233']='&eacute;';entities['234']='&ecirc;';entities['235']='&euml;';entities['236']='&igrave;';entities['237']='&iacute;';entities['238']='&icirc;';entities['239']='&iuml;';entities['240']='&eth;';entities['241']='&ntilde;';entities['242']='&ograve;';entities['243']='&oacute;';entities['244']='&ocirc;';entities['245']='&otilde;';entities['246']='&ouml;';entities['247']='&divide;';entities['248']='&oslash;';entities['249']='&ugrave;';entities['250']='&uacute;';entities['251']='&ucirc;';entities['252']='&uuml;';entities['253']='&yacute;';entities['254']='&thorn;';entities['255']='&yuml;';}
if(useQuoteStyle!=='ENT_NOQUOTES'){entities['34']='&quot;';}
if(useQuoteStyle==='ENT_QUOTES'){entities['39']='&#39;';}
entities['60']='&lt;';entities['62']='&gt;';for(decimal in entities){symbol=String.fromCharCode(decimal);hash_map[symbol]=entities[decimal];}
return hash_map;}
function get_include_path(){if(this.php_js&&this.php_js.ini&&this.php_js.ini.include_path&&this.php_js.ini.include_path.local_value){return this.php_js.ini.include_path.local_value;}
return'';}
function get_included_files(){var cur_file={};cur_file[this.window.location.href]=1;if(!this.php_js){this.php_js={};}
if(!this.php_js.includes){this.php_js.includes=cur_file;}
var includes=[];var i=0;for(var key in this.php_js.includes){includes[i]=key;i++;}
return includes;}
function get_meta_tags(file){var fulltxt='';if(false){fulltxt='<meta name="author" content="name">'+'<meta name="keywords" content="php documentation">'+'<meta name="DESCRIPTION" content="a php manual">'+'<meta name="geo.position" content="49.33;-86.59">'+'</head>';}else{fulltxt=this.file_get_contents(file).match(/^[\s\S]*<\/head>/i);}
var patt=/<meta[^>]*?>/gim;var patt1=/<meta\s+.*?name\s*=\s*(['"]?)(.*?)\1\s+.*?content\s*=\s*(['"]?)(.*?)\3/gim;var patt2=/<meta\s+.*?content\s*=\s*(['"?])(.*?)\1\s+.*?name\s*=\s*(['"]?)(.*?)\3/gim;var txt,match,name,arr={};while((txt=patt.exec(fulltxt))!==null){while((match=patt1.exec(txt))!==null){name=match[2].replace(/\W/g,'_').toLowerCase();arr[name]=match[4];}
while((match=patt2.exec(txt))!==null){name=match[4].replace(/\W/g,'_').toLowerCase();arr[name]=match[2];}}
return arr;}
function get_object_vars(obj){var retArr={},prop='';for(prop in obj){if(typeof obj[prop]!=='function'&&prop!=='prototype'){retArr[prop]=obj[prop];}}
for(prop in obj.prototype){if(typeof obj.prototype[prop]!=='function'){retArr[prop]=obj.prototype[prop];}}
return retArr;}
function get_required_files(){return this.get_included_files();}
function get_resource_type(handle){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(!handle||typeof handle!=='object'||!handle.constructor||getFuncName(handle.constructor)!=='PHPJS_Resource'){return false;}
return handle.get_resource_type();}
function getdate(timestamp){var _w=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];var _m=['January','February','March','April','May','June','July','August','September','October','November','December'];var d=((typeof(timestamp)=='undefined')?new Date():(typeof(timestamp)=='object')?new Date(timestamp):new Date(timestamp*1000));var w=d.getDay();var m=d.getMonth();var y=d.getFullYear();var r={};r.seconds=d.getSeconds();r.minutes=d.getMinutes();r.hours=d.getHours();r.mday=d.getDate();r.wday=w;r.mon=m+1;r.year=y;r.yday=Math.floor((d-(new Date(y,0,1)))/86400000);r.weekday=_w[w];r.month=_m[m];r['0']=parseInt(d.getTime()/1000,10);return r;}
function getenv(varname){if(!this.php_js||!this.php_js.ENV||!this.php_js.ENV[varname]){return false;}
return this.php_js.ENV[varname];}
function getlastmod(){return new Date(this.window.document.lastModified).getTime()/1000;}
function getrandmax()
{return 2147483647;}
function gettimeofday(return_float){var t=new Date(),y=0;if(return_float){return t.getTime()/1000;}
y=t.getFullYear();return{sec:t.getUTCSeconds(),usec:t.getUTCMilliseconds()*1000,minuteswest:t.getTimezoneOffset(),dsttime:0+(((new Date(y,0))-Date.UTC(y,0))!==((new Date(y,6))-Date.UTC(y,6)))};}
function gettype(mixed_var){var s=typeof mixed_var,name;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(s==='object'){if(mixed_var!==null){if(typeof mixed_var.length==='number'&&!(mixed_var.propertyIsEnumerable('length'))&&typeof mixed_var.splice==='function'){s='array';}
else if(mixed_var.constructor&&getFuncName(mixed_var.constructor)){name=getFuncName(mixed_var.constructor);if(name==='Date'){s='date';}
else if(name==='RegExp'){s='regexp';}
else if(name==='PHPJS_Resource'){s='resource';}}}else{s='null';}}
else if(s==='number'){s=this.is_float(mixed_var)?'double':'integer';}
return s;}
function gmdate(format,timestamp){var dt=((typeof(timestamp)=='undefined')?new Date():(typeof(timestamp)=='object')?new Date(timestamp):new Date(timestamp*1000));timestamp=Date.parse(dt.toUTCString().slice(0,-4))/1000;return this.date(format,timestamp);}
function gmmktime(){var no=0,i=0,ma=0,mb=0,d=new Date(),dn=new Date(),argv=arguments,argc=argv.length;var dateManip={0:function(tt){return d.setUTCHours(tt);},1:function(tt){return d.setUTCMinutes(tt);},2:function(tt){var set=d.setUTCSeconds(tt);mb=d.getUTCDate()-dn.getUTCDate();return set;},3:function(tt){var set=d.setUTCMonth(parseInt(tt,10)-1);ma=d.getUTCFullYear()-dn.getUTCFullYear();return set;},4:function(tt){return d.setUTCDate(tt+mb);},5:function(tt){if(tt>=0&&tt<=69){tt+=2000;}
else if(tt>=70&&tt<=100){tt+=1900;}
return d.setUTCFullYear(tt+ma);}};for(i=0;i<argc;i++){no=parseInt(argv[i]*1,10);if(isNaN(no)){return false;}else{if(!dateManip[i](no)){return false;}}}
for(i=argc;i<6;i++){switch(i){case 0:no=dn.getUTCHours();break;case 1:no=dn.getUTCMinutes();break;case 2:no=dn.getUTCSeconds();break;case 3:no=dn.getUTCMonth()+1;break;case 4:no=dn.getUTCDate();break;case 5:no=dn.getUTCFullYear();break;}
dateManip[i](no);}
return Math.floor(d.getTime()/1000);}
function gmstrftime(format,timestamp){var dt=((typeof(timestamp)=='undefined')?new Date():(typeof(timestamp)=='object')?new Date(timestamp):new Date(timestamp*1000));timestamp=Date.parse(dt.toUTCString().slice(0,-4))/1000;return this.strftime(format,timestamp);}
function gopher_parsedir(dirent){var entryPattern=/^(.)(.*?)\t(.*?)\t(.*?)\t(.*?)\u000d\u000a$/;var entry=dirent.match(entryPattern);if(entry===null){throw'Could not parse the directory entry';}
var type=entry[1];switch(type){case'i':type=255;break;case'1':type=1;break;case'0':type=0;break;case'4':type=4;break;case'5':type=5;break;case'6':type=6;break;case'9':type=9;break;case'h':type=254;break;default:return{type:-1,data:dirent};}
return{type:type,title:entry[2],path:entry[3],host:entry[4],port:entry[5]};}
function hexdec(hex_string){hex_string=(hex_string+'').replace(/[^a-f0-9]/gi,'');return parseInt(hex_string,16);}
function html_entity_decode(string,quote_style){var hash_map={},symbol='',tmp_str='',entity='';tmp_str=string.toString();if(false===(hash_map=this.get_html_translation_table('HTML_ENTITIES',quote_style))){return false;}
delete(hash_map['&']);hash_map['&']='&amp;';for(symbol in hash_map){entity=hash_map[symbol];tmp_str=tmp_str.split(entity).join(symbol);}
tmp_str=tmp_str.split('&#039;').join("'");return tmp_str;}
function htmlentities(string,quote_style){var hash_map={},symbol='',tmp_str='',entity='';tmp_str=string.toString();if(false===(hash_map=this.get_html_translation_table('HTML_ENTITIES',quote_style))){return false;}
hash_map["'"]='&#039;';for(symbol in hash_map){entity=hash_map[symbol];tmp_str=tmp_str.split(symbol).join(entity);}
return tmp_str;}
function htmlspecialchars(string,quote_style,charset,double_encode){var optTemp=0,i=0,noquotes=false;if(typeof quote_style==='undefined'||quote_style===null){quote_style=2;}
string=string.toString();if(double_encode!==false){string=string.replace(/&/g,'&amp;');}
string=string.replace(/</g,'&lt;').replace(/>/g,'&gt;');var OPTS={'ENT_NOQUOTES':0,'ENT_HTML_QUOTE_SINGLE':1,'ENT_HTML_QUOTE_DOUBLE':2,'ENT_COMPAT':2,'ENT_QUOTES':3,'ENT_IGNORE':4};if(quote_style===0){noquotes=true;}
if(typeof quote_style!=='number'){quote_style=[].concat(quote_style);for(i=0;i<quote_style.length;i++){if(OPTS[quote_style[i]]===0){noquotes=true;}
else if(OPTS[quote_style[i]]){optTemp=optTemp|OPTS[quote_style[i]];}}
quote_style=optTemp;}
if(quote_style&OPTS.ENT_HTML_QUOTE_SINGLE){string=string.replace(/'/g,'&#039;');}
if(!noquotes){string=string.replace(/"/g,'&quot;');}
return string;}
function htmlspecialchars_decode(string,quote_style){var optTemp=0,i=0,noquotes=false;if(typeof quote_style==='undefined'){quote_style=2;}
string=string.toString().replace(/&lt;/g,'<').replace(/&gt;/g,'>');var OPTS={'ENT_NOQUOTES':0,'ENT_HTML_QUOTE_SINGLE':1,'ENT_HTML_QUOTE_DOUBLE':2,'ENT_COMPAT':2,'ENT_QUOTES':3,'ENT_IGNORE':4};if(quote_style===0){noquotes=true;}
if(typeof quote_style!=='number'){quote_style=[].concat(quote_style);for(i=0;i<quote_style.length;i++){if(OPTS[quote_style[i]]===0){noquotes=true;}
else if(OPTS[quote_style[i]]){optTemp=optTemp|OPTS[quote_style[i]];}}
quote_style=optTemp;}
if(quote_style&OPTS.ENT_HTML_QUOTE_SINGLE){string=string.replace(/&#0*39;/g,"'");}
if(!noquotes){string=string.replace(/&quot;/g,'"');}
string=string.replace(/&amp;/g,'&');return string;}
function http_build_query(formdata,numeric_prefix,arg_separator){var value,key,tmp=[];var _http_build_query_helper=function(key,val,arg_separator){var k,tmp=[];if(val===true){val="1";}else if(val===false){val="0";}
if(val!==null&&typeof(val)==="object"){for(k in val){if(val[k]!==null){tmp.push(_http_build_query_helper(key+"["+k+"]",val[k],arg_separator));}}
return tmp.join(arg_separator);}else if(typeof(val)!=="function"){return this.urlencode(key)+"="+this.urlencode(val);}else{throw new Error('There was an error processing for http_build_query().');}};if(!arg_separator){arg_separator="&";}
for(key in formdata){value=formdata[key];if(numeric_prefix&&!isNaN(key)){key=String(numeric_prefix)+key;}
tmp.push(_http_build_query_helper(key,value,arg_separator));}
return tmp.join(arg_separator);}
function hypot(x,y){return Math.sqrt(x*x+y*y)||0;}
function i18n_loc_get_default(){this.php_js=this.php_js||{};return this.php_js.i18nLocale||(i18n_loc_set_default('en_US_POSIX'),'en_US_POSIX');}
function i18n_loc_set_default(name){this.php_js=this.php_js||{};this.php_js.i18nLocales={en_US_POSIX:{sorting:function(str1,str2){return(str1==str2)?0:((str1>str2)?1:-1);}}};this.php_js.i18nLocale=name;return true;}
function idate(format,timestamp){if(format===undefined){throw'idate() expects at least 1 parameter, 0 given';}
if(!format.length||format.length>1){throw'idate format is one char';}
var date=((typeof timestamp==='undefined')?new Date():(timestamp instanceof Date)?new Date(timestamp):new Date(timestamp*1000)),a;switch(format){case'B':return Math.floor(((date.getUTCHours()*36e2)+(date.getUTCMinutes()*60)+
date.getUTCSeconds()+36e2)/86.4)%1e3;case'd':return date.getDate();case'h':return date.getHours()%12||12;case'H':return date.getHours();case'i':return date.getMinutes();case'I':a=date.getFullYear();return 0+(((new Date(a,0))-Date.UTC(a,0))!==((new Date(a,6))-Date.UTC(a,6)));case'L':a=date.getFullYear();return(!(a&3)&&(a%1e2||!(a%4e2)))?1:0;case'm':return date.getMonth()+1;case's':return date.getSeconds();case't':return(new Date(date.getFullYear(),date.getMonth()+1,0)).getDate();case'U':return Math.round(date.getTime()/1000);case'w':return date.getDay();case'W':a=new Date(date.getFullYear(),date.getMonth(),date.getDate()-(date.getDay()||7)+3);return 1+Math.round((a-(new Date(a.getFullYear(),0,4)))/864e5/7);case'y':return parseInt((date.getFullYear()+'').slice(2),10);case'Y':return date.getFullYear();case'z':return Math.floor((date-new Date(date.getFullYear(),0,1))/864e5);case'Z':return-date.getTimezoneOffset()*60;default:throw'Unrecognized date format token';}}
function implode(glue,pieces){var i='',retVal='',tGlue='';if(arguments.length===1){pieces=glue;glue='';}
if(typeof(pieces)==='object'){if(pieces instanceof Array){return pieces.join(glue);}
else{for(i in pieces){retVal+=tGlue+pieces[i];tGlue=glue;}
return retVal;}}
else{return pieces;}}
function import_request_variables(types,prefix){var i=0,current='',url='',vars='',arrayBracketPos=-1,arrName='',win=this.window,requestObj=this.window,getObj=false,cookieObj=false;prefix=prefix||'';var that=this;var _ini_get=function(ini){if(that.php_js&&that.php_js.ini&&that.php_js.ini[ini]&&that.php_js.ini[ini].local_value){return that.php_js.ini[ini].local_value;}
return false;};requestObj=_ini_get('phpjs.requestVarsObj')||requestObj;if(/g/i.test(types)){getObj=_ini_get('phpjs.getVarsObj')||getObj;for(i=0,url=win.location.href,vars=url.substring(url.lastIndexOf("?")+1,url.length).split("&");i<vars.length;i++){current=vars[i].split("=");current[1]=decodeURIComponent(current[1]);arrayBracketPos=current[0].indexOf('[');if(arrayBracketPos!==-1){arrName=current[0].substring(0,arrayBracketPos);arrName=decodeURIComponent(arrName);if(!requestObj[prefix+arrName]){requestObj[prefix+arrName]=[];}
requestObj[prefix+arrName].push(current[1]||null);if(getObj){if(!getObj[prefix+arrName]){getObj[prefix+arrName]=[];}
getObj[prefix+arrName].push(current[1]||null);}}
else{current[0]=decodeURIComponent(current[0]);requestObj[prefix+current[0]]=current[1]||null;if(getObj){getObj[prefix+current[0]]=current[1]||null;}}}}
if(/c/i.test(types)){cookieObj=_ini_get('phpjs.cookieVarsObj')||cookieObj;for(i=0,vars=win.document.cookie.split("&");i<vars.length;i++){current=vars[i].split("=");requestObj[prefix+current[0]]=current[1].split(";")[0]||null;if(cookieObj){cookieObj[prefix+current[0]]=current[1].split(";")[0]||null;}}}}
function in_array(needle,haystack,argStrict){var key='',strict=!!argStrict;if(strict){for(key in haystack){if(haystack[key]===needle){return true;}}}else{for(key in haystack){if(haystack[key]==needle){return true;}}}
return false;}
function include(filename){var d=this.window.document;var js=d.createElementNS?d.createElementNS('http://www.w3.org/1999/xhtml','script'):d.createElement('script');js.setAttribute('type','text/javascript');js.setAttribute('src',filename);js.setAttribute('defer','defer');d.getElementsByTagNameNS?(d.getElementsByTagNameNS('http://www.w3.org/1999/xhtml','head')[0]?d.getElementsByTagNameNS('http://www.w3.org/1999/xhtml','head')[0].appendChild(js):d.documentElement.insertBefore(js,d.documentElement.firstChild)):d.getElementsByTagName('head')[0].appendChild(js);var cur_file={};cur_file[this.window.location.href]=1;this.php_js=this.php_js||{};if(!this.php_js.includes){this.php_js.includes=cur_file;}
if(!this.php_js.includes[filename]){this.php_js.includes[filename]=1;}else{this.php_js.includes[filename]++;}
return this.php_js.includes[filename];}
function include_once(filename){var cur_file={};cur_file[this.window.location.href]=1;try{php_js_shared;}
catch(e){php_js_shared={};}
if(!php_js_shared.includes){php_js_shared.includes=cur_file;}
if(!php_js_shared.includes[filename]){if(this.include(filename)){return true;}}else{return true;}
return false;}
function ini_alter(varname,newvalue){return this.ini_set(varname,newvalue);}
function ini_get(varname){if(this.php_js&&this.php_js.ini&&this.php_js.ini[varname]&&this.php_js.ini[varname].local_value!==undefined){if(this.php_js.ini[varname].local_value===null){return'';}
return this.php_js.ini[varname].local_value;}
return'';}
function ini_get_all(extension,details){var key='',ini={},noDetails={},extPattern;this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};if(extension){extPattern=new RegExp('^'+extension+'\\.');for(key in this.php_js.ini){if(extPattern.test(key)){ini[key]=this.php_js.ini[key];}}}
else{for(key in this.php_js.ini){ini[key]=this.php_js.ini[key];}}
if(details!==false){return ini;}
for(key in ini){noDetails[key]=ini[key].local_value;}
return noDetails;}
function ini_restore(varname){if(this.php_js&&this.php_js.ini&&this.php_js.ini[varname]){this.php_js.ini[varname].local_value=this.php_js.ini[varname].global_value;}}
function ini_set(varname,newvalue){var oldval='',that=this;this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};this.php_js.ini[varname]=this.php_js.ini[varname]||{};oldval=this.php_js.ini[varname].local_value;var _setArr=function(oldval){if(typeof oldval==='undefined'){that.php_js.ini[varname].local_value=[];}
that.php_js.ini[varname].local_value.push(newvalue);};switch(varname){case'extension':if(typeof this.dl==='function'){this.dl(newvalue);}
_setArr(oldval,newvalue);break;default:this.php_js.ini[varname].local_value=newvalue;break;}
return oldval;}
function intval(mixed_var,base){var tmp;var type=typeof(mixed_var);if(type==='boolean'){return(mixed_var)?1:0;}else if(type==='string'){tmp=parseInt(mixed_var,base||10);return(isNaN(tmp)||!isFinite(tmp))?0:tmp;}else if(type==='number'&&isFinite(mixed_var)){return Math.floor(mixed_var);}else{return 0;}}
function ip2long(IP){var i=0;IP=IP.match(/^([1-9]\d*|0[0-7]*|0x[\da-f]+)(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?$/i);if(!IP){return false;}
IP[0]=0;for(i=1;i<5;i+=1){IP[0]+=!!((IP[i]||'').length);IP[i]=parseInt(IP[i])||0;}
IP.push(256,256,256,256);IP[4+IP[0]]*=Math.pow(256,4-IP[0]);if(IP[1]>=IP[5]||IP[2]>=IP[6]||IP[3]>=IP[7]||IP[4]>=IP[8]){return false;}
return IP[1]*(IP[0]===1||16777216)+IP[2]*(IP[0]<=2||65536)+IP[3]*(IP[0]<=3||256)+IP[4]*1;}
function is_array(mixed_var){var key='';var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(!mixed_var){return false;}
this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};if(typeof mixed_var==='object'){if(this.php_js.ini['phpjs.objectsAsArrays']&&((this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase&&this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase()==='off')||parseInt(this.php_js.ini['phpjs.objectsAsArrays'].local_value,10)===0)){return mixed_var.hasOwnProperty('length')&&!mixed_var.propertyIsEnumerable('length')&&getFuncName(mixed_var.constructor)!=='String';}
if(mixed_var.hasOwnProperty){for(key in mixed_var){if(false===mixed_var.hasOwnProperty(key)){return false;}}}
return true;}
return false;}
function is_binary(vr){return typeof vr==='string';}
function is_bool(mixed_var)
{return(typeof mixed_var==='boolean');}
function is_buffer(vr){return typeof vr==='string';}
function is_callable(v,syntax_only,callable_name){var name='',obj={},method='';var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(typeof v==='string'){obj=this.window;method=v;name=v;}
else if(v instanceof Array&&v.length===2&&typeof v[0]==='object'&&typeof v[1]==='string'){obj=v[0];method=v[1];name=(obj.constructor&&getFuncName(obj.constructor))+'::'+method;}
else{return false;}
if(syntax_only||typeof obj[method]==='function'){if(callable_name){this.window[callable_name]=name;}
return true;}
return false;}
function is_double(mixed_var){return this.is_float(mixed_var);}
function is_finite(val){var warningType='';if(val===Infinity||val===-Infinity){return false;}
if(typeof val=='object'){warningType=(val instanceof Array?'array':'object');}else if(typeof val=='string'&&!val.match(/^[\+\-]?\d/)){warningType='string';}
if(warningType){throw new Error('Warning: is_finite() expects parameter 1 to be double, '+warningType+' given');}
return true;}
function is_float(mixed_var){if(typeof mixed_var!=='number'){return false;}
return!!(mixed_var%1);}
function is_infinite(val){var warningType='';if(val===Infinity||val===-Infinity){return true;}
if(typeof val=='object'){warningType=(val instanceof Array?'array':'object');}else if(typeof val=='string'&&!val.match(/^[\+\-]?\d/)){warningType='string';}
if(warningType){throw new Error('Warning: is_infinite() expects parameter 1 to be double, '+warningType+' given');}
return false;}
function is_int(mixed_var){if(typeof mixed_var!=='number'){return false;}
return!(mixed_var%1);}
function is_integer(mixed_var){return this.is_int(mixed_var);}
function is_long(mixed_var){return this.is_float(mixed_var);}
function is_nan(val){var warningType='';if(typeof val=='number'&&isNaN(val)){return true;}
if(typeof val=='object'){warningType=(val instanceof Array?'array':'object');}else if(typeof val=='string'&&!val.match(/^[\+\-]?\d/)){warningType='string';}
if(warningType){throw new Error('Warning: is_nan() expects parameter 1 to be double, '+warningType+' given');}
return false;}
function is_null(mixed_var){return(mixed_var===null);}
function is_numeric(mixed_var){return(typeof(mixed_var)==='number'||typeof(mixed_var)==='string')&&mixed_var!==''&&!isNaN(mixed_var);}
function is_object(mixed_var){if(mixed_var instanceof Array){return false;}else{return(mixed_var!==null)&&(typeof(mixed_var)=='object');}}
function is_real(mixed_var){return this.is_float(mixed_var);}
function is_resource(handle){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};return!(!handle||typeof handle!=='object'||!handle.constructor||getFuncName(handle.constructor)!=='PHPJS_Resource');}
function is_scalar(mixed_var){return(/boolean|number|string/).test(typeof mixed_var);}
function is_string(mixed_var){return(typeof(mixed_var)=='string');}
function is_unicode(vr){if(typeof vr!=='string'){return false;}
var arr=[],any='([\s\S])',highSurrogate='[\uD800-\uDBFF]',lowSurrogate='[\uDC00-\uDFFF]',highSurrogateBeforeAny=new RegExp(highSurrogate+any,'g'),lowSurrogateAfterAny=new RegExp(any+lowSurrogate,'g'),singleLowSurrogate=new RegExp('^'+lowSurrogate+'$'),singleHighSurrogate=new RegExp('^'+highSurrogate+'$');while((arr=highSurrogateBeforeAny.exec(vr))!==null){if(!arr[1]||!arr[1].match(singleLowSurrogate)){return false;}}
while((arr=lowSurrogateAfterAny.exec(vr))!==null){if(!arr[1]||!arr[1].match(singleHighSurrogate)){return false;}}
return true;}
function isset(){var a=arguments,l=a.length,i=0;if(l===0){throw new Error('Empty isset');}
while(i!==l){if(typeof(a[i])=='undefined'||a[i]===null){return false;}else{i++;}}
return true;}
function join(glue,pieces){return this.implode(glue,pieces);}
function json_decode(str_json){var json=this.window.JSON;if(typeof json==='object'&&typeof json.parse==='function'){try{return json.parse(str_json);}catch(err){if(!(err instanceof SyntaxError)){throw new Error('Unexpected error type in json_decode()');}
this.php_js=this.php_js||{};this.php_js.last_error_json=4;return null;}}
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;var j;var text=str_json;cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
if((/^[\],:{}\s]*$/).test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return j;}
this.php_js=this.php_js||{};this.php_js.last_error_json=4;return null;}
function json_encode(mixed_val){var retVal,json=this.window.JSON;try{if(typeof json==='object'&&typeof json.stringify==='function'){retVal=json.stringify(mixed_val);if(retVal===undefined){throw new SyntaxError('json_encode');}
return retVal;}
var value=mixed_val;var quote=function(string){var escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';};var str=function(key,holder){var gap='';var indent='    ';var i=0;var k='';var v='';var length=0;var mind=gap;var partial=[];var value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
if(value instanceof PHPJS_Resource){throw new SyntaxError('json_encode');}
gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
v=partial.length===0?'[]':gap?'[\n'+gap+
partial.join(',\n'+gap)+'\n'+
mind+']':'['+partial.join(',')+']';gap=mind;return v;}
for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}
v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;case'undefined':case'function':default:throw new SyntaxError('json_encode');}};return str('',{'':value});}catch(err){if(!(err instanceof SyntaxError)){throw new Error('Unexpected error type in json_encode()');}
this.php_js=this.php_js||{};this.php_js.last_error_json=4;return null;}}
function json_last_error(){return this.php_js&&this.php_js.last_error_json?this.php_js.last_error_json:0;}
function key(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}
var cursor=pointers[pointers.indexOf(arr)+1];if(!(arr instanceof Array)){var ct=0;for(var k in arr){if(ct===cursor){return k;}
ct++;}
return false;}
if(arr.length===0){return false;}
return cursor;}
function krsort(inputArr,sort_flags){var tmp_arr={},keys=[],sorter,i,k,that=this,strictForIn=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return that.strnatcmp(b,a);};break;case'SORT_LOCALE_STRING':var loc=this.i18n_loc_get_default();sorter=this.php_js.i18nLocales[loc].sorting;break;case'SORT_NUMERIC':sorter=function(a,b){return(b-a);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a<b){return 1;}
if(a>b){return-1;}
return 0;};break;}
for(k in inputArr){if(inputArr.hasOwnProperty){keys.push(k);}}
keys.sort(sorter);this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(i=0;i<keys.length;i++){k=keys[i];tmp_arr[k]=inputArr[k];if(strictForIn){delete inputArr[k];}}
for(i in tmp_arr){if(tmp_arr.hasOwnProperty){populateArr[i]=tmp_arr[i];}}
return strictForIn?true:populateArr;}
function ksort(inputArr,sort_flags){var tmp_arr={},keys=[],sorter,i,k,that=this,strictForIn=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return that.strnatcmp(a,b);};break;case'SORT_LOCALE_STRING':var loc=this.i18n_loc_get_default();sorter=this.php_js.i18nLocales[loc].sorting;break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b){return 1;}
if(a<b){return-1;}
return 0;};break;}
for(k in inputArr){if(inputArr.hasOwnProperty){keys.push(k);}}
keys.sort(sorter);this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(i=0;i<keys.length;i++){k=keys[i];tmp_arr[k]=inputArr[k];if(strictForIn){delete inputArr[k];}}
for(i in tmp_arr){if(tmp_arr.hasOwnProperty){populateArr[i]=tmp_arr[i];}}
return strictForIn?true:populateArr;}
function lcfirst(str){str+='';var f=str.charAt(0).toLowerCase();return f+str.substr(1);}
function lcg_value(){return Math.random();}
function levenshtein(s1,s2){if(s1==s2){return 0;}
var s1_len=s1.length;var s2_len=s2.length;if(s1_len===0){return s2_len;}
if(s2_len===0){return s1_len;}
var split=false;try{split=!('0')[0];}catch(e){split=true;}
if(split){s1=s1.split('');s2=s2.split('');}
var v0=new Array(s1_len+1);var v1=new Array(s1_len+1);var s1_idx=0,s2_idx=0,cost=0;for(s1_idx=0;s1_idx<s1_len+1;s1_idx++){v0[s1_idx]=s1_idx;}
var char_s1='',char_s2='';for(s2_idx=1;s2_idx<=s2_len;s2_idx++){v1[0]=s2_idx;char_s2=s2[s2_idx-1];for(s1_idx=0;s1_idx<s1_len;s1_idx++){char_s1=s1[s1_idx];cost=(char_s1==char_s2)?0:1;var m_min=v0[s1_idx+1]+1;var b=v1[s1_idx]+1;var c=v0[s1_idx]+cost;if(b<m_min){m_min=b;}
if(c<m_min){m_min=c;}
v1[s1_idx+1]=m_min;}
var v_tmp=v0;v0=v1;v1=v_tmp;}
return v0[s1_len];}
function localeconv(){var arr={},prop='';this.setlocale('LC_ALL',0);for(prop in this.php_js.locales[this.php_js.localeCategories.LC_NUMERIC].LC_NUMERIC){arr[prop]=this.php_js.locales[this.php_js.localeCategories.LC_NUMERIC].LC_NUMERIC[prop];}
for(prop in this.php_js.locales[this.php_js.localeCategories.LC_MONETARY].LC_MONETARY){arr[prop]=this.php_js.locales[this.php_js.localeCategories.LC_MONETARY].LC_MONETARY[prop];}
return arr;}
function localtime(timestamp,is_assoc){if(timestamp===undefined){timestamp=Math.round(new Date().getTime()/1000);}else if(timestamp instanceof Date){timestamp=timestamp/1000;}
var t=new Date(timestamp*1000);var jan1=new Date(t.getFullYear(),0,1);var yday=Math.ceil((t-jan1)/86400000)-1;jan1=new Date(t.getFullYear(),0,1,0,0,0,0);var june1=new Date(t.getFullYear(),6,1,0,0,0,0);var temp=jan1.toUTCString();var jan2=new Date(temp.slice(0,temp.lastIndexOf(' ')-1));temp=june1.toUTCString();var june2=new Date(temp.slice(0,temp.lastIndexOf(' ')-1));var std_time_offset=(jan1-jan2)/(1000*60*60);var daylight_time_offset=(june1-june2)/(1000*60*60);var dst;if(std_time_offset===daylight_time_offset){dst=0;}else{var hemisphere=std_time_offset-daylight_time_offset;if(hemisphere>=0){std_time_offset=daylight_time_offset;}
dst=1;}
if(is_assoc){return{'tm_sec':t.getSeconds(),'tm_min':t.getMinutes(),'tm_hour':t.getHours(),'tm_mday':t.getDate(),'tm_mon':t.getMonth(),'tm_year':t.getFullYear()-1900,'tm_wday':t.getDay(),'tm_yday':yday,'tm_isdst':dst};}
return[t.getSeconds(),t.getMinutes(),t.getHours(),t.getDate(),t.getMonth(),t.getFullYear()-1900,t.getDay(),yday,dst];}
function log(arg,base){if(base===undefined){return Math.log(arg);}else{return Math.log(arg)/Math.log(base);}}
function log10(arg){return Math.log(arg)/Math.LN10;}
function log1p(x){var ret=0,n=50;if(x<=-1){return'-INF';}
if(x<0||x>1){return Math.log(1+x);}
for(var i=1;i<n;i++){if((i%2)===0){ret-=Math.pow(x,i)/i;}
else{ret+=Math.pow(x,i)/i;}}
return ret;}
function long2ip(proper_address){var output=false;if(!isNaN(proper_address)&&(proper_address>=0||proper_address<=4294967295)){output=Math.floor(proper_address/Math.pow(256,3))+'.'+
Math.floor((proper_address%Math.pow(256,3))/Math.pow(256,2))+'.'+
Math.floor(((proper_address%Math.pow(256,3))%Math.pow(256,2))/Math.pow(256,1))+'.'+
Math.floor((((proper_address%Math.pow(256,3))%Math.pow(256,2))%Math.pow(256,1))/Math.pow(256,0));}
return output;}
function ltrim(str,charlist){charlist=!charlist?' \\s\u00A0':(charlist+'').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g,'$1');var re=new RegExp('^['+charlist+']+','g');return(str+'').replace(re,'');}
function max(){var ar,retVal,i=0,n=0;var argv=arguments,argc=argv.length;var _obj2Array=function(obj){if(obj instanceof Array){return obj;}else{var ar=[];for(var i in obj){ar.push(obj[i]);}
return ar;}};var _compare=function(current,next){var i=0,n=0,tmp=0;var nl=0,cl=0;if(current===next){return 0;}else if(typeof current=='object'){if(typeof next=='object'){current=_obj2Array(current);next=_obj2Array(next);cl=current.length;nl=next.length;if(nl>cl){return 1;}else if(nl<cl){return-1;}else{for(i=0,n=cl;i<n;++i){tmp=_compare(current[i],next[i]);if(tmp==1){return 1;}else if(tmp==-1){return-1;}}
return 0;}}else{return-1;}}else if(typeof next=='object'){return 1;}else if(isNaN(next)&&!isNaN(current)){if(current==0){return 0;}else{return(current<0?1:-1);}}else if(isNaN(current)&&!isNaN(next)){if(next==0){return 0;}else{return(next>0?1:-1);}}else{if(next==current){return 0;}else{return(next>current?1:-1);}}};if(argc===0){throw new Error('At least one value should be passed to max()');}else if(argc===1){if(typeof argv[0]==='object'){ar=_obj2Array(argv[0]);}else{throw new Error('Wrong parameter count for max()');}
if(ar.length===0){throw new Error('Array must contain at least one element for max()');}}else{ar=argv;}
retVal=ar[0];for(i=1,n=ar.length;i<n;++i){if(_compare(retVal,ar[i])==1){retVal=ar[i];}}
return retVal;}
function md5(str){var xl;var rotateLeft=function(lValue,iShiftBits){return(lValue<<iShiftBits)|(lValue>>>(32-iShiftBits));};var addUnsigned=function(lX,lY){var lX4,lY4,lX8,lY8,lResult;lX8=(lX&0x80000000);lY8=(lY&0x80000000);lX4=(lX&0x40000000);lY4=(lY&0x40000000);lResult=(lX&0x3FFFFFFF)+(lY&0x3FFFFFFF);if(lX4&lY4){return(lResult^0x80000000^lX8^lY8);}
if(lX4|lY4){if(lResult&0x40000000){return(lResult^0xC0000000^lX8^lY8);}else{return(lResult^0x40000000^lX8^lY8);}}else{return(lResult^lX8^lY8);}};var _F=function(x,y,z){return(x&y)|((~x)&z);};var _G=function(x,y,z){return(x&z)|(y&(~z));};var _H=function(x,y,z){return(x^y^z);};var _I=function(x,y,z){return(y^(x|(~z)));};var _FF=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_F(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var _GG=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_G(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var _HH=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_H(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var _II=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_I(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var convertToWordArray=function(str){var lWordCount;var lMessageLength=str.length;var lNumberOfWords_temp1=lMessageLength+8;var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1%64))/64;var lNumberOfWords=(lNumberOfWords_temp2+1)*16;var lWordArray=new Array(lNumberOfWords-1);var lBytePosition=0;var lByteCount=0;while(lByteCount<lMessageLength){lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=(lWordArray[lWordCount]|(str.charCodeAt(lByteCount)<<lBytePosition));lByteCount++;}
lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=lWordArray[lWordCount]|(0x80<<lBytePosition);lWordArray[lNumberOfWords-2]=lMessageLength<<3;lWordArray[lNumberOfWords-1]=lMessageLength>>>29;return lWordArray;};var wordToHex=function(lValue){var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;for(lCount=0;lCount<=3;lCount++){lByte=(lValue>>>(lCount*8))&255;wordToHexValue_temp="0"+lByte.toString(16);wordToHexValue=wordToHexValue+wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);}
return wordToHexValue;};var x=[],k,AA,BB,CC,DD,a,b,c,d,S11=7,S12=12,S13=17,S14=22,S21=5,S22=9,S23=14,S24=20,S31=4,S32=11,S33=16,S34=23,S41=6,S42=10,S43=15,S44=21;str=this.utf8_encode(str);x=convertToWordArray(str);a=0x67452301;b=0xEFCDAB89;c=0x98BADCFE;d=0x10325476;xl=x.length;for(k=0;k<xl;k+=16){AA=a;BB=b;CC=c;DD=d;a=_FF(a,b,c,d,x[k+0],S11,0xD76AA478);d=_FF(d,a,b,c,x[k+1],S12,0xE8C7B756);c=_FF(c,d,a,b,x[k+2],S13,0x242070DB);b=_FF(b,c,d,a,x[k+3],S14,0xC1BDCEEE);a=_FF(a,b,c,d,x[k+4],S11,0xF57C0FAF);d=_FF(d,a,b,c,x[k+5],S12,0x4787C62A);c=_FF(c,d,a,b,x[k+6],S13,0xA8304613);b=_FF(b,c,d,a,x[k+7],S14,0xFD469501);a=_FF(a,b,c,d,x[k+8],S11,0x698098D8);d=_FF(d,a,b,c,x[k+9],S12,0x8B44F7AF);c=_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);b=_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);a=_FF(a,b,c,d,x[k+12],S11,0x6B901122);d=_FF(d,a,b,c,x[k+13],S12,0xFD987193);c=_FF(c,d,a,b,x[k+14],S13,0xA679438E);b=_FF(b,c,d,a,x[k+15],S14,0x49B40821);a=_GG(a,b,c,d,x[k+1],S21,0xF61E2562);d=_GG(d,a,b,c,x[k+6],S22,0xC040B340);c=_GG(c,d,a,b,x[k+11],S23,0x265E5A51);b=_GG(b,c,d,a,x[k+0],S24,0xE9B6C7AA);a=_GG(a,b,c,d,x[k+5],S21,0xD62F105D);d=_GG(d,a,b,c,x[k+10],S22,0x2441453);c=_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);b=_GG(b,c,d,a,x[k+4],S24,0xE7D3FBC8);a=_GG(a,b,c,d,x[k+9],S21,0x21E1CDE6);d=_GG(d,a,b,c,x[k+14],S22,0xC33707D6);c=_GG(c,d,a,b,x[k+3],S23,0xF4D50D87);b=_GG(b,c,d,a,x[k+8],S24,0x455A14ED);a=_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);d=_GG(d,a,b,c,x[k+2],S22,0xFCEFA3F8);c=_GG(c,d,a,b,x[k+7],S23,0x676F02D9);b=_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);a=_HH(a,b,c,d,x[k+5],S31,0xFFFA3942);d=_HH(d,a,b,c,x[k+8],S32,0x8771F681);c=_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);b=_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);a=_HH(a,b,c,d,x[k+1],S31,0xA4BEEA44);d=_HH(d,a,b,c,x[k+4],S32,0x4BDECFA9);c=_HH(c,d,a,b,x[k+7],S33,0xF6BB4B60);b=_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);a=_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);d=_HH(d,a,b,c,x[k+0],S32,0xEAA127FA);c=_HH(c,d,a,b,x[k+3],S33,0xD4EF3085);b=_HH(b,c,d,a,x[k+6],S34,0x4881D05);a=_HH(a,b,c,d,x[k+9],S31,0xD9D4D039);d=_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);c=_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);b=_HH(b,c,d,a,x[k+2],S34,0xC4AC5665);a=_II(a,b,c,d,x[k+0],S41,0xF4292244);d=_II(d,a,b,c,x[k+7],S42,0x432AFF97);c=_II(c,d,a,b,x[k+14],S43,0xAB9423A7);b=_II(b,c,d,a,x[k+5],S44,0xFC93A039);a=_II(a,b,c,d,x[k+12],S41,0x655B59C3);d=_II(d,a,b,c,x[k+3],S42,0x8F0CCC92);c=_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);b=_II(b,c,d,a,x[k+1],S44,0x85845DD1);a=_II(a,b,c,d,x[k+8],S41,0x6FA87E4F);d=_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);c=_II(c,d,a,b,x[k+6],S43,0xA3014314);b=_II(b,c,d,a,x[k+13],S44,0x4E0811A1);a=_II(a,b,c,d,x[k+4],S41,0xF7537E82);d=_II(d,a,b,c,x[k+11],S42,0xBD3AF235);c=_II(c,d,a,b,x[k+2],S43,0x2AD7D2BB);b=_II(b,c,d,a,x[k+9],S44,0xEB86D391);a=addUnsigned(a,AA);b=addUnsigned(b,BB);c=addUnsigned(c,CC);d=addUnsigned(d,DD);}
var temp=wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d);return temp.toLowerCase();}
function md5_file(str_filename){var buf='';buf=this.file_get_contents(str_filename);if(!buf){return false;}
return this.md5(buf);}
function metaphone(word,phones){var wordlength=word.length,x=0,tempchar="",metaword="";var removedbl=function(word){var wordlength=word.length,tempword=word.toLowerCase(),rebuilt,tempchar1,tempchar2,x;tempchar1=tempword.charAt(0);rebuilt=tempchar1;for(x=1;x<wordlength;x++){tempchar2=tempword.charAt(x);if(tempchar2!=tempchar1||tempchar2=='c'||tempchar2=='g'){rebuilt+=tempchar2;}
tempchar1=tempchar2;}
return rebuilt;};var isVowel=function(a){switch(a.toLowerCase()){case'a':return true;case'e':return true;case'i':return true;case'o':return true;case'u':return true;default:return false;}};var tempword=removedbl(word.toLowerCase());if(tempword.charAt(0)=='w'&&tempword.charAt(1)=='h'){tempword="w"+tempword.substr(2);}
for(x=0;x<wordlength;x++){tempchar=String(tempword).charAt(x);if(x===0&&x+1<=wordlength){switch(tempchar){case'a':if(tempword.charAt(x+1)=='e'){metaword+='e';}else{metaword+='a';}break;case'e':metaword+='e';break;case'i':metaword+='i';break;case'o':metaword+='o';break;case'u':metaword+='u';break;case'g':if(String(tempword).charAt(x+1)=='n'){x+=1;tempchar=String(tempword).charAt(x);}break;case'k':if(String(tempword).charAt(x+1)=='n'){x+=1;tempchar=String(tempword).charAt(x);}break;case'p':if(String(tempword).charAt(x+1)=='n'){x+=1;tempchar=String(tempword).charAt(x);}break;case'w':if(String(tempword).charAt(x+1)=='r'){x+=1;tempchar=String(tempword).charAt(x);break;}break;}}
if(isVowel(tempchar)===false){switch(tempchar){case'b':if(String(tempword).charAt(x-1)=='m'){break;}else{metaword+='b';}break;case'c':if(x+1<=wordlength){if(String(tempword).charAt(x+1)=='h'&&String(tempword).charAt(x-1)!='s'){if(x===0&&(x+2<=wordlength)&&isVowel(String(tempword).charAt(x+2))){metaword+='k';}else{metaword+='x';}}else if(String(tempword).charAt(x+1)=='i'&&String(tempword).charAt(x+2)=='a'){metaword+='x';}
else if(String(tempword).charAt(x+1)=='i'||String(tempword).charAt(x+1)=='e'||String(tempword).charAt(x+1)=='y'){if(x>0){if(String(tempword).charAt(x-1)=='s'){break;}else{metaword+='s';}}else{metaword+='s';}}else{metaword+='k';}}else{metaword+='k';}
break;case'd':if(x+2<=wordlength){if(String(tempword).charAt(x+1)=='g'){if(String(tempword).charAt(x+2)=='e'||String(tempword).charAt(x+2)=='y'||String(tempword).charAt(x+2)=='i'){metaword+='j';x+=2;}else{metaword+='t';}}else{metaword+='t';}}else{metaword+='t';}
break;case'f':metaword+='f';break;case'g':if(x<wordlength){if((String(tempword).charAt(x+1)=='n'&&x+1==wordlength-1)||(String(tempword).charAt(x+1)=='n'&&String(tempword).charAt(x+2)=='s'&&x+2==wordlength-1)){break;}
if(String(tempword).charAt(x+1)=='n'&&String(tempword).charAt(x+2)=='e'&&String(tempword).charAt(x+3)=='d'&&x+3==wordlength-1){break;}
if(String(tempword).charAt(x-1)=='n'&&String(tempword).charAt(x-2)=='i'&&x==wordlength-1){break;}
if(String(tempword).charAt(x+1)=='h'&&x+1<=wordlength-1&&String(tempword).charAt(x-1)=='u'&&String(tempword).charAt(x-2)=='o'){metaword+='f';break;}
if(String(tempword).charAt(x+1)=='h'&&x+2<=wordlength){if(isVowel(String(tempword).charAt(x+2))===false){break;}else{metaword+='k';}}
else if(x+1==wordlength){if(String(tempword).charAt(x+1)=='n'){break;}else{metaword+='k';}}
else if(x+3==wordlength){if(String(tempword).charAt(x+1)=='n'&&String(tempword).charAt(x+2)=='e'&&String(tempword).charAt(x+3)=='d'){}else{metaword+='k';}}
else if(x+1<=wordlength){if(String(tempword).charAt(x+1)=='i'||String(tempword).charAt(x+1)=='e'||String(tempword).charAt(x+1)=='y'){if(String(tempword).charAt(x-1)!='g'){metaword+='j';}}else if(x>0){if(String(tempword).charAt(x-1)=='d'){switch(String(tempword).charAt(x+1)){case'e':case'y':case'i':break;default:metaword+='k';}}else{metaword+='k';}}else{metaword+='k';}}else{metaword+='k';}}else{metaword+='k';}
break;case'm':metaword+='m';break;case'j':metaword+='j';break;case'n':metaword+='n';break;case'q':metaword+='k';break;case'r':metaword+='r';break;case'l':metaword+='l';break;case'v':metaword+='f';break;case'z':metaword+='s';break;case'x':if(x===0){metaword+='s';}else{metaword+='ks';}break;case'm':metaword+='m';break;case'k':if(x>0){if(String(tempword).charAt(x-1)!='c'){metaword+='k';}}else{metaword+='k';}break;case'p':if(x+1<=wordlength){if(String(tempword).charAt(x+1)=='h'){metaword+='f';}else{metaword+='p';}}else{metaword+='p';}break;case'y':if(x+1<=wordlength){if(isVowel(String(tempword).charAt(x+1))===true){metaword+='y';}}else{metaword+='y';}break;case'h':if(x===0||['c','s','p','t','g'].indexOf(String(tempword).charAt(x-1))===-1){if(isVowel(String(tempword).charAt(x+1))===true){metaword+='h';}}break;case's':if(x+1<=wordlength){if(String(tempword).charAt(x+1)=='h'){metaword+='x';}
else if(x+2<=wordlength){if(String(tempword).charAt(x+1)=='i'){if(String(tempword).charAt(x+2)=='o'||String(tempword).charAt(x+2)=='a'){metaword+='x';}else{metaword+='s';}}else{metaword+='s';}}else{metaword+='s';}}else{metaword+='s';}break;case't':if(x+1<=wordlength){if(String(tempword).charAt(x+1)=='h'){metaword+='0';}
else if(x+2<=wordlength){if(String(tempword).charAt(x+1)=='i'){if(String(tempword).charAt(x+2)=='o'||String(tempword).charAt(x+2)=='a'){metaword+='x';}else{metaword+='t';}}else{metaword+='t';}}else{metaword+='t';}}else{metaword+='t';}break;case'w':if(x+1<=wordlength){if(isVowel(String(tempword).charAt(x+1))===true){metaword+='w';}}break;}}}
phones=parseInt(phones,10);if(metaword.length>phones){return metaword.substr(0,phones).toUpperCase();}
return metaword.toUpperCase();}
function method_exists(obj,method){if(typeof obj==='string'){return this.window[obj]&&typeof this.window[obj][method]==='function';}
return typeof obj[method]==='function';}
function microtime(get_as_float){var now=new Date().getTime()/1000;var s=parseInt(now,10);return(get_as_float)?now:(Math.round((now-s)*1000)/1000)+' '+s;}
function min(){var ar,retVal,i=0,n=0;var argv=arguments,argc=argv.length;var _obj2Array=function(obj){if(obj instanceof Array){return obj;}else{var ar=[];for(var i in obj){ar.push(obj[i]);}
return ar;}};var _compare=function(current,next){var i=0,n=0,tmp=0;var nl=0,cl=0;if(current===next){return 0;}else if(typeof current=='object'){if(typeof next=='object'){current=_obj2Array(current);next=_obj2Array(next);cl=current.length;nl=next.length;if(nl>cl){return 1;}else if(nl<cl){return-1;}else{for(i=0,n=cl;i<n;++i){tmp=_compare(current[i],next[i]);if(tmp==1){return 1;}else if(tmp==-1){return-1;}}
return 0;}}else{return-1;}}else if(typeof next=='object'){return 1;}else if(isNaN(next)&&!isNaN(current)){if(current==0){return 0;}else{return(current<0?1:-1);}}else if(isNaN(current)&&!isNaN(next)){if(next==0){return 0;}else{return(next>0?1:-1);}}else{if(next==current){return 0;}else{return(next>current?1:-1);}}};if(argc===0){throw new Error('At least one value should be passed to min()');}else if(argc===1){if(typeof argv[0]==='object'){ar=_obj2Array(argv[0]);}else{throw new Error('Wrong parameter count for min()');}
if(ar.length===0){throw new Error('Array must contain at least one element for min()');}}else{ar=argv;}
retVal=ar[0];for(i=1,n=ar.length;i<n;++i){if(_compare(retVal,ar[i])==-1){retVal=ar[i];}}
return retVal;}
function mktime(){var no=0,i=0,ma=0,mb=0,d=new Date(),dn=new Date(),argv=arguments,argc=argv.length;var dateManip={0:function(tt){return d.setHours(tt);},1:function(tt){return d.setMinutes(tt);},2:function(tt){var set=d.setSeconds(tt);mb=d.getDate()-dn.getDate();d.setDate(1);return set;},3:function(tt){var set=d.setMonth(parseInt(tt,10)-1);ma=d.getFullYear()-dn.getFullYear();return set;},4:function(tt){return d.setDate(tt+mb);},5:function(tt){if(tt>=0&&tt<=69){tt+=2000;}
else if(tt>=70&&tt<=100){tt+=1900;}
return d.setFullYear(tt+ma);}};for(i=0;i<argc;i++){no=parseInt(argv[i]*1,10);if(isNaN(no)){return false;}else{if(!dateManip[i](no)){return false;}}}
for(i=argc;i<6;i++){switch(i){case 0:no=dn.getHours();break;case 1:no=dn.getMinutes();break;case 2:no=dn.getSeconds();break;case 3:no=dn.getMonth()+1;break;case 4:no=dn.getDate();break;case 5:no=dn.getFullYear();break;}
dateManip[i](no);}
return Math.floor(d.getTime()/1000);}
function money_format(format,number){if(typeof number!=='number'){return null;}
var regex=/%((=.|[+^(!-])*?)(\d*?)(#(\d+))?(\.(\d+))?([in%])/g;this.setlocale('LC_ALL',0);var monetary=this.php_js.locales[this.php_js.localeCategories['LC_MONETARY']]['LC_MONETARY'];var doReplace=function(n0,flags,n2,width,n4,left,n6,right,conversion){var value='',repl='';if(conversion==='%'){return'%';}
var fill=flags&&/=./.test(flags)?flags.match(/=(.)/)[1]:' ';var showCurrSymbol=!flags||flags.indexOf('!')===-1;width=parseInt(width,10)||0;var neg=number<0;number=number+'';number=neg?number.slice(1):number;var decpos=number.indexOf('.');var integer=decpos!==-1?number.slice(0,decpos):number;var fraction=decpos!==-1?number.slice(decpos+1):'';var _str_splice=function(integerStr,idx,thous_sep){var integerArr=integerStr.split('');integerArr.splice(idx,0,thous_sep);return integerArr.join('');};var init_lgth=integer.length;left=parseInt(left,10);var filler=init_lgth<left;if(filler){var fillnum=left-init_lgth;integer=new Array(fillnum+1).join(fill)+integer;}
if(flags.indexOf('^')===-1){var thous_sep=monetary.mon_thousands_sep;var mon_grouping=monetary.mon_grouping;if(mon_grouping[0]<integer.length){for(var i=0,idx=integer.length;i<mon_grouping.length;i++){idx-=mon_grouping[i];if(idx<0){break;}
if(filler&&idx<fillnum){thous_sep=fill;}
integer=_str_splice(integer,idx,thous_sep);}}
if(mon_grouping[i-1]>0){while(idx>mon_grouping[i-1]){idx-=mon_grouping[i-1];if(filler&&idx<fillnum){thous_sep=fill;}
integer=_str_splice(integer,idx,thous_sep);}}}
if(right==='0'){value=integer;}
else{var dec_pt=monetary.mon_decimal_point;if(right===''||right===undefined){right=conversion==='i'?monetary.int_frac_digits:monetary.frac_digits;}
right=parseInt(right,10);if(right===0){fraction='';dec_pt='';}
else if(right<fraction.length){fraction=Math.round(parseFloat(fraction.slice(0,right)+'.'+fraction.substr(right,1),10))+'';}
else if(right>fraction.length){fraction+=new Array(right-fraction.length+1).join('0');}
value=integer+dec_pt+fraction;}
var symbol='';if(showCurrSymbol){symbol=conversion==='i'?monetary.int_curr_symbol:monetary.currency_symbol;}
var sign_posn=neg?monetary.n_sign_posn:monetary.p_sign_posn;var sep_by_space=neg?monetary.n_sep_by_space:monetary.p_sep_by_space;var cs_precedes=neg?monetary.n_cs_precedes:monetary.p_cs_precedes;if(flags.indexOf('(')!==-1){repl=(cs_precedes?symbol+(sep_by_space===1?' ':''):'')+
value+
(!cs_precedes?(sep_by_space===1?' ':'')+symbol:'');if(neg){repl='('+repl+')';}
else{repl=' '+repl+' ';}}
else{var pos_sign=monetary.positive_sign;var neg_sign=monetary.negative_sign;var sign=neg?(neg_sign):(pos_sign);var otherSign=neg?(pos_sign):(neg_sign);var signPadding='';if(sign_posn){signPadding=new Array(otherSign.length-sign.length+1).join(' ');}
var valueAndCS='';switch(sign_posn){case 0:valueAndCS=cs_precedes?symbol+(sep_by_space===1?' ':'')+value:value+(sep_by_space===1?' ':'')+symbol;repl='('+valueAndCS+')';break;case 1:valueAndCS=cs_precedes?symbol+(sep_by_space===1?' ':'')+value:value+(sep_by_space===1?' ':'')+symbol;repl=signPadding+sign+(sep_by_space===2?' ':'')+valueAndCS;break;case 2:valueAndCS=cs_precedes?symbol+(sep_by_space===1?' ':'')+value:value+(sep_by_space===1?' ':'')+symbol;repl=valueAndCS+(sep_by_space===2?' ':'')+sign+signPadding;break;case 3:repl=cs_precedes?signPadding+sign+(sep_by_space===2?' ':'')+symbol+(sep_by_space===1?' ':'')+value:value+(sep_by_space===1?' ':'')+sign+signPadding+(sep_by_space===2?' ':'')+symbol;break;case 4:repl=cs_precedes?symbol+(sep_by_space===2?' ':'')+signPadding+sign+(sep_by_space===1?' ':'')+value:value+(sep_by_space===1?' ':'')+symbol+(sep_by_space===2?' ':'')+sign+signPadding;break;}}
var padding=width-repl.length;if(padding>0){padding=new Array(padding+1).join(' ');if(flags.indexOf('-')!==-1){repl+=padding;}
else{repl=padding+repl;}}
return repl;};return format.replace(regex,doReplace);}
function mt_getrandmax()
{return 2147483647;}
function mt_rand(min,max){var argc=arguments.length;if(argc===0){min=0;max=2147483647;}else if(argc===1){throw new Error('Warning: mt_rand() expects exactly 2 parameters, 1 given');}
return Math.floor(Math.random()*(max-min+1))+min;}
function natcasesort(inputArr){var valArr=[],keyArr=[],k,i,ret,that=this,strictForIn=false,populateArr=[];var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=that.strnatcasecmp(inputArr[j+1],inputArr[j]);if(ret<0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);keyArr.push(k);if(strictForIn){delete inputArr[k];}}}
try{bubbleSort(keyArr,valArr);}catch(e){return false;}
for(i=0;i<valArr.length;i++){populateArr[keyArr[i]]=valArr[i];}
return strictForIn?true:populateArr;}
function natsort(inputArr){var valArr=[],keyArr=[],k,i,ret,that=this,strictForIn=false,populateArr=[];var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=that.strnatcmp(inputArr[j+1],inputArr[j]);if(ret<0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);keyArr.push(k);if(strictForIn){delete inputArr[k];}}}
try{bubbleSort(keyArr,valArr);}catch(e){return false;}
for(i=0;i<valArr.length;i++){populateArr[keyArr[i]]=valArr[i];}
return strictForIn?true:populateArr;}
function next(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}
var arrpos=pointers.indexOf(arr);var cursor=pointers[arrpos+1];if(!(arr instanceof Array)){var ct=0;for(var k in arr){if(ct===cursor+1){pointers[arrpos+1]+=1;return arr[k];}
ct++;}
return false;}
if(arr.length===0||cursor===(arr.length-1)){return false;}
pointers[arrpos+1]+=1;return arr[pointers[arrpos+1]];}
function nl2br(str,is_xhtml){var breakTag=(is_xhtml||typeof is_xhtml==='undefined')?'<br />':'<br>';return(str+'').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g,'$1'+breakTag+'$2');}
function nl_langinfo(item){this.setlocale('LC_ALL',0);var loc=this.php_js.locales[this.php_js.localeCategories.LC_TIME];if(item.indexOf('ABDAY_')===0){return loc.LC_TIME.a[parseInt(item.replace(/^ABDAY_/,''),10)-1];}
else if(item.indexOf('DAY_')===0){return loc.LC_TIME.A[parseInt(item.replace(/^DAY_/,''),10)-1];}
else if(item.indexOf('ABMON_')===0){return loc.LC_TIME.b[parseInt(item.replace(/^ABMON_/,''),10)-1];}
else if(item.indexOf('MON_')===0){return loc.LC_TIME.B[parseInt(item.replace(/^MON_/,''),10)-1];}
else{switch(item){case'AM_STR':return loc.LC_TIME.p[0];case'PM_STR':return loc.LC_TIME.p[1];case'D_T_FMT':return loc.LC_TIME.c;case'D_FMT':return loc.LC_TIME.x;case'T_FMT':return loc.LC_TIME.X;case'T_FMT_AMPM':return loc.LC_TIME.r;case'ERA':case'ERA_YEAR':case'ERA_D_T_FMT':case'ERA_D_FMT':case'ERA_T_FMT':return loc.LC_TIME[item];}
loc=this.php_js.locales[this.php_js.localeCategories.LC_MONETARY];if(item==='CRNCYSTR'){item='CURRENCY_SYMBOL';}
switch(item){case'INT_CURR_SYMBOL':case'CURRENCY_SYMBOL':case'MON_DECIMAL_POINT':case'MON_THOUSANDS_SEP':case'POSITIVE_SIGN':case'NEGATIVE_SIGN':case'INT_FRAC_DIGITS':case'FRAC_DIGITS':case'P_CS_PRECEDES':case'P_SEP_BY_SPACE':case'N_CS_PRECEDES':case'N_SEP_BY_SPACE':case'P_SIGN_POSN':case'N_SIGN_POSN':return loc.LC_MONETARY[item.toLowerCase()];case'MON_GROUPING':return loc.LC_MONETARY[item.toLowerCase()];}
loc=this.php_js.locales[this.php_js.localeCategories.LC_NUMERIC];switch(item){case'RADIXCHAR':case'DECIMAL_POINT':return loc.LC_NUMERIC[item.toLowerCase()];case'THOUSEP':case'THOUSANDS_SEP':return loc.LC_NUMERIC[item.toLowerCase()];case'GROUPING':return loc.LC_NUMERIC[item.toLowerCase()];}
loc=this.php_js.locales[this.php_js.localeCategories.LC_MESSAGES];switch(item){case'YESEXPR':case'NOEXPR':case'YESSTR':case'NOSTR':return loc.LC_MESSAGES[item];}
loc=this.php_js.locales[this.php_js.localeCategories.LC_CTYPE];if(item==='CODESET'){return loc.LC_CTYPE[item];}
return false;}}
function number_format(number,decimals,dec_point,thousands_sep){var n=number,prec=decimals;var toFixedFix=function(n,prec){var k=Math.pow(10,prec);return(Math.round(n*k)/k).toString();};n=!isFinite(+n)?0:+n;prec=!isFinite(+prec)?0:Math.abs(prec);var sep=(typeof thousands_sep==='undefined')?',':thousands_sep;var dec=(typeof dec_point==='undefined')?'.':dec_point;var s=(prec>0)?toFixedFix(n,prec):toFixedFix(Math.round(n),prec);var abs=toFixedFix(Math.abs(n),prec);var _,i;if(abs>=1000){_=abs.split(/\D/);i=_[0].length%3||3;_[0]=s.slice(0,i+(n<0))+
_[0].slice(i).replace(/(\d{3})/g,sep+'$1');s=_.join(dec);}else{s=s.replace('.',dec);}
var decPos=s.indexOf(dec);if(prec>=1&&decPos!==-1&&(s.length-decPos-1)<prec){s+=new Array(prec-(s.length-decPos-1)).join(0)+'0';}
else if(prec>=1&&decPos===-1){s+=dec+new Array(prec).join(0)+'0';}
return s;}
function octdec(oct_string){oct_string=(oct_string+'').replace(/[^0-7]/gi,'');return parseInt(oct_string,8);}
function ord(string){var str=string+'';var code=str.charCodeAt(0);if(0xD800<=code&&code<=0xDBFF){var hi=code;if(str.length===1){return code;}
var low=str.charCodeAt(1);if(!low){}
return((hi-0xD800)*0x400)+(low-0xDC00)+0x10000;}
if(0xDC00<=code&&code<=0xDFFF){return code;}
return code;}
function pack(format){var formatPointer=0,argumentPointer=1,result='',argument='',i=0,r=[],instruction,quantifier,word,precisionBits,exponentBits,extraNullCount;var bias,minExp,maxExp,minUnnormExp,status,exp,len,bin,signal,n,intPart,floatPart,lastBit,rounded,j,k,tmpResult;while(formatPointer<format.length){instruction=format[formatPointer];quantifier='';formatPointer++;while((formatPointer<format.length)&&(format[formatPointer].match(/[\d\*]/)!==null)){quantifier+=format[formatPointer];formatPointer++;}
if(quantifier===''){quantifier='1';}
switch(instruction){case'a':case'A':if(typeof arguments[argumentPointer]==='undefined'){throw new Error('Warning:  pack() Type '+instruction+': not enough arguments');}else{argument=String(arguments[argumentPointer]);}
if(quantifier==='*'){quantifier=argument.length;}
for(i=0;i<quantifier;i++){if(typeof argument[i]==='undefined'){if(instruction==='a'){result+=String.fromCharCode(0);}else{result+=' ';}}else{result+=argument[i];}}
argumentPointer++;break;case'h':case'H':if(typeof arguments[argumentPointer]==='undefined'){throw new Error('Warning: pack() Type '+instruction+': not enough arguments');}else{argument=arguments[argumentPointer];}
if(quantifier==='*'){quantifier=argument.length;}
if(quantifier>argument.length){throw new Error('Warning: pack() Type '+instruction+': not enough characters in string');}
for(i=0;i<quantifier;i+=2){word=argument[i];if(((i+1)>=quantifier)||typeof(argument[i+1])==='undefined'){word+='0';}else{word+=argument[i+1];}
if(instruction==='h'){word=word[1]+word[0];}
result+=String.fromCharCode(parseInt(word,16));}
argumentPointer++;break;case'c':case'C':if(quantifier==='*'){quantifier=arguments.length-argumentPointer;}
if(quantifier>(arguments.length-argumentPointer)){throw new Error('Warning:  pack() Type '+instruction+': too few arguments');}
for(i=0;i<quantifier;i++){result+=String.fromCharCode(arguments[argumentPointer]);argumentPointer++;}
break;case's':case'S':case'v':if(quantifier==='*'){quantifier=arguments.length-argumentPointer;}
if(quantifier>(arguments.length-argumentPointer)){throw new Error('Warning:  pack() Type '+instruction+': too few arguments');}
for(i=0;i<quantifier;i++){result+=String.fromCharCode(arguments[argumentPointer]&0xFF);result+=String.fromCharCode(arguments[argumentPointer]>>8&0xFF);argumentPointer++;}
break;case'n':if(quantifier==='*'){quantifier=arguments.length-argumentPointer;}
if(quantifier>(arguments.length-argumentPointer)){throw new Error('Warning:  pack() Type '+instruction+': too few arguments');}
for(i=0;i<quantifier;i++){result+=String.fromCharCode(arguments[argumentPointer]>>8&0xFF);result+=String.fromCharCode(arguments[argumentPointer]&0xFF);argumentPointer++;}
break;case'i':case'I':case'l':case'L':case'V':if(quantifier==='*'){quantifier=arguments.length-argumentPointer;}
if(quantifier>(arguments.length-argumentPointer)){throw new Error('Warning:  pack() Type '+instruction+': too few arguments');}
for(i=0;i<quantifier;i++){result+=String.fromCharCode(arguments[argumentPointer]&0xFF);result+=String.fromCharCode(arguments[argumentPointer]>>8&0xFF);result+=String.fromCharCode(arguments[argumentPointer]>>16&0xFF);result+=String.fromCharCode(arguments[argumentPointer]>>24&0xFF);argumentPointer++;}
break;case'N':if(quantifier==='*'){quantifier=arguments.length-argumentPointer;}
if(quantifier>(arguments.length-argumentPointer)){throw new Error('Warning:  pack() Type '+instruction+': too few arguments');}
for(i=0;i<quantifier;i++){result+=String.fromCharCode(arguments[argumentPointer]>>24&0xFF);result+=String.fromCharCode(arguments[argumentPointer]>>16&0xFF);result+=String.fromCharCode(arguments[argumentPointer]>>8&0xFF);result+=String.fromCharCode(arguments[argumentPointer]&0xFF);argumentPointer++;}
break;case'f':case'd':precisionBits=23;exponentBits=8;if(instruction==='d'){precisionBits=52;exponentBits=11;}
if(quantifier==='*'){quantifier=arguments.length-argumentPointer;}
if(quantifier>(arguments.length-argumentPointer)){throw new Error('Warning:  pack() Type '+instruction+': too few arguments');}
for(i=0;i<quantifier;i++){argument=arguments[argumentPointer];bias=Math.pow(2,exponentBits-1)-1;minExp=-bias+1;maxExp=bias;minUnnormExp=minExp-precisionBits;status=isNaN(n=parseFloat(argument))||n===-Infinity||n===+Infinity?n:0;exp=0;len=2*bias+1+precisionBits+3;bin=new Array(len);signal=(n=status!==0?0:n)<0;n=Math.abs(n);intPart=Math.floor(n);floatPart=n-intPart;for(k=len;k;){bin[--k]=0;}
for(k=bias+2;intPart&&k;){bin[--k]=intPart%2;intPart=Math.floor(intPart/2);}
for(k=bias+1;floatPart>0&&k;--floatPart){(bin[++k]=((floatPart*=2)>=1)-0);}
for(k=-1;++k<len&&!bin[k];){}
if(bin[(lastBit=precisionBits-1+
(k=(exp=bias+1-k)>=minExp&&exp<=maxExp?k+1:bias+1-(exp=minExp-1)))+1]){if(!(rounded=bin[lastBit])){for(j=lastBit+2;!rounded&&j<len;rounded=bin[j++]){}}
for(j=lastBit+1;rounded&&--j>=0;(bin[j]=!bin[j]-0)&&(rounded=0)){}}
for(k=k-2<0?-1:k-3;++k<len&&!bin[k];){}
if((exp=bias+1-k)>=minExp&&exp<=maxExp){++k;}else{if(exp<minExp){if(exp!==bias+1-len&&exp<minUnnormExp){}
k=bias+1-(exp=minExp-1);}}
if(intPart||status!==0){exp=maxExp+1;k=bias+2;if(status===-Infinity){signal=1;}else if(isNaN(status)){bin[k]=1;}}
n=Math.abs(exp+bias);tmpResult='';for(j=exponentBits+1;--j;){tmpResult=(n%2)+tmpResult;n=n>>=1;}
n=0;j=0;k=(tmpResult=(signal?'1':'0')+tmpResult+
bin.slice(k,k+precisionBits).join('')).length;r=[];for(;k;){n+=(1<<j)*tmpResult.charAt(--k);if(j===7){r[r.length]=String.fromCharCode(n);n=0;}
j=(j+1)%8;}
r[r.length]=n?String.fromCharCode(n):'';result+=r.join('');argumentPointer++;}
break;case'x':if(quantifier==='*'){throw new Error('Warning: pack(): Type x: \'*\' ignored');}
for(i=0;i<quantifier;i++){result+=String.fromCharCode(0);}
break;case'X':if(quantifier==='*'){throw new Error('Warning: pack(): Type X: \'*\' ignored');}
for(i=0;i<quantifier;i++){if(result.length===0){throw new Error('Warning: pack(): Type X:'+' outside of string');}else{result=result.substring(0,result.length-1);}}
break;case'@':if(quantifier==='*'){throw new Error('Warning: pack(): Type X: \'*\' ignored');}
if(quantifier>result.length){extraNullCount=quantifier-result.length;for(i=0;i<extraNullCount;i++){result+=String.fromCharCode(0);}}
if(quantifier<result.length){result=result.substring(0,quantifier);}
break;default:throw new Error('Warning:  pack() Type '+instruction+': unknown format code');}}
if(argumentPointer<arguments.length){throw new Error('Warning: pack(): '+
(arguments.length-argumentPointer)+' arguments unused');}
return result;}
function parse_str(str,array){var glue1='=',glue2='&',array2=String(str).split(glue2),i,j,chr,tmp,key,value,bracket,keys,evalStr,that=this,fixStr=function(str){return that.urldecode(str).replace(/([\\"'])/g,'\\$1').replace(/\n/g,'\\n').replace(/\r/g,'\\r');};if(!array){array=this.window;}
for(i=0;i<array2.length;i++){tmp=array2[i].split(glue1);if(tmp.length<2){tmp=[tmp,''];}
key=fixStr(tmp[0]);value=fixStr(tmp[1]);while(key.charAt(0)===' '){key=key.substr(1);}
if(key.indexOf('\0')!==-1){key=key.substr(0,key.indexOf('\0'));}
if(key&&key.charAt(0)!=='['){keys=[];bracket=0;for(j=0;j<key.length;j++){if(key.charAt(j)==='['&&!bracket){bracket=j+1;}
else if(key.charAt(j)===']'){if(bracket){if(!keys.length){keys.push(key.substr(0,bracket-1));}
keys.push(key.substr(bracket,j-bracket));bracket=0;if(key.charAt(j+1)!=='['){break;}}}}
if(!keys.length){keys=[key];}
for(j=0;j<keys[0].length;j++){chr=keys[0].charAt(j);if(chr===' '||chr==='.'||chr==='['){keys[0]=keys[0].substr(0,j)+'_'+keys[0].substr(j+1);}
if(chr==='['){break;}}
evalStr='array';for(j=0;j<keys.length;j++){key=keys[j];if((key!==''&&key!==' ')||j===0){key="'"+key+"'";}
else{key=eval(evalStr+'.push([]);')-1;}
evalStr+='['+key+']';if(j!==keys.length-1&&eval('typeof '+evalStr)==='undefined'){eval(evalStr+' = [];');}}
evalStr+=" = '"+value+"';\n";eval(evalStr);}}}
function parse_url(str,component){var o={strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var m=o.parser[o.strictMode?"strict":"loose"].exec(str),uri={},i=14;while(i--){uri[o.key[i]]=m[i]||"";}
switch(component){case'PHP_URL_SCHEME':return uri.protocol;case'PHP_URL_HOST':return uri.host;case'PHP_URL_PORT':return uri.port;case'PHP_URL_USER':return uri.user;case'PHP_URL_PASS':return uri.password;case'PHP_URL_PATH':return uri.path;case'PHP_URL_QUERY':return uri.query;case'PHP_URL_FRAGMENT':return uri.anchor;default:var retArr={};if(uri.protocol!==''){retArr.scheme=uri.protocol;}
if(uri.host!==''){retArr.host=uri.host;}
if(uri.port!==''){retArr.port=uri.port;}
if(uri.user!==''){retArr.user=uri.user;}
if(uri.password!==''){retArr.pass=uri.password;}
if(uri.path!==''){retArr.path=uri.path;}
if(uri.query!==''){retArr.query=uri.query;}
if(uri.anchor!==''){retArr.fragment=uri.anchor;}
return retArr;}}
function pathinfo(path,options){var opt='',optName='',optTemp=0,tmp_arr={},cnt=0,i=0;var have_basename=false,have_extension=false,have_filename=false;if(!path){return false;}
if(!options){options='PATHINFO_ALL';}
var OPTS={'PATHINFO_DIRNAME':1,'PATHINFO_BASENAME':2,'PATHINFO_EXTENSION':4,'PATHINFO_FILENAME':8,'PATHINFO_ALL':0};for(optName in OPTS){OPTS.PATHINFO_ALL=OPTS.PATHINFO_ALL|OPTS[optName];}
if(typeof options!=='number'){options=[].concat(options);for(i=0;i<options.length;i++){if(OPTS[options[i]]){optTemp=optTemp|OPTS[options[i]];}}
options=optTemp;}
var __getExt=function(path){var str=path+'';var dotP=str.lastIndexOf('.')+1;return str.substr(dotP);};if(options&OPTS.PATHINFO_DIRNAME){tmp_arr.dirname=this.dirname(path);}
if(options&OPTS.PATHINFO_BASENAME){if(false===have_basename){have_basename=this.basename(path);}
tmp_arr.basename=have_basename;}
if(options&OPTS.PATHINFO_EXTENSION){if(false===have_basename){have_basename=this.basename(path);}
if(false===have_extension){have_extension=__getExt(have_basename);}
tmp_arr.extension=have_extension;}
if(options&OPTS.PATHINFO_FILENAME){if(false===have_basename){have_basename=this.basename(path);}
if(false===have_extension){have_extension=__getExt(have_basename);}
if(false===have_filename){have_filename=have_basename.substr(0,(have_basename.length-have_extension.length)-1);}
tmp_arr.filename=have_filename;}
cnt=0;for(opt in tmp_arr){cnt++;}
if(cnt==1){return tmp_arr[opt];}
return tmp_arr;}
function pclose(handle){if(!handle||handle.opener!=='popen'){return false;}
try{delete this.php_js.resourceDataPointer[handle.id];delete this.php_js.resourceData[handle.id];}
catch(e){return false;}
return true;}
function php_ini_loaded_file(){if(!this.php_js||!this.php_js.ini_loaded_file){return false;}
return this.php_js.ini_loaded_file;}
function php_ini_scanned_files(){if(!this.php_js||!this.php_js.ini_scanned_files){return false;}
return this.php_js.ini_scanned_files;}
function php_strip_whitespace(file){try{var str=this.file_get_contents(file);}catch(e){return'';}
return str.replace(/\/\/.*?\n/g,'').replace(/\/\*[\s\S]*?\*\//g,'').replace(/[ \f\r\t\v\u00A0\u2028\u2029]+/g,' ').replace(/\s*\n+/g,'\n').replace(/^\s+/gm,'').replace(/\s*$/gm,'');}
function phpversion(){var xhtml=true,s={},firstScript={},d=this.window.document,c='createElement',cn='createElementNS',xn='http://www.w3.org/1999/xhtml',g='getElementsByTagName',gn='getElementsByTagNameNS';this.php_js=this.php_js||{};var getVersion=function(app){var att='',minVers=0,versionString='',temp_jsversion=undefined;if(this.php_js.jsversion!==undefined){return this.php_js.jsversion;}
while(this.php_js.jsversion===temp_jsversion&&minVers<10){temp_jsversion='1.'+minVers;if(gn){firstScript=d[gn](xn,'script')[0];}
if(!firstScript){firstScript=d[g]('script')[0];xhtml=false;}
if(d[cn]&&xhtml){s=d[cn](xn,'script');}
else{s=d[c]('script');}
if(app){att='type';versionString='application/javascript;version=1.';}
else{att='language';versionString='JavaScript1.';}
s.setAttribute(att,versionString+minVers);s.appendChild(d.createTextNode("this.php_js.jsversion="+"'1."+minVers+"'"));firstScript.parentNode.insertBefore(s,firstScript);s.parentNode.removeChild(s);minVers++;}
return this.php_js.jsversion;};getVersion(true);getVersion(false);return this.php_js.jsversion;}
function pi(){return Math.PI;}
function popen(filename,mode,use_include_path,context){var resource={},i=0,that=this;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};var file_get_contents=function(url){var req=that.window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req){throw new Error('XMLHttpRequest not supported');}
if(!(/^http/).test(url)){url=that.window.location.href+'/'+url;}
req.open("GET",url,false);req.send(null);return req.responseText;};if(use_include_path===1||use_include_path==='1'||use_include_path===true){}
if(context){}
for(i=0;i<mode.length;i++){switch(mode[i]){case'r':if(!mode[i+1]||mode[i+1]!=='+'){break;}
case'w':case'a':case'x':throw'Writing is not implemented';case'b':case't':throw'Windows-only modes are not supported';default:throw'Unrecognized file mode passed to '+getFuncName(arguments.caller)+'()';}}
this.php_js=this.php_js||{};this.php_js.resourceData=this.php_js.resourceData||{};this.php_js.resourceDataPointer=this.php_js.resourceDataPointer||{};this.php_js.resourceIdCounter=this.php_js.resourceIdCounter||0;function PHPJS_Resource(type,id,opener){this.type=type;this.id=id;this.opener=opener;}
PHPJS_Resource.prototype.toString=function(){return'Resource id #'+this.id;};PHPJS_Resource.prototype.get_resource_type=function(){return this.type;};PHPJS_Resource.prototype.var_dump=function(){return'resource('+this.id+') of type ('+this.type+')';};this.php_js.resourceIdCounter++;this.php_js.resourceData[this.php_js.resourceIdCounter]=this.file_get_contents(filename);this.php_js.resourceDataPointer[this.php_js.resourceIdCounter]=0;resource=new PHPJS_Resource('stream',this.php_js.resourceIdCounter,'popen');resource.mode=mode;return resource;}
function pos(arr){return this.current(arr);}
function pow(base,exp){return Math.pow(base,exp);}
function preg_grep(pattern,input,flags){var p='',retObj={};var invert=(flags===1||flags==='PREG_GREP_INVERT');if(typeof pattern==='string'){pattern=eval(pattern);}
if(invert){for(p in input){if(!pattern.test(input[p])){retObj[p]=input[p];}}}else{for(p in input){if(pattern.test(input[p])){retObj[p]=input[p];}}}
return retObj;}
function preg_quote(str){return(str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!<>\|\:])/g,"\\$1");}
function prev(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;var arrpos=pointers.indexOf(arr);var cursor=pointers[arrpos+1];if(pointers.indexOf(arr)===-1||cursor===0){return false;}
if(!(arr instanceof Array)){var ct=0;for(var k in arr){if(ct===cursor-1){pointers[arrpos+1]-=1;return arr[k];}
ct++;}}
if(arr.length===0){return false;}
pointers[arrpos+1]-=1;return arr[pointers[arrpos+1]];}
function print_r(array,return_val){var output="",pad_char=" ",pad_val=4,d=this.window.document;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};var repeat_char=function(len,pad_char){var str="";for(var i=0;i<len;i++){str+=pad_char;}
return str;};var formatArray=function(obj,cur_depth,pad_val,pad_char){if(cur_depth>0){cur_depth++;}
var base_pad=repeat_char(pad_val*cur_depth,pad_char);var thick_pad=repeat_char(pad_val*(cur_depth+1),pad_char);var str="";if(typeof obj==='object'&&obj!==null&&obj.constructor&&getFuncName(obj.constructor)!=='PHPJS_Resource'){str+="Array\n"+base_pad+"(\n";for(var key in obj){if(obj[key]instanceof Array){str+=thick_pad+"["+key+"] => "+formatArray(obj[key],cur_depth+1,pad_val,pad_char);}else{str+=thick_pad+"["+key+"] => "+obj[key]+"\n";}}
str+=base_pad+")\n";}else if(obj===null||obj===undefined){str='';}else{str=obj.toString();}
return str;};output=formatArray(array,0,pad_val,pad_char);if(return_val!==true){if(d.body){this.echo(output);}
else{try{d=XULDocument;this.echo('<pre xmlns="http://www.w3.org/1999/xhtml" style="white-space:pre;">'+output+'</pre>');}
catch(e){this.echo(output);}}
return true;}else{return output;}}
function printf(){var body,elmt,d=this.window.document;var ret='';var HTMLNS='http://www.w3.org/1999/xhtml';body=d.getElementsByTagNameNS?(d.getElementsByTagNameNS(HTMLNS,'body')[0]?d.getElementsByTagNameNS(HTMLNS,'body')[0]:d.documentElement.lastChild):d.getElementsByTagName('body')[0];if(!body){return false;}
ret=this.sprintf.apply(this,arguments);elmt=d.createTextNode(ret);body.appendChild(elmt);return ret.length;}
function property_exists(cls,prop){cls=(typeof cls==='string')?this.window[cls]:cls;if(typeof cls==='function'&&cls.toSource&&cls.toSource().match(new RegExp('this\\.'+prop+'\\s'))){return true;}
return(cls[prop]!==undefined&&typeof cls[prop]!=='function')||(cls.prototype!==undefined&&cls.prototype[prop]!==undefined&&typeof cls.prototype[prop]!=='function')||(cls.constructor&&cls.constructor[prop]!==undefined&&typeof cls.constructor[prop]!=='function');}
function putenv(setting){this.php_js=this.php_js||{};this.php_js.ENV=this.php_js.ENV||{};var pos=setting.indexOf('=');this.php_js.ENV[setting.slice(0,pos)]=setting.slice(pos+1);return true;}
function quoted_printable_decode(str){var RFC2045Decode1=/=\r\n/gm,RFC2045Decode2IN=/=([0-9A-F]{2})/gim,RFC2045Decode2OUT=function(sMatch,sHex){return String.fromCharCode(parseInt(sHex,16));};return str.replace(RFC2045Decode1,'').replace(RFC2045Decode2IN,RFC2045Decode2OUT);}
function quoted_printable_encode(str){var hexChars=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'],RFC2045Encode1IN=/ \r\n|\r\n|[^!-<>-~ ]/gm,RFC2045Encode1OUT=function(sMatch){if(sMatch.length>1){return sMatch.replace(' ','=20');}
var chr=sMatch.charCodeAt(0);return'='+hexChars[((chr>>>4)&15)]+hexChars[(chr&15)];},RFC2045Encode2IN=/.{1,72}(?!\r\n)[^=]{0,3}/g,RFC2045Encode2OUT=function(sMatch){if(sMatch.substr(sMatch.length-2)==='\r\n'){return sMatch;}
return sMatch+'=\r\n';};str=str.replace(RFC2045Encode1IN,RFC2045Encode1OUT).replace(RFC2045Encode2IN,RFC2045Encode2OUT);return str.substr(0,str.length-3);}
function quotemeta(str){return(str+'').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g,'\\$1');}
function rad2deg(angle){return(angle/Math.PI)*180;}
function rand(min,max){var argc=arguments.length;if(argc===0){min=0;max=2147483647;}else if(argc===1){throw new Error('Warning: rand() expects exactly 2 parameters, 1 given');}
return Math.floor(Math.random()*(max-min+1))+min;}
function range(low,high,step){var matrix=[];var inival,endval,plus;var walker=step||1;var chars=false;if(!isNaN(low)&&!isNaN(high)){inival=low;endval=high;}else if(isNaN(low)&&isNaN(high)){chars=true;inival=low.charCodeAt(0);endval=high.charCodeAt(0);}else{inival=(isNaN(low)?0:low);endval=(isNaN(high)?0:high);}
plus=((inival>endval)?false:true);if(plus){while(inival<=endval){matrix.push(((chars)?String.fromCharCode(inival):inival));inival+=walker;}}else{while(inival>=endval){matrix.push(((chars)?String.fromCharCode(inival):inival));inival-=walker;}}
return matrix;}
function rawurldecode(str){return decodeURIComponent(str);}
function rawurlencode(str){str=(str+'').toString();return encodeURIComponent(str).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A');}
function readfile(filename,use_include_path,context){var read_data=this.file_get_contents(filename,use_include_path,context);this.echo(read_data);return read_data;}
function realpath(path){var p=0,arr=[];var r=this.window.location.href;path=(path+'').replace('\\','/');if(path.indexOf('://')!==-1){p=1;}
if(!p){path=r.substring(0,r.lastIndexOf('/')+1)+path;}
arr=path.split('/');path=[];for(var k in arr){if(arr[k]=='.'){continue;}
if(arr[k]=='..'){if(path.length>3){path.pop();}}
else{if((path.length<2)||(arr[k]!=='')){path.push(arr[k]);}}}
return path.join('/');}
function register_shutdown_function(cb){var args=[];args=Array.prototype.slice.call(arguments,1);this.window.addEventListener('unload',function(){cb.apply(null,args);},false);}
function require(filename){var d=this.window.document;var js_code=this.file_get_contents(filename);var script_block=d.createElementNS?d.createElementNS('http://www.w3.org/1999/xhtml','script'):d.createElement('script');script_block.type='text/javascript';var client_pc=navigator.userAgent.toLowerCase();if((client_pc.indexOf("msie")!=-1)&&(client_pc.indexOf("opera")==-1)){script_block.text=js_code;}else{script_block.appendChild(d.createTextNode(js_code));}
if(typeof(script_block)!="undefined"){d.getElementsByTagNameNS?d.getElementsByTagNameNS('http://www.w3.org/1999/xhtml','head')[0].appendChild(script_block):d.getElementsByTagName('head')[0].appendChild(script_block);var cur_file={};cur_file[this.window.location.href]=1;this.php_js=this.php_js||{};if(!this.php_js.includes){this.php_js.includes=cur_file;}
if(!this.php_js.includes[filename]){this.php_js.includes[filename]=1;return 1;}else{return++this.php_js.includes[filename];}}
return 0;}
function require_once(filename){var cur_file={};cur_file[this.window.location.href]=1;try{php_js_shared;}
catch(e){php_js_shared={};}
if(!php_js_shared.includes){php_js_shared.includes=cur_file;}
if(!php_js_shared.includes[filename]){if(this.require(filename)){return true;}}else{return true;}
return false;}
function reset(arr){this.php_js=this.php_js||{};this.php_js.pointers=this.php_js.pointers||[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}
var arrpos=pointers.indexOf(arr);if(!(arr instanceof Array)){for(var k in arr){if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}else{pointers[arrpos+1]=0;}
return arr[k];}
return false;}
if(arr.length===0){return false;}
pointers[arrpos+1]=0;return arr[pointers[arrpos+1]];}
function restore_include_path(){if(this.php_js&&this.php_js.ini&&this.php_js.ini.include_path){this.php_js.ini.include_path.local_value=this.php_js.ini.include_path.global_value;}}
function rewind(handle){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||!handle||!handle.constructor||getFuncName(handle.constructor)!=='PHPJS_Resource'){return false;}
this.php_js.resourceDataPointer[handle.id]=0;return true;}
function round(val,precision,mode){var retVal=0,v='',integer='',decimal='',decp=0,negative=false;var _round_half_oe=function(dtR,dtLa,even){if(even===true){if(dtLa==50){if((dtR%2)===1){if(dtLa>=5){dtR+=1;}else{dtR-=1;}}}else if(dtLa>=5){dtR+=1;}}else{if(dtLa==5){if((dtR%2)===0){if(dtLa>=5){dtR+=1;}else{dtR-=1;}}}else if(dtLa>=5){dtR+=1;}}
return dtR;};var _round_half_ud=function(dtR,dtLa,up){if(up===true){if(dtLa>=5){dtR+=1;}}else{if(dtLa>5){dtR+=1;}}
return dtR;};var _round_half=function(val,decplaces,mode){var v=val.toString(),vlen=0,vlenDif=0;var decp=v.indexOf('.');var digitToRound=0,digitToLookAt=0;var integer='',decimal='';var round=null,bool=false;switch(mode){case'up':bool=true;case'down':round=_round_half_ud;break;case'even':bool=true;case'odd':round=_round_half_oe;break;}
if(decplaces<0){vlen=v.length;decplaces=vlen+decplaces;digitToLookAt=Number(v.charAt(decplaces));digitToRound=Number(v.charAt(decplaces-1));digitToRound=round(digitToRound,digitToLookAt,bool);v=v.slice(0,decplaces-1);vlenDif=vlen-v.length-1;if(digitToRound==10){v=String(Number(v)+1)+"0";}else{v+=digitToRound;}
v=Number(v)*(Math.pow(10,vlenDif));}else if(decplaces>0){integer=v.slice(0,decp);decimal=v.slice(decp+1);digitToLookAt=Number(decimal.charAt(decplaces));digitToRound=Number(decimal.charAt(decplaces-1));digitToRound=round(digitToRound,digitToLookAt,bool);decimal=decimal.slice(0,decplaces-1);if(digitToRound==10){v=Number(integer+'.'+decimal)+(1*(Math.pow(10,(0-decimal.length))));}else{v=Number(integer+'.'+decimal+digitToRound);}}else{integer=v.slice(0,decp);decimal=v.slice(decp+1);digitToLookAt=Number(decimal.charAt(decplaces));digitToRound=Number(integer.charAt(integer.length-1));digitToRound=round(digitToRound,digitToLookAt,bool);decimal='0';integer=integer.slice(0,integer.length-1);if(digitToRound==10){v=Number(integer)+1;}else{v=Number(integer+digitToRound);}}
return v;};if(typeof precision=='undefined'){precision=0;}
if(typeof mode=='undefined'){mode='PHP_ROUND_HALF_UP';}
if(val<0){negative=true;}else{negative=false;}
v=Math.abs(val).toString();decp=v.indexOf('.');if((decp==-1)&&(precision>=0)){return val;}else{if(decp==-1){integer=v;decimal='0';}else{integer=v.slice(0,decp);if(precision>=0){decimal=v.substr(decp+1,precision+1);}else{decimal='0';}}
if((precision>0)&&(precision>=decimal.length)){return val;}else if((precision<0)&&(Math.abs(precision)>=integer.length)){return 0;}
val=Number(integer+'.'+decimal);}
switch(mode){case 0:case'PHP_ROUND_HALF_UP':retVal=_round_half(val,precision,'up');break;case 1:case'PHP_ROUND_HALF_DOWN':retVal=_round_half(val,precision,'down');break;case 2:case'PHP_ROUND_HALF_EVEN':retVal=_round_half(val,precision,'even');break;case 3:case'PHP_ROUND_HALF_ODD':retVal=_round_half(val,precision,'odd');break;}
if(negative){return 0-retVal;}else{return retVal;}}
function rsort(inputArr,sort_flags){var valArr=[],k='',i=0,sorter=false,that=this,strictForIn=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return that.strnatcmp(b,a);};break;case'SORT_LOCALE_STRING':var loc=this.i18n_loc_get_default();sorter=this.php_js.i18nLocales[loc].sorting;break;case'SORT_NUMERIC':sorter=function(a,b){return(b-a);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a<b){return 1;}
if(a>b){return-1;}
return 0;};break;}
this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);if(strictForIn){delete inputArr[k];}}}
valArr.sort(sorter);for(i=0;i<valArr.length;i++){populateArr[i]=valArr[i];}
return strictForIn?true:populateArr;}
function rtrim(str,charlist){charlist=!charlist?' \\s\u00A0':(charlist+'').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g,'\\$1');var re=new RegExp('['+charlist+']+$','g');return(str+'').replace(re,'');}
function runkit_class_adopt(classname,parentname){if(typeof this.window[classname]!=='function'||typeof this.window[parentname]!=='function'){return false;}
this.window[classname].prototype=new this.window[parentname]();this.window[classname].constructor=this.window[classname];return true;}
function runkit_class_emancipate(classname){if(typeof this.window[classname]!=='function'){return false;}
for(var p in this.window[classname].prototype){delete this.window[classname].prototype[p];}
return true;}
function runkit_function_add(funcname,arglist,code){if(this.window[funcname]!==undefined){return false;}
try{this.window[funcname]=Function.apply(null,arglist.split(',').concat(code));}
catch(e){return false;}
return true;}
function runkit_function_copy(funcname,targetname){if(typeof this.window[funcname]!=='function'||this.window[targetname]!==undefined){return false;}
this.window[targetname]=this.window[funcname];return true;}
function runkit_function_redefine(funcname,arglist,code){if(this.window[funcname]===undefined){return false;}
try{this.window[funcname]=Function.apply(null,arglist.split(',').concat(code));}
catch(e){return false;}
return true;}
function runkit_function_remove(funcname){if(this.window[funcname]===undefined){return false;}
try{this.window[funcname]=undefined;}
catch(e){return false;}
return true;}
function runkit_function_rename(funcname,newname){if(typeof this.window[newname]!=='function'||this.window[funcname]!==undefined){return false;}
this.window[newname]=this.window[funcname];this.window[funcname]=undefined;return true;}
function runkit_import(file,flags){if(flags){throw'Flags not supported for runkit_import';}
eval(this.file_get_contents(file));}
function runkit_method_add(classname,methodname,args,code,flags){var func,argmnts=[];switch(flags){case'RUNKIT_ACC_PROTECTED':throw'Protected not supported';case'RUNKIT_ACC_PRIVATE':throw'Private not supported';case'RUNKIT_ACC_PUBLIC':default:break;}
argmnts=args.split(/,\s*/);if(typeof classname==='string'){classname=this.window[classname];}
func=Function.apply(null,argmnts.concat(code));classname.prototype[methodname]=func;return true;}
function runkit_method_copy(dClass,dMethod,sClass,sMethod){sMethod=sMethod||dMethod;if(typeof dClass==='string'){dClass=this.window[dClass];}
if(typeof sClass==='string'){sClass=this.window[sClass];}
dClass.prototype[dMethod]=sClass.prototype[sMethod];return true;}
function runkit_method_redefine(classname,methodname,args,code,flags){var argmnts=[],func;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};switch(flags){case'RUNKIT_ACC_PROTECTED':throw'Protected not supported';case'RUNKIT_ACC_PRIVATE':throw'Private not supported';case'RUNKIT_ACC_PUBLIC':default:break;}
argmnts=args.split(/,\s*/);if(typeof classname==='string'){classname=this.window[classname];}
if(getFuncName(classname)!=='PHP_JS'||(this.php_js&&this.php_js.ini&&this.php_js.ini['runkit.internal_override']&&(this.php_js.ini['runkit.internal_override'].local_value===true||this.php_js.ini['runkit.internal_override'].local_value===1||this.php_js.ini['runkit.internal_override'].local_value==='1'||this.php_js.ini['runkit.internal_override'].local_value==='true'))){func=Function.apply(null,argmnts.concat(code));classname.prototype[methodname]=func;return true;}
return false;}
function runkit_method_remove(classname,methodname){if(typeof classname==='string'){classname=this.window[classname];}
if(getFuncName(classname)!=='PHP_JS'||(this.php_js&&this.php_js.ini&&this.php_js.ini['runkit.internal_override']&&(this.php_js.ini['runkit.internal_override'].local_value===true||this.php_js.ini['runkit.internal_override'].local_value===1||this.php_js.ini['runkit.internal_override'].local_value==='1'||this.php_js.ini['runkit.internal_override'].local_value==='true'))){delete classname.prototype[methodname];return true;}
return false;}
function runkit_method_rename(classname,methodname,newname){var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};if(typeof classname==='string'){classname=this.window[classname];}
if(getFuncName(classname)!=='PHP_JS'||(this.php_js&&this.php_js.ini&&this.php_js.ini['runkit.internal_override']&&(this.php_js.ini['runkit.internal_override'].local_value===true||this.php_js.ini['runkit.internal_override'].local_value===1||this.php_js.ini['runkit.internal_override'].local_value==='1'||this.php_js.ini['runkit.internal_override'].local_value==='true'))){var method=classname.prototype[methodname];classname.prototype[newname]=method;delete classname.prototype[methodname];return true;}
return false;}
function runkit_superglobals(){var superglobal={},p='',arr=[];var superglobals=['$_GET','$_POST','$_REQUEST','$_COOKIE','$_SESSION','$_SERVER','$_ENV','$_FILES'];for(var i=0;i<superglobals.length;i++){superglobal=this.window[superglobals[i]];for(p in superglobal){arr.push(superglobal[p]);}}
return arr;}
function serialize(mixed_value){var _getType=function(inp){var type=typeof inp,match;var key;if(type=='object'&&!inp){return'null';}
if(type=="object"){if(!inp.constructor){return'object';}
var cons=inp.constructor.toString();match=cons.match(/(\w+)\(/);if(match){cons=match[1].toLowerCase();}
var types=["boolean","number","string","array"];for(key in types){if(cons==types[key]){type=types[key];break;}}}
return type;};var type=_getType(mixed_value);var val,ktype='';switch(type){case"function":val="";break;case"boolean":val="b:"+(mixed_value?"1":"0");break;case"number":val=(Math.round(mixed_value)==mixed_value?"i":"d")+":"+mixed_value;break;case"string":mixed_value=this.utf8_encode(mixed_value);val="s:"+encodeURIComponent(mixed_value).replace(/%../g,'x').length+":\""+mixed_value+"\"";break;case"array":case"object":val="a";var count=0;var vals="";var okey;var key;for(key in mixed_value){ktype=_getType(mixed_value[key]);if(ktype=="function"){continue;}
okey=(key.match(/^[0-9]+$/)?parseInt(key,10):key);vals+=this.serialize(okey)+
this.serialize(mixed_value[key]);count++;}
val+=":"+count+":{"+vals+"}";break;case"undefined":default:val="N";break;}
if(type!="object"&&type!="array"){val+=";";}
return val;}
function set_include_path(new_include_path){this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};var old_path=this.php_js.ini.include_path&&this.php_js.ini.include_path.local_value;if(!old_path){this.php_js.ini.include_path={global_value:new_include_path,local_value:new_include_path};}
else{this.php_js.ini.include_path.global_value=new_include_path;this.php_js.ini.include_path.local_value=new_include_path;}
return old_path;}
function set_time_limit(seconds){this.php_js=this.php_js||{};this.window.setTimeout(function(){if(!this.php_js.timeoutStatus){this.php_js.timeoutStatus=true;}
throw'Maximum execution time exceeded';},seconds*1000);}
function setcookie(name,value,expires,path,domain,secure){return this.setrawcookie(name,encodeURIComponent(value),expires,path,domain,secure);}
function setlocale(category,locale){var categ='',cats=[],i=0,d=this.window.document;var _copy=function _copy(orig){var newObj={};for(var i in orig){if(typeof orig[i]==='object'){newObj[i]=_copy(orig[i]);}
else{newObj[i]=orig[i];}}
return newObj;};var _nplurals1=function(n){return 0;};var _nplurals2a=function(n){return n!==1?1:0;};var _nplurals2b=function(n){return n>1?1:0;};var _nplurals2c=function(n){return n%10===1&&n%100!==11?0:1;};var _nplurals3a=function(n){return n%10===1&&n%100!==11?0:n!==0?1:2;};var _nplurals3b=function(n){return n===1?0:n===2?1:2;};var _nplurals3c=function(n){return n===1?0:(n===0||(n%100>0&&n%100<20))?1:2;};var _nplurals3d=function(n){return n%10===1&&n%100!==11?0:n%10>=2&&(n%100<10||n%100>=20)?1:2;};var _nplurals3e=function(n){return n%10===1&&n%100!==11?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2;};var _nplurals3f=function(n){return n===1?0:n>=2&&n<=4?1:2;};var _nplurals3g=function(n){return n===1?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2;};var _nplurals3h=function(n){return n%10===1?0:n%10===2?1:2;};var _nplurals4a=function(n){return n%100===1?0:n%100===2?1:n%100===3||n%100===4?2:3;};var _nplurals4b=function(n){return n===1?0:n===0||(n%100&&n%100<=10)?1:n%100>=11&&n%100<=19?2:3;};var _nplurals5=function(n){return n===1?0:n===2?1:n>=3&&n<=6?2:n>=7&&n<=10?3:4;};var _nplurals6=function(n){return n===0?5:n===1?0:n===2?1:n%100>=3&&n%100<=10?2:n%100>=11&&n%100<=99?3:4;};this.php_js=this.php_js||{};var phpjs=this.php_js;if(!phpjs.locales){phpjs.locales={};phpjs.locales.en={'LC_COLLATE':function(str1,str2){return(str1==str2)?0:((str1>str2)?1:-1);},'LC_CTYPE':{an:/^[A-Za-z\d]+$/g,al:/^[A-Za-z]+$/g,ct:/^[\u0000-\u001F\u007F]+$/g,dg:/^[\d]+$/g,gr:/^[\u0021-\u007E]+$/g,lw:/^[a-z]+$/g,pr:/^[\u0020-\u007E]+$/g,pu:/^[\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]+$/g,sp:/^[\f\n\r\t\v ]+$/g,up:/^[A-Z]+$/g,xd:/^[A-Fa-f\d]+$/g,CODESET:'UTF-8',lower:'abcdefghijklmnopqrstuvwxyz',upper:'ABCDEFGHIJKLMNOPQRSTUVWXYZ'},'LC_TIME':{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 %r %Z',p:['AM','PM'],P:['am','pm'],r:'%I:%M:%S %p',x:'%m/%d/%Y',X:'%r',alt_digits:'',ERA:'',ERA_YEAR:'',ERA_D_T_FMT:'',ERA_D_FMT:'',ERA_T_FMT:''},'LC_MONETARY':{int_curr_symbol:'USD',currency_symbol:'$',mon_decimal_point:'.',mon_thousands_sep:',',mon_grouping:[3],positive_sign:'',negative_sign:'-',int_frac_digits:2,frac_digits:2,p_cs_precedes:1,p_sep_by_space:0,n_cs_precedes:1,n_sep_by_space:0,p_sign_posn:3,n_sign_posn:0},'LC_NUMERIC':{decimal_point:'.',thousands_sep:',',grouping:[3]},'LC_MESSAGES':{YESEXPR:'^[yY].*',NOEXPR:'^[nN].*',YESSTR:'',NOSTR:''},nplurals:_nplurals2a};phpjs.locales.en_US=_copy(phpjs.locales.en);phpjs.locales.en_US.LC_TIME.c='%a %d %b %Y %r %Z';phpjs.locales.en_US.LC_TIME.x='%D';phpjs.locales.en_US.LC_TIME.X='%r';phpjs.locales.en_US.LC_MONETARY.int_curr_symbol='USD ';phpjs.locales.en_US.LC_MONETARY.p_sign_posn=1;phpjs.locales.en_US.LC_MONETARY.n_sign_posn=1;phpjs.locales.en_US.LC_MONETARY.mon_grouping=[3,3];phpjs.locales.en_US.LC_NUMERIC.thousands_sep='';phpjs.locales.en_US.LC_NUMERIC.grouping=[];phpjs.locales.en_GB=_copy(phpjs.locales.en);phpjs.locales.en_GB.LC_TIME.r='%l:%M:%S %P %Z';phpjs.locales.en_AU=_copy(phpjs.locales.en_GB);phpjs.locales.C=_copy(phpjs.locales.en);phpjs.locales.C.LC_CTYPE.CODESET='ANSI_X3.4-1968';phpjs.locales.C.LC_MONETARY={int_curr_symbol:'',currency_symbol:'',mon_decimal_point:'',mon_thousands_sep:'',mon_grouping:[],p_cs_precedes:127,p_sep_by_space:127,n_cs_precedes:127,n_sep_by_space:127,p_sign_posn:127,n_sign_posn:127,positive_sign:'',negative_sign:'',int_frac_digits:127,frac_digits:127};phpjs.locales.C.LC_NUMERIC={decimal_point:'.',thousands_sep:'',grouping:[]};phpjs.locales.C.LC_TIME.c='%a %b %e %H:%M:%S %Y';phpjs.locales.C.LC_TIME.x='%m/%d/%y';phpjs.locales.C.LC_TIME.X='%H:%M:%S';phpjs.locales.C.LC_MESSAGES.YESEXPR='^[yY]';phpjs.locales.C.LC_MESSAGES.NOEXPR='^[nN]';phpjs.locales.fr=_copy(phpjs.locales.en);phpjs.locales.fr.nplurals=_nplurals2b;phpjs.locales.fr.LC_TIME.a=['dim','lun','mar','mer','jeu','ven','sam'];phpjs.locales.fr.LC_TIME.A=['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'];phpjs.locales.fr.LC_TIME.b=['jan','f\u00E9v','mar','avr','mai','jun','jui','ao\u00FB','sep','oct','nov','d\u00E9c'];phpjs.locales.fr.LC_TIME.B=['janvier','f\u00E9vrier','mars','avril','mai','juin','juillet','ao\u00FBt','septembre','octobre','novembre','d\u00E9cembre'];phpjs.locales.fr.LC_TIME.c='%a %d %b %Y %T %Z';phpjs.locales.fr.LC_TIME.p=['',''];phpjs.locales.fr.LC_TIME.P=['',''];phpjs.locales.fr.LC_TIME.x='%d.%m.%Y';phpjs.locales.fr.LC_TIME.X='%T';phpjs.locales.fr_CA=_copy(phpjs.locales.fr);phpjs.locales.fr_CA.LC_TIME.x='%Y-%m-%d';}
if(!phpjs.locale){phpjs.locale='en_US';var NS_XHTML='http://www.w3.org/1999/xhtml';var NS_XML='http://www.w3.org/XML/1998/namespace';if(d.getElementsByTagNameNS&&d.getElementsByTagNameNS(NS_XHTML,'html')[0]){if(d.getElementsByTagNameNS(NS_XHTML,'html')[0].getAttributeNS&&d.getElementsByTagNameNS(NS_XHTML,'html')[0].getAttributeNS(NS_XML,'lang')){phpjs.locale=d.getElementsByTagName(NS_XHTML,'html')[0].getAttributeNS(NS_XML,'lang');}else if(d.getElementsByTagNameNS(NS_XHTML,'html')[0].lang){phpjs.locale=d.getElementsByTagNameNS(NS_XHTML,'html')[0].lang;}}else if(d.getElementsByTagName('html')[0]&&d.getElementsByTagName('html')[0].lang){phpjs.locale=d.getElementsByTagName('html')[0].lang;}}
phpjs.locale=phpjs.locale.replace('-','_');if(!(phpjs.locale in phpjs.locales)){if(phpjs.locale.replace(/_[a-zA-Z]+$/,'')in phpjs.locales){phpjs.locale=phpjs.locale.replace(/_[a-zA-Z]+$/,'');}}
if(!phpjs.localeCategories){phpjs.localeCategories={'LC_COLLATE':phpjs.locale,'LC_CTYPE':phpjs.locale,'LC_MONETARY':phpjs.locale,'LC_NUMERIC':phpjs.locale,'LC_TIME':phpjs.locale,'LC_MESSAGES':phpjs.locale};}
if(locale===null||locale===''){locale=this.getenv(category)||this.getenv('LANG');}else if(locale instanceof Array){for(i=0;i<locale.length;i++){if(!(locale[i]in this.php_js.locales)){if(i===locale.length-1){return false;}
continue;}
locale=locale[i];break;}}
if(locale==='0'||locale===0){if(category==='LC_ALL'){for(categ in this.php_js.localeCategories){cats.push(categ+'='+this.php_js.localeCategories[categ]);}
return cats.join(';');}
return this.php_js.localeCategories[category];}
if(!(locale in this.php_js.locales)){return false;}
if(category==='LC_ALL'){for(categ in this.php_js.localeCategories){this.php_js.localeCategories[categ]=locale;}}else{this.php_js.localeCategories[category]=locale;}
return locale;}
function setrawcookie(name,value,expires,path,domain,secure){if(expires instanceof Date){expires=expires.toGMTString();}else if(typeof(expires)=='number'){expires=(new Date(+(new Date())+expires*1e3)).toGMTString();}
var r=[name+"="+value],s={},i='';s={expires:expires,path:path,domain:domain};for(i in s){s[i]&&r.push(i+"="+s[i]);}
return secure&&r.push("secure"),this.window.document.cookie=r.join(";"),true;}
function settype(vr,type){var is_array=function(arr){return typeof arr==='object'&&typeof arr.length==='number'&&!(arr.propertyIsEnumerable('length'))&&typeof arr.splice==='function';};var v,mtch,i,obj;v=this[vr]?this[vr]:vr;try{switch(type){case'boolean':if(is_array(v)&&v.length===0){this[vr]=false;}
else if(v==='0'){this[vr]=false;}
else if(typeof v==='object'&&!is_array(v)){var lgth=false;for(i in v){lgth=true;}
this[vr]=lgth;}
else{this[vr]=!!v;}
break;case'integer':if(typeof v==='number'){this[vr]=parseInt(v,10);}
else if(typeof v==='string'){mtch=v.match(/^([+\-]?)(\d+)/);if(!mtch){this[vr]=0;}
else{this[vr]=parseInt(v,10);}}
else if(v===true){this[vr]=1;}
else if(v===false||v===null){this[vr]=0;}
else if(is_array(v)&&v.length===0){this[vr]=0;}
else if(typeof v==='object'){this[vr]=1;}
break;case'float':if(typeof v==='string'){mtch=v.match(/^([+\-]?)(\d+(\.\d+)?|\.\d+)([eE][+\-]?\d+)?/);if(!mtch){this[vr]=0;}
else{this[vr]=parseFloat(v,10);}}
else if(v===true){this[vr]=1;}
else if(v===false||v===null){this[vr]=0;}
else if(is_array(v)&&v.length===0){this[vr]=0;}
else if(typeof v==='object'){this[vr]=1;}
break;case'string':if(v===null||v===false){this[vr]='';}
else if(is_array(v)){this[vr]='Array';}
else if(typeof v==='object'){this[vr]='Object';}
else if(v===true){this[vr]='1';}
else{this[vr]+='';}
break;case'array':if(v===null){this[vr]=[];}
else if(typeof v!=='object'){this[vr]=[v];}
break;case'object':if(v===null){this[vr]={};}
else if(is_array(v)){for(i=0,obj={};i<v.length;i++){obj[i]=v;}
this[vr]=obj;}
else if(typeof v!=='object'){this[vr]={scalar:v};}
break;case'null':delete this[vr];break;}
return true;}catch(e){return false;}}
function sha1(str){var rotate_left=function(n,s){var t4=(n<<s)|(n>>>(32-s));return t4;};var cvt_hex=function(val){var str="";var i;var v;for(i=7;i>=0;i--){v=(val>>>(i*4))&0x0f;str+=v.toString(16);}
return str;};var blockstart;var i,j;var W=new Array(80);var H0=0x67452301;var H1=0xEFCDAB89;var H2=0x98BADCFE;var H3=0x10325476;var H4=0xC3D2E1F0;var A,B,C,D,E;var temp;str=this.utf8_encode(str);var str_len=str.length;var word_array=[];for(i=0;i<str_len-3;i+=4){j=str.charCodeAt(i)<<24|str.charCodeAt(i+1)<<16|str.charCodeAt(i+2)<<8|str.charCodeAt(i+3);word_array.push(j);}
switch(str_len%4){case 0:i=0x080000000;break;case 1:i=str.charCodeAt(str_len-1)<<24|0x0800000;break;case 2:i=str.charCodeAt(str_len-2)<<24|str.charCodeAt(str_len-1)<<16|0x08000;break;case 3:i=str.charCodeAt(str_len-3)<<24|str.charCodeAt(str_len-2)<<16|str.charCodeAt(str_len-1)<<8|0x80;break;}
word_array.push(i);while((word_array.length%16)!=14){word_array.push(0);}
word_array.push(str_len>>>29);word_array.push((str_len<<3)&0x0ffffffff);for(blockstart=0;blockstart<word_array.length;blockstart+=16){for(i=0;i<16;i++){W[i]=word_array[blockstart+i];}
for(i=16;i<=79;i++){W[i]=rotate_left(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);}
A=H0;B=H1;C=H2;D=H3;E=H4;for(i=0;i<=19;i++){temp=(rotate_left(A,5)+((B&C)|(~B&D))+E+W[i]+0x5A827999)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;}
for(i=20;i<=39;i++){temp=(rotate_left(A,5)+(B^C^D)+E+W[i]+0x6ED9EBA1)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;}
for(i=40;i<=59;i++){temp=(rotate_left(A,5)+((B&C)|(B&D)|(C&D))+E+W[i]+0x8F1BBCDC)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;}
for(i=60;i<=79;i++){temp=(rotate_left(A,5)+(B^C^D)+E+W[i]+0xCA62C1D6)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;}
H0=(H0+A)&0x0ffffffff;H1=(H1+B)&0x0ffffffff;H2=(H2+C)&0x0ffffffff;H3=(H3+D)&0x0ffffffff;H4=(H4+E)&0x0ffffffff;}
temp=cvt_hex(H0)+cvt_hex(H1)+cvt_hex(H2)+cvt_hex(H3)+cvt_hex(H4);return temp.toLowerCase();}
function sha1_file(str_filename){var buf=this.file_get_contents(str_filename);return this.sha1(buf);}
function shuffle(inputArr){var valArr=[],k='',i=0,strictForIn=false,populateArr=[];for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);if(strictForIn){delete inputArr[k];}}}
valArr.sort(function(){return 0.5-Math.random();});this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(i=0;i<valArr.length;i++){populateArr[i]=valArr[i];}
return strictForIn?true:populateArr;}
function sin(arg){return Math.sin(arg);}
function sinh(arg){return(Math.exp(arg)-Math.exp(-arg))/2;}
function sizeof(mixed_var,mode){return this.count(mixed_var,mode);}
function sleep(seconds){var start=new Date().getTime();while(new Date()<start+seconds*1000){}
return 0;}
function sort(inputArr,sort_flags){var valArr=[],keyArr=[],k='',i=0,sorter=false,that=this,strictForIn=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return that.strnatcmp(a,b);};break;case'SORT_LOCALE_STRING':var loc=this.i18n_loc_get_default();sorter=this.php_js.i18nLocales[loc].sorting;break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b){return 1;}
if(a<b){return-1;}
return 0;};break;}
this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);if(strictForIn){delete inputArr[k];}}}
valArr.sort(sorter);for(i=0;i<valArr.length;i++){populateArr[i]=valArr[i];}
return strictForIn?true:populateArr;}
function soundex(str){var s='';var i,j,l,p=isNaN(p)?4:p>10?10:p<4?4:p;var m={BFPV:1,CGJKQSXZ:2,DT:3,L:4,MN:5,R:6};var r=(s=(str+'').toUpperCase().replace(/[^A-Z]/g,"").split("")).splice(0,1);var sl=0;sl=s.length;for(i=-1,l=sl;++i<l;){for(j in m){if(j.indexOf(s[i])+1&&r[r.length-1]!=m[j]&&r.push(m[j])){break;}}}
return r.length>p&&(r.length=p),r.join("")+(new Array(p-r.length+1)).join("0");}
function split(delimiter,string){return this.explode(delimiter,string);}
function sprintf(){var regex=/%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;var a=arguments,i=0,format=a[i++];var pad=function(str,len,chr,leftJustify){if(!chr){chr=' ';}
var padding=(str.length>=len)?'':Array(1+len-str.length>>>0).join(chr);return leftJustify?str+padding:padding+str;};var justify=function(value,prefix,leftJustify,minWidth,zeroPad,customPadChar){var diff=minWidth-value.length;if(diff>0){if(leftJustify||!zeroPad){value=pad(value,minWidth,customPadChar,leftJustify);}else{value=value.slice(0,prefix.length)+pad('',diff,'0',true)+value.slice(prefix.length);}}
return value;};var formatBaseX=function(value,base,prefix,leftJustify,minWidth,precision,zeroPad){var number=value>>>0;prefix=prefix&&number&&{'2':'0b','8':'0','16':'0x'}[base]||'';value=prefix+pad(number.toString(base),precision||0,'0',false);return justify(value,prefix,leftJustify,minWidth,zeroPad);};var formatString=function(value,leftJustify,minWidth,precision,zeroPad,customPadChar){if(precision!=null){value=value.slice(0,precision);}
return justify(value,'',leftJustify,minWidth,zeroPad,customPadChar);};var doFormat=function(substring,valueIndex,flags,minWidth,_,precision,type){var number;var prefix;var method;var textTransform;var value;if(substring=='%%'){return'%';}
var leftJustify=false,positivePrefix='',zeroPad=false,prefixBaseX=false,customPadChar=' ';var flagsl=flags.length;for(var j=0;flags&&j<flagsl;j++){switch(flags.charAt(j)){case' ':positivePrefix=' ';break;case'+':positivePrefix='+';break;case'-':leftJustify=true;break;case"'":customPadChar=flags.charAt(j+1);break;case'0':zeroPad=true;break;case'#':prefixBaseX=true;break;}}
if(!minWidth){minWidth=0;}else if(minWidth=='*'){minWidth=+a[i++];}else if(minWidth.charAt(0)=='*'){minWidth=+a[minWidth.slice(1,-1)];}else{minWidth=+minWidth;}
if(minWidth<0){minWidth=-minWidth;leftJustify=true;}
if(!isFinite(minWidth)){throw new Error('sprintf: (minimum-)width must be finite');}
if(!precision){precision='fFeE'.indexOf(type)>-1?6:(type=='d')?0:undefined;}else if(precision=='*'){precision=+a[i++];}else if(precision.charAt(0)=='*'){precision=+a[precision.slice(1,-1)];}else{precision=+precision;}
value=valueIndex?a[valueIndex.slice(0,-1)]:a[i++];switch(type){case's':return formatString(String(value),leftJustify,minWidth,precision,zeroPad,customPadChar);case'c':return formatString(String.fromCharCode(+value),leftJustify,minWidth,precision,zeroPad);case'b':return formatBaseX(value,2,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'o':return formatBaseX(value,8,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'x':return formatBaseX(value,16,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'X':return formatBaseX(value,16,prefixBaseX,leftJustify,minWidth,precision,zeroPad).toUpperCase();case'u':return formatBaseX(value,10,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'i':case'd':number=parseInt(+value,10);prefix=number<0?'-':positivePrefix;value=prefix+pad(String(Math.abs(number)),precision,'0',false);return justify(value,prefix,leftJustify,minWidth,zeroPad);case'e':case'E':case'f':case'F':case'g':case'G':number=+value;prefix=number<0?'-':positivePrefix;method=['toExponential','toFixed','toPrecision']['efg'.indexOf(type.toLowerCase())];textTransform=['toString','toUpperCase']['eEfFgG'.indexOf(type)%2];value=prefix+Math.abs(number)[method](precision);return justify(value,prefix,leftJustify,minWidth,zeroPad)[textTransform]();default:return substring;}};return format.replace(regex,doFormat);}
function sql_regcase(str){this.setlocale('LC_ALL',0);var i=0,upper='',lower='',pos=0,retStr='';upper=this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.upper;lower=this.php_js.locales[this.php_js.localeCategories.LC_CTYPE].LC_CTYPE.lower;for(i=0;i<str.length;i++){if(((pos=upper.indexOf(str.charAt(i)))!==-1)||((pos=lower.indexOf(str.charAt(i)))!==-1)){retStr+='['+upper[pos]+lower[pos]+']';}
else{retStr+=str.charAt(i);}}
return retStr;}
function sqrt(arg){return Math.sqrt(arg);}
function str_getcsv(input,delimiter,enclosure,escape){var output=[];var backwards=function(str){return str.split('').reverse().join('');};var pq=function(str){return(str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g,"\\$1");};delimiter=delimiter||',';enclosure=enclosure||'"';escape=escape||'\\';input=input.replace(new RegExp('^\\s*'+pq(enclosure)),'').replace(new RegExp(pq(enclosure)+'\\s*$'),'');input=backwards(input).split(new RegExp(pq(enclosure)+'\\s*'+pq(delimiter)+'\\s*'+pq(enclosure)+'(?!'+pq(escape)+')','g')).reverse();for(var i=0;i<input.length;i++){output.push(backwards(input[i]).replace(new RegExp(pq(escape)+pq(enclosure),'g'),enclosure));}
return output;}
function str_ireplace(search,replace,subject){var i,k='';var searchl=0;var reg;var escapeRegex=function(s){return s.replace(/([\\\^\$*+\[\]?{}.=!:(|)])/g,'\\$1');};search+='';searchl=search.length;if(!(replace instanceof Array)){replace=[replace];if(search instanceof Array){while(searchl>replace.length){replace[replace.length]=replace[0];}}}
if(!(search instanceof Array)){search=[search];}
while(search.length>replace.length){replace[replace.length]='';}
if(subject instanceof Array){for(k in subject){if(subject.hasOwnProperty(k)){subject[k]=str_ireplace(search,replace,subject[k]);}}
return subject;}
searchl=search.length;for(i=0;i<searchl;i++){reg=new RegExp(escapeRegex(search[i]),'gi');subject=subject.replace(reg,replace[i]);}
return subject;}
function str_pad(input,pad_length,pad_string,pad_type){var half='',pad_to_go;var str_pad_repeater=function(s,len){var collect='',i;while(collect.length<len){collect+=s;}
collect=collect.substr(0,len);return collect;};input+='';pad_string=pad_string!==undefined?pad_string:' ';if(pad_type!='STR_PAD_LEFT'&&pad_type!='STR_PAD_RIGHT'&&pad_type!='STR_PAD_BOTH'){pad_type='STR_PAD_RIGHT';}
if((pad_to_go=pad_length-input.length)>0){if(pad_type=='STR_PAD_LEFT'){input=str_pad_repeater(pad_string,pad_to_go)+input;}
else if(pad_type=='STR_PAD_RIGHT'){input=input+str_pad_repeater(pad_string,pad_to_go);}
else if(pad_type=='STR_PAD_BOTH'){half=str_pad_repeater(pad_string,Math.ceil(pad_to_go/2));input=half+input+half;input=input.substr(0,pad_length);}}
return input;}
function str_repeat(input,multiplier){return new Array(multiplier+1).join(input);}
function str_replace(search,replace,subject,count){var i=0,j=0,temp='',repl='',sl=0,fl=0,f=[].concat(search),r=[].concat(replace),s=subject,ra=r instanceof Array,sa=s instanceof Array;s=[].concat(s);if(count){this.window[count]=0;}
for(i=0,sl=s.length;i<sl;i++){if(s[i]===''){continue;}
for(j=0,fl=f.length;j<fl;j++){temp=s[i]+'';repl=ra?(r[j]!==undefined?r[j]:''):r[0];s[i]=(temp).split(f[j]).join(repl);if(count&&s[i]!==temp){this.window[count]+=(temp.length-s[i].length)/f[j].length;}}}
return sa?s:s[0];}
function str_rot13(str){return(str+'').replace(/[A-Za-z]/g,function(c){return String.fromCharCode((((c=c.charCodeAt(0))&223)-52)%26+(c&32)+65);});}
function str_shuffle(str){if(str==undefined){throw'Wrong parameter count for str_shuffle()';}
var getRandomInt=function(max){return Math.floor(Math.random()*(max+1));};var newStr='',rand=0;while(str.length){rand=getRandomInt(str.length-1);newStr+=str.charAt(rand);str=str.substring(0,rand)+str.substr(rand+1);}
return newStr;}
function str_split(string,split_length){if(string===undefined||!string.toString||split_length<1){return false;}
return string.toString().match(new RegExp('.{1,'+(split_length||'1')+'}','g'));}
function str_word_count(str,format,charlist){var l=str.length,tmpStr="";var i=0;var c='';var wArr=[],wC=0;var assArr={},aC=0,reg="";if(charlist){for(i=0;i<=charlist.length-1;i++){if(i!=charlist.length-1){reg=reg+charlist.charCodeAt(i)+"|";}else{reg=reg+charlist.charCodeAt(i);}}
reg=new RegExp(reg);}
for(i=0;i<=l-1;i++){c=str.charCodeAt(i);if((c<91&&c>64)||(c<123&&c>96)||c==45||c==39||(reg&&reg.test(c))){if(tmpStr==""&&format==2){aC=i;}
tmpStr=tmpStr+String.fromCharCode(c);}else if(tmpStr!=""){if(format!=2){wArr[wArr.length]=tmpStr;}else{assArr[aC]=tmpStr;}
tmpStr="";wC++;}}
if(!format){return wC;}else if(format==1){return wArr;}else if(format==2){return assArr;}
throw'You have supplied an incorrect format';}
function strcasecmp(f_string1,f_string2){var string1=(f_string1+'').toLowerCase();var string2=(f_string2+'').toLowerCase();if(string1>string2){return 1;}
else if(string1==string2){return 0;}
return-1;}
function strchr(haystack,needle,bool){return this.strstr(haystack,needle,bool);}
function strcmp(str1,str2){return((str1==str2)?0:((str1>str2)?1:-1));}
function strcoll(str1,str2){this.setlocale('LC_ALL',0);var cmp=this.php_js.locales[this.php_js.localeCategories.LC_COLLATE].LC_COLLATE;return cmp(str1,str2);}
function strcspn(str,mask,start,length){start=start?start:0;var count=(length&&((start+length)<str.length))?start+length:str.length;strct:for(var i=start,lgth=0;i<count;i++){for(var j=0;j<mask.length;j++){if(str.charAt(i).indexOf(mask[j])!==-1){continue strct;}}
++lgth;}
return lgth;}
function stream_context_create(options,params){var resource={};options=options||{};this.php_js=this.php_js||{};this.php_js.resourceIdCounter=this.php_js.resourceIdCounter||0;function PHPJS_Resource(type,id,opener){this.type=type;this.id=id;this.opener=opener;}
PHPJS_Resource.prototype.toString=function(){return'Resource id #'+this.id;};PHPJS_Resource.prototype.get_resource_type=function(){return this.type;};PHPJS_Resource.prototype.var_dump=function(){return'resource('+this.id+') of type ('+this.type+')';};this.php_js.resourceIdCounter++;resource=new PHPJS_Resource('stream-context',this.php_js.resourceIdCounter,'stream_context_create');resource.stream_options=options;resource.stream_params=params;return resource;}
function stream_context_get_default(options){this.php_js=this.php_js||{};if(!this.php_js.default_streams_context){this.php_js.default_streams_context=this.stream_context_create(options);}
if(options){this.php_js.default_streams_context.stream_options=options;}
return this.php_js.default_streams_context;}
function stream_context_get_options(stream_or_context){return stream_or_context.stream_options;}
function stream_context_get_params(stream_or_context){return stream_or_context.stream_params;}
function stream_context_set_default(options){this.php_js=this.php_js||{};if(!this.php_js.default_streams_context){this.php_js.default_streams_context=this.stream_context_create(options);}
this.php_js.default_streams_context.stream_options=options;return this.php_js.default_streams_context;}
function stream_context_set_option(stream_or_context,optionsOrWrapper,option,value){if(option){if(!stream_or_context.stream_options[optionsOrWrapper]){stream_or_context.stream_options[optionsOrWrapper]={};}
stream_or_context.stream_options[optionsOrWrapper][option]=value;}
else{stream_or_context.stream_options=optionsOrWrapper;}
return true;}
function stream_context_set_params(stream_or_context,params){var param='';for(param in params){if(param==='options'){stream_or_context.stream_options=params[param];}
else{stream_or_context.stream_params[param]=params[param];}}
return true;}
function stream_get_contents(handle,maxLength,offset){if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||!handle||!handle.id){return false;}
offset=offset||0;this.php_js.resourceDataPointer[handle.id]+=offset;var chrs=this.php_js.resourceData[handle.id].slice(this.php_js.resourceDataPointer[handle.id]);chrs=maxLength>=0?chrs.substr(0,maxLength):chrs;this.echo(chrs);this.php_js.resourceDataPointer[handle.id]+=chrs.length;return chrs;}
function stream_get_line(handle,length,ending){var start=0,fullline='';if(!this.php_js||!this.php_js.resourceData||!this.php_js.resourceDataPointer||length!==undefined&&!length){return false;}
start=this.php_js.resourceDataPointer[handle.id];if(start===undefined||!this.php_js.resourceData[handle.id][start]){return false;}
fullline=this.php_js.resourceData[handle.id].slice(start,this.php_js.resourceData[handle.id].indexOf(ending,start)+1);if(fullline===''){fullline=this.php_js.resourceData[handle.id].slice(start);}
length=(length===undefined||fullline.length<length)?fullline.length:Math.floor(length/2)||1;this.php_js.resourceDataPointer[handle.id]+=length;return this.php_js.resourceData[handle.id].substr(start,length-(fullline&&ending&&ending.length?ending.length:0));}
function stream_is_local(stream_or_url){if(typeof stream_or_url==='string'){return(/^(https?|ftps?|ssl|tls):/.test(stream_or_url))?false:true;}
return stream_or_url.is_local?true:false;}
function strftime(fmt,timestamp){this.php_js=this.php_js||{};this.setlocale('LC_ALL',0);var phpjs=this.php_js;var _xPad=function(x,pad,r){if(typeof r==='undefined'){r=10;}
for(;parseInt(x,10)<r&&r>1;r/=10){x=pad.toString()+x;}
return x.toString();};var locale=phpjs.localeCategories.LC_TIME;var locales=phpjs.locales;var _formats={a:function(d){return locales[locale].LC_TIME.a[d.getDay()];},A:function(d){return locales[locale].LC_TIME.A[d.getDay()];},b:function(d){return locales[locale].LC_TIME.b[d.getMonth()];},B:function(d){return locales[locale].LC_TIME.B[d.getMonth()];},C:function(d){return _xPad(parseInt(d.getFullYear()/100,10),0);},d:['getDate','0'],e:['getDate',' '],g:function(d){return _xPad(parseInt(this.G(d)/100,10),0);},G:function(d){var y=d.getFullYear();var V=parseInt(_formats.V(d),10);var W=parseInt(_formats.W(d),10);if(W>V){y++;}
else if(W===0&&V>=52){y--;}
return y;},H:['getHours','0'],I:function(d){var I=d.getHours()%12;return _xPad(I===0?12:I,0);},j:function(d){var ms=d-new Date(''+d.getFullYear()+'/1/1 GMT');ms+=d.getTimezoneOffset()*60000;var doy=parseInt(ms/60000/60/24,10)+1;return _xPad(doy,0,100);},k:['getHours','0'],l:function(d){var l=d.getHours()%12;return _xPad(l===0?12:l,' ');},m:function(d){return _xPad(d.getMonth()+1,0);},M:['getMinutes','0'],p:function(d){return locales[locale].LC_TIME.p[d.getHours()>=12?1:0];},P:function(d){return locales[locale].LC_TIME.P[d.getHours()>=12?1:0];},s:function(d){return Date.parse(d)/1000;},S:['getSeconds','0'],u:function(d){var dow=d.getDay();return((dow===0)?7:dow);},U:function(d){var doy=parseInt(_formats.j(d),10);var rdow=6-d.getDay();var woy=parseInt((doy+rdow)/7,10);return _xPad(woy,0);},V:function(d){var woy=parseInt(_formats.W(d),10);var dow1_1=(new Date(''+d.getFullYear()+'/1/1')).getDay();var idow=woy+(dow1_1>4||dow1_1<=1?0:1);if(idow===53&&(new Date(''+d.getFullYear()+'/12/31')).getDay()<4){idow=1;}
else if(idow===0){idow=_formats.V(new Date(''+(d.getFullYear()-1)+'/12/31'));}
return _xPad(idow,0);},w:'getDay',W:function(d){var doy=parseInt(_formats.j(d),10);var rdow=7-_formats.u(d);var woy=parseInt((doy+rdow)/7,10);return _xPad(woy,0,10);},y:function(d){return _xPad(d.getFullYear()%100,0);},Y:'getFullYear',z:function(d){var o=d.getTimezoneOffset();var H=_xPad(parseInt(Math.abs(o/60),10),0);var M=_xPad(o%60,0);return(o>0?'-':'+')+H+M;},Z:function(d){return d.toString().replace(/^.*\(([^)]+)\)$/,'$1');},'%':function(d){return'%';}};var _date=((typeof(timestamp)=='undefined')?new Date():(typeof(timestamp)=='object')?new Date(timestamp):new Date(timestamp*1000));var _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'};while(fmt.match(/%[cDFhnrRtTxX]/)){fmt=fmt.replace(/%([cDFhnrRtTxX])/g,function(m0,m1)
{var f=_aggregates[m1];return(f==='locale'?locales[locale].LC_TIME[m1]:f);});}
var str=fmt.replace(/%([aAbBCdegGHIjklmMpPsSuUVwWyYzZ%])/g,function(m0,m1){var f=_formats[m1];if(typeof f==='string'){return _date[f]();}else if(typeof f==='function'){return f(_date);}else if(typeof f==='object'&&typeof(f[0])==='string'){return _xPad(_date[f[0]](),f[1]);}else{return m1;}});return str;}
function strip_tags(str,allowed_tags){var key='',allowed=false;var matches=[];var allowed_array=[];var allowed_tag='';var i=0;var k='';var html='';var replacer=function(search,replace,str){return str.split(search).join(replace);};if(allowed_tags){allowed_array=allowed_tags.match(/([a-zA-Z0-9]+)/gi);}
str+='';matches=str.match(/(<\/?[\S][^>]*>)/gi);for(key in matches){if(isNaN(key)){continue;}
html=matches[key].toString();allowed=false;for(k in allowed_array){allowed_tag=allowed_array[k];i=-1;if(i!=0){i=html.toLowerCase().indexOf('<'+allowed_tag+'>');}
if(i!=0){i=html.toLowerCase().indexOf('<'+allowed_tag+' ');}
if(i!=0){i=html.toLowerCase().indexOf('</'+allowed_tag);}
if(i==0){allowed=true;break;}}
if(!allowed){str=replacer(html,"",str);}}
return str;}
function stripos(f_haystack,f_needle,f_offset){var haystack=(f_haystack+'').toLowerCase();var needle=(f_needle+'').toLowerCase();var index=0;if((index=haystack.indexOf(needle,f_offset))!==-1){return index;}
return false;}
function stripslashes(str){return(str+'').replace(/\\(.?)/g,function(s,n1){switch(n1){case'\\':return'\\';case'0':return'\u000';case'':return'';default:return n1;}});}
function stristr(haystack,needle,bool){var pos=0;haystack+='';pos=haystack.toLowerCase().indexOf((needle+'').toLowerCase());if(pos==-1){return false;}else{if(bool){return haystack.substr(0,pos);}else{return haystack.slice(pos);}}}
function strlen(string){var str=string+'';var i=0,chr='',lgth=0;var getWholeChar=function(str,i){var code=str.charCodeAt(i);var next='',prev='';if(0xD800<=code&&code<=0xDBFF){if(str.length<=(i+1)){throw'High surrogate without following low surrogate';}
next=str.charCodeAt(i+1);if(0xDC00>next||next>0xDFFF){throw'High surrogate without following low surrogate';}
return str.charAt(i)+str.charAt(i+1);}else if(0xDC00<=code&&code<=0xDFFF){if(i===0){throw'Low surrogate without preceding high surrogate';}
prev=str.charCodeAt(i-1);if(0xD800>prev||prev>0xDBFF){throw'Low surrogate without preceding high surrogate';}
return false;}
return str.charAt(i);};for(i=0,lgth=0;i<str.length;i++){if((chr=getWholeChar(str,i))===false){continue;}
lgth++;}
return lgth;}
function strnatcasecmp(str1,str2){var a=(str1+'').toLowerCase();var b=(str2+'').toLowerCase();var isWhitespaceChar=function(a){return a.charCodeAt(0)<=32;};var isDigitChar=function(a){var charCode=a.charCodeAt(0);return(charCode>=48&&charCode<=57);};var compareRight=function(a,b){var bias=0;var ia=0;var ib=0;var ca;var cb;for(;;ia++,ib++){ca=a.charAt(ia);cb=b.charAt(ib);if(!isDigitChar(ca)&&!isDigitChar(cb)){return bias;}else if(!isDigitChar(ca)){return-1;}else if(!isDigitChar(cb)){return+1;}else if(ca<cb){if(bias==0){bias=-1;}}else if(ca>cb){if(bias==0){bias=+1;}}else if(ca==0&&cb==0){return bias;}}};var ia=0,ib=0;var nza=0,nzb=0;var ca,cb;var result;while(true){nza=nzb=0;ca=a.charAt(ia);cb=b.charAt(ib);while(isWhitespaceChar(ca)||ca=='0'){if(ca=='0'){nza++;}else{nza=0;}
ca=a.charAt(++ia);}
while(isWhitespaceChar(cb)||cb=='0'){if(cb=='0'){nzb++;}else{nzb=0;}
cb=b.charAt(++ib);}
if(isDigitChar(ca)&&isDigitChar(cb)){if((result=compareRight(a.substring(ia),b.substring(ib)))!=0){return result;}}
if(ca==0&&cb==0){return nza-nzb;}
if(ca<cb){return-1;}else if(ca>cb){return+1;}
++ia;++ib;}}
function strnatcmp(f_string1,f_string2,f_version){var i=0;if(f_version==undefined){f_version=false;}
var __strnatcmp_split=function(f_string){var result=[];var buffer='';var chr='';var i=0,f_stringl=0;var text=true;f_stringl=f_string.length;for(i=0;i<f_stringl;i++){chr=f_string.substring(i,i+1);if(chr.match(/\d/)){if(text){if(buffer.length>0){result[result.length]=buffer;buffer='';}
text=false;}
buffer+=chr;}else if((text==false)&&(chr=='.')&&(i<(f_string.length-1))&&(f_string.substring(i+1,i+2).match(/\d/))){result[result.length]=buffer;buffer='';}else{if(text==false){if(buffer.length>0){result[result.length]=parseInt(buffer,10);buffer='';}
text=true;}
buffer+=chr;}}
if(buffer.length>0){if(text){result[result.length]=buffer;}else{result[result.length]=parseInt(buffer,10);}}
return result;};var array1=__strnatcmp_split(f_string1+'');var array2=__strnatcmp_split(f_string2+'');var len=array1.length;var text=true;var result=-1;var r=0;if(len>array2.length){len=array2.length;result=1;}
for(i=0;i<len;i++){if(isNaN(array1[i])){if(isNaN(array2[i])){text=true;if((r=this.strcmp(array1[i],array2[i]))!=0){return r;}}else if(text){return 1;}else{return-1;}}else if(isNaN(array2[i])){if(text){return-1;}else{return 1;}}else{if(text||f_version){if((r=(array1[i]-array2[i]))!=0){return r;}}else{if((r=this.strcmp(array1[i].toString(),array2[i].toString()))!=0){return r;}}
text=false;}}
return result;}
function strncasecmp(argStr1,argStr2,len){var diff,i=0;var str1=(argStr1+'').toLowerCase().substr(0,len);var str2=(argStr2+'').toLowerCase().substr(0,len);if(str1.length!==str2.length){if(str1.length<str2.length){len=str1.length;if(str2.substr(0,str1.length)==str1){return str1.length-str2.length;}}else{len=str2.length;if(str1.substr(0,str2.length)==str2){return str1.length-str2.length;}}}else{len=str1.length;}
for(diff=0,i=0;i<len;i++){diff=str1.charCodeAt(i)-str2.charCodeAt(i);if(diff!==0){return diff;}}
return 0;}
function strncmp(str1,str2,lgth){var s1=(str1+'').substr(0,lgth);var s2=(str2+'').substr(0,lgth);return((s1==s2)?0:((s1>s2)?1:-1));}
function strpbrk(haystack,char_list){for(var i=0,len=haystack.length;i<len;++i){if(char_list.indexOf(haystack.charAt(i))>=0)
return haystack.slice(i);}
return false;}
function strpos(haystack,needle,offset){var i=(haystack+'').indexOf(needle,(offset?offset:0));return i===-1?false:i;}
function strrchr(haystack,needle){var pos=0;if(typeof needle!=='string'){needle=String.fromCharCode(parseInt(needle,10));}
needle=needle.charAt(0);pos=haystack.lastIndexOf(needle);if(pos===-1){return false;}
return haystack.substr(pos);}
function strrev(string){string=string+'';var grapheme_extend=/(.)([\uDC00-\uDFFF\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065E\u0670\u06D6-\u06DC\u06DE-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0901-\u0903\u093C\u093E-\u094D\u0951-\u0954\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C82\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D02\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B6-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAA\u1C24-\u1C37\u1DC0-\u1DE6\u1DFE\u1DFF\u20D0-\u20F0\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA67C\uA67D\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA926-\uA92D\uA947-\uA953\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uFB1E\uFE00-\uFE0F\uFE20-\uFE26])/g;string=string.replace(grapheme_extend,'$2$1');return string.split('').reverse().join('');}
function strripos(haystack,needle,offset){var i=(haystack+'').toLowerCase().lastIndexOf((needle+'').toLowerCase(),offset);return i>=0?i:false;}
function strrpos(haystack,needle,offset){var i=(haystack+'').lastIndexOf(needle,offset);return i>=0?i:false;}
function strspn(str1,str2,start,lgth){var found;var stri;var strj;var j=0;var i=0;start=start?(start<0?(str1.length+start):start):0;lgth=lgth?((lgth<0)?(str1.length+lgth-start):lgth):str1.length-start;str1=str1.substr(start,lgth);for(i=0;i<str1.length;i++){found=0;stri=str1.substring(i,i+1);for(j=0;j<=str2.length;j++){strj=str2.substring(j,j+1);if(stri==strj){found=1;break;}}
if(found!=1){return i;}}
return i;}
function strstr(haystack,needle,bool){var pos=0;haystack+='';pos=haystack.indexOf(needle);if(pos==-1){return false;}else{if(bool){return haystack.substr(0,pos);}else{return haystack.slice(pos);}}}
function strtok(str,tokens){this.php_js=this.php_js||{};if(tokens===undefined){tokens=str;str=this.php_js.strtokleftOver;}
if(str.length===0){return false;}
if(tokens.indexOf(str.charAt(0))!==-1){return this.strtok(str.substr(1),tokens);}
for(var i=0;i<str.length;i++){if(tokens.indexOf(str.charAt(i))!==-1){break;}}
this.php_js.strtokleftOver=str.substr(i+1);return str.substring(0,i);}
function strtolower(str){return(str+'').toLowerCase();}
function strtotime(str,now){var i,match,s,strTmp='',parse='';strTmp=str;strTmp=strTmp.replace(/\s{2,}|^\s|\s$/g,' ');strTmp=strTmp.replace(/[\t\r\n]/g,'');if(strTmp=='now'){return(new Date()).getTime()/1000;}else if(!isNaN(parse=Date.parse(strTmp))){return(parse/1000);}else if(now){now=new Date(now*1000);}else{now=new Date();}
strTmp=strTmp.toLowerCase();var __is={day:{'sun':0,'mon':1,'tue':2,'wed':3,'thu':4,'fri':5,'sat':6},mon:{'jan':0,'feb':1,'mar':2,'apr':3,'may':4,'jun':5,'jul':6,'aug':7,'sep':8,'oct':9,'nov':10,'dec':11}};var process=function(m){var ago=(m[2]&&m[2]=='ago');var num=(num=m[0]=='last'?-1:1)*(ago?-1:1);switch(m[0]){case'last':case'next':switch(m[1].substring(0,3)){case'yea':now.setFullYear(now.getFullYear()+num);break;case'mon':now.setMonth(now.getMonth()+num);break;case'wee':now.setDate(now.getDate()+(num*7));break;case'day':now.setDate(now.getDate()+num);break;case'hou':now.setHours(now.getHours()+num);break;case'min':now.setMinutes(now.getMinutes()+num);break;case'sec':now.setSeconds(now.getSeconds()+num);break;default:var day;if(typeof(day=__is.day[m[1].substring(0,3)])!='undefined'){var diff=day-now.getDay();if(diff==0){diff=7*num;}else if(diff>0){if(m[0]=='last'){diff-=7;}}else{if(m[0]=='next'){diff+=7;}}
now.setDate(now.getDate()+diff);}}
break;default:if(/\d+/.test(m[0])){num*=parseInt(m[0],10);switch(m[1].substring(0,3)){case'yea':now.setFullYear(now.getFullYear()+num);break;case'mon':now.setMonth(now.getMonth()+num);break;case'wee':now.setDate(now.getDate()+(num*7));break;case'day':now.setDate(now.getDate()+num);break;case'hou':now.setHours(now.getHours()+num);break;case'min':now.setMinutes(now.getMinutes()+num);break;case'sec':now.setSeconds(now.getSeconds()+num);break;}}else{return false;}
break;}
return true;};match=strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);if(match!=null){if(!match[2]){match[2]='00:00:00';}else if(!match[3]){match[2]+=':00';}
s=match[1].split(/-/g);for(i in __is.mon){if(__is.mon[i]==s[1]-1){s[1]=i;}}
s[0]=parseInt(s[0],10);s[0]=(s[0]>=0&&s[0]<=69)?'20'+(s[0]<10?'0'+s[0]:s[0]+''):(s[0]>=70&&s[0]<=99)?'19'+s[0]:s[0]+'';return parseInt(this.strtotime(s[2]+' '+s[1]+' '+s[0]+' '+match[2])+(match[4]?match[4]/1000:''),10);}
var regex='([+-]?\\d+\\s'+'(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+'|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+'|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)'+'|(last|next)\\s'+'(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+'|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+'|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))'+'(\\sago)?';match=strTmp.match(new RegExp(regex,'gi'));if(match==null){return false;}
for(i=0;i<match.length;i++){if(!process(match[i].split(' '))){return false;}}
return(now.getTime()/1000);}
function strtoupper(str){return(str+'').toUpperCase();}
function strtr(str,from,to){var fr='',i=0,j=0,lenStr=0,lenFrom=0,tmpStrictForIn=false,fromTypeStr='',toTypeStr='',istr='';var tmpFrom=[];var tmpTo=[];var ret='';var match=false;if(typeof from==='object'){tmpStrictForIn=this.ini_set('phpjs.strictForIn',false);from=this.krsort(from);this.ini_set('phpjs.strictForIn',tmpStrictForIn);for(fr in from){if(from.hasOwnProperty(fr)){tmpFrom.push(fr);tmpTo.push(from[fr]);}}
from=tmpFrom;to=tmpTo;}
lenStr=str.length;lenFrom=from.length;fromTypeStr=typeof from==='string';toTypeStr=typeof to==='string';for(i=0;i<lenStr;i++){match=false;if(fromTypeStr){istr=str.charAt(i);for(j=0;j<lenFrom;j++){if(istr==from.charAt(j)){match=true;break;}}}
else{for(j=0;j<lenFrom;j++){if(str.substr(i,from[j].length)==from[j]){match=true;i=(i+from[j].length)-1;break;}}}
if(match){ret+=toTypeStr?to.charAt(j):to[j];}else{ret+=str.charAt(i);}}
return ret;}
function strval(str){var type='';if(str===null){return'';}
type=this.gettype(str);switch(type){case'boolean':if(str===true){return'1';}
return'';case'array':return'Array';case'object':return'Object';}
return str;}
function substr(str,start,len){str+='';var end=str.length;if(start<0){start+=end;}
end=typeof len==='undefined'?end:(len<0?len+end:len+start);return start>=str.length||start<0||start>end?!1:str.slice(start,end);}
function substr_compare(main_str,str,offset,length,case_insensitivity){if(!offset&&offset!==0){throw'Missing offset for substr_compare()';}
if(offset<0){offset=main_str.length+offset;}
if(length&&length>(main_str.length-offset)){return false;}
length=length||main_str.length-offset;main_str=main_str.substr(offset,length);str=str.substr(0,length);if(case_insensitivity){main_str=(main_str+'').toLowerCase();str=(str+'').toLowerCase();if(main_str==str){return 0;}
return(main_str>str)?1:-1;}
return((main_str==str)?0:((main_str>str)?1:-1));}
function substr_count(haystack,needle,offset,length){var pos=0,cnt=0;haystack+='';needle+='';if(isNaN(offset)){offset=0;}
if(isNaN(length)){length=0;}
offset--;while((offset=haystack.indexOf(needle,offset+1))!=-1){if(length>0&&(offset+needle.length)>length){return false;}else{cnt++;}}
return cnt;}
function substr_replace(str,replace,start,length){if(start<0){start=start+str.length;}
length=length!==undefined?length:str.length;if(length<0){length=length+str.length-start;}
return str.slice(0,start)+replace.substr(0,length)+replace.slice(length)+str.slice(start+length);}
function tan(arg){return Math.tan(arg);}
function tanh(arg){return(Math.exp(arg)-Math.exp(-arg))/(Math.exp(arg)+Math.exp(-arg));}
function time(){return Math.floor(new Date().getTime()/1000);}
function time_nanosleep(seconds,nanosecs){var start=new Date().getTime();while(new Date()<(start+seconds*1000+nanosecs/1000000)){}
return true;}
function time_sleep_until(timestamp){while(new Date()<timestamp*1000){}
return true;}
function timezone_abbreviations_list(){var list={},i=0,j=0,len=0,jlen=0,indice='',curr='',currSub='',currSubPrefix='',timezone_id='';try{php_js_shared;}
catch(e){php_js_shared={};}
if(!php_js_shared.tz_abbrs){php_js_shared.tz_abbrs=[[[1,14,"Porto_Acre",9],[1,14,"Eirunepe",9],[1,14,"Rio_Branco",9],[1,14,"Acre",15]],[[0,11,"Porto_Acre",9],[0,11,"Eirunepe",9],[0,11,"Rio_Branco",9],[0,11,"Acre",15]],[[1,25,"Goose_Bay",9],[1,25,"Pangnirtung",9]],[[1,22,"Halifax",9],[1,22,"Barbados",9],[1,22,"Blanc-Sablon",9],[1,22,"Glace_Bay",9],[1,22,"Goose_Bay",9],[1,22,"Martinique",9],[1,22,"Moncton",9],[1,22,"Pangnirtung",9],[1,22,"Thule",9],[1,22,"Bermuda",13],[1,22,"Atlantic",16],[1,51,"Baghdad",12]],[[0,52,"Kabul",12]],[[1,6,"Anchorage",9],[1,6,"Alaska"]],[[0,4,"Anchorage",9],[0,4,"Adak",9],[0,4,"Atka",9],[0,4,"Alaska"],[0,4,"Aleutian"]],[[1,7,"Anchorage",9],[1,7,"Juneau",9],[1,7,"Nome",9],[1,7,"Yakutat",9],[1,7,"Alaska"]],[[0,6,"Anchorage",9],[0,6,"Juneau",9],[0,6,"Nome",9],[0,6,"Yakutat",9],[0,6,"Alaska"]],[[1,57,"Aqtobe",12]],[[0,51,"Aqtobe",12],[0,54,"Aqtobe",12],[0,57,"Aqtobe",12]],[[1,59,"Almaty",12]],[[0,54,"Almaty",12],[0,57,"Almaty",12]],[[1,51,"Yerevan",12],[1,54,"Yerevan",12],[1,22,"Boa_Vista",9],[1,22,"Campo_Grande",9],[1,22,"Cuiaba",9],[1,22,"Manaus",9],[1,22,"Porto_Velho",9],[1,22,"West",15]],[[0,47,"Yerevan",12],[0,51,"Yerevan",12],[0,14,"Boa_Vista",9],[0,14,"Campo_Grande",9],[0,14,"Cuiaba",9],[0,14,"Manaus",9],[0,14,"Porto_Velho",9],[0,14,"West",15],[0,32,"Amsterdam",18]],[[1,76,"Anadyr",12],[1,79,"Anadyr",12],[1,81,"Anadyr",12]],[[0,74,"Anadyr",12],[0,76,"Anadyr",12],[0,79,"Anadyr",12]],[[0,13,"Curacao",9],[0,13,"Aruba",9]],[[1,22,"Halifax",9],[1,22,"Blanc-Sablon",9],[1,22,"Glace_Bay",9],[1,22,"Moncton",9],[1,22,"Pangnirtung",9],[1,22,"Puerto_Rico",9],[1,22,"Atlantic",16]],[[1,54,"Aqtau",12],[1,57,"Aqtau",12],[1,57,"Aqtobe",12]],[[0,51,"Aqtau",12],[0,54,"Aqtau",12],[0,54,"Aqtobe",12]],[[1,22,"Buenos_Aires",9],[1,25,"Buenos_Aires",9],[1,22,"Buenos_Aires",2],[1,22,"Catamarca",2],[1,22,"ComodRivadavia",2],[1,22,"Cordoba",2],[1,22,"Jujuy",2],[1,22,"La_Rioja",2],[1,22,"Mendoza",2],[1,22,"Rio_Gallegos",2],[1,22,"San_Juan",2],[1,22,"Tucuman",2],[1,22,"Ushuaia",2],[1,22,"Catamarca",9],[1,22,"Cordoba",9],[1,22,"Jujuy",9],[1,22,"Mendoza",9],[1,22,"Rosario",9],[1,22,"Palmer",10],[1,25,"Buenos_Aires",2],[1,25,"Catamarca",2],[1,25,"ComodRivadavia",2],[1,25,"Cordoba",2],[1,25,"Jujuy",2],[1,25,"La_Rioja",2],[1,25,"Mendoza",2],[1,25,"Rio_Gallegos",2],[1,25,"San_Juan",2],[1,25,"Tucuman",2],[1,25,"Ushuaia",2],[1,25,"Catamarca",9],[1,25,"Cordoba",9],[1,25,"Jujuy",9],[1,25,"Mendoza",9],[1,25,"Rosario",9],[1,25,"Palmer",10]],[[0,22,"Buenos_Aires",9],[0,14,"Buenos_Aires",9],[0,22,"Buenos_Aires",2],[0,22,"Catamarca",2],[0,22,"ComodRivadavia",2],[0,22,"Cordoba",2],[0,22,"Jujuy",2],[0,22,"La_Rioja",2],[0,22,"Mendoza",2],[0,22,"Rio_Gallegos",2],[0,22,"San_Juan",2],[0,22,"Tucuman",2],[0,22,"Ushuaia",2],[0,22,"Catamarca",9],[0,22,"Cordoba",9],[0,22,"Jujuy",9],[0,22,"Mendoza",9],[0,22,"Rosario",9],[0,22,"Palmer",10],[0,14,"Buenos_Aires",2],[0,14,"Catamarca",2],[0,14,"ComodRivadavia",2],[0,14,"Cordoba",2],[0,14,"Jujuy",2],[0,14,"La_Rioja",2],[0,14,"Mendoza",2],[0,14,"Rio_Gallegos",2],[0,14,"San_Juan",2],[0,14,"Tucuman",2],[0,14,"Ushuaia",2],[0,14,"Catamarca",9],[0,14,"Cordoba",9],[0,14,"Jujuy",9],[0,14,"Mendoza",9],[0,14,"Rosario",9],[0,14,"Palmer",10]],[[1,54,"Ashkhabad",12],[1,57,"Ashkhabad",12],[1,54,"Ashgabat",12],[1,57,"Ashgabat",12]],[[0,51,"Ashkhabad",12],[0,54,"Ashkhabad",12],[0,51,"Ashgabat",12],[0,54,"Ashgabat",12]],[[0,47,"Riyadh",12],[0,14,"Anguilla",9],[0,14,"Antigua",9],[0,14,"Aruba",9],[0,14,"Barbados",9],[0,14,"Blanc-Sablon",9],[0,14,"Curacao",9],[0,14,"Dominica",9],[0,14,"Glace_Bay",9],[0,14,"Goose_Bay",9],[0,14,"Grenada",9],[0,14,"Guadeloupe",9],[0,14,"Halifax",9],[0,14,"Martinique",9],[0,14,"Miquelon",9],[0,14,"Moncton",9],[0,14,"Montserrat",9],[0,14,"Pangnirtung",9],[0,14,"Port_of_Spain",9],[0,14,"Puerto_Rico",9],[0,14,"Santo_Domingo",9],[0,14,"St_Kitts",9],[0,14,"St_Lucia",9],[0,14,"St_Thomas",9],[0,14,"St_Vincent",9],[0,14,"Thule",9],[0,14,"Tortola",9],[0,14,"Virgin",9],[0,14,"Bermuda",13],[0,14,"Atlantic",16],[0,47,"Aden",12],[0,47,"Baghdad",12],[0,47,"Bahrain",12],[0,47,"Kuwait",12],[0,47,"Qatar",12]],[[1,22,"Halifax",9],[1,22,"Blanc-Sablon",9],[1,22,"Glace_Bay",9],[1,22,"Moncton",9],[1,22,"Pangnirtung",9],[1,22,"Puerto_Rico",9],[1,22,"Atlantic",16]],[[1,31,"Azores",13]],[[1,28,"Azores",13],[1,31,"Azores",13]],[[0,28,"Azores",13],[0,25,"Azores",13]],[[1,51,"Baku",12],[1,54,"Baku",12]],[[0,47,"Baku",12],[0,51,"Baku",12]],[[1,51,"Baku",12],[1,54,"Baku",12]],[[0,47,"Baku",12],[0,51,"Baku",12]],[[1,42,"London",18],[1,42,"Belfast",18],[1,42,"Gibraltar",18],[1,42,"Guernsey",18],[1,42,"Isle_of_Man",18],[1,42,"Jersey",18],[1,42,"GB"],[1,42,"GB-Eire"]],[[1,4,"Adak",9],[1,4,"Atka",9],[1,4,"Nome",9],[1,4,"Aleutian"],[0,57,"Dacca",12],[0,57,"Dhaka",12]],[[0,43,"Mogadishu"],[0,43,"Kampala"],[0,43,"Nairobi"]],[[0,46,"Nairobi"],[0,46,"Dar_es_Salaam"],[0,46,"Kampala"]],[[0,15,"Barbados",9],[0,27,"Banjul"],[0,41,"Tiraspol",18],[0,41,"Chisinau",18]],[[0,63,"Brunei",12],[0,65,"Brunei",12]],[[1,66,"Kuching",12]],[[0,63,"Kuching",12],[0,65,"Kuching",12]],[[1,19,"La_Paz",9]],[[0,14,"La_Paz",9]],[[1,25,"Sao_Paulo",9],[1,25,"Araguaina",9],[1,25,"Bahia",9],[1,25,"Belem",9],[1,25,"Fortaleza",9],[1,25,"Maceio",9],[1,25,"Recife",9],[1,25,"East",15]],[[0,22,"Sao_Paulo",9],[0,22,"Araguaina",9],[0,22,"Bahia",9],[0,22,"Belem",9],[0,22,"Fortaleza",9],[0,22,"Maceio",9],[0,22,"Recife",9],[0,22,"East",15]],[[0,35,"London",18],[1,35,"London",18],[0,2,"Adak",9],[0,2,"Atka",9],[0,2,"Nome",9],[0,2,"Midway",21],[0,2,"Pago_Pago",21],[0,2,"Samoa",21],[0,2,"Aleutian"],[0,2,"Samoa"],[0,35,"Belfast",18],[0,35,"Guernsey",18],[0,35,"Isle_of_Man",18],[0,35,"Jersey",18],[0,35,"GB"],[0,35,"GB-Eire"],[1,35,"Eire"],[1,35,"Belfast",18],[1,35,"Dublin",18],[1,35,"Gibraltar",18],[1,35,"Guernsey",18],[1,35,"Isle_of_Man",18],[1,35,"Jersey",18],[1,35,"GB"],[1,35,"GB-Eire"]],[[0,57,"Thimbu",12],[0,57,"Thimphu",12]],[[0,58,"Calcutta",12],[0,58,"Dacca",12],[0,58,"Dhaka",12],[0,58,"Rangoon",12]],[[0,28,"Canary",13]],[[1,6,"Anchorage",9],[1,6,"Alaska"]],[[0,70,"Adelaide",14],[1,47,"Gaborone"],[1,47,"Khartoum"]],[[0,4,"Anchorage",9],[0,4,"Alaska"],[0,42,"Khartoum"],[0,42,"Blantyre"],[0,42,"Gaborone"],[0,42,"Harare"],[0,42,"Kigali"],[0,42,"Lusaka"],[0,42,"Maputo"],[0,42,"Windhoek"]],[[1,6,"Anchorage",9],[1,6,"Alaska"]],[[1,14,"Rankin_Inlet",9]],[[1,11,"Chicago",9],[1,14,"Havana",9],[1,14,"Cuba"],[1,11,"Atikokan",9],[1,11,"Belize",9],[1,11,"Cambridge_Bay",9],[1,11,"Cancun",9],[1,11,"Chihuahua",9],[1,11,"Coral_Harbour",9],[1,11,"Costa_Rica",9],[1,11,"El_Salvador",9],[1,11,"Fort_Wayne",9],[1,11,"Guatemala",9],[1,11,"Indianapolis",4],[1,11,"Knox",4],[1,11,"Marengo",4],[1,11,"Petersburg",4],[1,11,"Vevay",4],[1,11,"Vincennes",4],[1,11,"Winamac",4],[1,11,"Indianapolis",9],[1,11,"Iqaluit",9],[1,11,"Louisville",6],[1,11,"Monticello",6],[1,11,"Knox_IN",9],[1,11,"Louisville",9],[1,11,"Managua",9],[1,11,"Menominee",9],[1,11,"Merida",9],[1,11,"Mexico_City",9],[1,11,"Monterrey",9],[1,11,"Center",8],[1,11,"New_Salem",8],[1,11,"Pangnirtung",9],[1,11,"Rainy_River",9],[1,11,"Rankin_Inlet",9],[1,11,"Tegucigalpa",9],[1,11,"Winnipeg",9],[1,11,"Central",16],[1,11,"CST6CDT"],[1,11,"General",20],[1,11,"Central"],[1,11,"East-Indiana"],[1,11,"Indiana-Starke"],[1,69,"Shanghai",12],[1,69,"Chongqing",12],[1,69,"Chungking",12],[1,69,"Harbin",12],[1,69,"Kashgar",12],[1,69,"Taipei",12],[1,69,"Urumqi",12],[1,69,"PRC"],[1,69,"ROC"]],[[1,47,"Berlin",18],[1,47,"CET"]],[[1,42,"Berlin",18],[1,47,"Kaliningrad",18],[1,42,"Algiers"],[1,42,"Ceuta"],[1,42,"Tripoli"],[1,42,"Tunis"],[1,42,"Longyearbyen",11],[1,42,"Jan_Mayen",13],[1,42,"CET"],[1,42,"Amsterdam",18],[1,42,"Andorra",18],[1,42,"Athens",18],[1,42,"Belgrade",18],[1,42,"Bratislava",18],[1,42,"Brussels",18],[1,42,"Budapest",18],[1,42,"Chisinau",18],[1,42,"Copenhagen",18],[1,42,"Gibraltar",18],[1,42,"Kaliningrad",18],[1,42,"Kiev",18],[1,42,"Lisbon",18],[1,42,"Ljubljana",18],[1,42,"Luxembourg",18],[1,42,"Madrid",18],[1,42,"Malta",18],[1,42,"Minsk",18],[1,42,"Monaco",18],[1,42,"Oslo",18],[1,42,"Paris",18],[1,42,"Podgorica",18],[1,42,"Prague",18],[1,42,"Riga",18],[1,42,"Rome",18],[1,42,"San_Marino",18],[1,42,"Sarajevo",18],[1,42,"Simferopol",18],[1,42,"Skopje",18],[1,42,"Sofia",18],[1,42,"Stockholm",18],[1,42,"Tallinn",18],[1,42,"Tirane",18],[1,42,"Tiraspol",18],[1,42,"Uzhgorod",18],[1,42,"Vaduz",18],[1,42,"Vatican",18],[1,42,"Vienna",18],[1,42,"Vilnius",18],[1,42,"Warsaw",18],[1,42,"Zagreb",18],[1,42,"Zaporozhye",18],[1,42,"Zurich",18],[1,42,"Libya"],[1,42,"Poland"],[1,42,"Portugal"],[1,42,"WET"]],[[0,35,"Berlin",18],[0,35,"Algiers"],[0,35,"Casablanca"],[0,35,"Ceuta"],[0,35,"Tripoli"],[0,35,"Tunis"],[0,35,"Longyearbyen",11],[0,35,"Jan_Mayen",13],[0,35,"CET"],[0,35,"Amsterdam",18],[0,35,"Andorra",18],[0,35,"Athens",18],[0,35,"Belgrade",18],[0,35,"Bratislava",18],[0,35,"Brussels",18],[0,35,"Budapest",18],[0,35,"Chisinau",18],[0,35,"Copenhagen",18],[0,35,"Gibraltar",18],[0,35,"Kaliningrad",18],[0,35,"Kiev",18],[0,35,"Lisbon",18],[0,35,"Ljubljana",18],[0,35,"Luxembourg",18],[0,35,"Madrid",18],[0,35,"Malta",18],[0,35,"Minsk",18],[0,35,"Monaco",18],[0,35,"Oslo",18],[0,35,"Paris",18],[0,35,"Podgorica",18],[0,35,"Prague",18],[0,35,"Riga",18],[0,35,"Rome",18],[0,35,"San_Marino",18],[0,35,"Sarajevo",18],[0,35,"Simferopol",18],[0,35,"Skopje",18],[0,35,"Sofia",18],[0,35,"Stockholm",18],[0,35,"Tallinn",18],[0,35,"Tirane",18],[0,35,"Tiraspol",18],[0,35,"Uzhgorod",18],[0,35,"Vaduz",18],[0,35,"Vatican",18],[0,35,"Vienna",18],[0,35,"Vilnius",18],[0,35,"Warsaw",18],[0,35,"Zagreb",18],[0,35,"Zaporozhye",18],[0,35,"Zurich",18],[0,35,"Libya"],[0,35,"Poland"],[0,35,"Portugal"],[0,35,"WET"],[0,42,"Kaliningrad",18]],[[1,28,"Scoresbysund",9]],[[0,25,"Scoresbysund",9]],[[1,80,"Chatham",21],[1,80,"NZ-CHAT"]],[[0,78,"Chatham",21],[0,78,"NZ-CHAT"]],[[0,67,"Harbin",12],[0,69,"Harbin",12]],[[1,10,"Belize",9]],[[1,72,"Choibalsan",12]],[[0,69,"Choibalsan",12]],[[0,65,"Dili",12],[0,65,"Makassar",12],[0,65,"Pontianak",12],[0,65,"Ujung_Pandang",12]],[[0,69,"Sakhalin",12]],[[1,5,"Rarotonga",21]],[[0,4,"Rarotonga",21]],[[1,22,"Santiago",9],[1,14,"Santiago",9],[1,22,"Palmer",10],[1,22,"Continental",17],[1,14,"Continental",17]],[[0,14,"Santiago",9],[0,11,"Santiago",9],[0,14,"Palmer",10],[0,14,"Continental",17],[0,11,"Continental",17]],[[1,14,"Bogota",9]],[[0,11,"Bogota",9]],[[1,11,"Chicago",9],[1,11,"Atikokan",9],[1,11,"Coral_Harbour",9],[1,11,"Fort_Wayne",9],[1,11,"Indianapolis",4],[1,11,"Knox",4],[1,11,"Marengo",4],[1,11,"Petersburg",4],[1,11,"Vevay",4],[1,11,"Vincennes",4],[1,11,"Winamac",4],[1,11,"Indianapolis",9],[1,11,"Louisville",6],[1,11,"Monticello",6],[1,11,"Knox_IN",9],[1,11,"Louisville",9],[1,11,"Menominee",9],[1,11,"Rainy_River",9],[1,11,"Rankin_Inlet",9],[1,11,"Winnipeg",9],[1,11,"Central",16],[1,11,"CST6CDT"],[1,11,"Central"],[1,11,"East-Indiana"],[1,11,"Indiana-Starke"]],[[0,9,"Chicago",9],[0,11,"Havana",9],[0,11,"Cuba"],[0,9,"Atikokan",9],[0,9,"Belize",9],[0,9,"Cambridge_Bay",9],[0,9,"Cancun",9],[0,9,"Chihuahua",9],[0,9,"Coral_Harbour",9],[0,9,"Costa_Rica",9],[0,9,"Detroit",9],[0,9,"El_Salvador",9],[0,9,"Fort_Wayne",9],[0,9,"Guatemala",9],[0,9,"Hermosillo",9],[0,9,"Indianapolis",4],[0,9,"Knox",4],[0,9,"Marengo",4],[0,9,"Petersburg",4],[0,9,"Vevay",4],[0,9,"Vincennes",4],[0,9,"Winamac",4],[0,9,"Indianapolis",9],[0,9,"Iqaluit",9],[0,9,"Louisville",6],[0,9,"Monticello",6],[0,9,"Knox_IN",9],[0,9,"Louisville",9],[0,9,"Managua",9],[0,9,"Mazatlan",9],[0,9,"Menominee",9],[0,9,"Merida",9],[0,9,"Mexico_City",9],[0,9,"Monterrey",9],[0,9,"Center",8],[0,9,"New_Salem",8],[0,9,"Pangnirtung",9],[0,9,"Rainy_River",9],[0,9,"Rankin_Inlet",9],[0,9,"Regina",9],[0,9,"Swift_Current",9],[0,9,"Tegucigalpa",9],[0,9,"Winnipeg",9],[0,9,"Central",16],[0,9,"East-Saskatchewan",16],[0,9,"Saskatchewan",16],[0,9,"CST6CDT"],[0,9,"BajaSur",20],[0,9,"General",20],[0,9,"Central"],[0,9,"East-Indiana"],[0,9,"Indiana-Starke"],[0,9,"Michigan"],[0,65,"Chongqing",12],[0,65,"Chungking",12],[0,65,"Harbin",12],[0,65,"Kashgar",12],[0,65,"Macao",12],[0,65,"Macau",12],[0,65,"Shanghai",12],[0,65,"Taipei",12],[0,65,"Urumqi",12],[0,65,"PRC"],[0,65,"ROC"],[0,70,"Jayapura",12],[0,70,"Adelaide",14],[0,70,"Broken_Hill",14],[0,70,"Darwin",14],[0,70,"North",14],[0,70,"South",14],[0,70,"Yancowinna",14],[1,73,"Adelaide",14],[1,73,"Broken_Hill",14],[1,73,"Darwin",14],[1,73,"North",14],[1,73,"South",14],[1,73,"Yancowinna",14]],[[1,28,"Cape_Verde",13]],[[0,28,"Cape_Verde",13],[0,25,"Cape_Verde",13]],[[0,68,"Eucla",14],[1,71,"Eucla",14]],[[1,11,"Chicago",9],[1,11,"Atikokan",9],[1,11,"Coral_Harbour",9],[1,11,"Fort_Wayne",9],[1,11,"Indianapolis",4],[1,11,"Knox",4],[1,11,"Marengo",4],[1,11,"Petersburg",4],[1,11,"Vevay",4],[1,11,"Vincennes",4],[1,11,"Winamac",4],[1,11,"Indianapolis",9],[1,11,"Louisville",6],[1,11,"Monticello",6],[1,11,"Knox_IN",9],[1,11,"Louisville",9],[1,11,"Menominee",9],[1,11,"Mexico_City",9],[1,11,"Rainy_River",9],[1,11,"Rankin_Inlet",9],[1,11,"Winnipeg",9],[1,11,"Central",16],[1,11,"CST6CDT"],[1,11,"General",20],[1,11,"Central"],[1,11,"East-Indiana"],[1,11,"Indiana-Starke"]],[[0,72,"Guam",21],[0,72,"Saipan",21]],[[0,57,"Dacca",12],[0,57,"Dhaka",12]],[[0,59,"Davis",10]],[[0,72,"DumontDUrville",10]],[[1,57,"Dushanbe",12],[1,59,"Dushanbe",12]],[[0,54,"Dushanbe",12],[0,57,"Dushanbe",12]],[[1,11,"EasterIsland",17],[1,9,"EasterIsland",17],[1,11,"Easter",21],[1,9,"Easter",21]],[[0,9,"EasterIsland",17],[0,8,"EasterIsland",17],[0,9,"Easter",21],[0,8,"Easter",21],[1,51,"Antananarivo",19]],[[0,47,"Khartoum"],[0,47,"Addis_Ababa"],[0,47,"Asmara"],[0,47,"Asmera"],[0,47,"Dar_es_Salaam"],[0,47,"Djibouti"],[0,47,"Kampala"],[0,47,"Mogadishu"],[0,47,"Nairobi"],[0,47,"Antananarivo",19],[0,47,"Comoro",19],[0,47,"Mayotte",19]],[[0,11,"Guayaquil",9],[0,11,"Galapagos",21]],[[1,22,"Iqaluit",9]],[[1,14,"New_York",9],[1,14,"Cancun",9],[1,14,"Detroit",9],[1,14,"Fort_Wayne",9],[1,14,"Grand_Turk",9],[1,14,"Indianapolis",4],[1,14,"Marengo",4],[1,14,"Vevay",4],[1,14,"Vincennes",4],[1,14,"Winamac",4],[1,14,"Indianapolis",9],[1,14,"Iqaluit",9],[1,14,"Jamaica",9],[1,14,"Louisville",6],[1,14,"Monticello",6],[1,14,"Louisville",9],[1,14,"Montreal",9],[1,14,"Nassau",9],[1,14,"Nipigon",9],[1,14,"Pangnirtung",9],[1,14,"Port-au-Prince",9],[1,14,"Santo_Domingo",9],[1,14,"Thunder_Bay",9],[1,14,"Toronto",9],[1,14,"Eastern",16],[1,14,"EST"],[1,14,"EST5EDT"],[1,14,"Jamaica"],[1,14,"East-Indiana"],[1,14,"Eastern"],[1,14,"Michigan"]],[[1,47,"Helsinki",18],[1,47,"Cairo"],[1,47,"Amman",12],[1,47,"Beirut",12],[1,47,"Damascus",12],[1,47,"Gaza",12],[1,47,"Istanbul",12],[1,47,"Nicosia",12],[1,47,"EET"],[1,47,"Egypt"],[1,47,"Athens",18],[1,47,"Bucharest",18],[1,47,"Chisinau",18],[1,47,"Istanbul",18],[1,47,"Kaliningrad",18],[1,47,"Kiev",18],[1,47,"Mariehamn",18],[1,47,"Minsk",18],[1,47,"Moscow",18],[1,47,"Nicosia",18],[1,47,"Riga",18],[1,47,"Simferopol",18],[1,47,"Sofia",18],[1,47,"Tallinn",18],[1,47,"Tiraspol",18],[1,47,"Uzhgorod",18],[1,47,"Vilnius",18],[1,47,"Warsaw",18],[1,47,"Zaporozhye",18],[1,47,"Poland"],[1,47,"Turkey"],[1,47,"W-SU"]],[[0,42,"Helsinki",18],[1,47,"Gaza",12],[0,42,"Cairo"],[0,42,"Tripoli"],[0,42,"Amman",12],[0,42,"Beirut",12],[0,42,"Damascus",12],[0,42,"Gaza",12],[0,42,"Istanbul",12],[0,42,"Nicosia",12],[0,42,"EET"],[0,42,"Egypt"],[0,42,"Athens",18],[0,42,"Bucharest",18],[0,42,"Chisinau",18],[0,42,"Istanbul",18],[0,42,"Kaliningrad",18],[0,42,"Kiev",18],[0,42,"Mariehamn",18],[0,42,"Minsk",18],[0,42,"Moscow",18],[0,42,"Nicosia",18],[0,42,"Riga",18],[0,42,"Simferopol",18],[0,42,"Sofia",18],[0,42,"Tallinn",18],[0,42,"Tiraspol",18],[0,42,"Uzhgorod",18],[0,42,"Vilnius",18],[0,42,"Warsaw",18],[0,42,"Zaporozhye",18],[0,42,"Libya"],[0,42,"Poland"],[0,42,"Turkey"],[0,42,"W-SU"]],[[1,31,"Scoresbysund",9]],[[0,28,"Scoresbysund",9]],[[1,13,"Santo_Domingo",9]],[[0,69,"Jayapura",12]],[[1,14,"New_York",9],[1,14,"Detroit",9],[1,14,"Iqaluit",9],[1,14,"Montreal",9],[1,14,"Nipigon",9],[1,14,"Thunder_Bay",9],[1,14,"Toronto",9],[1,14,"Eastern",16],[1,14,"EST"],[1,14,"EST5EDT"],[1,14,"Eastern"],[1,14,"Michigan"]],[[0,11,"New_York",9],[0,11,"Antigua",9],[0,11,"Atikokan",9],[0,11,"Cambridge_Bay",9],[0,11,"Cancun",9],[0,11,"Cayman",9],[0,11,"Chicago",9],[0,11,"Coral_Harbour",9],[0,11,"Detroit",9],[0,11,"Fort_Wayne",9],[0,11,"Grand_Turk",9],[0,11,"Indianapolis",4],[0,11,"Knox",4],[0,11,"Marengo",4],[0,11,"Petersburg",4],[0,11,"Vevay",4],[0,11,"Vincennes",4],[0,11,"Winamac",4],[0,11,"Indianapolis",9],[0,11,"Iqaluit",9],[0,11,"Jamaica",9],[0,11,"Louisville",6],[0,11,"Monticello",6],[0,11,"Knox_IN",9],[0,11,"Louisville",9],[0,11,"Managua",9],[0,11,"Menominee",9],[0,11,"Merida",9],[0,11,"Montreal",9],[0,11,"Nassau",9],[0,11,"Nipigon",9],[0,11,"Panama",9],[0,11,"Pangnirtung",9],[0,11,"Port-au-Prince",9],[0,11,"Rankin_Inlet",9],[0,11,"Santo_Domingo",9],[0,11,"Thunder_Bay",9],[0,11,"Toronto",9],[0,11,"Eastern",16],[0,11,"EST"],[0,11,"EST5EDT"],[0,11,"Jamaica"],[0,11,"Central"],[0,11,"East-Indiana"],[0,11,"Eastern"],[0,11,"Indiana-Starke"],[0,11,"Michigan"],[0,72,"ACT",14],[0,72,"Brisbane",14],[0,72,"Canberra",14],[0,72,"Currie",14],[0,72,"Hobart",14],[0,72,"Lindeman",14],[0,72,"Melbourne",14],[0,72,"NSW",14],[0,72,"Queensland",14],[0,72,"Sydney",14],[0,72,"Tasmania",14],[0,72,"Victoria",14],[1,74,"Melbourne",14],[1,74,"ACT",14],[1,74,"Brisbane",14],[1,74,"Canberra",14],[1,74,"Currie",14],[1,74,"Hobart",14],[1,74,"Lindeman",14],[1,74,"NSW",14],[1,74,"Queensland",14],[1,74,"Sydney",14],[1,74,"Tasmania",14],[1,74,"Victoria",14]],[[1,14,"New_York",9],[1,14,"Detroit",9],[1,14,"Iqaluit",9],[1,14,"Montreal",9],[1,14,"Nipigon",9],[1,14,"Thunder_Bay",9],[1,14,"Toronto",9],[1,14,"Eastern",16],[1,14,"EST"],[1,14,"EST5EDT"],[1,14,"Eastern"],[1,14,"Michigan"]],[[1,79,"Fiji",21]],[[0,76,"Fiji",21]],[[1,22,"Stanley",13],[1,25,"Stanley",13]],[[0,22,"Stanley",13],[0,14,"Stanley",13]],[[1,28,"Noronha",9],[1,28,"DeNoronha",15]],[[0,25,"Noronha",9],[0,25,"DeNoronha",15]],[[0,51,"Aqtau",12],[0,54,"Aqtau",12]],[[1,57,"Bishkek",12],[1,59,"Bishkek",12]],[[0,54,"Bishkek",12],[0,57,"Bishkek",12]],[[0,9,"Galapagos",21]],[[0,6,"Gambier",21]],[[0,16,"Guyana",9]],[[1,51,"Tbilisi",12],[1,54,"Tbilisi",12]],[[0,47,"Tbilisi",12],[0,51,"Tbilisi",12]],[[0,22,"Cayenne",9],[0,14,"Cayenne",9]],[[1,33,"Accra"]],[[0,31,"Abidjan"],[0,31,"Accra"],[0,31,"Bamako"],[0,31,"Banjul"],[0,31,"Bissau"],[0,31,"Conakry"],[0,31,"Dakar"],[0,31,"Freetown"],[0,31,"Malabo"],[0,31,"Monrovia"],[0,31,"Niamey"],[0,31,"Nouakchott"],[0,31,"Ouagadougou"],[0,31,"Porto-Novo"],[0,31,"Sao_Tome"],[0,31,"Timbuktu"],[0,31,"Danmarkshavn",9],[0,31,"Reykjavik",13],[0,31,"St_Helena",13],[0,31,"Eire"],[0,31,"Belfast",18],[0,31,"Dublin",18],[0,31,"Gibraltar",18],[0,31,"Guernsey",18],[0,31,"Isle_of_Man",18],[0,31,"Jersey",18],[0,31,"London",18],[0,31,"GB"],[0,31,"GB-Eire"],[0,31,"Iceland"]],[[0,51,"Dubai",12],[0,51,"Bahrain",12],[0,51,"Muscat",12],[0,51,"Qatar",12]],[[0,22,"Guyana",9],[0,16,"Guyana",9],[0,14,"Guyana",9]],[[1,6,"Adak",9],[1,6,"Atka",9],[1,6,"Aleutian"]],[[0,4,"Adak",9],[0,4,"Atka",9],[0,4,"Aleutian"]],[[1,5,"Honolulu",21],[1,5,"HST"],[1,5,"Hawaii"]],[[1,69,"Hong_Kong",12],[1,69,"Hongkong"]],[[0,65,"Hong_Kong",12],[0,65,"Hongkong"]],[[1,65,"Hovd",12]],[[0,57,"Hovd",12],[0,59,"Hovd",12]],[[1,5,"Honolulu",21],[1,5,"HST"],[1,5,"Hawaii"]],[[0,4,"Honolulu",21],[0,3,"Honolulu",21],[0,4,"HST"],[0,4,"Hawaii"],[0,3,"HST"],[0,3,"Hawaii"]],[[1,5,"Honolulu",21],[1,5,"HST"],[1,5,"Hawaii"]],[[0,59,"Bangkok",12],[0,59,"Phnom_Penh",12],[0,59,"Saigon",12],[0,59,"Vientiane",12],[0,65,"Phnom_Penh",12],[0,65,"Saigon",12],[0,65,"Vientiane",12]],[[1,51,"Jerusalem",12],[1,51,"Tel_Aviv",12],[1,51,"Israel"]],[[1,47,"Jerusalem",12],[1,47,"Gaza",12],[1,47,"Tel_Aviv",12],[1,47,"Israel"]],[[1,57,"Colombo",12]],[[0,54,"Chagos",19],[0,57,"Chagos",19]],[[1,52,"Tehran",12],[1,54,"Tehran",12],[1,52,"Iran"],[1,54,"Iran"]],[[1,65,"Irkutsk",12],[1,69,"Irkutsk",12]],[[0,59,"Irkutsk",12],[0,65,"Irkutsk",12]],[[0,49,"Tehran",12],[0,51,"Tehran",12],[0,49,"Iran"],[0,51,"Iran"]],[[1,31,"Reykjavik",13],[1,31,"Iceland"]],[[0,42,"Jerusalem",12],[0,28,"Reykjavik",13],[0,28,"Iceland"],[0,55,"Calcutta",12],[0,55,"Colombo",12],[0,55,"Dacca",12],[0,55,"Dhaka",12],[0,55,"Karachi",12],[0,55,"Katmandu",12],[0,55,"Thimbu",12],[0,55,"Thimphu",12],[1,34,"Eire"],[1,34,"Dublin",18],[1,58,"Calcutta",12],[1,58,"Colombo",12],[1,58,"Karachi",12],[0,35,"Eire"],[0,35,"Dublin",18],[1,35,"Eire"],[1,35,"Dublin",18],[0,42,"Gaza",12],[0,42,"Tel_Aviv",12],[0,42,"Israel"]],[[0,62,"Jakarta",12]],[[1,72,"Tokyo",12],[1,72,"Japan"]],[[0,69,"Tokyo",12],[0,69,"Dili",12],[0,69,"Jakarta",12],[0,69,"Kuala_Lumpur",12],[0,69,"Kuching",12],[0,69,"Makassar",12],[0,69,"Manila",12],[0,69,"Pontianak",12],[0,69,"Rangoon",12],[0,69,"Sakhalin",12],[0,69,"Singapore",12],[0,69,"Ujung_Pandang",12],[0,69,"Japan"],[0,69,"Nauru",21],[0,69,"Singapore"]],[[0,54,"Karachi",12]],[[0,54,"Kashgar",12],[0,55,"Kashgar",12]],[[1,69,"Seoul",12],[1,72,"Seoul",12],[1,69,"ROK"],[1,72,"ROK"]],[[1,57,"Bishkek",12]],[[0,54,"Bishkek",12],[0,57,"Bishkek",12]],[[1,57,"Qyzylorda",12]],[[0,51,"Qyzylorda",12],[0,54,"Qyzylorda",12],[0,57,"Qyzylorda",12]],[[0,38,"Vilnius",18]],[[0,74,"Kosrae",21],[0,76,"Kosrae",21]],[[1,59,"Krasnoyarsk",12],[1,65,"Krasnoyarsk",12]],[[0,57,"Krasnoyarsk",12],[0,59,"Krasnoyarsk",12]],[[0,65,"Seoul",12],[0,67,"Seoul",12],[0,69,"Seoul",12],[0,65,"Pyongyang",12],[0,65,"ROK"],[0,67,"Pyongyang",12],[0,67,"ROK"],[0,69,"Pyongyang",12],[0,69,"ROK"]],[[1,47,"Samara",18],[1,51,"Samara",18],[1,54,"Samara",18]],[[0,47,"Samara",18],[0,51,"Samara",18]],[[0,0,"Kwajalein",21],[0,0,"Kwajalein"]],[[0,73,"Lord_Howe",14],[1,74,"Lord_Howe",14],[1,75,"Lord_Howe",14],[0,73,"LHI",14],[1,74,"LHI",14],[1,75,"LHI",14]],[[0,4,"Kiritimati",21],[0,81,"Kiritimati",21]],[[0,57,"Colombo",12],[0,58,"Colombo",12]],[[0,59,"Chongqing",12],[0,59,"Chungking",12]],[[0,29,"Monrovia"]],[[1,45,"Riga",18]],[[1,35,"Madeira",13]],[[1,31,"Madeira",13]],[[0,28,"Madeira",13]],[[1,74,"Magadan",12],[1,76,"Magadan",12]],[[0,72,"Magadan",12],[0,74,"Magadan",12]],[[1,62,"Singapore",12],[1,62,"Kuala_Lumpur",12],[1,62,"Singapore"]],[[0,59,"Singapore",12],[0,62,"Singapore",12],[0,63,"Singapore",12],[0,59,"Kuala_Lumpur",12],[0,59,"Singapore"],[0,62,"Kuala_Lumpur",12],[0,62,"Singapore"],[0,63,"Kuala_Lumpur",12],[0,63,"Singapore"]],[[0,5,"Marquesas",21]],[[0,57,"Mawson",10]],[[1,11,"Cambridge_Bay",9],[1,11,"Yellowknife",9]],[[1,53,"Moscow",18],[1,53,"W-SU"]],[[1,9,"Denver",9],[1,9,"Boise",9],[1,9,"Cambridge_Bay",9],[1,9,"Chihuahua",9],[1,9,"Edmonton",9],[1,9,"Hermosillo",9],[1,9,"Inuvik",9],[1,9,"Mazatlan",9],[1,9,"Center",8],[1,9,"New_Salem",8],[1,9,"Phoenix",9],[1,9,"Regina",9],[1,9,"Shiprock",9],[1,9,"Swift_Current",9],[1,9,"Yellowknife",9],[1,9,"East-Saskatchewan",16],[1,9,"Mountain",16],[1,9,"Saskatchewan",16],[1,9,"BajaSur",20],[1,9,"MST"],[1,9,"MST7MDT"],[1,9,"Navajo"],[1,9,"Arizona"],[1,9,"Mountain"]],[[1,42,"MET"]],[[0,35,"MET"]],[[0,76,"Kwajalein",21],[0,76,"Kwajalein"],[0,76,"Majuro",21]],[[0,44,"Moscow",18],[0,58,"Rangoon",12],[0,64,"Makassar",12],[0,64,"Ujung_Pandang",12],[0,44,"W-SU"]],[[1,69,"Macao",12],[1,69,"Macau",12]],[[0,65,"Macao",12],[0,65,"Macau",12]],[[1,9,"Denver",9],[1,9,"Boise",9],[1,9,"Cambridge_Bay",9],[1,9,"Edmonton",9],[1,9,"Center",8],[1,9,"New_Salem",8],[1,9,"Regina",9],[1,9,"Shiprock",9],[1,9,"Swift_Current",9],[1,9,"Yellowknife",9],[1,9,"East-Saskatchewan",16],[1,9,"Mountain",16],[1,9,"Saskatchewan",16],[1,9,"MST"],[1,9,"MST7MDT"],[1,9,"Navajo"],[1,9,"Mountain"],[0,72,"Saipan",21]],[[1,51,"Moscow",18],[1,54,"Moscow",18],[1,51,"Chisinau",18],[1,51,"Kaliningrad",18],[1,51,"Kiev",18],[1,51,"Minsk",18],[1,51,"Riga",18],[1,51,"Simferopol",18],[1,51,"Tallinn",18],[1,51,"Tiraspol",18],[1,51,"Uzhgorod",18],[1,51,"Vilnius",18],[1,51,"Zaporozhye",18],[1,51,"W-SU"],[1,54,"W-SU"]],[[0,47,"Moscow",18],[0,47,"Chisinau",18],[0,47,"Kaliningrad",18],[0,47,"Kiev",18],[0,47,"Minsk",18],[0,47,"Riga",18],[0,47,"Simferopol",18],[0,47,"Tallinn",18],[0,47,"Tiraspol",18],[0,47,"Uzhgorod",18],[0,47,"Vilnius",18],[0,47,"Zaporozhye",18],[0,47,"W-SU"]],[[0,8,"Denver",9],[0,8,"Boise",9],[0,8,"Cambridge_Bay",9],[0,8,"Chihuahua",9],[0,8,"Dawson_Creek",9],[0,8,"Edmonton",9],[0,8,"Ensenada",9],[0,8,"Hermosillo",9],[0,8,"Inuvik",9],[0,8,"Mazatlan",9],[0,8,"Mexico_City",9],[0,8,"Center",8],[0,8,"New_Salem",8],[0,8,"Phoenix",9],[0,8,"Regina",9],[0,8,"Shiprock",9],[0,8,"Swift_Current",9],[0,8,"Tijuana",9],[0,8,"Yellowknife",9],[0,8,"East-Saskatchewan",16],[0,8,"Mountain",16],[0,8,"Saskatchewan",16],[0,8,"BajaNorte",20],[0,8,"BajaSur",20],[0,8,"General",20],[0,8,"MST"],[0,8,"MST7MDT"],[0,8,"Navajo"],[0,8,"Arizona"],[0,8,"Mountain"],[1,50,"Moscow",18],[1,50,"W-SU"]],[[0,51,"Mauritius",19]],[[0,54,"Maldives",19]],[[1,9,"Denver",9],[1,9,"Boise",9],[1,9,"Cambridge_Bay",9],[1,9,"Edmonton",9],[1,9,"Center",8],[1,9,"New_Salem",8],[1,9,"Phoenix",9],[1,9,"Regina",9],[1,9,"Shiprock",9],[1,9,"Swift_Current",9],[1,9,"Yellowknife",9],[1,9,"East-Saskatchewan",16],[1,9,"Mountain",16],[1,9,"Saskatchewan",16],[1,9,"MST"],[1,9,"MST7MDT"],[1,9,"Navajo"],[1,9,"Arizona"],[1,9,"Mountain"]],[[0,65,"Kuala_Lumpur",12],[0,65,"Kuching",12]],[[1,76,"Noumea",21]],[[0,74,"Noumea",21]],[[1,26,"St_Johns",9],[1,26,"Newfoundland",16]],[[1,24,"St_Johns",9],[1,23,"St_Johns",9],[1,4,"Midway",21],[1,24,"Goose_Bay",9],[1,24,"Newfoundland",16],[1,23,"Goose_Bay",9],[1,23,"Newfoundland",16]],[[0,21,"Paramaribo",9]],[[1,37,"Amsterdam",18]],[[0,33,"Amsterdam",18]],[[0,75,"Norfolk",21]],[[1,59,"Novosibirsk",12],[1,65,"Novosibirsk",12]],[[0,57,"Novosibirsk",12],[0,59,"Novosibirsk",12]],[[1,24,"St_Johns",9],[1,4,"Adak",9],[1,4,"Atka",9],[1,4,"Nome",9],[1,4,"Aleutian"],[1,24,"Goose_Bay",9],[1,24,"Newfoundland",16],[0,56,"Katmandu",12]],[[0,75,"Nauru",21],[0,76,"Nauru",21]],[[0,21,"St_Johns",9],[0,20,"St_Johns",9],[0,21,"Goose_Bay",9],[0,21,"Newfoundland",16],[0,20,"Goose_Bay",9],[0,20,"Newfoundland",16],[0,2,"Adak",9],[0,2,"Atka",9],[0,2,"Nome",9],[0,2,"Midway",21],[0,2,"Pago_Pago",21],[0,2,"Samoa",21],[0,2,"Aleutian"],[0,2,"Samoa"],[1,36,"Amsterdam",18]],[[0,2,"Niue",21],[0,1,"Niue",21]],[[1,24,"St_Johns",9],[1,4,"Adak",9],[1,4,"Atka",9],[1,4,"Nome",9],[1,4,"Aleutian"],[1,24,"Goose_Bay",9],[1,24,"Newfoundland",16]],[[1,79,"Auckland",21],[1,79,"McMurdo",10],[1,79,"South_Pole",10],[1,79,"NZ"]],[[0,75,"Auckland",21],[0,75,"NZ"]],[[0,76,"Auckland",21],[1,76,"Auckland",21],[1,77,"Auckland",21],[0,76,"McMurdo",10],[0,76,"South_Pole",10],[0,76,"NZ"],[1,76,"NZ"],[1,77,"NZ"]],[[1,57,"Omsk",12],[1,59,"Omsk",12]],[[0,54,"Omsk",12],[0,57,"Omsk",12]],[[1,54,"Oral",12]],[[0,51,"Oral",12],[0,54,"Oral",12]],[[1,9,"Inuvik",9]],[[1,8,"Los_Angeles",9],[1,8,"Boise",9],[1,8,"Dawson",9],[1,8,"Dawson_Creek",9],[1,8,"Ensenada",9],[1,8,"Inuvik",9],[1,8,"Juneau",9],[1,8,"Tijuana",9],[1,8,"Vancouver",9],[1,8,"Whitehorse",9],[1,8,"Pacific",16],[1,8,"Yukon",16],[1,8,"BajaNorte",20],[1,8,"PST8PDT"],[1,8,"Pacific"],[1,8,"Pacific-New"]],[[1,14,"Lima",9]],[[1,76,"Kamchatka",12],[1,79,"Kamchatka",12]],[[0,74,"Kamchatka",12],[0,76,"Kamchatka",12]],[[0,11,"Lima",9]],[[0,2,"Enderbury",21],[0,79,"Enderbury",21]],[[1,69,"Manila",12]],[[0,65,"Manila",12]],[[1,57,"Karachi",12]],[[0,54,"Karachi",12]],[[1,25,"Miquelon",9]],[[0,22,"Miquelon",9]],[[0,18,"Paramaribo",9],[0,17,"Paramaribo",9],[0,61,"Pontianak",12],[0,72,"DumontDUrville",10]],[[1,8,"Los_Angeles",9],[1,8,"Dawson_Creek",9],[1,8,"Ensenada",9],[1,8,"Inuvik",9],[1,8,"Juneau",9],[1,8,"Tijuana",9],[1,8,"Vancouver",9],[1,8,"Pacific",16],[1,8,"BajaNorte",20],[1,8,"PST8PDT"],[1,8,"Pacific"],[1,8,"Pacific-New"]],[[0,7,"Los_Angeles",9],[0,7,"Boise",9],[0,7,"Dawson",9],[0,7,"Dawson_Creek",9],[0,7,"Ensenada",9],[0,7,"Hermosillo",9],[0,7,"Inuvik",9],[0,7,"Juneau",9],[0,7,"Mazatlan",9],[0,7,"Tijuana",9],[0,7,"Vancouver",9],[0,7,"Whitehorse",9],[0,7,"Pacific",16],[0,7,"Yukon",16],[0,7,"BajaNorte",20],[0,7,"BajaSur",20],[0,7,"Pitcairn",21],[0,7,"PST8PDT"],[0,7,"Pacific"],[0,7,"Pacific-New"]],[[1,8,"Los_Angeles",9],[1,8,"Dawson_Creek",9],[1,8,"Ensenada",9],[1,8,"Inuvik",9],[1,8,"Juneau",9],[1,8,"Tijuana",9],[1,8,"Vancouver",9],[1,8,"Pacific",16],[1,8,"BajaNorte",20],[1,8,"PST8PDT"],[1,8,"Pacific"],[1,8,"Pacific-New"]],[[1,22,"Asuncion",9]],[[0,22,"Asuncion",9],[0,14,"Asuncion",9]],[[1,59,"Qyzylorda",12]],[[0,54,"Qyzylorda",12],[0,57,"Qyzylorda",12]],[[0,51,"Reunion",19]],[[0,39,"Riga",18]],[[0,22,"Rothera",10]],[[1,74,"Sakhalin",12],[1,76,"Sakhalin",12]],[[0,72,"Sakhalin",12],[0,74,"Sakhalin",12]],[[1,57,"Samarkand",12],[1,54,"Samara",18]],[[0,51,"Samarkand",12],[0,54,"Samarkand",12],[0,1,"Apia",21],[0,1,"Pago_Pago",21],[0,1,"Samoa",21],[0,1,"Samoa"],[0,47,"Samara",18],[0,51,"Samara",18]],[[1,47,"Johannesburg"],[0,42,"Johannesburg"],[1,47,"Maseru"],[1,47,"Windhoek"],[0,42,"Maseru"],[0,42,"Mbabane"],[0,42,"Windhoek"]],[[0,74,"Guadalcanal",21]],[[0,51,"Mahe",19]],[[0,63,"Singapore",12],[0,65,"Singapore",12],[0,63,"Singapore"],[0,65,"Singapore"]],[[1,57,"Aqtau",12]],[[0,54,"Aqtau",12],[0,57,"Aqtau",12]],[[1,30,"Freetown"],[1,35,"Freetown"]],[[0,60,"Saigon",12],[0,12,"Santiago",9],[0,12,"Continental",17],[0,60,"Phnom_Penh",12],[0,60,"Vientiane",12]],[[0,22,"Paramaribo",9],[0,21,"Paramaribo",9]],[[0,2,"Samoa",21],[0,2,"Midway",21],[0,2,"Pago_Pago",21],[0,2,"Samoa"]],[[0,47,"Volgograd",18],[0,51,"Volgograd",18]],[[1,54,"Yekaterinburg",12],[1,57,"Yekaterinburg",12]],[[0,51,"Yekaterinburg",12],[0,54,"Yekaterinburg",12]],[[0,47,"Syowa",10]],[[0,4,"Tahiti",21]],[[1,59,"Samarkand",12],[1,57,"Tashkent",12],[1,59,"Tashkent",12]],[[0,57,"Samarkand",12],[0,54,"Tashkent",12],[0,57,"Tashkent",12]],[[1,51,"Tbilisi",12],[1,54,"Tbilisi",12]],[[0,47,"Tbilisi",12],[0,51,"Tbilisi",12]],[[0,54,"Kerguelen",19]],[[0,54,"Dushanbe",12]],[[0,65,"Dili",12],[0,69,"Dili",12]],[[0,48,"Tehran",12],[0,48,"Iran"],[0,51,"Ashgabat",12],[0,51,"Ashkhabad",12],[0,54,"Ashgabat",12],[0,54,"Ashkhabad",12],[0,40,"Tallinn",18]],[[1,81,"Tongatapu",21]],[[0,79,"Tongatapu",21]],[[1,51,"Istanbul",18],[1,51,"Istanbul",12],[1,51,"Turkey"]],[[0,47,"Istanbul",18],[0,47,"Istanbul",12],[0,47,"Turkey"]],[[0,47,"Volgograd",18]],[[1,69,"Ulaanbaatar",12],[1,69,"Ulan_Bator",12]],[[0,59,"Ulaanbaatar",12],[0,65,"Ulaanbaatar",12],[0,59,"Choibalsan",12],[0,59,"Ulan_Bator",12],[0,65,"Choibalsan",12],[0,65,"Ulan_Bator",12]],[[1,54,"Oral",12],[1,57,"Oral",12]],[[0,51,"Oral",12],[0,54,"Oral",12],[0,57,"Oral",12]],[[0,57,"Urumqi",12]],[[1,22,"Montevideo",9],[1,24,"Montevideo",9]],[[1,25,"Montevideo",9]],[[0,22,"Montevideo",9],[0,21,"Montevideo",9]],[[1,57,"Samarkand",12],[1,57,"Tashkent",12]],[[0,54,"Samarkand",12],[0,54,"Tashkent",12]],[[0,14,"Caracas",9],[0,13,"Caracas",9]],[[1,72,"Vladivostok",12]],[[0,69,"Vladivostok",12],[1,74,"Vladivostok",12]],[[0,69,"Vladivostok",12],[0,72,"Vladivostok",12]],[[1,51,"Volgograd",18],[1,54,"Volgograd",18]],[[0,47,"Volgograd",18],[0,51,"Volgograd",18]],[[0,57,"Vostok",10]],[[1,76,"Efate",21]],[[0,74,"Efate",21]],[[1,22,"Mendoza",9],[1,22,"Jujuy",2],[1,22,"Mendoza",2],[1,22,"Jujuy",9]],[[0,14,"Mendoza",9],[0,14,"Catamarca",2],[0,14,"ComodRivadavia",2],[0,14,"Cordoba",2],[0,14,"Jujuy",2],[0,14,"La_Rioja",2],[0,14,"Mendoza",2],[0,14,"Rio_Gallegos",2],[0,14,"San_Juan",2],[0,14,"Tucuman",2],[0,14,"Ushuaia",2],[0,14,"Catamarca",9],[0,14,"Cordoba",9],[0,14,"Jujuy",9],[0,14,"Rosario",9]],[[1,42,"Windhoek"],[1,42,"Ndjamena"]],[[0,28,"Dakar"],[0,28,"Bamako"],[0,28,"Banjul"],[0,28,"Bissau"],[0,28,"Conakry"],[0,28,"El_Aaiun"],[0,28,"Freetown"],[0,28,"Niamey"],[0,28,"Nouakchott"],[0,28,"Timbuktu"],[0,31,"Freetown"],[0,35,"Brazzaville"],[0,35,"Bangui"],[0,35,"Douala"],[0,35,"Lagos"],[0,35,"Libreville"],[0,35,"Luanda"],[0,35,"Malabo"],[0,35,"Ndjamena"],[0,35,"Niamey"],[0,35,"Porto-Novo"],[0,35,"Windhoek"]],[[1,42,"Lisbon",18],[1,42,"Madrid",18],[1,42,"Monaco",18],[1,42,"Paris",18],[1,42,"Portugal"],[1,42,"WET"]],[[1,35,"Paris",18],[1,35,"Algiers"],[1,35,"Casablanca"],[1,35,"Ceuta"],[1,35,"Canary",13],[1,35,"Faeroe",13],[1,35,"Faroe",13],[1,35,"Madeira",13],[1,35,"Brussels",18],[1,35,"Lisbon",18],[1,35,"Luxembourg",18],[1,35,"Madrid",18],[1,35,"Monaco",18],[1,35,"Portugal"],[1,35,"WET"],[1,42,"Luxembourg",18]],[[0,31,"Paris",18],[0,31,"Algiers"],[0,31,"Casablanca"],[0,31,"Ceuta"],[0,31,"El_Aaiun"],[0,31,"Azores",13],[0,31,"Canary",13],[0,31,"Faeroe",13],[0,31,"Faroe",13],[0,31,"Madeira",13],[0,31,"Brussels",18],[0,31,"Lisbon",18],[0,31,"Luxembourg",18],[0,31,"Madrid",18],[0,31,"Monaco",18],[0,31,"Portugal"],[0,31,"WET"],[0,35,"Luxembourg",18]],[[1,25,"Godthab",9],[1,25,"Danmarkshavn",9]],[[0,22,"Godthab",9],[0,22,"Danmarkshavn",9]],[[0,59,"Jakarta",12],[0,63,"Jakarta",12],[0,65,"Jakarta",12],[0,59,"Pontianak",12],[0,63,"Pontianak",12],[0,65,"Pontianak",12]],[[0,65,"Perth",14],[1,69,"Perth",14],[0,2,"Apia",21],[0,65,"Casey",10],[0,65,"West",14],[1,69,"West",14]],[[1,69,"Yakutsk",12],[1,72,"Yakutsk",12]],[[0,65,"Yakutsk",12],[0,69,"Yakutsk",12]],[[1,8,"Dawson",9],[1,8,"Whitehorse",9],[1,8,"Yukon",16]],[[1,7,"Dawson",9],[1,7,"Whitehorse",9],[1,7,"Yakutat",9],[1,7,"Yukon",16]],[[1,57,"Yekaterinburg",12]],[[0,54,"Yekaterinburg",12]],[[1,51,"Yerevan",12],[1,54,"Yerevan",12]],[[0,47,"Yerevan",12],[0,51,"Yerevan",12]],[[1,7,"Dawson",9],[1,7,"Whitehorse",9],[1,7,"Yakutat",9],[1,7,"Yukon",16]],[[0,6,"Anchorage",9],[0,6,"Dawson",9],[0,6,"Juneau",9],[0,6,"Nome",9],[0,6,"Whitehorse",9],[0,6,"Yakutat",9],[0,6,"Yukon",16],[0,6,"Alaska"]],[[1,7,"Dawson",9],[1,7,"Whitehorse",9],[1,7,"Yakutat",9],[1,7,"Yukon",16]],[[0,35]],[[0,42]],[[0,47]],[[0,51]],[[0,54]],[[0,57]],[[0,59]],[[0,65]],[[0,69]],[[0,72]],[[0,74]],[[0,76]],[[0,28]],[[0,25]],[[0,22]],[[0,14]],[[0,11]],[[0,9]],[[0,8]],[[0,31,"UTC"]],[[0,7]],[[0,6]],[[0,4]],[[0,2]],[[0,0]],[[0,31,"Davis",10],[0,31,"DumontDUrville",10]],[[0,31]]];}
if(!php_js_shared.tz_abbreviations){php_js_shared.tz_abbreviations=["acst","act","addt","adt","aft","ahdt","ahst","akdt","akst","aktst","aktt","almst","almt","amst","amt","anast","anat","ant","apt","aqtst","aqtt","arst","art","ashst","asht","ast","awt","azomt","azost","azot","azst","azt","bakst","bakt","bdst","bdt","beat","beaut","bmt","bnt","bortst","bort","bost","bot","brst","brt","bst","btt","burt","cant","capt","cast","cat","cawt","cddt","cdt","cemt","cest","cet","cgst","cgt","chadt","chast","chat","chdt","chost","chot","cit","cjt","ckhst","ckt","clst","clt","cost","cot","cpt","cst","cvst","cvt","cwst","cwt","chst","dact","davt","ddut","dusst","dust","easst","east","eat","ect","eddt","edt","eest","eet","egst","egt","ehdt","eit","ept","est","ewt","fjst","fjt","fkst","fkt","fnst","fnt","fort","frust","frut","galt","gamt","gbgt","gest","get","gft","ghst","gmt","gst","gyt","hadt","hast","hdt","hkst","hkt","hovst","hovt","hpt","hst","hwt","ict","iddt","idt","ihst","iot","irdt","irkst","irkt","irst","isst","ist","javt","jdt","jst","kart","kast","kdt","kgst","kgt","kizst","kizt","kmt","kost","krast","krat","kst","kuyst","kuyt","kwat","lhst","lint","lkt","lont","lrt","lst","madmt","madst","madt","magst","magt","malst","malt","mart","mawt","mddt","mdst","mdt","mest","met","mht","mmt","most","mot","mpt","msd","msk","mst","mut","mvt","mwt","myt","ncst","nct","nddt","ndt","negt","nest","net","nft","novst","novt","npt","nrt","nst","nut","nwt","nzdt","nzmt","nzst","omsst","omst","orast","orat","pddt","pdt","pest","petst","pett","pet","phot","phst","pht","pkst","pkt","pmdt","pmst","pmt","ppt","pst","pwt","pyst","pyt","qyzst","qyzt","ret","rmt","rott","sakst","sakt","samst","samt","sast","sbt","sct","sgt","shest","shet","slst","smt","srt","sst","stat","svest","svet","syot","taht","tasst","tast","tbist","tbit","tft","tjt","tlt","tmt","tost","tot","trst","trt","tsat","ulast","ulat","urast","urat","urut","uyhst","uyst","uyt","uzst","uzt","vet","vlasst","vlast","vlat","volst","volt","vost","vust","vut","warst","wart","wast","wat","wemt","west","wet","wgst","wgt","wit","wst","yakst","yakt","yddt","ydt","yekst","yekt","yerst","yert","ypt","yst","ywt","a","b","c","d","e","f","g","h","i","k","l","m","n","o","p","q","r","s","t","utc","u","v","w","x","y","zzz","z"];}
if(!php_js_shared.tz_offsets){php_js_shared.tz_offsets=[-43200,-41400,-39600,-37800,-36000,-34200,-32400,-28800,-25200,-21600,-19800,-18000,-16966,-16200,-14400,-14308,-13500,-13252,-13236,-12756,-12652,-12600,-10800,-9052,-9000,-7200,-5400,-3996,-3600,-2670,-1200,0,1172,1200,2079,3600,4772,4800,5736,5784,5940,6264,7200,9000,9048,9384,9885,10800,12344,12600,12648,14400,16200,16248,18000,19800,20700,21600,23400,25200,25580,26240,26400,27000,28656,28800,30000,30600,31500,32400,34200,35100,36000,37800,39600,41400,43200,45000,45900,46800,49500,50400];}
if(!php_js_shared.tz_prefixes){php_js_shared.tz_prefixes=['Africa','America','America/Argentina','America','America/Indiana','America','America/Kentucky','America','America/North_Dakota','America','Antarctica','Arctic','Asia','Atlantic','Australia','Brazil','Canada','Chile','Europe','Indian','Mexico','Pacific'];}
for(i=0,len=php_js_shared.tz_abbrs.length;i<len;i++){indice=php_js_shared.tz_abbreviations[i];curr=php_js_shared.tz_abbrs[i];list[indice]=[];for(j=0,jlen=curr.length;j<jlen;j++){currSub=curr[j];currSubPrefix=(currSub[3]?php_js_shared.tz_prefixes[currSub[3]]+'/':'');timezone_id=currSub[2]?(currSubPrefix+currSub[2]):null;list[indice].push({'dst':!!currSub[0],'offset':php_js_shared.tz_offsets[currSub[1]],'timezone_id':timezone_id});}}
return list;}
function timezone_identifiers_list(what,country){var i=0,new_what='',returnArr=[],continents=[],codes=[],identifiers=['Africa/Abidjan','Africa/Accra','Africa/Addis_Ababa','Africa/Algiers','Africa/Asmara','Africa/Asmera','Africa/Bamako','Africa/Bangui','Africa/Banjul','Africa/Bissau','Africa/Blantyre','Africa/Brazzaville','Africa/Bujumbura','Africa/Cairo','Africa/Casablanca','Africa/Ceuta','Africa/Conakry','Africa/Dakar','Africa/Dar_es_Salaam','Africa/Djibouti','Africa/Douala','Africa/El_Aaiun','Africa/Freetown','Africa/Gaborone','Africa/Harare','Africa/Johannesburg','Africa/Kampala','Africa/Khartoum','Africa/Kigali','Africa/Kinshasa','Africa/Lagos','Africa/Libreville','Africa/Lome','Africa/Luanda','Africa/Lubumbashi','Africa/Lusaka','Africa/Malabo','Africa/Maputo','Africa/Maseru','Africa/Mbabane','Africa/Mogadishu','Africa/Monrovia','Africa/Nairobi','Africa/Ndjamena','Africa/Niamey','Africa/Nouakchott','Africa/Ouagadougou','Africa/Porto-Novo','Africa/Sao_Tome','Africa/Timbuktu','Africa/Tripoli','Africa/Tunis','Africa/Windhoek','America/Adak','America/Anchorage','America/Anguilla','America/Antigua','America/Araguaina','America/Argentina/Buenos_Aires','America/Argentina/Catamarca','America/Argentina/ComodRivadavia','America/Argentina/Cordoba','America/Argentina/Jujuy','America/Argentina/La_Rioja','America/Argentina/Mendoza','America/Argentina/Rio_Gallegos','America/Argentina/San_Juan','America/Argentina/San_Luis','America/Argentina/Tucuman','America/Argentina/Ushuaia','America/Aruba','America/Asuncion','America/Atikokan','America/Atka','America/Bahia','America/Barbados','America/Belem','America/Belize','America/Blanc-Sablon','America/Boa_Vista','America/Bogota','America/Boise','America/Buenos_Aires','America/Cambridge_Bay','America/Campo_Grande','America/Cancun','America/Caracas','America/Catamarca','America/Cayenne','America/Cayman','America/Chicago','America/Chihuahua','America/Coral_Harbour','America/Cordoba','America/Costa_Rica','America/Cuiaba','America/Curacao','America/Danmarkshavn','America/Dawson','America/Dawson_Creek','America/Denver','America/Detroit','America/Dominica','America/Edmonton','America/Eirunepe','America/El_Salvador','America/Ensenada','America/Fort_Wayne','America/Fortaleza','America/Glace_Bay','America/Godthab','America/Goose_Bay','America/Grand_Turk','America/Grenada','America/Guadeloupe','America/Guatemala','America/Guayaquil','America/Guyana','America/Halifax','America/Havana','America/Hermosillo','America/Indiana/Indianapolis','America/Indiana/Knox','America/Indiana/Marengo','America/Indiana/Petersburg','America/Indiana/Tell_City','America/Indiana/Vevay','America/Indiana/Vincennes','America/Indiana/Winamac','America/Indianapolis','America/Inuvik','America/Iqaluit','America/Jamaica','America/Jujuy','America/Juneau','America/Kentucky/Louisville','America/Kentucky/Monticello','America/Knox_IN','America/La_Paz','America/Lima','America/Los_Angeles','America/Louisville','America/Maceio','America/Managua','America/Manaus','America/Marigot','America/Martinique','America/Mazatlan','America/Mendoza','America/Menominee','America/Merida','America/Mexico_City','America/Miquelon','America/Moncton','America/Monterrey','America/Montevideo','America/Montreal','America/Montserrat','America/Nassau','America/New_York','America/Nipigon','America/Nome','America/Noronha','America/North_Dakota/Center','America/North_Dakota/New_Salem','America/Panama','America/Pangnirtung','America/Paramaribo','America/Phoenix','America/Port-au-Prince','America/Port_of_Spain','America/Porto_Acre','America/Porto_Velho','America/Puerto_Rico','America/Rainy_River','America/Rankin_Inlet','America/Recife','America/Regina','America/Resolute','America/Rio_Branco','America/Rosario','America/Santiago','America/Santo_Domingo','America/Sao_Paulo','America/Scoresbysund','America/Shiprock','America/St_Barthelemy','America/St_Johns','America/St_Kitts','America/St_Lucia','America/St_Thomas','America/St_Vincent','America/Swift_Current','America/Tegucigalpa','America/Thule','America/Thunder_Bay','America/Tijuana','America/Toronto','America/Tortola','America/Vancouver','America/Virgin','America/Whitehorse','America/Winnipeg','America/Yakutat','America/Yellowknife','Antarctica/Casey','Antarctica/Davis','Antarctica/DumontDUrville','Antarctica/Mawson','Antarctica/McMurdo','Antarctica/Palmer','Antarctica/Rothera','Antarctica/South_Pole','Antarctica/Syowa','Antarctica/Vostok','Arctic/Longyearbyen','Asia/Aden','Asia/Almaty','Asia/Amman','Asia/Anadyr','Asia/Aqtau','Asia/Aqtobe','Asia/Ashgabat','Asia/Ashkhabad','Asia/Baghdad','Asia/Bahrain','Asia/Baku','Asia/Bangkok','Asia/Beirut','Asia/Bishkek','Asia/Brunei','Asia/Calcutta','Asia/Choibalsan','Asia/Chongqing','Asia/Chungking','Asia/Colombo','Asia/Dacca','Asia/Damascus','Asia/Dhaka','Asia/Dili','Asia/Dubai','Asia/Dushanbe','Asia/Gaza','Asia/Harbin','Asia/Ho_Chi_Minh','Asia/Hong_Kong','Asia/Hovd','Asia/Irkutsk','Asia/Istanbul','Asia/Jakarta','Asia/Jayapura','Asia/Jerusalem','Asia/Kabul','Asia/Kamchatka','Asia/Karachi','Asia/Kashgar','Asia/Katmandu','Asia/Kolkata','Asia/Krasnoyarsk','Asia/Kuala_Lumpur','Asia/Kuching','Asia/Kuwait','Asia/Macao','Asia/Macau','Asia/Magadan','Asia/Makassar','Asia/Manila','Asia/Muscat','Asia/Nicosia','Asia/Novosibirsk','Asia/Omsk','Asia/Oral','Asia/Phnom_Penh','Asia/Pontianak','Asia/Pyongyang','Asia/Qatar','Asia/Qyzylorda','Asia/Rangoon','Asia/Riyadh','Asia/Saigon','Asia/Sakhalin','Asia/Samarkand','Asia/Seoul','Asia/Shanghai','Asia/Singapore','Asia/Taipei','Asia/Tashkent','Asia/Tbilisi','Asia/Tehran','Asia/Tel_Aviv','Asia/Thimbu','Asia/Thimphu','Asia/Tokyo','Asia/Ujung_Pandang','Asia/Ulaanbaatar','Asia/Ulan_Bator','Asia/Urumqi','Asia/Vientiane','Asia/Vladivostok','Asia/Yakutsk','Asia/Yekaterinburg','Asia/Yerevan','Atlantic/Azores','Atlantic/Bermuda','Atlantic/Canary','Atlantic/Cape_Verde','Atlantic/Faeroe','Atlantic/Faroe','Atlantic/Jan_Mayen','Atlantic/Madeira','Atlantic/Reykjavik','Atlantic/South_Georgia','Atlantic/St_Helena','Atlantic/Stanley','Australia/ACT','Australia/Adelaide','Australia/Brisbane','Australia/Broken_Hill','Australia/Canberra','Australia/Currie','Australia/Darwin','Australia/Eucla','Australia/Hobart','Australia/LHI','Australia/Lindeman','Australia/Lord_Howe','Australia/Melbourne','Australia/North','Australia/NSW','Australia/Perth','Australia/Queensland','Australia/South','Australia/Sydney','Australia/Tasmania','Australia/Victoria','Australia/West','Australia/Yancowinna','Brazil/Acre','Brazil/DeNoronha','Brazil/East','Brazil/West','Canada/Atlantic','Canada/Central','Canada/East-Saskatchewan','Canada/Eastern','Canada/Mountain','Canada/Newfoundland','Canada/Pacific','Canada/Saskatchewan','Canada/Yukon','CET','Chile/Continental','Chile/EasterIsland','CST6CDT','Cuba','EET','Egypt','Eire','EST','EST5EDT','Etc/GMT','Etc/GMT+0','Etc/GMT+1','Etc/GMT+10','Etc/GMT+11','Etc/GMT+12','Etc/GMT+2','Etc/GMT+3','Etc/GMT+4','Etc/GMT+5','Etc/GMT+6','Etc/GMT+7','Etc/GMT+8','Etc/GMT+9','Etc/GMT-0','Etc/GMT-1','Etc/GMT-10','Etc/GMT-11','Etc/GMT-12','Etc/GMT-13','Etc/GMT-14','Etc/GMT-2','Etc/GMT-3','Etc/GMT-4','Etc/GMT-5','Etc/GMT-6','Etc/GMT-7','Etc/GMT-8','Etc/GMT-9','Etc/GMT0','Etc/Greenwich','Etc/UCT','Etc/Universal','Etc/UTC','Etc/Zulu','Europe/Amsterdam','Europe/Andorra','Europe/Athens','Europe/Belfast','Europe/Belgrade','Europe/Berlin','Europe/Bratislava','Europe/Brussels','Europe/Bucharest','Europe/Budapest','Europe/Chisinau','Europe/Copenhagen','Europe/Dublin','Europe/Gibraltar','Europe/Guernsey','Europe/Helsinki','Europe/Isle_of_Man','Europe/Istanbul','Europe/Jersey','Europe/Kaliningrad','Europe/Kiev','Europe/Lisbon','Europe/Ljubljana','Europe/London','Europe/Luxembourg','Europe/Madrid','Europe/Malta','Europe/Mariehamn','Europe/Minsk','Europe/Monaco','Europe/Moscow','Europe/Nicosia','Europe/Oslo','Europe/Paris','Europe/Podgorica','Europe/Prague','Europe/Riga','Europe/Rome','Europe/Samara','Europe/San_Marino','Europe/Sarajevo','Europe/Simferopol','Europe/Skopje','Europe/Sofia','Europe/Stockholm','Europe/Tallinn','Europe/Tirane','Europe/Tiraspol','Europe/Uzhgorod','Europe/Vaduz','Europe/Vatican','Europe/Vienna','Europe/Vilnius','Europe/Volgograd','Europe/Warsaw','Europe/Zagreb','Europe/Zaporozhye','Europe/Zurich','Factory','GB','GB-Eire','GMT','GMT+0','GMT-0','GMT0','Greenwich','Hongkong','HST','Iceland','Indian/Antananarivo','Indian/Chagos','Indian/Christmas','Indian/Cocos','Indian/Comoro','Indian/Kerguelen','Indian/Mahe','Indian/Maldives','Indian/Mauritius','Indian/Mayotte','Indian/Reunion','Iran','Israel','Jamaica','Japan','Kwajalein','Libya','MET','Mexico/BajaNorte','Mexico/BajaSur','Mexico/General','MST','MST7MDT','Navajo','NZ','NZ-CHAT','Pacific/Apia','Pacific/Auckland','Pacific/Chatham','Pacific/Easter','Pacific/Efate','Pacific/Enderbury','Pacific/Fakaofo','Pacific/Fiji','Pacific/Funafuti','Pacific/Galapagos','Pacific/Gambier','Pacific/Guadalcanal','Pacific/Guam','Pacific/Honolulu','Pacific/Johnston','Pacific/Kiritimati','Pacific/Kosrae','Pacific/Kwajalein','Pacific/Majuro','Pacific/Marquesas','Pacific/Midway','Pacific/Nauru','Pacific/Niue','Pacific/Norfolk','Pacific/Noumea','Pacific/Pago_Pago','Pacific/Palau','Pacific/Pitcairn','Pacific/Ponape','Pacific/Port_Moresby','Pacific/Rarotonga','Pacific/Saipan','Pacific/Samoa','Pacific/Tahiti','Pacific/Tarawa','Pacific/Tongatapu','Pacific/Truk','Pacific/Wake','Pacific/Wallis','Pacific/Yap','Poland','Portugal','PRC','PST8PDT','ROC','ROK','Singapore','Turkey','UCT','Universal','US/Alaska','US/Aleutian','US/Arizona','US/Central','US/East-Indiana','US/Eastern','US/Hawaii','US/Indiana-Starke','US/Michigan','US/Mountain','US/Pacific','US/Pacific-New','US/Samoa','UTC','W-SU','WET','Zulu'];continents=['AFRICA','AMERICA','ANTARCTICA','ARCTIC','ASIA','ATLANTIC','AUSTRALIA','EUROPE','INDIAN','PACIFIC'];codes=[1,2,4,8,16,32,64,128,256,512];if(what){if(codes.indexOf(what)!==-1||continents.indexOf(what)!==-1){if(what&&what===parseInt(what,10)+''){new_what=continents[codes.indexOf(what)];}
if(what){new_what=what[0]+what.slice(1).toLowerCase();}
for(i=0;i<identifiers.length;i++){if(identifiers[i].indexOf(new_what+'/')!==-1){returnArr.push(identifiers[i]);}}
return returnArr;}else if(what==='UTC'||what===1024){throw'Unknown implementation';}else if(what==='ALL_WITH_BC'||what===4095){throw'Unknown implementation';}else if(what==='PER_COUNTRY'||what===4096){throw'Unknown implementation';}else if(what==='ALL'||what===2047){return identifiers;}}
return identifiers;}
function trigger_error(error_msg,error_type){var type=0,i=0,that=this,prepend='',append='';if(!error_type){error_type='E_USER_NOTICE';}
var ini_on=function(ini){return that.php_js.ini[ini]&&that.php_js.ini[ini].local_value&&((that.php_js.ini[ini].local_value.toString&&that.php_js.ini[ini].local_value.toString().toLowerCase&&(that.php_js.ini[ini].local_value.toString().toLowerCase()==='on'||that.php_js.ini[ini].local_value.toString().toLowerCase()==='true'))||parseInt(that.php_js.ini[ini].local_value,10)===1);};var display_errors=function(type){return that.php_js.ini.error_reporting&&(type&that.php_js.ini.error_reporting.local_value)&&ini_on('display_errors');};var TYPES={E_ERROR:1,E_WARNING:2,E_PARSE:4,E_NOTICE:8,E_CORE_ERROR:16,E_CORE_WARNING:32,E_COMPILE_ERROR:64,E_COMPILE_WARNING:128,E_USER_ERROR:256,E_USER_WARNING:512,E_USER_NOTICE:1024,E_STRICT:2048,E_RECOVERABLE_ERROR:4096,E_DEPRECATED:8192,E_USER_DEPRECATED:16384,E_ALL:30719};if(typeof error_type==='number'){type=error_type;}
else{error_type=[].concat(error_type);for(i=0;i<error_type.length;i++){if(TYPES[error_type[i]]){type=type|TYPES[error_type[i]];}}}
this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};if(type&TYPES.E_USER_ERROR||type&TYPES.E_ERROR||type&TYPES.E_CORE_ERROR||type&TYPES.E_COMPILE_ERROR||type&TYPES.E_RECOVERABLE_ERROR||type&TYPES.E_PARSE){if(ini_on('track_errors')){this.$php_errormsg=error_msg;}
if(display_errors(type)){prepend=this.php_js.ini.error_prepend_string?this.php_js.ini.error_prepend_string:'';append=this.php_js.ini.error_append_string?this.php_js.ini.error_append_string:'';this.echo(prepend+'Error: '+error_msg+' '+append);}
var e=new Error(error_msg);e.type=type;this.php_js.last_error={message:e.message,file:e.fileName,line:e.lineNumber,type:e.type};throw e;}
if(display_errors(type)){switch(type){case TYPES.E_USER_WARNING:case TYPES.E_WARNING:case TYPES.E_CORE_WARNING:case TYPES.E_COMPILE_WARNING:this.echo('Warning: '+error_msg);break;case TYPES.E_USER_NOTICE:case TYPES.E_NOTICE:this.echo('Notice: '+error_msg);break;case TYPES.E_DEPRECATED:case TYPES.E_USER_DEPRECATED:this.echo('Deprecated: '+error_msg);break;default:throw'Unrecognized error type';}}
return true;}
function trim(str,charlist){var whitespace,l=0,i=0;str+='';if(!charlist){whitespace=" \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";}else{charlist+='';whitespace=charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g,'$1');}
l=str.length;for(i=0;i<l;i++){if(whitespace.indexOf(str.charAt(i))===-1){str=str.substring(i);break;}}
l=str.length;for(i=l-1;i>=0;i--){if(whitespace.indexOf(str.charAt(i))===-1){str=str.substring(0,i+1);break;}}
return whitespace.indexOf(str.charAt(0))===-1?str:'';}
function uasort(inputArr,sorter){var valArr=[],keyArr=[],tempKeyVal,tempValue,ret,k='',i=0,strictForIn=false,populateArr=[];if(typeof sorter==='string'){sorter=this[sorter];}else if(sorter instanceof Array){sorter=this[sorter[0]][sorter[1]];}
var sorterNew=function(keyArr,valArr){for(var i=valArr.length-2;i>=0;i--){for(var j=0;j<=i;j++){ret=sorter(valArr[j+1],valArr[j]);if(ret<0){tempValue=valArr[j];valArr[j]=valArr[j+1];valArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);keyArr.push(k);if(strictForIn){delete inputArr[k];}}}
try{sorterNew(keyArr,valArr);}catch(e){return false;}
for(i=0;i<valArr.length;i++){populateArr[keyArr[i]]=valArr[i];}
return strictForIn?true:populateArr;}
function ucfirst(str){str+='';var f=str.charAt(0).toUpperCase();return f+str.substr(1);}
function ucwords(str){return(str+'').replace(/^(.)|\s(.)/g,function($1){return $1.toUpperCase();});}
function uksort(inputArr,sorter){var tmp_arr={},keys=[],i=0,k='',strictForIn=false,populateArr=[];if(typeof sorter==='string'){sorter=this.window[sorter];}
for(k in inputArr){if(inputArr.hasOwnProperty){keys.push(k);}}
try{if(sorter){keys.sort(sorter);}else{keys.sort();}}catch(e){return false;}
this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(i=0;i<keys.length;i++){k=keys[i];tmp_arr[k]=inputArr[k];if(strictForIn){delete inputArr[k];}}
for(i in tmp_arr){if(tmp_arr.hasOwnProperty){populateArr[i]=tmp_arr[i];}}
return strictForIn?true:populateArr;}
function uniqid(prefix,more_entropy){if(typeof prefix=='undefined'){prefix="";}
var retId;var formatSeed=function(seed,reqWidth){seed=parseInt(seed,10).toString(16);if(reqWidth<seed.length){return seed.slice(seed.length-reqWidth);}
if(reqWidth>seed.length){return Array(1+(reqWidth-seed.length)).join('0')+seed;}
return seed;};if(!this.php_js){this.php_js={};}
if(!this.php_js.uniqidSeed){this.php_js.uniqidSeed=Math.floor(Math.random()*0x75bcd15);}
this.php_js.uniqidSeed++;retId=prefix;retId+=formatSeed(parseInt(new Date().getTime()/1000,10),8);retId+=formatSeed(this.php_js.uniqidSeed,5);if(more_entropy){retId+=(Math.random()*10).toFixed(8).toString();}
return retId;}
function unserialize(data){var that=this;var utf8Overhead=function(chr){var code=chr.charCodeAt(0);if(code<0x0080){return 0;}
if(code<0x0800){return 1;}
return 2;};var error=function(type,msg,filename,line){throw new that.window[type](msg,filename,line);};var read_until=function(data,offset,stopchr){var buf=[];var chr=data.slice(offset,offset+1);var i=2;while(chr!=stopchr){if((i+offset)>data.length){error('Error','Invalid');}
buf.push(chr);chr=data.slice(offset+(i-1),offset+i);i+=1;}
return[buf.length,buf.join('')];};var read_chrs=function(data,offset,length){var buf;buf=[];for(var i=0;i<length;i++){var chr=data.slice(offset+(i-1),offset+i);buf.push(chr);length-=utf8Overhead(chr);}
return[buf.length,buf.join('')];};var _unserialize=function(data,offset){var readdata;var readData;var chrs=0;var ccount;var stringlength;var keyandchrs;var keys;if(!offset){offset=0;}
var dtype=(data.slice(offset,offset+1)).toLowerCase();var dataoffset=offset+2;var typeconvert=function(x){return x;};switch(dtype){case'i':typeconvert=function(x){return parseInt(x,10);};readData=read_until(data,dataoffset,';');chrs=readData[0];readdata=readData[1];dataoffset+=chrs+1;break;case'b':typeconvert=function(x){return parseInt(x,10)!==0;};readData=read_until(data,dataoffset,';');chrs=readData[0];readdata=readData[1];dataoffset+=chrs+1;break;case'd':typeconvert=function(x){return parseFloat(x);};readData=read_until(data,dataoffset,';');chrs=readData[0];readdata=readData[1];dataoffset+=chrs+1;break;case'n':readdata=null;break;case's':ccount=read_until(data,dataoffset,':');chrs=ccount[0];stringlength=ccount[1];dataoffset+=chrs+2;readData=read_chrs(data,dataoffset+1,parseInt(stringlength,10));chrs=readData[0];readdata=readData[1];dataoffset+=chrs+2;if(chrs!=parseInt(stringlength,10)&&chrs!=readdata.length){error('SyntaxError','String length mismatch');}
readdata=that.utf8_decode(readdata);break;case'a':readdata={};keyandchrs=read_until(data,dataoffset,':');chrs=keyandchrs[0];keys=keyandchrs[1];dataoffset+=chrs+2;for(var i=0;i<parseInt(keys,10);i++){var kprops=_unserialize(data,dataoffset);var kchrs=kprops[1];var key=kprops[2];dataoffset+=kchrs;var vprops=_unserialize(data,dataoffset);var vchrs=vprops[1];var value=vprops[2];dataoffset+=vchrs;readdata[key]=value;}
dataoffset+=1;break;default:error('SyntaxError','Unknown / Unhandled data type(s): '+dtype);break;}
return[dtype,dataoffset-offset,typeconvert(readdata)];};return _unserialize((data+''),0)[2];}
function urldecode(str){return decodeURIComponent(str).replace(/\+/g,'%20');}
function urlencode(str){str=(str+'').toString();return encodeURIComponent(str).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A').replace(/%20/g,'+');}
function user_error(error_msg,error_type){return this.trigger_error(error_msg,error_type);}
function usleep(microseconds){var start=new Date().getTime();while(new Date()<(start+microseconds/1000)){}
return true;}
function usort(inputArr,sorter){var valArr=[],k='',i=0,strictForIn=false,populateArr=[];if(typeof sorter==='string'){sorter=this[sorter];}else if(sorter instanceof Array){sorter=this[sorter[0]][sorter[1]];}
this.php_js=this.php_js||{};this.php_js.ini=this.php_js.ini||{};strictForIn=this.php_js.ini['phpjs.strictForIn']&&this.php_js.ini['phpjs.strictForIn'].local_value;populateArr=strictForIn?inputArr:populateArr;for(k in inputArr){if(inputArr.hasOwnProperty){valArr.push(inputArr[k]);if(strictForIn){delete inputArr[k];}}}
try{valArr.sort(sorter);}catch(e){return false;}
for(i=0;i<valArr.length;i++){populateArr[i]=valArr[i];}
return strictForIn?true:populateArr;}
function utf8_decode(str_data){var tmp_arr=[],i=0,ac=0,c1=0,c2=0,c3=0;str_data+='';while(i<str_data.length){c1=str_data.charCodeAt(i);if(c1<128){tmp_arr[ac++]=String.fromCharCode(c1);i++;}else if((c1>191)&&(c1<224)){c2=str_data.charCodeAt(i+1);tmp_arr[ac++]=String.fromCharCode(((c1&31)<<6)|(c2&63));i+=2;}else{c2=str_data.charCodeAt(i+1);c3=str_data.charCodeAt(i+2);tmp_arr[ac++]=String.fromCharCode(((c1&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}}
return tmp_arr.join('');}
function utf8_encode(argString){var string=(argString+'');var utftext="";var start,end;var stringl=0;start=end=0;stringl=string.length;for(var n=0;n<stringl;n++){var c1=string.charCodeAt(n);var enc=null;if(c1<128){end++;}else if(c1>127&&c1<2048){enc=String.fromCharCode((c1>>6)|192)+String.fromCharCode((c1&63)|128);}else{enc=String.fromCharCode((c1>>12)|224)+String.fromCharCode(((c1>>6)&63)|128)+String.fromCharCode((c1&63)|128);}
if(enc!==null){if(end>start){utftext+=string.substring(start,end);}
utftext+=enc;start=end=n+1;}}
if(end>start){utftext+=string.substring(start,string.length);}
return utftext;}
function var_dump(){var output="",pad_char=" ",pad_val=4,lgth=0,i=0,d=this.window.document;var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};var repeat_char=function(len,pad_char){var str="";for(var i=0;i<len;i++){str+=pad_char;}
return str;};var getScalarVal=function(val){var ret='';if(val===null){ret='NULL';}
else if(typeof val==='boolean'){ret='bool('+val+')';}
else if(typeof val==='string'){ret='string('+val.length+') "'+val+'"';}
else if(typeof val==='number'){if(parseFloat(val)==parseInt(val,10)){ret='int('+val+')';}
else{ret='float('+val+')';}}
else if(val===undefined){ret='UNDEFINED';}
else if(typeof val==='function'){ret='FUNCTION';}
return ret;};var formatArray=function(obj,cur_depth,pad_val,pad_char){var someProp='';if(cur_depth>0){cur_depth++;}
var base_pad=repeat_char(pad_val*(cur_depth-1),pad_char);var thick_pad=repeat_char(pad_val*(cur_depth+1),pad_char);var str="";var val='';if(typeof obj==='object'&&obj!==null){if(obj.constructor&&getFuncName(obj.constructor)==='PHPJS_Resource'){return obj.var_dump();}
lgth=0;for(someProp in obj){lgth++;}
str+="array("+lgth+") {\n";for(var key in obj){if(typeof obj[key]==='object'&&obj[key]!==null){str+=thick_pad+"["+key+"] =>\n"+thick_pad+formatArray(obj[key],cur_depth+1,pad_val,pad_char);}else{val=getScalarVal(obj[key]);str+=thick_pad+"["+key+"] =>\n"+thick_pad+val+"\n";}}
str+=base_pad+"}\n";}else{str=getScalarVal(obj);}
return str;};output=formatArray(arguments[0],0,pad_val,pad_char);for(i=1;i<arguments.length;i++){output+='\n'+formatArray(arguments[i],0,pad_val,pad_char);}
if(d.body){this.echo(output);}
else{try{d=XULDocument;this.echo('<pre xmlns="http://www.w3.org/1999/xhtml" style="white-space:pre;">'+output+'</pre>');}
catch(e){this.echo(output);}}}
function var_export(mixed_expression,bool_return){var retstr='',iret='',cnt=0,x=[],i=0,funcParts=[];var getFuncName=function(fn){var name=(/\W*function\s+([\w\$]+)\s*\(/).exec(fn);if(!name){return'(Anonymous)';}
return name[1];};var __getType=function(inp){var i=0;var match,type=typeof inp;if(type==='object'&&inp.constructor&&getFuncName(inp.constructor)==='PHPJS_Resource'){return'resource';}
if(type==='function'){return'function';}
if(type==='object'&&!inp){return'null';}
if(type==="object"){if(!inp.constructor){return'object';}
var cons=inp.constructor.toString();match=cons.match(/(\w+)\(/);if(match){cons=match[1].toLowerCase();}
var types=["boolean","number","string","array"];for(i=0;i<types.length;i++){if(cons===types[i]){type=types[i];break;}}}
return type;};var type=__getType(mixed_expression);if(type===null){retstr="NULL";}else if(type==='array'||type==='object'){for(i in mixed_expression){x[cnt++]=this.var_export(i,true)+" => "+this.var_export(mixed_expression[i],true);}
iret=x.join(',\n  ');retstr="array (\n  "+iret+"\n)";}
else if(type==='function'){funcParts=mixed_expression.toString().match(/function .*?\((.*?)\) \{([\s\S]*)\}/);retstr="create_function ('"+funcParts[1]+"', '"+funcParts[2].replace(new RegExp("'",'g'),"\\'")+"')";}
else if(type==='resource'){retstr='NULL';}else{retstr=(!isNaN(mixed_expression))?mixed_expression:"'"+mixed_expression.replace(/(["'])/g,"\\$1").replace(/\0/g,"\\0")+"'";}
if(bool_return!==true){this.echo(retstr);return null;}else{return retstr;}}
function version_compare(version1,version2,operator){this.php_js=this.php_js||{};this.php_js.ENV=this.php_js.ENV||{};if(!version1||!version2){throw'version_compare() is missing a required argument';}
var v1,v2,compare=0,i=0,x=0;var i1,i2;var parseVersionString=function(v){v=v.replace(/(^\s*)|(\s*$)/g,"").replace(/[-|_|+]/g,'.').replace(/([^0-9\.]+)/g,'.$1.');v=v.replace(/\.\.*/g,'.').toLowerCase().split('.');while(!v[0]){v.shift();}
while(!v[v.length-1]){v.pop();}
return v;};var versions={'dev':-1,'alpha':1,'a':1,'beta':2,'b':2,'rc':3,'#':4,'p':5,'pl':5};v1=parseVersionString(version1);v2=parseVersionString(version2);x=(v1.length>v2.length)?v2.length:v1.length;for(i=0;i<x;i++){if(v1[i]==v2[i]){continue;}
compare=0;i1=v1[i];i2=v2[i];if(!isNaN(i1)&&!isNaN(i2)){if(parseInt(i1,10)<parseInt(i2,10)){compare=-1;}else if(parseInt(i1,10)>parseInt(i2,10)){compare=1;}
break;}
if(i1=='#'){i1='';}else if(!isNaN(i1)){i1='#';}
if(i2=='#'){i2='';}else if(!isNaN(i2)){i2='#';}
if(versions[i1]&&versions[i2]){if(versions[i1]<versions[i2])
compare=-1;else if(versions[i1]>versions[i2])
compare=1;}else if(versions[i1]){compare=1;}else if(versions[i2]){compare=-1;}
break;}
if(compare==0&&v1.length!=v2.length){if(v2.length>v1.length){if(versions[v2[i]]){compare=(versions[v2[i]]<4)?1:-1;}else{compare=-1;}}else{if(versions[v1[i]]){compare=(versions[v1[i]]<4)?-1:1;}else{compare=1;}}}
if(operator){switch(operator.toLowerCase()){case'>':case'gt':return(compare>0);case'>=':case'ge':return(compare>=0);case'<=':case'le':return(compare<=0);case'==':case'=':case'eq':return(compare==0);case'<>':case'!=':case'ne':return(compare!=0);case'':case'<':case'lt':default:return(compare<0);}}
return compare;}
function vprintf(format,args){var body,elmt;var ret='',d=this.window.document;var HTMLNS='http://www.w3.org/1999/xhtml';body=d.getElementsByTagNameNS?(d.getElementsByTagNameNS(HTMLNS,'body')[0]?d.getElementsByTagNameNS(HTMLNS,'body')[0]:d.documentElement.lastChild):d.getElementsByTagName('body')[0];if(!body){return false;}
ret=this.sprintf.apply(this,[format].concat(args));elmt=d.createTextNode(ret);body.appendChild(elmt);return ret.length;}
function vsprintf(format,args){return this.sprintf.apply(this,[format].concat(args));}
function wordwrap(str,int_width,str_break,cut){var m=((arguments.length>=2)?arguments[1]:75);var b=((arguments.length>=3)?arguments[2]:"\n");var c=((arguments.length>=4)?arguments[3]:false);var i,j,l,s,r;str+='';if(m<1){return str;}
for(i=-1,l=(r=str.split(/\r\n|\n|\r/)).length;++i<l;r[i]+=s){for(s=r[i],r[i]="";s.length>m;r[i]+=s.slice(0,j)+((s=s.slice(j)).length?b:"")){j=c==2||(j=s.slice(0,m+1).match(/\S*(\s)?$/))[1]?m:j.input.length-j[0].length||c==1&&m||j.input.length+(j=s.slice(m).match(/^\S*/)).input.length;}}
return r.join("\n");}

/** 
 * @description		prototype.js based context menu
 * @author        Juriy Zaytsev; kangax [at] gmail [dot] com; http://thinkweb2.com/projects/prototype/
 * @version       0.6
 * @date          12/03/07
 * @requires      prototype.js 1.6
*/

if (Object.isUndefined(Proto)) { var Proto = { } }

Proto.Menu = Class.create({
	initialize: function() {
		var e = Prototype.emptyFunction;
		this.ie = Prototype.Browser.IE;
		this.options = Object.extend({
			selector: '.contextmenu',
			className: 'protoMenu',
			pageOffset: 25,
			fade: false,
			zIndex: 100,
			beforeShow: e,
			beforeHide: e,
			beforeSelect: e
		}, arguments[0] || { });
		
		this.shim = new Element('iframe', {
			style: 'position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);display:none',
			src: 'javascript:false;',
			frameborder: 0
		});
		
		this.options.fade = this.options.fade && !Object.isUndefined(Effect);
		this.container = new Element('div', {className: this.options.className, style: 'display:none'});
		var list = new Element('ul');
		this.options.menuItems.each(function(item) {
			list.insert(
				new Element('li', {className: item.separator ? 'separator' : ''}).insert(
					item.separator 
						? '' 
						: Object.extend(new Element('a', {
							href: '#',
							title: item.name,
							className: (item.className || '') + (item.disabled ? ' disabled' : ' enabled')
						}), { _callback: item.callback })
						.observe('click', this.onClick.bind(this))
						.observe('contextmenu', Event.stop)
						.update(item.name)
				)
			)
		}.bind(this));
		$(document.body).insert(this.container.insert(list).observe('contextmenu', Event.stop));
		if (this.ie) { $(document.body).insert(this.shim) }
		
		document.observe('click', function(e) {
			if (this.container.visible() && !e.isRightClick()) {
				this.options.beforeHide(e);
				if (this.ie) this.shim.hide();
				this.container.hide();
			}
		}.bind(this));
		
		$$(this.options.selector).invoke('observe', Prototype.Browser.Opera ? 'click' : 'contextmenu', function(e){
			if (Prototype.Browser.Opera && !e.ctrlKey) {
				return;
			}
			this.show(e);
		}.bind(this));
	},
	show: function(e) {
		e.stop();
		this.options.beforeShow(e);
		var x = Event.pointer(e).x,
			y = Event.pointer(e).y,
			vpDim = document.viewport.getDimensions(),
			vpOff = document.viewport.getScrollOffsets(),
			elDim = this.container.getDimensions(),
			elOff = {
				left: ((x + elDim.width + this.options.pageOffset) > vpDim.width 
					? (vpDim.width - elDim.width - this.options.pageOffset) : x) + 'px',
				top: ((y - vpOff.top + elDim.height) > vpDim.height && (y - vpOff.top) > elDim.height 
					? (y - elDim.height) : y) + 'px'
			};
		this.container.setStyle(elOff).setStyle({zIndex: this.options.zIndex});
		if (this.ie) { 
			this.shim.setStyle(Object.extend(Object.extend(elDim, elOff), {zIndex: this.options.zIndex - 1})).show();
		}
		this.options.fade ? Effect.Appear(this.container, {duration: 0.25}) : this.container.show();
		this.event = e;
	},
	onClick: function(e) {
		e.stop();
		if (e.target._callback && !e.target.hasClassName('disabled')) {
			this.options.beforeSelect(e);
			if (this.ie) this.shim.hide();
			this.container.hide();
			e.target._callback(this.event);
		}
	}
})

// lightwindow.js v2.0
//
// Copyright (c) 2007 stickmanlabs
// Author: Kevin P Miller | http://www.stickmanlabs.com
// 
// LightWindow is freely distributable under the terms of an MIT-style license.
//
// I don't care what you think about the file size...
//   Be a pro: 
//	    http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
//      http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
//

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

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

// This will stop image flickering in IE6 when elements with images are moved
try {
	document.execCommand("BackgroundImageCache", false, true);
} catch(e) {}

var lightwindow = Class.create();	
lightwindow.prototype = {
	//
	//	Setup Variables
	//
	element : null,
	contentToFetch : null,
	windowActive : false,
	dataEffects : [],
	dimensions : {
		cruft : null,
		container : null,
		viewport : {
			height : null,
			width : null,
			offsetTop : null,
			offsetLeft : null
		}
	},
	pagePosition : {
		x : 0,
		y : 0
	},
	pageDimensions : {
		width : null,
		height : null
	},
	preloadImage : [],
	preloadedImage : [],
	galleries : [],
	resizeTo : {
		height : null,
		heightPercent : null,
		width : null,
		widthPercent : null,
		fixedTop : null,
		fixedLeft : null
	},
	scrollbarOffset : 18,
	navigationObservers : {
		previous : null,
		next : null
	},
	containerChange : {
		height : 0,
		width : 0
	},
	activeGallery : false,
	galleryLocation : {
		current : 0,
		total : 0
	},
	//
	//	Initialize the lightwindow.
	//
	initialize : function(options) {
		this.options = Object.extend({
			resizeSpeed : 8,
			contentOffset : {
				height : 20,
				width : 20
			},
			dimensions : {
				image : {height : 250, width : 250},
				page : {height : 50, width : 50},
				inline : {height : 250, width : 250},
				media : {height : 250, width : 250},
				external : {height : 250, width : 250},
				titleHeight : 25
			},
			classNames : {	
				standard : 'lightwindow',
				ajax : 'lightwindow_ajax',
				action : 'lightwindow_action'
			},
			fileTypes : {
				page : ['asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'pl', 'php4', 'php3', 'php', 'php5', 'phtml', 'rhtml', 'shtml', 'txt', 'vbs', 'rb'],
				media : ['aif', 'aiff', 'asf', 'avi', 'divx', 'm1v', 'm2a', 'm2v', 'm3u', 'mid', 'midi', 'mov', 'moov', 'movie', 'mp2', 'mp3', 'mpa', 'mpa', 'mpe', 'mpeg', 'mpg', 'mpg', 'mpga', 'pps', 'qt', 'rm', 'ram', 'swf', 'viv', 'vivo', 'wav'],
				image : ['bmp', 'gif', 'jpg', 'png', 'tiff']
			},
			mimeTypes : {
				avi 	: 'video/avi',
				aif 	: 'audio/aiff',
				aiff 	: 'audio/aiff',
				gif 	: 'image/gif',
				bmp 	: 'image/bmp',
				jpeg 	: 'image/jpeg',
				m1v 	: 'video/mpeg',
				m2a 	: 'audio/mpeg',
				m2v 	: 'video/mpeg',
				m3u 	: 'audio/x-mpequrl',
				mid 	: 'audio/x-midi',
				midi 	: 'audio/x-midi',
				mjpg 	: 'video/x-motion-jpeg',
				moov 	: 'video/quicktime',
				mov 	: 'video/quicktime',
				movie 	: 'video/x-sgi-movie',
				mp2 	: 'audio/mpeg',
				mp3 	: 'audio/mpeg3',
				mpa 	: 'audio/mpeg',
				mpa 	: 'video/mpeg',
				mpe 	: 'video/mpeg',
				mpeg 	: 'video/mpeg',
				mpg 	: 'audio/mpeg',
				mpg 	: 'video/mpeg',
				mpga 	: 'audio/mpeg',
				pdf 	: 'application/pdf',
				png 	: 'image/png',
				pps 	: 'application/mspowerpoint',
				qt 		: 'video/quicktime',
				ram 	: 'audio/x-pn-realaudio-plugin',
				rm 		: 'application/vnd.rn-realmedia',
				swf		: 'application/x-shockwave-flash',
				tiff 	: 'image/tiff',
				viv 	: 'video/vivo',
				vivo 	: 'video/vivo',
				wav 	: 'audio/wav',
				wmv 	: 'application/x-mplayer2'			
			},	
			classids : {
				mov : 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
				swf : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
				wmv : 'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6'
			},
			codebases : {
				mov : 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
				swf : 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0',
				wmv : 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715'
			},	
			viewportPadding : 10,
			EOLASFix : 'swf,wmv,fla,flv',
			overlay : {
				opacity 	: 0.7,
				image 		: '/'+root+'images/black.png',
				presetImage : '/'+root+'images/black-70.png'
			},
			skin : 	{
				main : 	'<div id="lightwindow_container" >'+
							'<div id="lightwindow_title_bar" >'+
								'<div id="lightwindow_title_bar_inner" >'+
									'<span id="lightwindow_title_bar_title"></span>'+
									'<a id="lightwindow_title_bar_close_link" >close</a>'+
								'</div>'+
							'</div>'+
							'<div id="lightwindow_stage" >'+
								'<div id="lightwindow_contents" >'+
								'</div>'+
								'<div id="lightwindow_navigation" >'+
									'<a href="#" id="lightwindow_previous" >'+
										'<span id="lightwindow_previous_title"></span>'+
									'</a>'+
									'<a href="#" id="lightwindow_next" >'+
										'<span id="lightwindow_next_title"></span>'+
									'</a>'+
									'<iframe name="lightwindow_navigation_shim" id="lightwindow_navigation_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+
								'</div>'+								
								'<div id="lightwindow_galleries">'+
									'<div id="lightwindow_galleries_tab_container" >'+
										'<a href="#" id="lightwindow_galleries_tab" >'+
											'<span id="lightwindow_galleries_tab_span" class="up" >Galleries</span>'+
										'</a>'+
									'</div>'+
									'<div id="lightwindow_galleries_list" >'+
									'</div>'+
								'</div>'+
							'</div>'+
							'<div id="lightwindow_data_slide" >'+
								'<div id="lightwindow_data_slide_inner" >'+
									'<div id="lightwindow_data_details" >'+
										'<div id="lightwindow_data_gallery_container" >'+
											'<span id="lightwindow_data_gallery_current"></span>'+
											' of '+
											'<span id="lightwindow_data_gallery_total"></span>'+
										'</div>'+
										'<div id="lightwindow_data_author_container" >'+
											'by <span id="lightwindow_data_author"></span>'+
										'</div>'+
									'</div>'+
									'<div id="lightwindow_data_caption" >'+
									'</div>'+
								'</div>'+
							'</div>'+
						'</div>',	
				loading : 	'<div id="lightwindow_loading" >'+
								'<img src="/'+ajax_root+'images/ajax-loading.gif" alt="loading" /><br />'+
								'<span>Loading or <a href="javascript: myLightWindow.deactivate();">Cancel</a></span>'+
								'<iframe name="lightwindow_loading_shim" id="lightwindow_loading_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+
							'</div>',
				iframe : 	'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+
							'<html xmlns="http://www.w3.org/1999/xhtml">'+
								'<body>'+
									'{body_replace}'+
								'</body>'+
							'</html>',
				gallery : {
					top :		'<div class="lightwindow_galleries_list">'+
									'<h1>{gallery_title_replace}</h1>'+
									'<ul>',
					middle : 			'<li>'+
											'{gallery_link_replace}'+
										'</li>',
					bottom : 		'</ul>'+
								'</div>'
				}
			},
			formMethod : 'get',
			hideFlash : false,
			hideGalleryTab : false,
			showTitleBar : true,
			animationHandler : false,
			navigationHandler : false,
			transitionHandler : false,
			finalAnimationHandler : false,
			formHandler : false,
			galleryAnimationHandler : false,
			showGalleryCount : true
		}, options || {});
		this.duration = ((11-this.options.resizeSpeed)*0.15);
		this._setupLinks();
		this._getScroll();
		this._getPageDimensions();
		this._browserDimensions();
		this._addLightWindowMarkup(false);
		this._setupDimensions(); 
		this.buildGalleryList();
	},
	//
	//	Activate the lightwindow.
	//
	activate : function(e, link){		
		// Clear out the window Contents
		this._clearWindowContents(true);
			
		// Add back in out loading panel
		this._addLoadingWindowMarkup();

		// Setup the element properties
		this._setupWindowElements(link);
		
		// Setup everything
		this._getScroll();
		this._browserDimensions();
		this._setupDimensions();
		this._toggleTroubleElements('hidden', false);
		this._displayLightWindow('block', 'hidden');
		this._setStatus(true);
		this._monitorKeyboard(true);
		this._prepareIE(true);
		this._loadWindow();
	},
	//
	//	Turn off the window
	//
	deactivate : function(){
		// The window is not active
		this.windowActive = false;
		
		// There is no longer a gallery active
		this.activeGallery = false;
		if (!this.options.hideGalleryTab) {
			this._handleGalleryAnimation(false);
		}
		
		// Kill the animation
		this.animating = false;
		
		// Clear our element
		this.element = null;
		
		// hide the window.
		this._displayLightWindow('none', 'visible');
		
		// Clear out the window Contents
		this._clearWindowContents(false);
		
		// Stop all animation
		var queue = Effect.Queues.get('lightwindowAnimation').each(function(e){e.cancel();});
		
		// Undo the setup
		this._prepareIE(false);
		this._setupDimensions();
		this._toggleTroubleElements('visible', false);	
		this._monitorKeyboard(false);	
	},
	//
	//  Initialize specific window
	//
	createWindow : function(element, attributes) {
		this._processLink($(element));
	},
	//
	//  Open a Window from a hash of attributes
	//
	activateWindow : function(options) {
		this.element = Object.extend({
			href : null,
			title : null,
			author : null,
			caption : null,
			rel : null,
			top : null,
			left : null,
			type : null,
			showImages : null,
			height : null,
			width : null,
			loadingAnimation : null,
			iframeEmbed : null,
			form : null
		}, options || {});
		
		// Set the window type
		this.contentToFetch = this.element.href;
		this.windowType = this.element.type ? this.element.type : this._fileType(this.element.href);	
		
		// Clear out the window Contents
		this._clearWindowContents(true);
			
		// Add back in out loading panel
		this._addLoadingWindowMarkup();
		
		// Setup everything
		this._getScroll();
		this._browserDimensions();
		this._setupDimensions();
		this._toggleTroubleElements('hidden', false);
		this._displayLightWindow('block', 'hidden');
		this._setStatus(true);
		this._monitorKeyboard(true);
		this._prepareIE(true);
		this._loadWindow();
	},
	//
	//  Fire off our Form handler
	//
	submitForm : function(e) {
		if (this.options.formHandler) {
			this.options.formHandler(e);
		} else {
			this._defaultFormHandler(e);
		}
	},
	//
	//	Reload the window with another location
	//
	openWindow : function(element) {
		var element = $(element);

		// The window is active
		this.windowActive = true;
		
		// Clear out the window Contents
		this._clearWindowContents(true);
		
		// Add back in out loading panel
		this._addLoadingWindowMarkup();
		
		// Setup the element properties
		this._setupWindowElements(element);

		this._setStatus(true);
		this._handleTransition();
	},
	//
	//  Navigate the window
	//
	navigateWindow : function(direction) {
		this._handleNavigation(false);
		if (direction == 'previous') {
			this.openWindow(this.navigationObservers.previous);
		} else if (direction == 'next'){ 
			this.openWindow(this.navigationObservers.next);
		}
	},
	//
	//  Build the Gallery List and Load it
	//
	buildGalleryList : function() {
		var output = '';
		var galleryLink;
		for (i in this.galleries) {
			if (typeof this.galleries[i] == 'object') {
				output += (this.options.skin.gallery.top).replace('{gallery_title_replace}', unescape(i));
				for (j in this.galleries[i]) {
					if (typeof this.galleries[i][j] == 'object') {						
						galleryLink = '<a href="#" id="lightwindow_gallery_'+i+'_'+j+'" >'+unescape(j)+'</a>';
						output += (this.options.skin.gallery.middle).replace('{gallery_link_replace}', galleryLink);
					}
				}
				output += this.options.skin.gallery.bottom;
			}
		}
		new Insertion.Top('lightwindow_galleries_list', output);
		
		// Attach Events
		for (i in this.galleries) {
			if (typeof this.galleries[i] == 'object') {
				for (j in this.galleries[i]) {
					if (typeof this.galleries[i][j] == 'object') {
						Event.observe($('lightwindow_gallery_'+i+'_'+j), 'click', this.openWindow.bind(this, this.galleries[i][j][0]), false);
						$('lightwindow_gallery_'+i+'_'+j).onclick = function() {return false;};	
					}
				}
			}
		}
	},
	// 
	//  Set Links Up
	//
	_setupLinks : function() {
		var links = $$('.'+this.options.classNames.standard);
		links.each(function(link) {
			this._processLink(link);
		}.bind(this));	
		
		var links2 = $$('.'+this.options.classNames.ajax);
		links2.each(function(link) {
            link.href = link.getAttribute('href')+'?ajax';
			this._processLink(link);
		}.bind(this));	
	},
	//
	//  Process a Link
	//
	_processLink : function(link) {
		if ((this._fileType(link.getAttribute('href')) == 'image' || this._fileType(link.getAttribute('href')) == 'media')) {
			if (gallery = this._getGalleryInfo(link.rel)) {
				if (!this.galleries[gallery[0]]) {
					this.galleries[gallery[0]] = new Array();
				}
				if (!this.galleries[gallery[0]][gallery[1]]) {
					this.galleries[gallery[0]][gallery[1]] = new Array();
				}
				this.galleries[gallery[0]][gallery[1]].push(link);
			}
		}
		
		// Take care of our inline content
		var url = link.getAttribute('href');
		if (url.indexOf('?') > -1) {
			url = url.substring(0, url.indexOf('?'));
		}
		
		var container = url.substring(url.indexOf('#')+1);
		if($(container)) {
			$(container).setStyle({
				display : 'none'
			});
		}
		
		Event.observe(link, 'click', this.activate.bindAsEventListener(this, link), false);
		link.onclick = function() {return false;};		
	},
	//
	//	Setup our actions
	//
	_setupActions : function() {
		var links = $$('#lightwindow_container .'+this.options.classNames.action);
		links.each(function(link) {
			Event.observe(link, 'click', this[link.getAttribute('rel')].bindAsEventListener(this, link), false);
			link.onclick = function() {return false;};
		}.bind(this));
	},
	//
	//	Add the markup to the page.
	//
	_addLightWindowMarkup : function(rebuild) {
		var overlay = Element.extend(document.createElement('div'));
		overlay.setAttribute('id', 'lightwindow_overlay');		
		// FF Mac has a problem with putting Flash above a layer without a 100% opacity background, so we need to use a pre-made
		if (Prototype.Browser.Gecko) {
			overlay.setStyle({
				backgroundImage: 'url('+this.options.overlay.presetImage+')',
				backgroundRepeat: 'repeat',
				height: this.pageDimensions.height+'px'
			});			
		} else {
			overlay.setStyle({
				opacity: this.options.overlay.opacity,
				backgroundImage: 'url('+this.options.overlay.image+')',
				backgroundRepeat: 'repeat',
				height: this.pageDimensions.height+'px'
			});
		}
		
		var lw = document.createElement('div');
		lw.setAttribute('id', 'lightwindow');
		lw.innerHTML = this.options.skin.main;
		
		var body = document.getElementsByTagName('body')[0];
		body.appendChild(overlay);
		body.appendChild(lw);	
				
		if ($('lightwindow_title_bar_close_link')) {
			Event.observe('lightwindow_title_bar_close_link', 'click', this.deactivate.bindAsEventListener(this));
			$('lightwindow_title_bar_close_link').onclick = function() {return false;};
		}
			
		Event.observe($('lightwindow_previous'), 'click', this.navigateWindow.bind(this, 'previous'), false);
		$('lightwindow_previous').onclick = function() {return false;};		
		Event.observe($('lightwindow_next'), 'click', this.navigateWindow.bind(this, 'next'), false);
		$('lightwindow_next').onclick = function() {return false;};

		if (!this.options.hideGalleryTab) {
			Event.observe($('lightwindow_galleries_tab'), 'click', this._handleGalleryAnimation.bind(this, true), false);
			$('lightwindow_galleries_tab').onclick = function() {return false;};
		}
		
		// Because we use position absolute, kill the scroll Wheel on animations
		if (Prototype.Browser.IE) {
			Event.observe(document, 'mousewheel', this._stopScrolling.bindAsEventListener(this), false);
		} else {
			Event.observe(window, 'DOMMouseScroll', this._stopScrolling.bindAsEventListener(this), false);
		}
				
		Event.observe(overlay, 'click', this.deactivate.bindAsEventListener(this), false);
		overlay.onclick = function() {return false;};
	},
	//
	//  Add loading window markup
	//
	_addLoadingWindowMarkup : function() {
		$('lightwindow_contents').innerHTML += this.options.skin.loading;
	},
	//
	//  Setup the window elements
	//
	_setupWindowElements : function(link) {
		this.element = link;
		this.element.title = null ? '' : link.getAttribute('title');
		this.element.author = null ? '' : link.getAttribute('author');
		this.element.caption = null ? '' : link.getAttribute('caption');
		this.element.rel = null ? '' : link.getAttribute('rel');
		this.element.params = null ? '' : link.getAttribute('params');

		// Set the window type
		this.contentToFetch = this.element.href;
		this.windowType = this._getParameter('lightwindow_type') ? this._getParameter('lightwindow_type') : this._fileType(this.contentToFetch);	
	},
	//
	//  Clear the window contents out
	//
	_clearWindowContents : function(contents) {
		// If there is an iframe, its got to go
		if ($('lightwindow_iframe')) {
			Element.remove($('lightwindow_iframe'));
		}

		// Stop playing an object if its still around
		if ($('lightwindow_media_primary')) {
			try {
				$('lightwindow_media_primary').Stop();
			} catch(e) {}
			Element.remove($('lightwindow_media_primary'));
		}

		// Stop playing an object if its still around		
		if ($('lightwindow_media_secondary')) {
			try {
				$('lightwindow_media_secondary').Stop();
			} catch(e) {}
			Element.remove($('lightwindow_media_secondary'));
		}
		
		this.activeGallery = false;
		this._handleNavigation(this.activeGallery);
		
		if (contents) {
			// Empty the contents
			$('lightwindow_contents').innerHTML = '';
			
			// Reset the scroll bars
			$('lightwindow_contents').setStyle({
				overflow: 'hidden'
			});		
			
			if (!this.windowActive) {
				$('lightwindow_data_slide_inner').setStyle({
					display: 'none'
				});

				$('lightwindow_title_bar_title').innerHTML = '';
			}

			// Because of browser differences and to maintain flexible captions we need to reset this height at close
			$('lightwindow_data_slide').setStyle({
				height: 'auto'
			});
		}
		
		this.resizeTo.height = null;
		this.resizeTo.width = null;
	},
	//
	//	Set the status of our animation to keep things from getting clunky
	//
	_setStatus : function(status) {
		this.animating = status;
		if (status) {
			Element.show('lightwindow_loading');
		}
		if (!(/MSIE 6./i.test(navigator.userAgent))) {
			this._fixedWindow(status);
		}
	},
	//
	//  Make this window Fixed
	//
	_fixedWindow : function(status) {
		if (status) {
			if (this.windowActive) {
				this._getScroll();
				$('lightwindow').setStyle({
					position: 'absolute',
					top: parseFloat($('lightwindow').getStyle('top'))+this.pagePosition.y+'px',
					left: parseFloat($('lightwindow').getStyle('left'))+this.pagePosition.x+'px'
				});		
			} else {
				$('lightwindow').setStyle({
					position: 'absolute'
				});						
			}
		} else {
			if (this.windowActive) {
				this._getScroll();
				$('lightwindow').setStyle({
					position: 'fixed',
					top: parseFloat($('lightwindow').getStyle('top'))-this.pagePosition.y+'px',
					left: parseFloat($('lightwindow').getStyle('left'))-this.pagePosition.x+'px'
				});		
			} else {
				if ($('lightwindow_iframe')) {
					// Ideally here we would set a 50% value for top and left, but Safari rears it ugly head again and we need to do it by pixels
					this._browserDimensions();
				}
				$('lightwindow').setStyle({
					position: 'fixed',
					top: (parseFloat(this._getParameter('lightwindow_top')) ? parseFloat(this._getParameter('lightwindow_top'))+'px' : this.dimensions.viewport.height/2+'px'),
					left: (parseFloat(this._getParameter('lightwindow_left')) ? parseFloat(this._getParameter('lightwindow_left'))+'px' : this.dimensions.viewport.width/2+'px')
				});
			}
		}
	},
	//
	//	Prepare the window for IE.
	//
	_prepareIE : function(setup) {
		if (Prototype.Browser.IE) {
			var height, overflowX, overflowY;
			if (setup) { 
				var height = '100%';
			} else {
				var height = 'auto';
			}
			var body = document.getElementsByTagName('body')[0];
			var html = document.getElementsByTagName('html')[0];
			html.style.height = body.style.height = height;
		}
	},
	_stopScrolling : function(e) {
		if (this.animating) {
			if (e.preventDefault) {
				e.preventDefault();
			}
			e.returnValue = false;		
		}
	},
	//
	//	Get the scroll for the page.
	//
	_getScroll : function(){
      	if(typeof(window.pageYOffset) == 'number') {
        	this.pagePosition.x = window.pageXOffset;
        	this.pagePosition.y = window.pageYOffset;
      	} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
	       	this.pagePosition.x = document.body.scrollLeft;
        	this.pagePosition.y = document.body.scrollTop;
		} else if(document.documentElement) {
        	this.pagePosition.x = document.documentElement.scrollLeft;
        	this.pagePosition.y = document.documentElement.scrollTop;
      	}
	},
	//
	//	Reset the scroll.
	//
	_setScroll : function(x, y) {
		document.documentElement.scrollLeft = x; 
		document.documentElement.scrollTop = y; 
	},
	//
	//	Hide Selects from the page because of IE.
	//     We could use iframe shims instead here but why add all the extra markup for one browser when this is much easier and cleaner
	//
	_toggleTroubleElements : function(visibility, content){
		
		if (content) {
			var selects = $('lightwindow_contents').getElementsByTagName('select');
		} else {
			var selects = document.getElementsByTagName('select');
		}
		
		for(var i = 0; i < selects.length; i++) {
			selects[i].style.visibility = visibility;
		}
		
		if (!content) {
			if (this.options.hideFlash){
				var objects = document.getElementsByTagName('object');
				for (i = 0; i != objects.length; i++) {
					objects[i].style.visibility = visibility;
				}
				var embeds = document.getElementsByTagName('embed');
				for (i = 0; i != embeds.length; i++) {
					embeds[i].style.visibility = visibility;
				}
			}
			var iframes = document.getElementsByTagName('iframe');
			for (i = 0; i != iframes.length; i++) {
				iframes[i].style.visibility = visibility;
			}
		}
	},
	// 
	//  Get the actual page size
	//
	_getPageDimensions : function() {
		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;
		}

		var windowWidth, windowHeight;
		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){
			this.pageDimensions.height = windowHeight;
		} else { 
			this.pageDimensions.height = yScroll;
		}

		if(xScroll < windowWidth){	
			this.pageDimensions.width = windowWidth;
		} else {
			this.pageDimensions.width = xScroll;
		}
	},
	//
	//	Display the lightWindow.
	//
	_displayLightWindow : function(display, visibility) {
		$('lightwindow_overlay').style.display = $('lightwindow').style.display = $('lightwindow_container').style.display = display;	
		$('lightwindow_overlay').style.visibility = $('lightwindow').style.visibility = $('lightwindow_container').style.visibility = visibility;
	},
	//
	//	Setup Dimensions of lightwindow.

	//
	_setupDimensions : function() {

		var originalHeight, originalWidth;
		switch (this.windowType) {
			case 'page' :
				originalHeight = this.options.dimensions.page.height;
				originalWidth = this.options.dimensions.page.width;
				break;

			case 'image' :
				originalHeight = this.options.dimensions.image.height;
				originalWidth = this.options.dimensions.image.width;
				break;
				
			case 'media' :
				originalHeight = this.options.dimensions.media.height;
				originalWidth = this.options.dimensions.media.width;
				break;
			
			case 'external' : 
				originalHeight = this.options.dimensions.external.height;
				originalWidth = this.options.dimensions.external.width;
				break;
				
			case 'inline' :
				originalHeight = this.options.dimensions.inline.height;
				originalWidth = this.options.dimensions.inline.width;
				break;
				
			default :
				originalHeight = this.options.dimensions.page.height;
				originalWidth = this.options.dimensions.page.width;
				break;
				
		}

		var offsetHeight = this._getParameter('lightwindow_top') ? parseFloat(this._getParameter('lightwindow_top'))+this.pagePosition.y : this.dimensions.viewport.height/2+this.pagePosition.y;
		var offsetWidth = this._getParameter('lightwindow_left') ? parseFloat(this._getParameter('lightwindow_left'))+this.pagePosition.x : this.dimensions.viewport.width/2+this.pagePosition.x;
		
		// So if a theme has say shadowed edges, they should be consistant and take care of in the contentOffset
		$('lightwindow').setStyle({
			top: offsetHeight+'px',
			left: offsetWidth+'px'
		});
		
		$('lightwindow_container').setStyle({
			height: originalHeight+'px',
			width: originalWidth+'px',
			left: -(originalWidth/2)+'px',
			top: -(originalHeight/2)+'px'
		});

		$('lightwindow_contents').setStyle({
			height: originalHeight+'px',
			width: originalWidth+'px'
		});
	},
	//
	//	Get the type of file.
	//
	_fileType : function(url) {
		var image = new RegExp("[^\.]\.("+this.options.fileTypes.image.join('|')+")\s*$", "i");
		if (image.test(url)) return 'image';
		if (url.indexOf('#') > -1 && (document.domain == this._getDomain(url))) return 'inline';		
		if (url.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));
		var type = 'unknown';
		var page = new RegExp("[^\.]\.("+this.options.fileTypes.page.join('|')+")\s*$", "i");
		var media = new RegExp("[^\.]\.("+this.options.fileTypes.media.join('|')+")\s*$", "i");
		if (document.domain != this._getDomain(url)) type = 'external';
	  	if (media.test(url)) type = 'media';
		if (type == 'external' || type == 'media') return type;
	  	if (page.test(url) || url.substr((url.length-1), url.length) == '/') type = 'page';
		return type;
	},
	//
	//  Get file Extension
	//
	_fileExtension : function(url) {
		if (url.indexOf('?') > -1) {
			url = url.substring(0, url.indexOf('?'));
		}
		var extenstion = '';
		for (var x = (url.length-1); x > -1; x--) {
			if (url.charAt(x) == '.') {
				return extenstion;
			}
			extenstion = url.charAt(x)+extenstion;
		}
	},
	//
	//	Monitor the keyboard while this lightwindow is up
	//
	_monitorKeyboard : function(status) {
		if (status) document.onkeydown = this._eventKeypress.bind(this); 
		else document.onkeydown = '';
	},
	//
	//  Perform keyboard actions
	//
	_eventKeypress : function(e) {
		if (e == null) {
			var keycode = event.keyCode;
		} else {
			var keycode = e.which;
		}
		
		switch (keycode) { 
			case 27: 
				this.deactivate(); 
				break;
			
			case 13:
				return;
				
			default:
				break;
		}
	
		// Gotta stop those quick fingers
		if (this.animating) {
			return false;
		}
		
		switch (String.fromCharCode(keycode).toLowerCase()) {
			case 'p':
				if (this.navigationObservers.previous) {
					this.navigateWindow('previous');
				}
				break;
				
			case 'n':
				if (this.navigationObservers.next) {
					this.navigateWindow('next');
				}
				break;
				
			default:
				break;
		}
	},
	//
	//	Get Gallery Information
	//
	_getGalleryInfo : function(rel) {
		if (!rel) return false;
		if (rel.indexOf('[') > -1) {
			return new Array(escape(rel.substring(0, rel.indexOf('['))), escape(rel.substring(rel.indexOf('[')+1, rel.indexOf(']'))));
		} else {
			return false;
		}
	},
	//
	//	Get the domain from a string.
	//
	_getDomain : function(url) {    
        var leadSlashes = url.indexOf('//');
        var domainStart = leadSlashes+2;
        var withoutResource = url.substring(domainStart, url.length);
        var nextSlash = withoutResource.indexOf('/');
        var domain = withoutResource.substring(0, nextSlash);
		if (domain.indexOf(':') > -1){
			var portColon = domain.indexOf(':');
			domain = domain.substring(0, portColon);
       	}
		return domain;
    },
	//
	//	Get the value from the params attribute string.
	//
	_getParameter : function(parameter, parameters) {
		if (!this.element) return false;
		if (parameter == 'lightwindow_top' && this.element.top) {
			return unescape(this.element.top);
		} else if (parameter == 'lightwindow_left' && this.element.left) {
			return unescape(this.element.left);
		} else if (parameter == 'lightwindow_type' && this.element.type) {
			return unescape(this.element.type);
		} else if (parameter == 'lightwindow_show_images' && this.element.showImages) {
			return unescape(this.element.showImages);
		} else if (parameter == 'lightwindow_height' && this.element.height) {
			return unescape(this.element.height);
		} else if (parameter == 'lightwindow_width' && this.element.width) {
			return unescape(this.element.width);
		} else if (parameter == 'lightwindow_loading_animation' && this.element.loadingAnimation) {
			return unescape(this.element.loadingAnimation);
		} else if (parameter == 'lightwindow_iframe_embed' && this.element.iframeEmbed) {
			return unescape(this.element.iframeEmbed);
		} else if (parameter == 'lightwindow_form' && this.element.form) {
			return unescape(this.element.form);
		} else {
			if (!parameters) {
				if (this.element.params) parameters = this.element.params;
				else return;
			}
			var value;
			var parameterArray = parameters.split(',');
			var compareString = parameter+'=';
			var compareLength = compareString.length;
			for (var i = 0; i < parameterArray.length; i++) {
				if (parameterArray[i].substr(0, compareLength) == compareString) {
					var currentParameter = parameterArray[i].split('=');
					value = currentParameter[1];
					break;
				}
			}
			if (!value) return false;
			else return unescape(value);
		}
	},
	//
	//  Get the Browser Viewport Dimensions
	//
	_browserDimensions : function() {
		if (Prototype.Browser.IE) {
            this.dimensions.viewport.height = document.documentElement.clientHeight;
            this.dimensions.viewport.width = document.documentElement.clientWidth;   
        } else {
            this.dimensions.viewport.height = window.innerHeight;
            this.dimensions.viewport.width = document.width || document.body.offsetWidth;
        }
	},
	//
	//  Get the scrollbar offset, I don't like this method but there is really no other way I can find.
	//
	_getScrollerWidth : function() {
	    var scrollDiv = Element.extend(document.createElement('div'));
		scrollDiv.setAttribute('id', 'lightwindow_scroll_div');
		scrollDiv.setStyle({
			position: 'absolute',
			top: '-10000px',
			left: '-10000px',
			width: '100px',
			height: '100px',
			overflow: 'hidden'
		});



	    var contentDiv = Element.extend(document.createElement('div'));
		contentDiv.setAttribute('id', 'lightwindow_content_scroll_div');
		contentDiv.setStyle({
			width: '100%',
			height: '200px'
		});

	    scrollDiv.appendChild(contentDiv);

		var body = document.getElementsByTagName('body')[0];
		body.appendChild(scrollDiv);

	    var noScroll = $('lightwindow_content_scroll_div').offsetWidth;
	    scrollDiv.style.overflow = 'auto';
    	var withScroll = $('lightwindow_content_scroll_div').offsetWidth;

	   	Element.remove($('lightwindow_scroll_div'));

	    this.scrollbarOffset = noScroll-withScroll;
	},
	

	//
	//  Add a param to an object dynamically created
	//
	_addParamToObject : function(name, value, object, id) {
		var param = document.createElement('param');
		param.setAttribute('value', value);
		param.setAttribute('name', name);
		if (id) {
			param.setAttribute('id', id);
		}
		object.appendChild(param);
		return object;
	},
	//
	//  Get the outer HTML of an object CROSS BROWSER
	//
	_outerHTML : function(object) {
 		if (Prototype.Browser.IE) {
			return object.outerHTML;
		} else {
			var clone = object.cloneNode(true);
			var cloneDiv = document.createElement('div');
			cloneDiv.appendChild(clone);
			return cloneDiv.innerHTML;
		}
	},
	//
	//  Convert an object to markup
	//
	_convertToMarkup : function(object, closeTag) {
		var markup = this._outerHTML(object).replace('</'+closeTag+'>', '');
		if (Prototype.Browser.IE) {
			for (var i = 0; i < object.childNodes.length; i++){
				markup += this._outerHTML(object.childNodes[i]);
			}
			markup += '</'+closeTag+'>';
		}
		return markup;
	},
	//
	//  Depending what type of browser it is we have to append the object differently... DAMN YOU IE!!
	//
	_appendObject : function(object, closeTag, appendTo) {
		if (Prototype.Browser.IE) {
			appendTo.innerHTML += this._convertToMarkup(object, closeTag);
			
			// Fix the Eolas activate thing but only for specified media, for example doing this to a quicktime film breaks it.
			if (this.options.EOLASFix.indexOf(this._fileType(this.element.href)) > -1) {
				var objectElements = document.getElementsByTagName('object');
				for (var i = 0; i < objectElements.length; i++) {
					if (objectElements[i].getAttribute("data")) objectElements[i].removeAttribute('data');
					objectElements[i].outerHTML = objectElements[i].outerHTML;
					objectElements[i].style.visibility = "visible";
				}
			}
		} else {
			appendTo.appendChild(object);	
		}	
	},
	//
	//  Add in iframe
	//
	_appendIframe : function(scroll) {
		var iframe = document.createElement('iframe');
		iframe.setAttribute('id', 'lightwindow_iframe');
		iframe.setAttribute('name', 'lightwindow_iframe');
		iframe.setAttribute('src', 'about:blank');
		iframe.setAttribute('height', '100%');
		iframe.setAttribute('width', '100%');
		iframe.setAttribute('frameborder', '0');
		iframe.setAttribute('marginwidth', '0');
		iframe.setAttribute('marginheight', '0');
		iframe.setAttribute('scrolling', scroll);	
		
		this._appendObject(iframe, 'iframe', $('lightwindow_contents'));
	},
	//
	//  Write Content to the iframe using the skin
	//
	_writeToIframe : function(content) {
		var template = this.options.skin.iframe;
		template = template.replace('{body_replace}', content); 
		if ($('lightwindow_iframe').contentWindow){
			$('lightwindow_iframe').contentWindow.document.open();
			$('lightwindow_iframe').contentWindow.document.write(template);
			$('lightwindow_iframe').contentWindow.document.close();
		} else {
			$('lightwindow_iframe').contentDocument.open();
			$('lightwindow_iframe').contentDocument.write(template);
			$('lightwindow_iframe').contentDocument.close();
		}
	},
	//
	//  Load the window Information
	//  
	_loadWindow : function() {
		switch (this.windowType) {
			case 'image' :

				var current = 0;
				var images = [];
				this.checkImage = [];
				this.resizeTo.height = this.resizeTo.width = 0;
				this.imageCount = this._getParameter('lightwindow_show_images') ? parseInt(this._getParameter('lightwindow_show_images')) : 1;

				// If there is a gallery get it
				if (gallery = this._getGalleryInfo(this.element.rel)) {	
					for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {
						if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {
							break;
						}
					}
					if (this.galleries[gallery[0]][gallery[1]][current-this.imageCount]) {
						this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-this.imageCount];
					} else {
						this.navigationObservers.previous = false;
					}
					if (this.galleries[gallery[0]][gallery[1]][current+this.imageCount]) {
						this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+this.imageCount];
					} else {
						this.navigationObservers.next = false;
					}
					
					this.activeGallery = true;
				} else {
					this.navigationObservers.previous = false;
					this.navigationObservers.next = false;					

					this.activeGallery = false;
				}
				
				for (var i = current; i < (current+this.imageCount); i++) {
		
					if (gallery && this.galleries[gallery[0]][gallery[1]][i]) {
						this.contentToFetch = this.galleries[gallery[0]][gallery[1]][i].href;
						
						this.galleryLocation = {current: (i+1)/this.imageCount, total: (this.galleries[gallery[0]][gallery[1]].length)/this.imageCount};
											
						if (!this.galleries[gallery[0]][gallery[1]][i+this.imageCount]) {
							$('lightwindow_next').setStyle({
								display: 'none'
							});
						} else {
							$('lightwindow_next').setStyle({
								display: 'block'
							});
							$('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i+this.imageCount].title;
						}
						
						if (!this.galleries[gallery[0]][gallery[1]][i-this.imageCount]) {
							$('lightwindow_previous').setStyle({
								display: 'none'
							});
						} else {
							$('lightwindow_previous').setStyle({
								display: 'block'
							});
							$('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i-this.imageCount].title;
						}
					}

					images[i] = document.createElement('img');
					images[i].setAttribute('id', 'lightwindow_image_'+i);
					images[i].setAttribute('border', '0');
					images[i].setAttribute('src', this.contentToFetch);
					$('lightwindow_contents').appendChild(images[i]);

					// We have to do this instead of .onload 
					this.checkImage[i] = new PeriodicalExecuter(function(i) {
						if (!(typeof $('lightwindow_image_'+i).naturalWidth != "undefined" && $('lightwindow_image_'+i).naturalWidth == 0)) {
	
							this.checkImage[i].stop();
	
							var imageHeight = $('lightwindow_image_'+i).getHeight();
							if (imageHeight > this.resizeTo.height) {
								this.resizeTo.height = imageHeight;
							}
							this.resizeTo.width += $('lightwindow_image_'+i).getWidth();
							this.imageCount--;
	
							$('lightwindow_image_'+i).setStyle({
								height: '100%'
							});
	
						 	if (this.imageCount == 0) {
								this._processWindow();
						 	}
						}
					
					}.bind(this, i), 1);			
				}


			break;
		
		case 'media' :			
		
			var current = 0;
			this.resizeTo.height = this.resizeTo.width = 0;

			// If there is a gallery get it
			if (gallery = this._getGalleryInfo(this.element.rel)) {	
				for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {
					if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {
						break;
					}
				}
				
				if (this.galleries[gallery[0]][gallery[1]][current-1]) {
					this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-1];
				} else {
					this.navigationObservers.previous = false;
				}
				if (this.galleries[gallery[0]][gallery[1]][current+1]) {
					this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+1];
				} else {
					this.navigationObservers.next = false;
				}
		
				this.activeGallery = true;
			} else {
				this.navigationObservers.previous = false;
				this.navigationObservers.next = false;
				
				this.activeGallery = false;
			}
		

			if (gallery && this.galleries[gallery[0]][gallery[1]][current]) {
				this.contentToFetch = this.galleries[gallery[0]][gallery[1]][current].href;

				this.galleryLocation = {current: current+1, total: this.galleries[gallery[0]][gallery[1]].length};
				
				if (!this.galleries[gallery[0]][gallery[1]][current+1]) {
					$('lightwindow_next').setStyle({
						display: 'none'
					});
				} else {
					$('lightwindow_next').setStyle({
						display: 'block'
					});
					$('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current+1].title;
				}
				
				if (!this.galleries[gallery[0]][gallery[1]][current-1]) {
					$('lightwindow_previous').setStyle({
						display: 'none'
					});
				} else {
					$('lightwindow_previous').setStyle({
						display: 'block'
					});
					$('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current-1].title;
				}
			}
			
			if (this._getParameter('lightwindow_iframe_embed')) {
				this.resizeTo.height = this.dimensions.viewport.height;
				this.resizeTo.width = this.dimensions.viewport.width;	
			} else {
				this.resizeTo.height = this._getParameter('lightwindow_height');
				this.resizeTo.width = this._getParameter('lightwindow_width');				
			}
			
			this._processWindow();
			
			break;

		case 'external' :		

			this._appendIframe('auto');

			this.resizeTo.height = this.dimensions.viewport.height;
			this.resizeTo.width = this.dimensions.viewport.width;
						
			this._processWindow();

			break;
				
		case 'page' :	
			
			var newAJAX = new Ajax.Request(
				this.contentToFetch, {
					method: 'get', 
					parameters: '', 
					onComplete: function(response) {
						$('lightwindow_contents').innerHTML += response.responseText;
						this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);
						this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);
						this._processWindow();
					}.bind(this)
				}
			);
			
			break;
			
		case 'inline' : 
		
			var content = this.contentToFetch;
			if (content.indexOf('?') > -1) {
				content = content.substring(0, content.indexOf('?'));
			}
			content = content.substring(content.indexOf('#')+1);
			
			new Insertion.Top($('lightwindow_contents'), $(content).innerHTML);
			
			this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);
			this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);
			
			this._toggleTroubleElements('hidden', true); 			
			this._processWindow();
			
			break;
			
		default : 
			throw("Page Type could not be determined, please amend this lightwindow URL "+this.contentToFetch);
			break;
		}
	},
	//
	//  Resize the Window to fit the viewport if necessary
	//
	_resizeWindowToFit : function() {
		if (this.resizeTo.height+this.dimensions.cruft.height > this.dimensions.viewport.height) {
			var heightRatio = this.resizeTo.height/this.resizeTo.width;
			this.resizeTo.height = this.dimensions.viewport.height-this.dimensions.cruft.height-(2*this.options.viewportPadding);
			// We only care about ratio's with this window type			
			if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
				this.resizeTo.width = this.resizeTo.height/heightRatio;
				$('lightwindow_data_slide_inner').setStyle({
					width: this.resizeTo.width+'px'
				});			
			}
		} 
		if (this.resizeTo.width+this.dimensions.cruft.width > this.dimensions.viewport.width) {
			var widthRatio = this.resizeTo.width/this.resizeTo.height;
			this.resizeTo.width = this.dimensions.viewport.width-2*this.dimensions.cruft.width-(2*this.options.viewportPadding);
			// We only care about ratio's with this window type
			if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
				this.resizeTo.height = this.resizeTo.width/widthRatio;
				$('lightwindow_data_slide_inner').setStyle({
					height: this.resizeTo.height+'px'
				});
			}
		}
			
	},
	//
	//  Set the Window to a preset size
	//
	_presetWindowSize : function() {
		if (this._getParameter('lightwindow_height')) {
			this.resizeTo.height = parseFloat(this._getParameter('lightwindow_height'));
		}
		if (this._getParameter('lightwindow_width')) {
			this.resizeTo.width = parseFloat(this._getParameter('lightwindow_width'));
		}
	},
	//
	//  Process the Window
	//
	_processWindow : function() {
		// Clean out our effects
		this.dimensions.dataEffects = [];

		// Set up the data-slide if we have caption information
		if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {
			if (this.element.caption) {
				$('lightwindow_data_caption').innerHTML = this.element.caption;
				$('lightwindow_data_caption').setStyle({
					display: 'block'
				});
			} else {
				$('lightwindow_data_caption').setStyle({
					display: 'none'
				});				
			}
			if (this.element.author) {
				$('lightwindow_data_author').innerHTML = this.element.author;
				$('lightwindow_data_author_container').setStyle({
					display: 'block'
				});
			} else {
				$('lightwindow_data_author_container').setStyle({
					display: 'none'
				});				
			}
			if (this.activeGallery && this.options.showGalleryCount) {
				$('lightwindow_data_gallery_current').innerHTML = this.galleryLocation.current;
				$('lightwindow_data_gallery_total').innerHTML = this.galleryLocation.total;
				$('lightwindow_data_gallery_container').setStyle({
					display: 'block'
				});
			} else {
				$('lightwindow_data_gallery_container').setStyle({
					display: 'none'
				});				
			}

			$('lightwindow_data_slide_inner').setStyle({
				width: this.resizeTo.width+'px',
				height: 'auto',
				visibility: 'visible',
				display: 'block'
			});
			$('lightwindow_data_slide').setStyle({
				height: $('lightwindow_data_slide').getHeight()+'px',
				width: '1px',
				overflow: 'hidden',
				display: 'block'
			});
		} else {
			$('lightwindow_data_slide').setStyle({
				display: 'none',
				width: 'auto'
			});
			$('lightwindow_data_slide_inner').setStyle({
				display: 'none',
				visibility: 'hidden',
				width: this.resizeTo.width+'px',
				height: '0px'
			});
		}
				
		if (this.element.title != 'null') {		
			$('lightwindow_title_bar_title').innerHTML = this.element.title;
		} else {
			$('lightwindow_title_bar_title').innerHTML = '';
		}
		
		var originalContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
		// Position the window
    	$('lightwindow_container').setStyle({
			height: 'auto',
			// We need to set the width to a px not auto as opera has problems with it
			width: $('lightwindow_container').getWidth()+this.options.contentOffset.width-(this.windowActive ? this.options.contentOffset.width : 0)+'px'
		});
		var newContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
 		
		// We need to record the container dimension changes
		this.containerChange = {height: originalContainerDimensions.height-newContainerDimensions.height, width: originalContainerDimensions.width-newContainerDimensions.width};

		// Get out general dimensions
		this.dimensions.container = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
		this.dimensions.cruft = {height: this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.options.contentOffset.height, width: this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.options.contentOffset.width};
		
		// Set Sizes if we need too
		this._presetWindowSize();
		this._resizeWindowToFit(); // Even if the window is preset we still don't want it to go outside of the viewport

		if (!this.windowActive) {
			// Position the window
		   	$('lightwindow_container').setStyle({
				left: -(this.dimensions.container.width/2)+'px',
				top: -(this.dimensions.container.height/2)+'px'
			});
		}
	   	$('lightwindow_container').setStyle({
			height: this.dimensions.container.height+'px',
			width: this.dimensions.container.width+'px'
		});
		
		// We are ready, lets show this puppy off!
		this._displayLightWindow('block', 'visible');
		this._animateLightWindow();
	},
	//
	//  Fire off our animation handler
	//
	_animateLightWindow : function() {
		if (this.options.animationHandler) {
			this.options.animationHandler().bind(this);
		} else {
			this._defaultAnimationHandler();
		}
	},
	//
	//  Fire off our transition handler
	//
	_handleNavigation : function(display) {
		if (this.options.navigationHandler) {
			this.options.navigationHandler().bind(this, display);
		} else {
			this._defaultDisplayNavigation(display);
		}
	},
	//
	//  Fire off our transition handler
	//
	_handleTransition : function() {
		if (this.options.transitionHandler) {
			this.options.transitionHandler().bind(this);
		} else {
			this._defaultTransitionHandler();
		}
	},
	//
	//  Handle the finish of the window animation
	// 
	_handleFinalWindowAnimation : function(delay) {
		if (this.options.finalAnimationHandler) {
			this.options.finalAnimationHandler().bind(this, delay);
		} else {
			this._defaultfinalWindowAnimationHandler(delay);
		}		
	},
	//
	//  Handle the gallery Animation
	// 
	_handleGalleryAnimation : function(list) {
		if (this.options.galleryAnimationHandler) {
			this.options.galleryAnimationHandler().bind(this, list);
		} else {
			this._defaultGalleryAnimationHandler(list);
		}		
	},
	//
	//  Display the navigation 
	//
	_defaultDisplayNavigation : function(display) {
		if (display) {
			$('lightwindow_navigation').setStyle({
				display: 'block',
				height: $('lightwindow_contents').getHeight()+'px',
				width: '100%',
				marginTop: this.options.dimensions.titleHeight+'px'
			});			
		} else {
			$('lightwindow_navigation').setStyle({
				display: 'none',
				height: 'auto',
				width: 'auto'
			});			
		}
	},
	//
	//  This is the default animation handler for LightWindow
	//
	_defaultAnimationHandler : function() {	
		// Now that we have figures out the cruft lets make the caption go away and add its effects
		if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {
			$('lightwindow_data_slide').setStyle({
				display: 'none',
				width: 'auto'
			});
			this.dimensions.dataEffects.push(
				new Effect.SlideDown('lightwindow_data_slide', {sync: true}),
				new Effect.Appear('lightwindow_data_slide', {sync: true, from: 0.0, to: 1.0})
			);
		}

		// Set up the Title if we have one
		$('lightwindow_title_bar_inner').setStyle({
			height: '0px',
			marginTop: this.options.dimensions.titleHeight+'px'
		});
		
		// We always want the title bar as well
		this.dimensions.dataEffects.push(
			new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: this.options.dimensions.titleHeight+'px', marginTop: '0px'}}),
		 	new Effect.Appear('lightwindow_title_bar_inner', {sync: true, from: 0.0, to: 1.0})
		);		
		
		if (!this.options.hideGalleryTab) {
			this._handleGalleryAnimation(false);
			if ($('lightwindow_galleries_tab_container').getHeight() == 0) {
				this.dimensions.dataEffects.push(
					new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '20px', marginTop: '0px'}})
				);
				$('lightwindow_galleries').setStyle({
					width: '0px'
				});
			}
		}
		
		var resized = false;
		var ratio = this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.resizeTo.width+this.options.contentOffset.width;
		if (ratio != $('lightwindow_container').getWidth()) {
			new Effect.Parallel([
					new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.width/$('lightwindow_contents').getWidth()), {scaleFrom: 100*($('lightwindow_contents').getWidth()/($('lightwindow_contents').getWidth()+(this.options.contentOffset.width))), sync: true,  scaleY: false, scaleContent: false}),
					new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.width)), {sync: true, scaleY: false, scaleFromCenter: true, scaleContent: false})
				], {
					duration: this.duration, 
					delay: 0.25,
					queue: {position: 'end', scope: 'lightwindowAnimation'}
				}
			);		
		}
		
		ratio = this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.resizeTo.height+this.options.contentOffset.height;
		if (ratio != $('lightwindow_container').getHeight()) {
			new Effect.Parallel([
					new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.height/$('lightwindow_contents').getHeight()), {scaleFrom: 100*($('lightwindow_contents').getHeight()/($('lightwindow_contents').getHeight()+(this.options.contentOffset.height))), sync: true, scaleX: false, scaleContent: false}),
					new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.height)), {sync: true, scaleX: false, scaleFromCenter: true, scaleContent: false})
				], {
					duration: this.duration, 
					afterFinish: function() {				
						if (this.dimensions.dataEffects.length > 0) {
							if (!this.options.hideGalleryTab) {
								$('lightwindow_galleries').setStyle({
									width: this.resizeTo.width+'px'
								});
							}
							new Effect.Parallel(this.dimensions.dataEffects, {
									duration: this.duration,
									afterFinish: function() {
										this._finishWindow();
									}.bind(this),
									queue: {position: 'end', scope: 'lightwindowAnimation'} 
								}
							);
						}
					}.bind(this), 
					queue: {position: 'end', scope: 'lightwindowAnimation'} 
				}
			);
			resized = true;
		}
		
		// We need to do our data effect since there was no resizing
		if (!resized && this.dimensions.dataEffects.length > 0) {	
			new Effect.Parallel(this.dimensions.dataEffects, {
					duration: this.duration,
					beforeStart: function() {
						if (!this.options.hideGalleryTab) {
							$('lightwindow_galleries').setStyle({
								width: this.resizeTo.width+'px'
							});
						}
						if (this.containerChange.height != 0 || this.containerChange.width != 0) {
							new Effect.MoveBy('lightwindow_container', this.containerChange.height, this.containerChange.width, {transition: Effect.Transitions.sinoidal});
						}
					}.bind(this),			
					afterFinish: function() {
						this._finishWindow();
					}.bind(this),
					queue: {position: 'end', scope: 'lightwindowAnimation'} 
				}
			);
		}			
		
	},
	//
	//  Finish up Window Animation
	//
	_defaultfinalWindowAnimationHandler : function(delay) {
		if (this.windowType == 'media' || this._getParameter('lightwindow_loading_animation')) {	
			// Because of major flickering with the overlay we just hide it in this case
			Element.hide('lightwindow_loading');
			this._handleNavigation(this.activeGallery);
			this._setStatus(false);
		} else {
			Effect.Fade('lightwindow_loading', {
				duration: 0.75,
				delay: 1.0, 
				afterFinish: function() {
					// Just in case we need some scroll goodness (this also avoids the swiss cheese effect)
					if (this.windowType != 'image' && this.windowType != 'media' && this.windowType != 'external') {
						$('lightwindow_contents').setStyle({
							overflow: 'auto'
						});
					}
					this._handleNavigation(this.activeGallery);
					this._defaultGalleryAnimationHandler();
					this._setStatus(false);
				}.bind(this),
				queue: {position: 'end', scope: 'lightwindowAnimation'}
			});
		}
	},
	//
	//  Handle the gallery Animation
	//
	_defaultGalleryAnimationHandler : function(list) {
		if (this.activeGallery) {
			$('lightwindow_galleries').setStyle({
				display: 'block',
				marginBottom: $('lightwindow_data_slide').getHeight()+this.options.contentOffset.height/2+'px'
			});
			$('lightwindow_navigation').setStyle({
				height: $('lightwindow_contents').getHeight()-20+'px'
			});
		} else {
			$('lightwindow_galleries').setStyle({
				display: 'none'
			});	
			$('lightwindow_galleries_tab_container').setStyle({
				height: '0px',
				marginTop: '20px'
			});
			$('lightwindow_galleries_list').setStyle({
				height: '0px'
			});
			return false;
		}
		
		if (list) {
			if ($('lightwindow_galleries_list').getHeight() == 0) {
				var height = $('lightwindow_contents').getHeight()*0.80;
				$('lightwindow_galleries_tab_span').className = 'down';
			} else {
				var height = 0;
				$('lightwindow_galleries_tab_span').className = 'up';
			}

			new Effect.Morph('lightwindow_galleries_list', {
				duration: this.duration,
				transition: Effect.Transitions.sinoidal,
				style: {height: height+'px'},
				beforeStart: function() {
					$('lightwindow_galleries_list').setStyle({
						overflow: 'hidden'
					});					
				},
				afterFinish: function() {
					$('lightwindow_galleries_list').setStyle({
						overflow: 'auto'
					});
				},
				queue: {position: 'end', scope: 'lightwindowAnimation'}
			});	
		}
		
		
	},
	//
	//  Default Transition Handler
	//
	_defaultTransitionHandler : function() {
		// Clean out our effects
		this.dimensions.dataEffects = [];

		// Now that we have figures out the cruft lets make the caption go away and add its effects
		if ($('lightwindow_data_slide').getStyle('display') != 'none') {
			this.dimensions.dataEffects.push(
				new Effect.SlideUp('lightwindow_data_slide', {sync: true}),
				new Effect.Fade('lightwindow_data_slide', {sync: true, from: 1.0, to: 0.0})
			);
		}
		
		if (!this.options.hideGalleryTab) {
			if ($('lightwindow_galleries').getHeight() != 0 && !this.options.hideGalleryTab) {
				this.dimensions.dataEffects.push(
					new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '0px', marginTop: '20px'}})
				);
			}
			
			if ($('lightwindow_galleries_list').getHeight() != 0) {
				$('lightwindow_galleries_tab_span').className = 'up';
				this.dimensions.dataEffects.push(
					new Effect.Morph('lightwindow_galleries_list', {
						sync: true, 
						style: {height: '0px'},
						transition: Effect.Transitions.sinoidal,
						beforeStart: function() {
							$('lightwindow_galleries_list').setStyle({
								overflow: 'hidden'
							});					
						},
						afterFinish: function() {
							$('lightwindow_galleries_list').setStyle({
								overflow: 'auto'
							});
						}
					})
				);
			}
		}
		
		// We always want the title bar as well
		this.dimensions.dataEffects.push(
			new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: '0px', marginTop: this.options.dimensions.titleHeight+'px'}}),
		 	new Effect.Fade('lightwindow_title_bar_inner', {sync: true, from: 1.0, to: 0.0})
		);

		new Effect.Parallel(this.dimensions.dataEffects, {
				duration: this.duration,
				afterFinish: function() {
					this._loadWindow();
				}.bind(this),
				queue: {position: 'end', scope: 'lightwindowAnimation'} 
			}
		);	
	},
	//
	//	Default Form handler for LightWindow
	//
	_defaultFormHandler : function(e) {
		var element = Event.element(e).parentNode;
		var parameterString = Form.serialize(this._getParameter('lightwindow_form', element.getAttribute('params')));
		if (this.options.formMethod == 'post') {
			var newAJAX = new Ajax.Request(element.href, { 
				method: 'post', 
				postBody: parameterString, 
				onComplete: this.openWindow.bind(this, element)
			});
		} else if (this.options.formMethod == 'get') {
			var newAJAX = new Ajax.Request(element.href, { 
				method: 'get', 
				parameters: parameterString, 
				onComplete: this.openWindow.bind(this, element)
			});
		}
	},
	// 
	//  Wrap everything up
	//
	_finishWindow : function() {
		if (this.windowType == 'external') {
			// We set the externals source here because it allows for a much smoother animation
			$('lightwindow_iframe').setAttribute('src', this.element.href);
			this._handleFinalWindowAnimation(1);	
		} else if (this.windowType == 'media') {

			var outerObject = document.createElement('object');
			outerObject.setAttribute('classid', this.options.classids[this._fileExtension(this.contentToFetch)]);
			outerObject.setAttribute('codebase', this.options.codebases[this._fileExtension(this.contentToFetch)]);
			outerObject.setAttribute('id', 'lightwindow_media_primary');
			outerObject.setAttribute('name', 'lightwindow_media_primary');
			outerObject.setAttribute('width', this.resizeTo.width);
			outerObject.setAttribute('height', this.resizeTo.height);
			outerObject = this._addParamToObject('movie', this.contentToFetch, outerObject);
			outerObject = this._addParamToObject('src', this.contentToFetch, outerObject);
			outerObject = this._addParamToObject('controller', 'true', outerObject);
			outerObject = this._addParamToObject('wmode', 'transparent', outerObject);
			outerObject = this._addParamToObject('cache', 'false', outerObject);
			outerObject = this._addParamToObject('quality', 'high', outerObject);

			if (!Prototype.Browser.IE) {
				var innerObject = document.createElement('object');
				innerObject.setAttribute('type', this.options.mimeTypes[this._fileExtension(this.contentToFetch)]);
				innerObject.setAttribute('data', this.contentToFetch);
				innerObject.setAttribute('id', 'lightwindow_media_secondary');
				innerObject.setAttribute('name', 'lightwindow_media_secondary');
				innerObject.setAttribute('width', this.resizeTo.width);
				innerObject.setAttribute('height', this.resizeTo.height);
				innerObject = this._addParamToObject('controller', 'true', innerObject);
				innerObject = this._addParamToObject('wmode', 'transparent', innerObject);
				innerObject = this._addParamToObject('cache', 'false', innerObject);
				innerObject = this._addParamToObject('quality', 'high', innerObject);
			
				outerObject.appendChild(innerObject);
			}	
			
			if (this._getParameter('lightwindow_iframe_embed')) {
				this._appendIframe('no');
				this._writeToIframe(this._convertToMarkup(outerObject, 'object'));
			} else {
				this._appendObject(outerObject, 'object', $('lightwindow_contents'));
			}

			this._handleFinalWindowAnimation(0);
		} else {
			this._handleFinalWindowAnimation(0);
		}

		// Initialize any actions
		this._setupActions();
	}
}

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

Event.observe(window, 'load', lightwindowInit, false);

//
//	Set up all of our links
//
var myLightWindow = null;
function lightwindowInit() {
	myLightWindow = new lightwindow();
}

function togglePreview(){
	$('preview', 'post-content', 'editor-controls').invoke('toggle');
}

function doPreview(){
	new Ajax.Updater('preview', '/'+root+'modules/forum/preview/?ajax', {method: 'post', parameters: {post_val: $F('post')}});
	setTimeout(function () { togglePreview(); } , 550);
}

function toggleFSEditor(){
	$('editor').toggleClassName('fs');
	$('post').setStyle({height: (document.viewport.getHeight()-75)+'px'}).stopObserving('keyup');
}

function loginChecker(){
	new Ajax.Request('/'+ajax_root+'login.php?action=check&ajax', {
        method: 'post', parameters: {username: $F('cs_user'), password: md5($F('cs_pass')), hash: $F('cs_hash'), remember: $F('cs_cookie')},
        onSuccess: function(transport) {
            switch(transport.responseText){
                case 'fail':
                    Effect.Shake('loginBox');
                    var error = 'There was a problem with the form submission. Please try again.';
                    $('loginError').addClassName('boxred').update(error).show();
                    return false;
                break;

                case 'done':
                    var error = 'Please hold while we transfer you.';
                    $('loginError').addClassName('boxgreen').update(error).show();
                    setTimeout(function () { document.location = '/'+root+'index.php';}, 200);
                    return false;
                break;

                default:
                    Effect.Shake('loginBox');
                    $('loginError').addClassName('boxred').update(transport.responseText).show();
                    return false;
                break;
            }
        },
        onFailure: function(transport) {
            $('loginError').value = 'There was a problem with your submission please try again.';
        }
    
    });
    return false;
}

//setTimeout(function () { $("post").focus(); },600);
function hideid(ele){
	Effect.toggle(ele, 'slide');
	$("post").focus();
	return false;
}

function toggle(ele){
	new Effect.toggle(ele, 'slide');
	return true;
}

function MM_jumpMenuGo(objId,targ,restore){ //v9.0
  var selObj = null;  with (document) { 
  if (getElementById) selObj = getElementById(objId);
  if (selObj) eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0; }
}

function emoticon(text, ele) {
	textarea = document.getElementById(ele);
	text = ' ' + text + ' ';
	if (textarea.createTextRange && textarea.caretPos) {
		var caretPos = textarea.caretPos;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
		textarea.focus();
	} else {
		textarea.value  += text;
		textarea.focus();
	}
	return false;
}

function insertFormatting(txt, ele) {
	textarea = document.getElementById(ele);
	if (document.selection) {
		textarea.focus();
		selected = document.selection.createRange();
		selected.text = '['+txt+']'+selected.text+'[/'+txt+']';
	} else if (textarea.selectionStart || textarea.selectionStart == '0') {
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start) +'['+txt+']'+ textarea.value.substring(start, end) +'[/'+txt+']'+ textarea.value.substring(end, textarea.value.length);
	}
	return false;
}

function addText(ele, txt1, txt2) {
	textarea = document.getElementById(ele);
	if (document.selection) {
		textarea.focus();
		selected = document.selection.createRange();
		selected.text = txt1 + selected.text + txt2;
	} else if (textarea.selectionStart || textarea.selectionStart == '0') {
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start) + txt1 + textarea.value.substring(start, end) + txt2 + textarea.value.substring(end, textarea.value.length);
	}
	return false;
}

//robbed from Coderprofile.com ;D
function increase_textarea_height(id, ammount){
	$(id).style.height=(parseInt($(id).style.height)+ammount)+"px";
}
function decrease_textarea_height(id, ammount){
	$(id).style.height=(parseInt($(id).style.height)-ammount)+"px";
}

function bbremove_scroll(remove_scroll_bar_link){
	remove_scroll_bar_link = $(remove_scroll_bar_link);
	var container = remove_scroll_bar_link.up('div[class="bbcode_code"]',0);

	if(content = container.select('div[id="bbcode"]')[0]){
    	var content2 = container.select('pre[rel="bbcode"]')[0];
    
        content.removeClassName('bb').addClassName('bb_expanded');
        content2.removeClassName('bb').addClassName('bb_expanded');

    }	
    remove_scroll_bar_link.setStyle({display:'none'});
}

function fnSelect(objId){
   fnDeSelect();
   if (document.selection){
      var range = document.body.createTextRange();
      range.moveToElementText(document.getElementById(objId));
      range.select();
   }else if (window.getSelection){
      var range = document.createRange();
      range.selectNode(document.getElementById(objId));
      window.getSelection().addRange(range);
   }
}
function fnDeSelect(){
	if (document.selection){
		document.selection.empty();
	}else if (window.getSelection){
		window.getSelection().removeAllRanges();
	}
} 

ResizeableTextarea = Class.create();
ResizeableTextarea.prototype = {
    initialize: function(element, options) {
        this.element = $(element);
        this.size = parseFloat(this.element.getStyle('height') || '100');
        this.options = Object.extend({
            inScreen: true,
            resizeStep: 10,
            minHeight: this.size
        }, options || {});
        Event.observe(this.element, "keyup", this.resize.bindAsEventListener(this));
        if ( !this.options.inScreen ) {
            this.element.style.overflow = 'hidden';
        }
        this.element.setAttribute("wrap","virtual");
        this.resize();
    },
    resize : function(){
        this.shrink();
        this.grow();
    },
    shrink : function(){
        if ( this.size <= this.options.minHeight ){
            return;
        }
        if ( this.element.scrollHeight <= this.element.clientHeight) {
            this.size -= this.options.resizeStep;
            this.element.style.height = this.size+'px';
            this.shrink();
        }
    },
    grow : function(){
        if ( this.element.scrollHeight > this.element.clientHeight ) {
            if ( this.options.inScreen && (20 + this.element.offsetTop + this.element.clientHeight) > document.body.clientHeight ) {
                return;
            }
            this.size += (this.element.scrollHeight - this.element.clientHeight) + this.options.resizeStep;
            this.element.style.height = this.size+'px';
            this.grow();
        }
    }
}


function checkAll(checkname, exby) {
  for (i = 0; i < checkname.length; i++){
      checkname[i].checked = exby.checked? true:false
  }
}

function inverse($f) {
	for ($i=0; $i < $f.elements.length; $i++) {
		if ($f.elements[$i].type == "checkbox") {
			$f.elements[$i].checked = !$f.elements[$i].checked;
		}
	}
}

// We are going to catch the TAB key so that we can use it
function catchTab(item,e){
   if(navigator.userAgent.match("Gecko")){
       c=e.which;
   }else{
       c=e.keyCode;
   }
   if(c==9){
       replaceSelection(item,"	"); //basically 1 tab == 4 spaces
       setTimeout("document.getElementById('"+item.id+"').focus();",0);
       return false;
   }

}

function setSelectionRange(input, selectionStart, selectionEnd) {
 if (input.setSelectionRange) {
   input.focus();
   input.setSelectionRange(selectionStart, selectionEnd);
 }
 else if (input.createTextRange) {
   var range = input.createTextRange();
   range.collapse(true);
   range.moveEnd('character', selectionEnd);
   range.moveStart('character', selectionStart);
   range.select();
 }
}
   
// replace the text area contents with original plus our new TAB
function replaceSelection (input, replaceString) {
   if (input.setSelectionRange) {
       var selectionStart = input.selectionStart;
       var selectionEnd = input.selectionEnd;
       input.value = input.value.substring(0, selectionStart)+
replaceString + input.value.substring(selectionEnd);

       if (selectionStart != selectionEnd){
           setSelectionRange(input, selectionStart, selectionStart +
   replaceString.length);
       }else{
           setSelectionRange(input, selectionStart +
replaceString.length, selectionStart + replaceString.length);
       }

   }else if (document.selection) {
       var range = document.selection.createRange();

       if (range.parentElement() == input) {
           var isCollapsed = range.text == '';
           range.text = replaceString;

            if (!isCollapsed)  {
               range.moveStart('character', -replaceString.length);
               range.select();
           }
       }
   }
}
function updateDimensions(){
    $$('img[class="bbcode_img"]').each(function (ele){
        //var needed = {width: 328};
    	var curImg = $(ele).getDimensions();
    	if(curImg.width > 328){
    		var newWidth = 328;
    		var scaleFactor = newWidth/curImg.width;
    		var newHeight = scaleFactor*curImg.height;
    		$(ele).writeAttribute({width: newWidth, height: newHeight});
    		$(ele).wrap('a', {'href': $(ele).readAttribute('src'), class: 'lightwindow', title: 'BBCode Image: Click to open fullscreen'});
    	}
    });
}

function growl(message, header, sticky){
    growler.growl(message, {header: header || "", sticky: Boolean(sticky)});
}

document.observe('dom:loaded', function(){
    
	$$('textarea').each(function (txtarea){
        txtarea.onkeyup = new ResizeableTextarea(txtarea);
        txtarea.writeAttribute('onkeydown', "return catchTab(this, event)");
    });
    
    updateDimensions();
    
    growler = new k.Growler({location: 'nu'});
	
	if($('post')){
        $('post').focus();
        window.onresize = function (){
            if($('editor').hasClassName('fs'))
                $('post').setStyle({height: (document.viewport.getHeight()-75)+'px'});
        }
	}
});


function inWindow(url, title, width, height){
    var title = title || '';
    var url = url || '';
    var width = width || 400;
    var height = height || document.viewport.getHeight()-200;
    
    if(url=='')
        return false;
        
      myLightWindow.activateWindow({
    	   href: 		url, 
    	   title: 		title,
    	   width: 		width > document.viewport.getWidth() ?  document.viewport.getWidth() : width,
    	   height:      height > document.viewport.getHeight() ? document.viewport.getHeight() : height
      });
    return false;
}