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

var Prototype = {
  Version: '1.6.0.3',

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

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

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

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

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


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

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

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

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

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

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

    klass.prototype.constructor = klass;

    return klass;
  }
};

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

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

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

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

    return this;
  }
};

var Abstract = { };

Object.extend = function(destination, source) {
  for (var property in source)
    destination[property] = source[property];
  return destination;
};

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (Object.isUndefined(object)) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : String(object);
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

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

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

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

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

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

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

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({ }, object);
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) { }
    }

    return returnValue;
  }
};

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

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

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

var PeriodicalExecuter = Class.create({
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

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

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

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

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = Object.isUndefined(count) ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return String(this);
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = Object.isUndefined(truncation) ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : String(this);
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

  unescapeHTML: function() {
    var div = new Element('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return { };

    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

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

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var $break = { };

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

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

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

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

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

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

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

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

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

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

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

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

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

  inject: function(memo, iterator, context) {
    this.each(function(value, index) {
      memo = iterator.call(context, memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

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

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

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

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

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

  sortBy: function(iterator, context) {
    return this.map(function(value, index) {
      return {
        value: value,
        criteria: iterator.call(context, value, index)
      };
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (Object.isFunction(args.last()))
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

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

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
};

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  filter:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray,
  every:   Enumerable.all,
  some:    Enumerable.any
});
function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

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

Array.from = $A;

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(Object.isArray(value) ?
        value.flatten() : [value]);
    });
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

if (Prototype.Browser.Opera){
  Array.prototype.concat = function() {
    var array = [];
    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for (var i = 0, length = arguments.length; i < length; i++) {
      if (Object.isArray(arguments[i])) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  };
}
Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
Hash.from = $H;
var ObjectRange = Class.create(Enumerable, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
};

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
};

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (Object.isFunction(responder[callback])) {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) { }
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate:   function() { Ajax.activeRequestCount++ },
  onComplete: function() { Ajax.activeRequestCount-- }
});

Ajax.Base = Class.create({
  initialize: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

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

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

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

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

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

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

    this.parameters = params;

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

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

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

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

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

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  status:      0,
  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

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

  getHeader: Ajax.Request.prototype.getHeader,

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

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

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

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

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

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

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

    $super(url, options);
  },

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

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

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

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

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

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

    this.start();
  },

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

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

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

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

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

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

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

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

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

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

Element.cache = { };

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

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

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

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

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

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

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

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

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

    var content, insert, tagName, childNodes;

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

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

      content = Object.toHTML(content);

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

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

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

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

    return element;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return false;
  },

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

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

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

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

    return element;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return $(document.body);
  },

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

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

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

    } while (element = element.offsetParent);

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

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

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

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

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

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

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

Element.Methods.identify.counter = 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  Element._attributeTranslations.has = {};

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

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

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

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

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

    return element;
  };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

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

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

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

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

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

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

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

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  },

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

    var e = this.expression;

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

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

    return true;
  },

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

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

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

    return true;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return match;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return matchingInputs;
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  cache: { },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

      return element;
    },

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

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

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

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

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

      destroyWrapper(id, eventName, handler);

      return element;
    },

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

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

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

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

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

Object.extend(Event, Event.Methods);

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

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

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

  var timer;

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

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

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

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

  } else {
    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();
var _sp="http://www.datou.com/";
var _cp="http://www.datou.com/dtw/";
//var _cp = "http://127.0.0.1/dtw/";
//var _sp="http://127.0.0.1/";
var _st = window.setTimeout;
Array.prototype.without = function (obj){
	var oarr = this;
	var arrTmp = new Array();
	for(var i = 0 ;i < oarr.length ; i++){
		if(oarr[i] != obj)
			arrTmp.push(oarr[i])
	}
	return arrTmp;
};
window.setTimeout = function(fRef, mDelay) {
	if(typeof fRef == 'function'){
	  var argu = Array.prototype.slice.call(arguments,2);
	  var f = (function(){ fRef.apply(null, argu); });
	  return _st(f, mDelay);
 	}
 	return _st(fRef,mDelay);
}
function importJsFile(fileName){
		document.write("<script language=\"javascript\" src=\""+fileName+"\"></script>");
	}
var Co = {
	getCo : function(name){
	var strCookie=document.cookie; 
      var arrCookie=strCookie.split("; "); 
      for(var i=0;i<arrCookie.length;i++){ 
            var arr=arrCookie[i].split("="); 
            if(arr[0]==name)return arr[1]; 
      } 
      return ""; 
	},
	setCo : function(name,value,expireHours){
	 var cookieString=name+"="+escape(value); 
     var date=new Date(); 
     date.setTime(date.getTime()+expireHours*3600*1000); 
     cookieString=cookieString+"; expires="+date.toGMTString() + "; path = /"; 
     document.cookie=cookieString; 
	},
	remove : function(name){
		 var cookieString=name+"="; 
	     var date=new Date(); 
	     date.setTime(date.getTime() - 1); 
	     cookieString=cookieString+"; expires="+date.toGMTString() + "; path = /"; 
	     document.cookie=cookieString; 
	}
}
function importCssFile(fileName){
		document.write("<link rel=\"stylesheet\" type=\"text/css\" href=\""+fileName+"\"></script>");
	}
String.prototype.replaceAll  = function(s1,s2){
	return this.replace(new RegExp(s1,"gm"),s2);    
} 
function doSort(a,s,e)  
    {  
        if(s<e)  
        {  
            var pos=partition(a,s,e);  
            doSort(a,s,pos-1);  
            doSort(a,pos+1,e);  
        }  
    }  
 function partition(a,st,en)  
    {  
        var s=st;  
        var e=en+1;  
        var temp=a[s];  
        while(1)  
        {  
            while(a[++s]<temp);  
            while(a[--e]>temp);  
            if(s>e)break;  
            var tem=a[s];  
            a[s]=a[e];  
            a[e]=tem;  
        }  
        a[st]=a[e];  
        a[e]=temp;  
        return e;  
    }  
    


Array.prototype.quickSort=function(){ 
   doSort(this,0,this.length-1);  
} 
function createXml(str){ 
	if(document.all){ 
		var xmlDom=new ActiveXObject("Microsoft.XMLDOM") ;
		xmlDom.loadXML(str) ;
		return xmlDom ;
	}
	else 
		return new DOMParser().parseFromString(str, "text/xml") ;
}
function getQueryString(key){
         var value = ""; 
         var sURL = window.document.URL;
         if (sURL.indexOf("?") > 0){
         	var arrayParams = sURL.split("?");
            var arrayURLParams = arrayParams[1].split("&");
			for (var i = 0; i < arrayURLParams.length; i++){
				var sParam =  arrayURLParams[i].split("=");
				if ((sParam[0] == key) && (sParam[1] != "")){
					value = sParam[1];
					break;
				}
			}        
		}
		return value;
}
function getContextPath(){
	var path="/";
	var sURL = window.document.URL;
	var address=sURL.substring(0,sURL.indexOf("?"));
	var arr=address.split("/");
	for(var i=3;i<arr.length-1;i++){
		path+=arr[i];
		path+="/";
	}
	return path;
}
function isLocation(){
	var req=document.referrer;
	var thispath=getContextPath();
	var path="/";
	var address=req.substring(0,req.indexOf("?"));
	var arr=address.split("/");
	if(thispath.indexOf(arr[3]) && req!="")
		return false;
	else
		return true;
}
var _arr_onloading_event = [];
function seq_onload(fun){
	if(typeof(fun) == "function")
		_arr_onloading_event.push(fun);
} 
window.onload = function() { 
	for(i = 0 ;i< _arr_onloading_event.length;i++){
		_arr_onloading_event[i]();
	}
} 
function getElement(xml,tagname,i){
	var arr = xml.getElementsByTagName(tagname)
	if( arr != null && arr.length >= i+1){
		var itemI = arr.item(i);
		if(itemI.firstChild  && itemI.firstChild.nodeValue){
			delete arr,xml,tagname,i,itemI;
			return itemI.firstChild.nodeValue;
		}else{
			delete arr,xml,tagname,i,itemI;
			return "";
		}
	}else{
		delete arr,xml,tagname,i;
		return "";
	}
}
function getElements(xml,tagname){
	var arr = xml.getElementsByTagName(tagname);
	if(arr != null){
		delete arr;
		return arr;
	}else{
		return [];
	}
}
Array.prototype.fit = function (){
	var col =this;
	for(var i = 0 ;i<arguments.length;i++){
		for(var j = 0 ;j<arguments[i].length;j++){
			col.push(arguments[i][j]);
		}		
	}
	return col;
}
Array.prototype.uniqe = function (obj){
	var col = this;
	for(var i=0 ;i<col.length;i++){
		if(obj == col[i])
			return false;
	}
	return true;
}
function getEvent(){    
       if(document.all)    return window.event;           
       func=getEvent.caller;               
       while(func!=null){       
           var arg0=func.arguments[0];   
           if(arg0){   
               if((arg0.constructor==Event || arg0.constructor ==MouseEvent)   
                   || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){       
                   return arg0;   
               }   
           }   
           func=func.caller;   
       }   
      return window.event;   
} 
function $B(name){
	return document.getElementsByName(name) != null ? document.getElementsByName(name) :new Array();
}
//var _arr_Ajax_request = [];
//var _arr_Ajax_request_lab = true;
//function Class_Ajax_Request(url,params,onComplete){
//	this.url = url;
//	this.params = params;
//	this.onComplete = onComplete;
//}
//Ajax.prototype.seq_Request(url,params,onComplete){
//	_arr_Ajax_request.push(new Class_Ajax_Request(url,params,onComplete));
//	if(_arr_Ajax_request_lab){
//		if(_arr_Ajax_request.length > 0){
//			_arr_Ajax_request_lab = false;
//			new Ajax.Request(_arr_Ajax_request[0].url,{
//				method: 'POST',
//				parameters:_arr_Ajax_request[0].params,
//				asynchronous:true,
//				onComplete:function (response){
//					_arr_Ajax_request[0].onComplete(response);
//					_arr_Ajax_request_lab = true;
//				}
//			});
//		}
//	}
//}
var Client = {
    Engine: {'name': 'unknown', 'version': ''},
    Features: {}
};

Client.Features.xhr = !!(window.XMLHttpRequest);
Client.Features.xpath = !!(document.evaluate);
if (window.opera) Client.Engine.name = 'opera';
else if (window.ActiveXObject) Client.Engine = {'name': 'ie', 'version': (Client.Features.xhr) ? 7 : 6};
else if (!navigator.taintEnabled) Client.Engine = {'name': 'webkit', 'version': (Client.Features.xpath) ? 420 : 419};
else if (document.getBoxObjectFor != null) Client.Engine.name = 'gecko';
Client.Engine[Client.Engine.name] = Client.Engine[Client.Engine.name + Client.Engine.version] = true;
//Client.Engine.ie是否IE浏览器，版本不限
//Client.Engine.ie6是否IE 6
//Client.Engine.ie7是否IE 7
//Client.Engine.opera是否opera
//Client.Engine.gecko是否Mozilla/Gecko(包括firefox)
//Client.Engine.webkit是否Safari
//Client.Engine.webkit419是否Safari2
//Client.Engine.webkit420是否Safari3
function getRadio(name){
	var tags = document.getElementsByName(name);
	if(tags.length > 0){
		for(var i = 0 ; i < tags.length ;i++){
			if(tags[i].checked)
				return tags[i].value;
		}
		return "";
	}else{
		return null;
	}
}
String.prototype.trim=function(){
        return this.replace(/(^\s*)|(\s*$)/g, "");
}
String.prototype.ltrim=function(){
        return this.replace(/(^\s*)/g,"");
}
String.prototype.rtrim=function(){
        return this.replace(/(\s*$)/g,"");
}
function getCheck(name){
	var res = new Array();
	var checks = document.getElementsByName(name);
	
	if(checks.length > 0){
		for(var i = 0 ; i < checks.length ;i++){
			if(checks[i].checked)
				res.push(checks[i].value);
		}
		return res;
	}else{
		return null;
	}
}
function desc(x,y){ 
        if (x > y)   
            return -1; 
        if (x < y)           
            return 1; 
    } 
function asc(x,y){ 
        if (x > y)   
            return 1; 
        if (x < y)           
            return -1; 
    } 
   //根据ID得到某个元素的位置
function getElementPos(elementId){
	  var ua = navigator.userAgent.toLowerCase();   
	  var isOpera = (ua.indexOf('opera') != -1);   
	  var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof   
	  var el = document.getElementById(elementId);   
	  if(el.parentNode === null || el.style.display == 'none')   
	  {   
	    return false;   
	  }   
	  var parent = null;   
	  var pos = [];   
	  var box;   
	  if(el.getBoundingClientRect) //IE   
	  {   
	    box = el.getBoundingClientRect();   
	    var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);   
	    var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);return {x:box.left + scrollLeft, y:box.top + scrollTop};   
	  }   
	  else if(document.getBoxObjectFor) // gecko   
	  {   
	    box = document.getBoxObjectFor(el);   
	  
	    var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0;   
	    var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0;   
	    pos = [box.x - borderLeft, box.y - borderTop];   
	  }   
	  else // safari & opera   
	  {   
	    pos = [el.offsetLeft, el.offsetTop];   
	    parent = el.offsetParent;   
	    if (parent != el) {   
	      while (parent) {   
	        pos[0] += parent.offsetLeft;   
	        pos[1] += parent.offsetTop;   
	        parent = parent.offsetParent;   
	      }   
	    }   
	    if (ua.indexOf('opera') != -1|| ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' ))   
	    {   
	      pos[0] -= document.body.offsetLeft;   
	      pos[1] -= document.body.offsetTop;   
	    }   
	  }   
	  
	  if (el.parentNode) {   
	    parent = el.parentNode;    
	  }else {    
	    parent = null;    
	  }   
	  while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML')   
	  { // account for any scrolled ancestors   
	    pos[0] -= parent.scrollLeft;   
	    pos[1] -= parent.scrollTop;   
	  
	    if (parent.parentNode){    
	      parent = parent.parentNode;    
	    }   
	    else{    
	      parent = null;    
	    }   
	  }   
	  return {x:pos[0], y:pos[1]};   
	};
function Position(){
	this.obj = ""; 
   	this.initTop = 0; 
    this.topLimit = 0; 
    this.top = 0;
   	this.getTop = function() { 
        if (typeof(document.documentElement.scrollTop) == "number") { 
            return document.documentElement.scrollTop; 
        } else if (typeof(window.pageYOffset) == "number") { 
            return window.pageYOffset; 
        } else { 
            return 0; 
        } 
    } ;
    this.move = true;
}
var posArr = new Array();
function PositionAllElements() {
		var pal =  posArr.length;
		var i = 0 ;
		while( i < pal){
			    obj = posArr[i];
				if(obj.move){
						var pos = obj.getTop() + obj.topLimit; 
			        if(pos < obj.initTop) 
			            pos = obj.initTop; 
			        interval = obj.top - pos; 
			        if (interval > 1000) { 
			            obj.top = pos + 700; 
			        } else if (interval < -1000) { 
			            obj.top = pos - 700; 
			        } else  { 
			            obj.top = obj.top - interval / 3; 
			        } 
			        obj.style.top = obj.top + "px"; 
				}
				i++;
		}
}
var _login = _cp+"ajax/login/login.jsp";
var _status = _cp+"ajax/login/loginstatus.jsp";
var _user_login_info = "<a href='javascript:util.toLogin();' id='login_info_did'>登录</a> <a id='login_info_nn' href='"+_cp+"regist/regist.jsp'>/注册</a>&nbsp;&nbsp;&nbsp;&nbsp; ";
var _login_exit = _cp + "ajax/login/exit.jsp";
var _login_forget = _cp + "ajax/login/forget.jsp";
var _login_padding = 0;
var _re_login = _cp+"ajax/login/fflush.jsp";
if(Client.Engine.gecko){
	_login_padding = 6;
}
var counttemp = 0 ;
					    
function Login (){
	this.pf = {m:"DF",id:""};
	//登陆验证表单
	this.input = {
		id:$("username"),
		pwd:$("password")
	};
	this.resetInput = function(){
		if($("username").value == "请输入手机号/大头号"){
			$("username").value = "";
		}
	};
	//回车登录
	this.loginByEnter = function(){
		var event = getEvent();   
		if(event.keyCode == 13) {
		   lg.login();
	     }
	};
	//用户信息
	this.user= "";
	//错误提示接口
	this.error = function (){
		V("请输入用户名/密码");
		return false;
	};
	//正确提示接口
	this.pass = function (){
		return true;
	};
	//登陆成功
	this.suss = function(){
		lg.keep();
		return true;
	};
	//登陆错误接口
	this.fail = function (err,username){
		if($("login_form"))
				$("login_form").style.display = "";
		if($("login_load"))
				$("login_load").style.display = "none";
			
		return false;
	};
	//登陆验证
	this.check = function(u,p){
		if(u == "" || p == "" || u == "请输入手机号/大头号"){
			lg.error();
			return false;
		}else{
			lg.pass();
			return true;
		}
	};
	//完成接口
	this.com = function (response){
		return true;
	};
	this.nn = "";
	this.said = "";
	this.qqid = "";
	this.mdn = "";
	this.sn = "";
	this.logo = "";
	//设置用户信息
	this.setUser = function (xml){
		var user ;
		user = getElements(xml,"im")[0];
		user = getElement(user,"did",0);
		lg.user = user;
		var nn = getElement(xml,"nn",0);
		var st = getElement(xml,"st",0);
		var qq = getElement(xml,"qq",0);
		var mdn = getElement(xml,"mdn",0);
		var sn = getElement(xml,"sn",0);
		var logo = getElement(xml,"logo",0);
		lg.qqid = qq;
		if($("im")){
			im.st = st;
		}
		lg.nn = nn;
		var said = getElement(xml,"sid",0);
		lg.said = said;
		if($("login_info")){
			$("login_info").innerHTML = "<img title='系统消息' src='" + _sp + "images/header_sign01.gif' id='unread_icon' onclick='window.location.href=\"" +_cp+"message/messages.jsp\"' style='cursor:pointer;'  align='absmiddle' /> <span onclick='window.location.href=\"" +_cp+"message/messages.jsp\"' style='cursor:pointer;'>系统消息</span><span onclick='window.location.href=\"" +_cp+"message/messages.jsp\"' style='cursor:pointer;' id='msg_count'>(0)</span>&nbsp;"+"<span><a href=javascript:util.toSpace('" + lg.user + "');>"+(lg.nn != null && lg.nn.trim() != "" ? lg.nn : lg.user)+"</a></span>&nbsp;&nbsp;"+"<a href='javascript:lg.exit();'>退出</a>&nbsp;&nbsp;";
			$("login_info").style.visibility = "visible";
		}
		if($("h_weather")){
			$("h_weather").style.display = "block";
			$("h_weather").innerHTML = getElement(xml,"gf",0);
		}
		lg.mdn = mdn;
		lg.sn = sn;
		lg.logo = logo;
	};
	this.readyToLogin = function(){
		return false;
	};
	this.notLoginPage  = false;
	this.reloging = false;
	this.relogin = function(){
		if(!lg.reloging){
			lg.reloging = true;
			if($("login_form"))
				$("login_form").style.display = "none";
			if($("im")){
				im.loading();
			}
			var user = this.user;
			var setUser =this.setUser;
			var login_Ajax = new Ajax.Request(_re_login,{
				method: 'POST',
				asynchronous:true,
				onComplete:function (response){
						if(response.responseText.indexOf("<response>") > -1){
							var xml = createXml(response.responseText);
	 						setUser(xml,user)
							if($("im")){
								im.login("D");
								lg.reloging = false;
							}
						}
					}
				});	
		}
	};
	this.setupPosition = function(){
		
	};
	//登陆
	this.login = function(){
		
		var com = this.com;
		var fail = this.fail;
		var setUser =this.setUser;
		var user = this.user;
		var suss = this.suss;
		var setupPosition = this.setupPosition;
		var username = $("username").value;
		var password = $("password").value;
		var cookies = $("cookies").checked  ? "true" : "";
		if(this.check(username,password)){
				lg.readyToLogin();
				if($("login_form"))
					$("login_form").style.display = "none";
				if($("login_load"))
					$("login_load").style.display = "";
				var param = "action=login&account="+username+"&password="+password+"&cookies=" + cookies + "&time=" + new Date();
				
				var login_Ajax = new Ajax.Request(_login,{method: 'POST',parameters:param,evalscripts:false,asynchronous:true,onComplete:function (response){
						
						if(response.responseText.indexOf("<response>") > -1){
							var xml = createXml(response.responseText);
						//调用完成接口
							setUser(xml)
							suss();
							
							if($("cookies").checked){
								var p = getElement(xml,"pwd",0);
								var mdn = getElement(xml,"mdn",0);
								Co.setCo("_pwd",p,720);
								Co.setCo("_did",mdn,720);
								
							}
							
							if($("im")){
								try{
									im.login("D");
								}catch(e){
									V(e.message);
								}
							}else{
							}
							
						}else{
							V(response.responseText.substring(response.responseText.indexOf("ERR") + 7,response.responseText.length) + ",<span id='clock' > 3</span>秒后关闭",{w:200});
							alter.clock(3);
							//调用失败接口
							lg.fail(response.responseText,username);
						}
						
						//setupPosition();
					}
				});
				
			
		}
	};
	this.loginPageLoad = function(){
		$("login_form").style.display = 'none';
	}
	this.keep = function(){
		util.isMaster();
	};
	this.position = "";
	this.befroStatusEscape = function(){
	
	};
	//检查用户登录状态
	this.status = function (info_id){
		
			var user = this.user; 
			var setUser = this.setUser;
			var afterStatus = this.afterStatus;
			var befroStatusEscape = this.befroStatusEscape;
			var defaultSet = this.defaultSet;
			var	param = "m=" + lg.pf.m +"&id=" + lg.pf.id;
			var pwd = Co.getCo("_pwd");
			var did = Co.getCo("_did");
			
			if(did != null && did != ""){
				param += "&account=" + did + "&password=" + pwd;
			}
			var myAjax = new Ajax.Request(_status,{method: 'POST',parameters:param,asynchronous:true,onComplete:function (response){
				befroStatusEscape();
				if(response.responseText.indexOf("<response>") > -1){
					//var info = new LoginInfo(response.responseText);
					var xml = createXml(response.responseText);
					setUser(xml,user);
					lg.keep();
					//new Fill_Login_Info(info).set(info_id);
					
					if($("im")){
						im.login("D");
					}else{
						count.count();
					}
					return;
				}else{
					
					//util.toLogin();
					if($("login_form"))
						$("login_form").style.display = "";
					if($("login_load"))
						$("login_load").style.display = "none";
					lg.defaultSet();
				}
				afterStatus();
				
				if(lg.position == ""){
					//lg.position = window.setInterval(PositionAllElements , 30);
				}
		}});
	}
	this.defaultSet = function(){
			var sb = new Array();
			sb[sb.length] = "亲爱的大头友友，您还没有";
			sb[sb.length] = "<strong>";
			sb[sb.length] = "	<a href='javascript:util.toLogin();'>登录</a>&nbsp;";
			sb[sb.length] = "	<a href='"+_cp+"regist/regist.jsp'>注册</a>";
			sb[sb.length] = "</strong>";
			sb[sb.length] = "<b>大头网</b>";
				
			if($("login_info")){
				$("login_info").style.visibility = "visible";
				$("login_info").innerHTML = sb.join('');
			} 
			if($("h_weather"))
				$("h_weather").style.display = "none";
			lg.statusFail();
						
	}
	this.statusFail = function(){
		return false;
	}
	this.afterStatus = function(){
		
		return false;
	}
	this.timerCount = "";
	//去我的空间
	this.mySpace = function(){
		if(lg.user != ""){
			window.location.href = _cp + "space/space.jsp?who=" + escape(lg.user);
		}
		else
			window.location.href = _cp + "login.html";
	};
	this.exit = function(){
		if(lg.user != ""){
			if($("im")){
				im.pingAble = false;
				if(im.pingTimer){
					window.clearTimeout(im.pingTimer);
				}
			}
			if(lg.timerCount){
					clearTimeout(lg.timerCount);
			}
			if($("non_login"))
				$("non_login").style.display = "";
			if($("im"))
				$("im").style.display = "none";
				
			if($("sms1")){
				sms.cls(1);sms.cls(2);
			}
			lg.afterExit();
			if($("login_form"))
				$("login_form").style.display = "";
			if($("login_load"))
				$("login_load").style.display = "none";
			lg.defaultTrack();
			if($("im")){
				
			}
			Co.remove("_did");
			Co.remove("_pwd");
			new Ajax.Request(_login_exit , {method: 'POST',asynchronous:true,onComplete:function(response){
				if(response.responseText.indexOf("<response>") > -1){
					
				}
			}});
			//util.toLogin();
		}
	};
	this.defaultTrack = function(){
		
	};
	this.afterExit = function(){
		lg.user = "";
		lg.defaultSet();
		lg.fail();
		util.notMaster();
		lg.exitCustom();
	};
	this.exitCustom = function(){
		
	};
	this.mySystemMessage = function(){
		if($("im_sys_count").innerHTML != '(0)'){
			window.location.href = _cp + "message/system.jsp";
		}
		
	};
	this.myShellMessage = function(){
		if($("im_shell_count").innerHTML != '(0)'){
			window.location.href = _cp + "message/shell.jsp";
		}
	};
	this.subForGet = function(){
		var forget = $("forgetNum").value;
		if(forget != ""){
			$("forgetNum").disabled = true;
			var forget_Ajax = new Ajax.Request(_login_forget,{
			method: 'POST',
			asynchronous:true,
			parameters:"forget=" + forget,
			onComplete:function (response){
				if(response.responseText.indexOf("<response>") > -1){
					var sb = "<div>用户名和密码已发送到手机,请查收.<span id='clock'>3</span></div>";
					alter.end = function(){
						window.location.href = "../login.html";
					}
					V(sb);
					alter.clock(3);
				}else{
					var sb = "<div>手机号不存在或错误!请稍候再试!<span id='clock'>3</span></div>";
					alter.end = function(){};
					V(sb);
					alter.clock(3);
					$("forgetNum").disabled = false;
				}
			}});
		}
	};
	this.initShell = function(){
	
		//document.write("<div id='shell_container' style='position:absolute;top:0px;left:0px;filter:alpha(opacity=15);opacity:0.14;'></div>");
		//document.write("<div id='sheller' style='display:none'></div>");
		//document.write("<div id='sheller' style=''></div>");
	};
	this.initShell();
}
function LoginInfo(xml){
	this.userId ="";
	this.sid = "";
	this.mdn = "";
	this.trans = function (){
			var login_info=createXml(xml);
			this.userId = getElement(login_info,"userId",0);
			this.sid = getElement(login_info,"sid",0);
			this.mdn = getElement(login_info,"mdn",0);
	}
	this.trans();
}
function Fill_Login_Info(info){
	this.set = function (info_id){
		var info_container = $(info_id);
		info_container.innerHTML = "Hi!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
		info_container.innerHTML += info.userId;
		info_container.innerHTML += "&nbsp;&nbsp;&nbsp;&nbsp;";
		info_container.innerHTML += info.mdn;
	};
}
var count = {
	unread : new Array(),
	q3 : "",
	pinginter : "",
	system : "",
	count : function(){
		try{
			var myAjax = new Ajax.Request(_cp + "ajax/util/count/count.jsp",{method: 'POST',asynchronous:true,onComplete:function(response){
				count.setupSystem();
				count.alertNext();
				count.pinginter = window.setTimeout(count.setPing,count.sleep);
				delete myAjax;
				delete response;
			}});	
		}catch(e){alert("count|" + e.message);}
	},
	setupSystem : function(){
		$("msg_count").innerHTML = "("+count.system + ")";
		if(parseInt(count.system) > 0)
			$("unread_icon").src = _sp + "images/header_sign02.gif";
	},
	alertLock : false,
	alertNext : function(){
		if(!count.alertLock){
			var uid = $("mess_alter_uid").value;
			if(uid != ""){
				var i = 0 ;
				var l = count.unread.length;
				var nar = new Array();
				while(i < l){
					if(count.unread[i]["ID"] != uid){
						nar.push(count.unread[i]);
					}
					i++;
				}
				count.unread = nar;
				
			}
			$("mess_alter").style.display = "none";
			count.alertLock = false;
			if(count.unread.length == 0) return;
			window.setTimeout(function(){
				var obj = count.unread[0];
				var id = obj["ID"];
				var p = $("mess_body");
				var nn = obj["N"];
				p.innerHTML = "<a class='mess_alter_text' href='javascript:count.alterPlay();util.openClient(\"" +id+ "\");'>收到<br/><span>" +nn+ "</span>的未读消息.</a>";
				$("mess_alter").style.display = "block";
				$("mess_alter_uid").value = id;
				count.alertLock = true;
				if(Client.Engine.ie6){
					if(count.alterposition == ""){
						count.alterposition = window.setInterval(function(){
							$("mess_alter").style.position = "absolute";
							$("mess_alter").style.top = (450+document.documentElement.scrollTop) + "px";
						},30);
					}
				}
			},500);
		}
	},
	alterposition : "",
	sleep : 10000,
	setPing : function(){
		window.clearInterval(count.pinginter);
		count.pinginter = window.setInterval(count.countSe,count.sleep);
	},
	countSe : function(){
		
		var d = new Date().getTime();
		var param = "time=" + d;
		param += "&q3=" + count.q3 ;
		var myAjax = new Ajax.Request(_cp + "ajax/util/count/countse.jsp",{method: 'POST',parameters:param,asynchronous:true,onComplete:function(response){
				delete param;
				delete response;
				delete myAjax; 
		}});	
	},
	countBack : function(sys,unreads,newq3){
		count.q3 = newq3;
		count.unread = unreads;
		$("msg_count").innerHTML = "("+sys+ ")";
		if(parseInt(sys) > 0)
			$("unread_icon").src = _sp + "images/header_sign02.gif";
			
		count.alertNext();
	},
	alterPlay : function(){
		count.alertLock = false;
		count.alertNext();
	}
}
var _alter_able = true;
var _alert_x;
var _alert_y;
var _alert_w = 200;
var _alert_h = 100;
var _alert_client_X = "";
var _alert_client_Y = "";
var alter = {
	down : function (){
		var event = getEvent();
		_alert_x = event.clientX - $("alert_div").offsetLeft;
		_alert_y = event.clientY - $("alert_div").offsetTop;
		if(Client.Engine.ie){
			document.body.onmousemove = alter.move;
			document.body.onmouseup = alter.up;
		}else{
			window.onmousemove = alter.move;
			window.onmouseup = alter.up;
		}
	},
	move : function(){
		if(_alter_able){
			//$("alert_div").className = "tip_class";
			var event = getEvent();
			var x = event.clientX;
			var y = event.clientY;
			$("alert_div").style.top = (y-_alert_y) + "px";
			$("alert_div").style.left = (x-_alert_x) + "px";
			//$("alert_div").style.width = _alert_w + "px";
			//$("alert_div").style.height = _alert_h + "px";
		}
	},
	tag : true,
	level : 1,
	inter : "",
	step : function(){
		alter.level = alter.level + 1;
		if(alter.level < 11){
			var obj = $("alert_div_bg");
			var x = parseInt(obj.style.left.substring(0,obj.style.left.indexOf("px")));
			var y = parseInt(obj.style.top.substring(0,obj.style.top.indexOf("px")));
			var w = parseInt(obj.style.width.substring(0,obj.style.width.indexOf("px")));
			var h = parseInt(obj.style.height.substring(0,obj.style.height.indexOf("px")));
			
			obj.style.width = w * 0.9 + "px";
			obj.style.height = h * 0.9 + "px";
			var c = 720 - x
			
			obj.style.left = (x + c*0.2) + "px";
			var d =  y - 40 ;
			if($("waper_container").scrollTop > 10){
				d = y + 10;
			}
			obj.style.top = (y - d*0.3) + "px";
		}else{
			window.clearInterval(alter.inter);
			alter.tag = true;
			$("alert_div_bg").style.display = "none";
			if($("hav_msg"))
				$("hav_msg").style.display = "block";
		}
		
	},
	mini : function(){
		//x:740 y:40
		var obj = $("alert_div_bg");
		var o = $("alert_div");
		if(alter.tag){
			alter.tag = false;
			$("alert_div_bg").style.display = "block";
			obj.style.left = o.style.left;
			obj.style.top = o.style.top;
			obj.style.width = o.style.width;
			obj.style.height = o.style.height;
			alter.cls();
			alter.inter = window.setInterval(alter.step , 40);
			alter.level = 1;
		}else{
			obj.style.display = "none";
			window.clearInterval(alter.inter);
		}
	},
	up : function(){
		if(Client.Engine.ie){
			document.body.onmousemove = null;
		}else{
			window.onmousemove = null;
		}
		$("alert_div").className = "tip";
	},
	cls : function(){
		_alter_able = true;
		this.beforCls();
		$("alert_div").style.display = "none";
		if($("hav_msg"))
			$("hav_msg").style.display = "none";
	},
	show : function(inner , w){
		$("alert_div").style.display = "block";
		$("alert_div_body").innerHTML = inner;
		if($("hav_msg"))
			$("hav_msg").style.display = "none";
	},
	max : function(){
		$("alert_div").style.display = "block";
		if($("hav_msg"))
			$("hav_msg").style.display = "none";
	},
	beforCls : function (){
		return true;
	},
	clock : function(t){
		if($("clock")){
			if(t>0){
				$("clock").innerHTML = t;
				t--;
				setTimeout(alter.clock , 1000, t);
			}else{
				alter.cls();
				alter.end();
			}
		}
	},
	end : function(){
		return true;
	}
};
function V(str , son){
	//param = 1:width 2:height 3:x 4:y
	if(str == ""){
		return;
	}
	if(alter){
		$("alert_div").style.position = "absolute";
			if(son && son.w){
				$("alert_div").style.width = son.w +  "px";
				_alert_w = son.w
			}else{
				$("alert_div").style.width = "200px";
				_alert_w = 200;
			}
			if(son && son.h){
				_alert_h = son.h;
				$("alert_div").style.height = son.h +  "px";
			}else{
				$("alert_div").style.height = "100px";
				_alert_h = 100;
			}
			if(son && son.x){
				$("alert_div").style.left = son.x +  "px";
			}else{
				var w = window.screen.width;
				var x = 300;
				if(w == 1280){
					x = 300;
				}
				$("alert_div").style.left = x +  "px";
			}
			if(son && son.y){
				var top = document.documentElement.scrollTop;
				$("alert_div").style.top = (son.y + top) +  "px";
			}else{
				var w = window.screen.height;
				var y = 120;
				if(w == 1280){
					y = 120;
				}
				var top = document.documentElement.scrollTop;
				$("alert_div").style.top = (y + top) +  "px";
			}
		alter.show(str);
	}
};
var _char = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var _favor_path = _cp+"ajax/util/favor.jsp";
var _shell_init_path = _cp + "ajax/shell/initShell.jsp"; 
var _shell_send_path =  _cp + "shell"; 
var _util_is_friend = _cp + "ajax/im/isFriend.jsp";
var _util__sms_send = _cp+"ajax/im/sendmesg.jsp";
var _util_invited = _cp + "ajax/im/friend/invited.jsp"; 
var _util_fnvalidatemsg = _cp+"ajax/im/friend/valid.jsp"; 
var _util_addfreind = _cp + "ajax/im/friend/friend.jsp";
var _track_queryType = "ROOT";
var _track_flush = true;
var _music_resource = _cp + "ajax/music/linkResource.jsp";
var _dtw_track = _cp + "ajax/track/getActionTrack.jsp"; 
var _usedPage = 0;

var _queryModelArr = new Array();
_queryModelArr[_queryModelArr.length] = "NEWS";
_queryModelArr[_queryModelArr.length] = "MUSIC";
_queryModelArr[_queryModelArr.length] = "VIDEO";
_queryModelArr[_queryModelArr.length] = "SPACE";
_queryModelArr[_queryModelArr.length] = "BBS";
	
var _innerUlArr = new Array();
_innerUlArr[_innerUlArr.length] = "zxgj";
_innerUlArr[_innerUlArr.length] = "yygj";
_innerUlArr[_innerUlArr.length] = "spgj";
_innerUlArr[_innerUlArr.length] = "xcgj";
_innerUlArr[_innerUlArr.length] = "sqgj";

var _thisTrackPage = 0;
		
var requestUrl = _cp + "ajax/track/getFocusTrack.jsp";

function get24HourNum(){
	var countAjaxPath = _cp + "ajax/track/getCountInWeb.jsp";
	var myAjax = new Ajax.Request(countAjaxPath,{method: 'POST',asynchronous:true,onComplete:function (response){
			var jsonObj = eval("(" + response.responseText+ ")");
			$("_news").innerHTML = jsonObj.NEWSMDN;
			$("_music").innerHTML = jsonObj.MUSICMDN;
			$("_video").innerHTML = jsonObj.VIDEOMDN;
			$("_bbs").innerHTML = jsonObj.BBSMDN;
			$("_space").innerHTML = jsonObj.SPACEMDN;
			$("_blog").innerHTML = jsonObj.BLOGMDN;
			$("_home").innerHTML = jsonObj.ZILLMDN;
		}});
}
var util = {
	openClient : function(uid){
		if(uid.length == 8){
			var h1 = uid.substr(0,1);
			var h2 = uid.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(h1 == code1[i]){
					h1 = code2[i];
					break;
				}
			}
			uid = h1 + h2;
		}
		window.open(_cp + "message/imclient.jsp?who=" +uid ,"imclient","width=540,height=385,z-look=yes;alwaysRaised=yes,location=no,titlebar=no,menubar=no,toolbar=no,scrollbars=no");
	},
	invited : function(uid,nn){
		var sb = new Array();
		sb[sb.length] = "<div>";
		sb[sb.length] = "	<div>";
		sb[sb.length] = "    是否邀请";
		sb[sb.length] = nn != "" ? nn :uid ;
		sb[sb.length] = "    成为好友?";
		sb[sb.length] = "	</div>";
		sb[sb.length] = "	<div class='add_friend'>";
		sb[sb.length] = "		<input type='button' value='确定' onclick='util.invitedsub(\"" +uid+ "\",\"" +nn+ "\")'/>";
		sb[sb.length] = "		<input type='button' value='取消' onclick='alter.cls();' />";
		sb[sb.length] = "	</div>";
		sb[sb.length] = "</div>";
		V(sb.join('') , {h:100,w:200})
	},
	invitedsub : function(uid,nn){
		var param = "who=" + uid;
		var myAjax = new Ajax.Request(_util_invited,{method: 'POST',parameters:param,asynchronous:true,onComplete:function (response){
				var message = new Array();
				var tp = response.responseText;
				
				if(tp.indexOf("ERR") > -1){
					message[message.length] = "<br/><br/><div class='im_sys' id=\"imSysMessage\">调用协议失败，请稍候再试！<br/><br/><input type='button' value='关闭' onclick='alter.cls();'/></div>";
				}else if (tp.indexOf('SYS:PROVED')> -1){
					message[message.length] = "<br/><br/><div class='im_sys' id=\"imSysMessage\">邀请成功，" + nn + "已经加您为好友！<br/><br/><input type='button' value='关闭' onclick='alter.cls();'/></div>";
					util.reloadWindow();
				}else if (tp.indexOf('SYS:DENNY')> -1){
					message[message.length] = "<br/><br/><div class='im_sys' id=\"imSysMessage\">邀请失败, " + nn + "拒绝了您的邀请！<br/><br/><input type='button' value='关闭' onclick='alter.cls();'/></div>";
				}else if (tp.indexOf('SYS:NEEDP')> -1){
					message[message.length] = "<div class='im_sys' id=\"imSysMessage\">" + nn+ "需要您输入验证消息:<br/>";
					message[message.length] = "<textarea style='width:200px;height:100px' type=\"text\" id=\"validatemsg\" value=\"\"></textarea><br/>";
					message[message.length] = "<input type=\"button\"  value=\"提交\" onClick=\"util.fnvalidatemsg('" + uid + "','" +nn+ "',$('validatemsg').value)\"/><input type='button' value='取消' onclick='alter.cls();'/></div>";
				
				}else{
					message[message.length] = "<br/><br/><div class='im_sys' id=\"imSysMessage\">正在处理您的请求,请稍候.<br/><br/><input type='button' value='关闭' onclick='alter.cls();'/></div>";
				}
				V(message.join(''),{h:200,w:250})		
		}});
	},
	reloadWindow :function(){
		if($("add_friend_img")){
			window.location.reload();
		}
	},
	fnvalidatemsg : function(uid,nn,msgs,mid){
			var param = "who="+uid+"&date=" + new Date()+"&userstate=ON&msg=" + msgs;
			if(mid){
				param += "&mid=" + mid;
			}
			var myAjax = new Ajax.Request(_util_fnvalidatemsg,{method: 'POST',asynchronous:true,parameters:param,onComplete: function (response){
				var sb = new Array();
				sb[sb.length] = "<div class='im_sys'>对"+nn+" 的邀请已经发送.</div><div class='im_sys'>";
				sb[sb.length] = "<span id='clock'>3</span>秒后关闭.<span style='margin-top:10px;'></span></div><div class='im_sys'>"; 
				sb[sb.length] = "<input type=\"button\" value=\"关闭\" onClick=\"alter.cls();\"/></div>";
				sb[sb.length] = "";
				V(sb.join(''));
				alter.clock(3);
				util.reloadWindow();
				
				if(mid){
					if($("mess_" + mid)){
						$("mess_" + mid).innerHTML = nn +"需要您发送验证消息:";
					}
					if($("mess_con_" + mid)){
						$("mess_con_" + mid).innerHTML = nn +"验证消息已经发送.";
					}
				}
				
			}});
	},
	sreachDatou : function(){
		var uid = $("dt_sreach_uid").value;
		var sex = $("dt_sreach_sex").value;
		var online = $("dt_sreach_on").checked;
		var age = $("dt_sreach_age").value;
		var area = $("dt_sreach_area").value;
		var param = new Array();;
		if(uid != ""){
			if(uid.length == 8){
				param[param.length] = "uid=" + util.encode(uid);
			}else{
				param[param.length] = "uid=" + encodeURI(uid);
			}
		}
		if(sex != ""){
			param[param.length] = "sex=" + sex;
		}
		if(online){
			param[param.length] = "on=" + online;
		}
		if(age != ""){
			param[param.length] = "age=" + age;
		}
		if(area != ""){
			param[param.length] = "area=" + area;
		}
		var p = param.join('&');
		window.location.href = _cp + 'friends/sreach.jsp?' + p;
	},
	addFriend : function(uid,type,mid){
		var param = "who=" + uid + "&type=" + type;
		if(mid){
				param += "&mid=" + mid;
		}
			var myAjax = new Ajax.Request(_util_addfreind,{method: 'POST',asynchronous:true,parameters:param,onComplete: function (response){
				var sb = new Array();
				if(type == "A"){
					sb[sb.length] = "<div >已将"+uid+"添加到您的好友列表,<span id='clock'>3</span>秒后关闭!</div>";
					if(mid && $("mess_" + mid)){
						$("mess_" + mid).innerHTML = "<span>已将"+uid+"添加到您的好友列表</span>";
					}
				}else if(type == "B"){
					sb[sb.length] = "<div >已经拒绝了"+uid+"的请求,<span id='clock'>3</span>秒后关闭!</div>";
					if(mid && $("mess_" + mid)){
						$("mess_" + mid).innerHTML = "<span>已经拒绝了"+uid+"的请求</span>";
					}
				}
				V(sb.join(''));
				alter.clock(3);
			}});
	},
	dtsreach : function(tp){
		if(tp == "DID"){
			$("dt_sreach_on").checked = false;
			$("dt_sreach_sex").selectedIndex = 0;
			$("dt_sreach_age").selectedIndex = 0;
			$("dt_sreach_area").selectedIndex = 0;
		}else{
			$("dt_sreach_uid").value = "";
		}
	},
	toPhoneList : function(){
		if(lg.user != ""){
			window.location.href = _cp + "contacts/phonelist.jsp";
		}else{
			util.toLogin();
		}
	},
	toMusicBox : function(){
		var param = "";
		if(lg.user != ""){
			param = "?who=" + util.encode(lg.user);
		}
		window.open(_cp + "space/music/musicbox.jsp" +param ,"music","width=680,z-look=yes;alwaysRaised=yes,location=no,titlebar=no,menubar=no,toolbar=no,scrollbars=yes");
	},
	menuover : function(obj){
		
	},
	menuout : function(obj){
		
	},
	endplay : function(id){
		if($("play_" + id)){
			$("play_" + id).innerHTML = "";
		}
	},
	toYy : function(uid){
		if($("friend_" + uid)){
			var t = util.encode(uid);
			var m = util.encode(lg.user);
			window.location.href = _cp + "space/active/romur.jsp?who=" + m +"&target=" + t;
		}
	},
	toPrt : function(uid){
		if($("friend_" + uid)){
			var t = util.encode(uid);
			var m = util.encode(lg.user);
			window.location.href = _cp + "space/active/present.jsp?who=" + m +"&target=" + t;
		}
	},
	toHome : function(uid){
		if($("friend_" + uid)){
			var t = util.encode(uid);
			var m = util.encode(lg.user);
			window.location.href = _cp + "space/myhome/myhome.jsp?who=" + m +"&target=" + t;
		}
	},
	toPk : function(uid){
		if($("friend_" + uid)){
			var t = util.encode(uid);
			var m = util.encode(lg.user);
			window.location.href = _cp + "space/active/pk.jsp?who=" + m +"&target=" + t;
		}
	},
	toDt: function(uid){
		if($("friend_" + uid)){
			var t = util.encode(uid);
			var m = util.encode(lg.user);
			window.location.href = _cp + "space/active/yy.jsp?who=" + m +"&target=" + t;
		}
	},
	play:function(id,url){
		if($("play_" + id)){
			if($("play_" + id).getAttribute("played")){
				var sb = new Array();
				url = url.replace("/r?","/d?");
				sb[sb.length] = '<object id="trackplayerobj" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="180" height="24" title="轨迹音乐">';
				sb[sb.length] = ' <param name="movie" value="' + _sp + 'player/thousand.swf?time=' +new Date()+ '" />';
				sb[sb.length] = ' <param name="quality" value="high" />';
				sb[sb.length] = ' <param name="wmode" value="transparent"/>';
				sb[sb.length] = ' <param name="FlashVars" value="sid=' +id+ '&url='+ url +'" />';
				sb[sb.length] = ' <embed name="trackplayerobj" wmode="transparent" flashvars="sid=' +id+ '&url='+ url +'" src="' + _sp + 'player/thousand.swf?time=' +new Date()+ '" quality="high"  width="180" height="24" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" ></embed>';
				sb[sb.length] = ' </object>';
				$("play_" + id).innerHTML = sb.join('');
			}else{
				$("play_" + id).innerHTML = "<span style='color:#b5b5b5;'>正在生成声音文件,请稍候几秒钟开始播放.</span>";
				$("play_" + id).setAttribute("played","true");
				window.setTimeout(util.play,500,id,url);
			}
			
		}
		
	},
	toUserHome : function(homeid){
		var h1 = homeid.substr(0,1);
		var h2 = homeid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(h1 == code1[i]){
				h1 = code2[i];
				break;
			}
		}
		parent.$('home_area').src = _cp + "games/myhome/homecontent.jsp?homeid="+h1 + h2 ;
	},
	loadScript : function(jn){
		$("changeScript").src = _sp + "javascript/" + jn ;
	},
	loadStyle : function(cn){
		$("changeStyle").href = _sp + "styles/" + cn ;
	},
	turnToBox : function(name,url){
		if(name != undefined && url != undefined){
			//window.location.href = _cp+"music/gotoBox.jsp?url=" + url + "&name="+escape(name);
			window.open(_cp+"music/gotoBox.jsp?url=" + url + "&name="+escape(name) ,"music","width=680,z-look=yes;alwaysRaised=yes,location=no,titlebar=no,menubar=no,toolbar=no,scrollbars=yes");
		}else{
			//window.location.href = _cp+"music/gotoBox.jsp";
			window.open(_cp+"music/gotoBox.jsp" ,"music","width=650,z-look=yes;alwaysRaised=yes,location=no,titlebar=no,menubar=no,toolbar=no,scrollbars=yes");
		}		
	},
	stopTrack : function(){
		if ($("trackUp")){
			$("num").innerHTML = 9;
			track.trackStop();
			$("trackUp").innerHTML = "开始刷新";	
			$("trackUp").onclick = function(){
				util.startTrack();
			}
		}
	},
	startTrack : function(){
		if ($("trackUp")){
			track.trackStart();
			$("trackUp").innerHTML = "停止刷新";	
			$("trackUp").onclick = function(){
				util.stopTrack();
			};
		}
		
	},
	limitNum : function(obj){
		var event = getEvent();
		var iKeyCode = event.keyCode?event.keyCode:event.which;
            if(!(((iKeyCode >= 48) && (iKeyCode <= 57)) || (iKeyCode == 13) || (iKeyCode == 46) || (iKeyCode == 45) || (iKeyCode == 37) || (iKeyCode == 39) || (iKeyCode == 8)))
            {   
                if (Client.Engine.ie)
                {
                    event.returnValue=false;
                }
                else
                {
                    event.preventDefault();   //重要 firefox是用prevenDefault()来取消事件的
                }
            }
	},
	getSiderTrack : function(resouseId, model ,index){
		var param = "resouseId=" + resouseId + "&model=" + model + "&queryModel=" + _queryModelArr[index];
		var myAjax = new Ajax.Request(requestUrl,{method: 'POST',parameters:param,asynchronous:true,onComplete:function (response){
			util.printTrack(response, index);
			if (index < 5){
				util.getSiderTrack(resouseId, model, index + 1);
			}else{
				return;
			}
		}});
	},
	printTrack : function(response, index){
		var xml = createXml(response.responseText);
		var is = getElements(xml,"i");
		if (is.length == 0){//判断暂有问题
			$(_innerUlArr[index]).innerHTML = "";
		}else{
			$(_innerUlArr[index]).innerHTML = "";
			trackmodle.escapeTrack(is, _innerUlArr[index]);
		}
			
		delete res, xml ,is;	
	},
	goInfo : function(uid){
		var c1 = uid.substr(0,1);
		var c2 = uid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.location.href = _cp + "space/info/info.jsp?who=" +c1 + c2;
	},
	sentMsg : function(uid){
		//2
		if(lg.user && lg.user != "")
			util.isFriend(uid,"S");
		else
			V("发送消息需要登录.",200);
	},
	isFriend : function(uid,type){
		var param = "who=" + uid;
		var myAjax = new Ajax.Request(_util_is_friend,{method: 'POST',parameters:param,asynchronous:true,onComplete:function (response){
				var res = response.responseText;
				
				if(res.indexOf("false") > -1){
					var sb = new Array();
					sb[sb.length] = "<div>是否添加";
					sb[sb.length] = uid;
					sb[sb.length] = "为好友?</div>";
					sb[sb.length] = "<div>";
					sb[sb.length] = "<input class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' type='button' value='确定' onclick='util.addFriendSub(\""+uid+"\");'/>";
					sb[sb.length] = "<input type='button' value='取消' onclick='alter.cls();' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")'/>";
					sb[sb.length] = "</div>";
					V(sb.join(''),200);
				}else{
					if(type == "A"){
						util.addFriendBack(uid);
					}else{
						util.sentMsgBack(uid);
					}
				}
			}});
	},
	sentMsgBack : function(uid){
		var sb = new Array();
		sb[sb.length] = "<div style='width:100%;text-align:left;'>Hi," +uid+ " : </div>";
		sb[sb.length] = "<div style='width:100%text-align:center;'><textarea id='sendMsg' style='width:240px;height:100px;margin:5px 0px;word-break:break-all;overflow-x:hidden;'></textarea></div>";
		sb[sb.length] = "<div id='senderror' style='color:red;font-weight:500;'></div>";
		sb[sb.length] = "<div style='width:100%text-align:center;'>";
		sb[sb.length] = "<input class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' type='button' value='发送' onclick='util.sendMsgSub(\""+uid+"\");'/>";
		sb[sb.length] = "<input type='button' value='取消' onclick='alter.cls();' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")'/>";
		sb[sb.length] = "</div>";
		V(sb.join(''),300);
	},
	sendMsgSub : function(uid){
		var msg = $("sendMsg").value;
		$("sendMsg").disabled = true;
		var param = escape("who="+uid+"&date=" + new Date()+"&w="+msg);
		var myAjax = new Ajax.Request(_util__sms_send+"?"+param,{method: 'GET',asynchronous:true,onComplete:function (response){
			if(response.responseText.indexOf(msg) > -1 ){
				V("<div>消息已经发送 ,<span id='clock'>3</span> 秒后关闭.</div>" , 200)
				alter.clock(3);
			}else{
				$("sendMsg").disabled = false;
				$("senderror").innerHTML = "消息发送失败,请稍候再试.";
			}
						
		}});
	},
	addFriendBack : function(uid){
			var sb = new Array();
			sb[sb.length] = "<div>";
			sb[sb.length] = uid;
			sb[sb.length] = "已经在您的好友列表中了.</div>";
			V(sb.join(''),300);
	},
	toAlbum : function(uid,resid){
		if(uid == "我"){
			nid = lg.user;
		}
		if(uid.indexOf("#") > -1){
			return;
		}
		if(uid.indexOf("暂") > -1){
			return;
		}
		if(uid.length != 8){
			return;
		}
		if(uid.indexOf("guest") > -1){
			return;
		}
		var c1 = uid.substr(0,1);
		var c2 = uid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.open(_cp + "space/album/picture.jsp?who=" +c1 + c2 + "&album=" + resid);
	},
	toAlbumLst : function(nid){
		if(nid == "我"){
			nid = lg.user;
		}
		if(nid.indexOf("#") > -1){
			return;
		}
		if(nid.indexOf("暂") > -1){
			return;
		}
		if(nid.length != 8){
			return;
		}
		if(nid.indexOf("guest") > -1){
			return;
		}
		var c1 = nid.substr(0,1);
		var c2 = nid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		//alert( _cp + "space/space.jsp?who=" +c1 + c2);
		window.location.href = _cp + "space/album/album.jsp?who=" +c1 + c2;
	},
	toPicture : function(uid,parentid, resid){
		if(uid == "我"){
			nid = lg.user;
		}
		if(uid.indexOf("暂") > -1){
			return;
		}
		if(uid.indexOf("#") > -1){
			return;
		}
		if(uid.length != 8){
			return;
		}
		if(uid.indexOf("guest") > -1){
			return;
		}
		var c1 = uid.substr(0,1);
		var c2 = uid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.open(_cp + "space/album/picture.jsp?who=" +c1 + c2 + "&album=" + parentid + "&pid=" + resid);
	},
	toLog : function(uid,resid){
		if(uid == "我"){
			uid = lg.user;
		}
		if(uid.indexOf("#") > -1){
			return;
		}
		if(uid.indexOf("暂") > -1){
			return;
		}
		if(uid.length != 8){
			return;
		}
		if(uid.indexOf("guest") > -1){
			return;
		}
		var c1 = uid.substr(0,1);
		var c2 = uid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.open(_cp + "space/log/log.jsp?who=" +c1 + c2 + "&log=" + resid);
	},
	toNews : function(nid){
		window.open(_cp + "info/entity/entity.jsp?nid=" +nid);
	},
	toSpace : function(nid){
		if(nid == "我"){
			nid = lg.user;
		}
		if(nid.indexOf("#") > -1){
			return;
		}
		if(nid.indexOf("暂") > -1){
			return;
		}
		if(nid.length != 8){
			return;
		}
		if(nid.indexOf("guest") > -1){
			return;
		}
		var c1 = nid.substr(0,1);
		var c2 = nid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.open(_cp + "space/space.jsp?who=" +c1 + c2,"space");
	},
	toWiki : function(nid){
		if(nid == "我"){
			nid = lg.user;
		}
		if(nid.indexOf("#") > -1){
			return;
		}
		if(nid.indexOf("暂") > -1){
			return;
		}
		if(nid.length != 8){
			return;
		}
		if(nid.indexOf("guest") > -1){
			return;
		}
		
		var c1 = nid.substr(0,1);
		var c2 = nid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		
		window.open(_cp + "space/wiki/wiki.jsp?who=" +c1 + c2);
	},
	toLogs : function(nid){
		var c1 = nid.substr(0,1);
		var c2 = nid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.document.location.href = _cp + "space/log/logs.jsp?who=" + c1 + c2;
	},
	toTrackAll :function(){
		var nid = lg.user;
		if(nid == "")
			return;
		var c1 = nid.substr(0,1);
		var c2 = nid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.location.href = _cp + "space/util/SpaceAllTrack.jsp?who="  +c1 + c2;	
	},
	encode : function(code){
		var c1 = code.substr(0,1);
		var c2 = code.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				return c1 + c2
			}
		}
		return code;
	},
	decode : function(code){
		var c1 = code.substr(0,2);
		var c2 = code.substr(2);
		for(var i = 0 ; i < code2.length ; i++){
			if(c1 == code2[i]){
				c1 = code1[i];
				return c1 + c2
			}
		}
		return code;
	},
	mySpace : function (){
		if(lg.user != ""){
			var c1 = lg.user.substr(0,1);
			var c2 = lg.user.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			window.location.href = _cp + "space/space.jsp?who=" + c1 + c2;
		}
		else
			util.toLogin();
	},
	myFaver : function(){
		if(lg.user != ""){
			var c1 = lg.user.substr(0,1);
			var c2 = lg.user.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			window.location.href = _cp + "space/favourites/favourites.jsp?who=" + c1 + c2;
		}
		else
			util.toLogin();
	}, 
	toLogin : function(){
		if(lg.user == "" ){
		//if(lg.user == "" && util.thisRedirctAble ){
			//var locationHref = "?href=" + window.location.href;
			//if(util.thisUrl != ""){
			//	locationHref = util.thisUrl;
			///}
			//window.location.href = _cp + "index/login.jsp" + locationHref;
			window.location.href = _sp ;
		}
	},
	myQuan : function(){
		if(lg.user != ""){
			window.location.href = _cp + "quan/circle/circle_mine.jsp";
		}
		else
			util.toLogin();
	},
	toQuan : function(id){
		window.location.href = _cp + "quan/quan-post-list.jsp?id=" + id;
	},
	toPost : function(id){
		window.open(_cp + "community/froum_post_view.jsp?numpostid=" + id);
	},
	toFroum : function(id){
		var arr = id.split("|");
		window.location.href = _cp + "community/froum_index.jsp?id=" + arr[0] + "&sid=" + arr[1];
	},
	toTrack : function(){
		
	},
	thisUrl : "",
	thisRedirctAble : true,
	orgAreaSelect : function(n,a){
		var result = new Array();
		
		var areas = ["北京","天津","上海","重庆","广东",
				  "福建","山东","浙江","辽宁","四川",
				  "河南","江苏","湖南","湖北","山西",
				  "云南","黑龙江","河北","江西","吉林",
				  "安徽","海南","陕西","广西","内蒙古",
				  "贵州","新疆","甘肃","西藏","宁夏",
				  "青海","香港","澳门","台湾"];
		
		result[result.length] = "<select "+n+">";
		result[result.length] = "<option value='null'>--全部--</option>";
		for(var i = 0; i<areas.length; i++){
			result[result.length] = "<option value=\"" + (i+1) + "\"";
			if(i+1 == a){
				result[result.length] = " selected "
			}
			result[result.length] = ">" + areas[i] + "</option>"			
		}
		
		result[result.length] = "</select>" ;
		return result.join('');
	},
	res : {
		id : "",
		desc : "",
		owner : "",
		mt : "",
		t : "",
		url : "",
		newsType : "",
		musicAlbum: "",
		musicSize : "",
		action : ""
	},
	resM : {
		id : "",
		desc : "",
		owner : "",
		mt : "",
		t : "",
		url : "",
		newsType : "",
		musicAlbum: "",
		musicSize : "",
		musicURL : ""
	},
	favor : function(){
		
		if(lg.user == ""){
			var sb = new Array();
			sb[sb.length] = "<div>收藏资源需要登录，是否现在登录?</div>";
			sb[sb.length] = "<div style='width:100%;text-align:center;'><input type='button' value='登录' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='util.toLogin();' />";
			sb[sb.length] = "<input  type='button' value='取消' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' /></div>";
			V(sb.join(''));
			return;
		}else if(lg.said == ""){
			var sb = new Array();
			sb[sb.length] = "<div>收藏资源需要开通空间,是否现在开通?</div>";
			sb[sb.length] = "<div style='width:100%;text-align:center;'><input type='button' value='开通' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='util.openSpace();' />";
			sb[sb.length] = "<input  type='button' value='取消' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' /></div>";
			V(sb.join(''));
			return;
		}else if(util.isMusicFavor){
			var sb = new Array();
			sb[sb.length] = "<div>将资源:"+util.resM.desc+" 放入收藏夹?</div>";
			sb[sb.length] = "<div style='width:100%;text-align:center;'><input type='button' value='确认' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='util.favorMusicBack();' />";
			sb[sb.length] = "<input  type='button' value='取消' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' /></div>";
			V(sb.join(''));
			util.isMusicFavor = false;
			return;
		}else{
			var sb = new Array();
			sb[sb.length] = "<div>将资源《"+util.res.desc+"》放入收藏夹?</div>";
			sb[sb.length] = "<div style='width:100%;text-align:center;'><input type='button' value='确认' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='util.favorBack();' />";
			sb[sb.length] = "<input  type='button' value='取消' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' /></div>";
			V(sb.join(''),{w:230,h:130});
			return;
			
		}
		
	},
	deletefavor : function(){
		var sb = new Array();
		sb[sb.length] = "<div>确认要将资源《"+util.res.desc+"》删除?</div>";
		sb[sb.length] = "<div style='width:100%;text-align:center;'><input type='button' value='确认' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='util.favorBack();' />";
		sb[sb.length] = "<input  type='button' value='取消' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' /></div>";
		V(sb.join(''),{w:230,h:130});
		return;
	},
	openSpace : function(){
		window.location.href = _cp + "control/controlSpace.jsp?";
	},
	favorMusicBack : function(){
		
		//收藏模块类型   ["N 资讯项 | P 帖子项 | M 音乐项 | R 书籍项 | V 视频项 | S 空间项 | B 日记项 | Q 圈圈项 | C 客户端 "]
		//收藏对象类型   ["S 空间 | N 资讯 | Q 圈圈 | D 大杂烩 | M 音乐 | V 视频 | B　读书 | L 日志 | A 相册"]
		var params = "resId=" + util.resM.id + 
					"&desc="  + util.resM.desc +
					"&ownerId=" + util.resM.owner +
					"&moduleType=" + util.resM.mt +
					"&type=" +util.resM.t +
					"&url=" + escape(util.resM.url);
		return;
		var myAjax = new Ajax.Request(_favor_path,{method: 'POST',parameters:params,asynchronous:true,
			onComplete:function (response){
				if(response.responseText.indexOf("OK") > -1){
					V(util.res.desc + "&nbsp;&nbsp;已经添加到您的收藏夹。");
				}else{
					V("服务器忙，请稍候再试！");
				}
				
			    
			}	
		});
	},
	favorBack : function(){
		
		//收藏模块类型   ["N 资讯项 | P 帖子项 | M 音乐项 | R 书籍项 | V 视频项 | S 空间项 | B 日记项 | Q 圈圈项 | C 客户端 "]
		//收藏对象类型   ["S 空间 | I 咨询 | Q 圈圈 | D 大杂烩 | M 音乐 | V 视频 | B　读书"]
		var params = "resId=" + util.res.id + 
					"&desc="  + util.res.desc +
					"&ownerId=" + util.res.owner +
					"&moduleType=" + util.res.mt +
					"&type=" +util.res.t + 
					"&url=" + escape(escape(util.res.url)) +
					"&action=" + util.res.action;
		V("请稍候，系统正为您操作中...",{w:230,h:130});
		var myAjax = new Ajax.Request(_favor_path,{method: 'POST',parameters:params,asynchronous:true,
			onComplete:function (response){
				if(response.responseText.indexOf("OK") > -1){
					if(util.res.action == "D"){
						V("《" + util.res.desc + "》已经从您的收藏夹中删除... <input  type='button' value='返回' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='util.favor_ok();' />",{w:230,h:130});
					}else{
						V("《" + util.res.desc + "》已经添加到您的收藏夹... <input  type='button' value='返回' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' />",{w:230,h:130});
					}
				}else if(response.responseText.indexOf("ERR:05") > -1){
					V("您的收藏夹中已存在《" + util.res.desc + "》 <input  type='button' value='返回' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' />",{w:230,h:130});
				}else{
					V("服务器忙，请稍候再试...<input  type='button' value='返回' class='fix_button1' onmouseover='changebtn(this,\"fix_button1_on\")' onmouseout='changebtn(this,\"fix_button1\")' onclick='alter.cls();' />",{w:230,h:130});
				}
			}	
		});
	},
	favor_ok : function(){
		window.location.href = encodeURI(util.res.url);
	},
	favor_err : function(){
		
	},
	myContacts : function(i){
		if(lg.user != ""){
			if(i){
				var who = _sms_sequence[i-1]
				window.location.href = _cp + "contacts/contacts.jsp?who=" + escape(who);
			}else{
				window.location.href = _cp + "contacts/contacts.jsp?who=" + escape(lg.user);
			}
		}else{
			util.toLogin();
		}
	},
	myControl : function (){
		if(lg.user != ""){
			var c1 = lg.user.substr(0,1);
			var c2 = lg.user.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			window.location.href = _cp + "control/user/userInfo.jsp?who=" + c1 + c2;
		}else{
			util.toLogin();
		}
	},
	favorMusic : function(){
		util.isMusicFavor = true;
		util.favor();
	},
	isMusicFavor : false,
	constellation : function(constell){
		var cons = ["白羊座" , "金牛座" , "双子座" , "巨蟹座" , "狮子座" , "处女座" , "天秤座" , "天蝎座" , "射手座" ,"摩羯座" , "水瓶座" , "双鱼座"];
		var date = ["03月21-04月19" , "04月20-05月20" , "05月21-06月21" , "06月22-07月22" , "07月23-08月22" , '08月23-09月22' , "09月23-10月23" , "10月24-11月21" , "11月22-12月21" , "12月22-01月19" , "01月20-02月18" , "02月19-03月20"];
		var sb = new Array();
		sb[sb.length] = "<select name='constellation' id='constellation'>";
			sb[sb.length] = "<option value='null'>";
			sb[sb.length] = "--请选择--";
			sb[sb.length] = "</option>";
		for(var i = 0 ; i < 12 ; i++){
			sb[sb.length] = "<optgroup  label='"+date[i]+"'>";
			sb[sb.length] = "<option value='"+i+"' ";
			if(i == constell)
				sb[sb.length] = " selected ";
			sb[sb.length] = ">";
			sb[sb.length] = cons[i];
			sb[sb.length] = "</option>";
			sb[sb.length] = "</optgroup>";
		}
		sb[sb.length] = "</select>";
		return sb.join('');
	},
	countHTML : function(){
		document.write("");
		//document.write("<div class='messages' style='visibility:hidden;margin-right:10px;' id='messages_border'>");
	  	//document.write(" <img src='"+_cp+"images/INFO_03.png' align='absmiddle' alt='未读消息'/> ");
	    //document.write("  <a href='javascript:util.myContacts();' id='im_message_count'>(0)</a>&nbsp;&nbsp; ");
	    //document.write("  <img src='"+_cp+"images/INFO_05.png' align='absmiddle' alt='系统消息'/> ");
	    //document.write("  <a href='javascript:lg.mySystemMessage();' id='im_sys_count'>(0)</a> &nbsp;&nbsp;");
	    //document.write("  <img src='"+_cp+"images/INFO_07.png' align='absmiddle'  alt='分享消息' />");
	    //document.write("  <a href='javascript:lg.myShellMessage();' id='im_shell_count'>(0)</a>&nbsp;&nbsp; ");
	    //document.write("  <img src='"+_cp+"images/INFO_09.png'  align='absmiddle' style='visibility:hidden'/>");
	   // document.write("   <a href='javascript:void(0);' id='im_unknow_count'  style='visibility:hidden'>(0)</a>&nbsp;&nbsp; ");
		//document.write("  </div>");
	},
	invite : function(){
		//邀请好友
	},
	chat : function(){
		//发送消息
	},
	setFaces : function(i){
		if(i && i == ""  || i == " ")
			i = "a";
		document.write("<div style='position:relative;width : 50px;height : 40px ;background:#cbcbcb'>");
		document.write("<img id='curFace' width='36' height='36' onmouseover='util.callFacesSelecter();'  style='cursor:pointer;margin:2px' src='"+_cp+"images/head/"+i+".bmp'/>");
		document.write("<img id='face_opener' src='"+_sp+"images/head/open.gif' height='100%' width='10'/>");
		document.write("<div id='logo_float_con' style='display:none;width:340px;height:40px;z-index:20;position:absolute;top:0px;left:40px;overflow:hidden'>");
		
		
		document.write("<div style='width : 340px;height:40px;position:absolute;top:0px;left:-340px;' id='facesSelecter'>");
		for(var t = 0 ; t < 8 ; t++){
			document.write("<div onclick='util.selectFace(\""+_char[t]+"\");' style='position:absolute;width :40px height:40px;left:"+t*40+"px;' onmouseover='this.style.backgroundColor=\"#cbcbcb\"' onmouseout='this.style.backgroundColor=\"\"'>");
			document.write("<img width='36' height='36' style='margin:2px;cursor:pointer' src='"+_cp+"images/head/"+_char[t]+".bmp'/>");
			document.write("</div>");
		}
		document.write("<div style='position:absolute;width :10px ;height:40px;left:"+8*40+"px;' >");
		document.write("<img style='cursor:pointer;' src='"+_sp+"images/head/closs.gif' height='100%' width='10' onclick='util.clsFacesSelecter(10);'/>");
		document.write("</div>");
		document.write("</div>");
		
		document.write("</div>");
		document.write("</div>");
		document.write("<input type='hidden' value='"+i+"' name='logo' id='logo'/>")
	},
	callFacesSelecter : function(time){
		var left = $("facesSelecter").style.left;
		left = parseInt(left.substring(0,left.indexOf("px")));
		if(left < 0){
			$("logo_float_con").style.display = "block";
			$("face_opener").style.visibility = "hidden";
			$("facesSelecter").style.left = (left+10) + "px";
			util.selectTimer = setTimeout(util.callFacesSelecter , time, time);
		}
	},
	selectTimer : "",
	selectFace : function(t){
		$("curFace").src = _cp+"images/head/"+t+".bmp";
		$("logo").value = t; 
		$("facesSelecter").style.left = "-410px";
		$("face_opener").style.visibility = "visible";
	} ,
	clsFacesSelecter : function(time){
		clearTimeout(util.selectTimer);
		util.clsFacesSelecterBack(time);
	},
	clsFacesSelecterBack : function(time){
		var left = $("facesSelecter").style.left;
		left = parseInt(left.substring(0,left.indexOf("px"))) ;
		left = isNaN(left) ? 0 : left;
		if(left > -410){
			$("facesSelecter").style.left = (left-15) + "px";;
			util.selectTimer = setTimeout(util.clsFacesSelecterBack , time, time);
		}else{
			$("face_opener").style.visibility = "visible";
		}
	},
	hiddenLevelup : function(){
		$("levelup_notice").style.display = "";
		setTimeout(function(){
			$("levelup_notice").style.display = "none";
		} ,10000);
	},
	isMaster : function(){
		var mas = $A(document.getElementsByName("master_dis"));
		if(Client.Engine.ie){
			var temp = new Array();
			var divs = $A(document.getElementsByTagName("div"))
			
			divs.each(function(value,index){
				if(value.getAttribute("name") == "master_dis"){
						
					temp.push(value);
				}
			});
			var as = $A(document.getElementsByTagName("a"))
			as.each(function(value,index){
				if(value.getAttribute("name") == "master_dis"){
						
					temp.push(value);
				}
			});
			var spans = $A(document.getElementsByTagName("span"))
			spans.each(function(value,index){
				if(value.getAttribute("name") == "master_dis"){
						
					temp.push(value);
				}
			});
			
			mas = temp;
		}
		
		mas.each(function(value,index){
			value.style.display = ""
		});
		util.mIsMaster();
	},
	mIsMaster : function(){
		
	},
	notMaster : function(){
		var mas = $A(document.getElementsByName("master_dis"));
		if(Client.Engine.ie){
			var temp = new Array();
			var divs = $A(document.getElementsByTagName("div"))
			
			divs.each(function(value,index){
				if(value.getAttribute("name") == "master_dis"){
						
					temp.push(value);
				}
			});
			var as = $A(document.getElementsByTagName("a"))
			as.each(function(value,index){
				if(value.getAttribute("name") == "master_dis"){
						
					temp.push(value);
				}
			});
			var spans = $A(document.getElementsByTagName("span"))
			spans.each(function(value,index){
				if(value.getAttribute("name") == "master_dis"){
						
					temp.push(value);
				}
			});
			mas = temp;
		}
		mas.each(function(value,index){
			value.style.display = "none"
		});
		util.mNotMaster();
	},
	mNotMaster : function(){
		
	},
	hOrs : function(id){
		var target = $(id);
		var oh = target.getAttribute("h");
		var h = target.style.height;
		h = h.substring(0,h.indexOf("px"));
		var s = target.getAttribute("s")  ? target.getAttribute("s") : "o";
		if(s == "o"){
			if((h - 20) > 0){
				target.style.overflow = "hidden";
				target.style.height =  (h - 20) + "px";
				setTimeout(util.hOrs , 1 , id);
			}else{
				target.setAttribute("s","h");
				target.style.display = "none";
			}
		}else{
			if((parseInt(h) + 20) < parseInt(oh)){
				target.style.display = "";
				target.style.overflow = "hidden";
				target.style.height =  (parseInt(h) + 20) + "px";
				setTimeout(util.hOrs , 1 , id);
			}else{
				target.setAttribute("s","o");
				target.style.display = "";
			}
		}
		
		
	},
	hOrsTimer : "",
	initMusic : function(song,singer,mid,album,tot){
		util.resM.id = mid;
		util.resM.desc = song;
		util.resM.owner = singer;
		util.resM.musicURL = album;
		util.resM.musicSize = tot;
		
	},
	shellMusic : function(){
		util.isMusicShell = true;
		util.shell();
	},
	isMusicShell :false,
	trackView : function(n){
		var i = 1;
		while(i < 10){
			if($("track_grp_t_" + i)){
				$("track_grp_t_" + i).style.backgroundColor = "#C9C9C9";
				$("track_grp_b_" + i).style.display = "none";
			}
			i++;
		}
		$("track_grp_t_" + n).style.backgroundColor = "#E14141";
		$("track_grp_b_" + n).style.display = "block";
	},
	getPageNum : function(){
		for (var i = 1; i < 10; i++){
			$("_a" + i).style.visibility = "hidden";
		}

		var _dtw_track_g = _cp + "trackG/trackPageNumString.xml";
		/*var myAjax = new Ajax.Request(_dtw_track_g,{method: 'POST',asynchronous:true,
			onComplete:function (response){
				var trackNumXML = createXml(response.responseText);
				var pageNumElements = getElements(trackNumXML, "param");
				var PageNum = 1;
				for (var i = 0; i < pageNumElements.length; i++){
					if (pageNumElements[i].getAttribute(_track_queryType) != null){
						PageNum = pageNumElements[i].getAttribute(_track_queryType);
						break;
					}
				}
				for (var i = 1; i < PageNum; i++){
					$("_a" + i).style.visibility = "visible";
					//$("_a" + i).href = "javascript:track.turnTrackPage(" + i ")";
				}
				delete track;

			}
		});*/
		
		for (var i = 1; i < _thisTrackPage; i++){
			$("_a" + i).style.visibility = "visible";
			//$("_a" + i).href = "javascript:track.turnTrackPage(" + i ")";
		}
	},
	getActionTrack :function(type){
		
		//如果是具体分类的轨迹
		if (type == "T"){
			type = "G";
		}
		
		if(!type){
			if($("trackType"))
				 type = $("trackType").value;
		}
		if(!type){
			return;
		}
		
		var spaceUserId = "";
		if($("spaceUserId")){
			spaceUserId = $("spaceUserId").value;
		}
		var queueType = _track_queryType;
			  
		var param = new Array();
		param[param.length] = "type=";
		param[param.length] = type;
		param[param.length] = "&queueType=";
		param[param.length] = queueType;
		
		
		if (spaceUserId != ""){
			param[param.length] = param;
			param[param.length] = "&spaceUserId=";
			param[param.length] = spaceUserId;
		}  
		

		
			var myAjax = new Ajax.Request(_dtw_track,{method: 'POST',asynchronous:true,parameters:param.join(''),
			onComplete:function (response){
				var xml = createXml(response.responseText);
				
				if(type.indexOf("F") > -1){
					if($("login_track"))
						$("login_track").style.display = "block";
					var track = getElement(xml, "F" , 0 );
					if (track.trim() == "<ul></ul>"){
			 			track = "<ul><li class=\"\">您暂无足迹，去大头网随便逛逛吧</li><ul>";
			 		}
					$("friend_track").innerHTML = track;
					delete track;
				}
				
				if(type.indexOf("U") > -1){
					if($("login_track"))
						$("login_track").style.display = "block";
					var track = getElement(xml, "F" , 0 );
					if (track.trim() == "<ul></ul>"){
			 			track = "<ul><li class=\"\">您暂无足迹，去大头网随便逛逛吧/li><ul>";
			 		}
					$("friend_track").innerHTML = track;
					delete track;
				}
				
				if(type.indexOf("S") > -1){
					if($("login_track"))
						$("login_track").style.display = "block";
					var track = getElement(xml, "S" , 0 );
					$("friend_track").innerHTML = track;
					delete track;
				}

				_track_flush = true;

				delete type,spaceUserId,queueType,param,myAjax,response,xml;

				}	
			});
		
	},
	toUpload : function(){
		window.location.href = _cp + "contacts/phonebook.jsp";
	}
	
}

function _setBody(){
		document.body.onclick = function (){
			if($("im_context_menu"))
				$("im_context_menu").style.display = "none";
			for(var i = 0;i<5 ;i++){
				if($("im_context_menu"+i))
					$("im_context_menu"+i).style.display = "none";
			}
			if($("sms_face_pick" ))
			  $("sms_face_pick" ).style.display = "none";
			if($("im_layer")){
				im.disbar();
			}
		};
		
}
var py = {
	strGB : "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄",
	qswhSpell : ["a",0,"ai",2,"an",15,"ang",24,"ao",27,"ba",36,"bai",54,"ban",62,"bang",77,"bao",89,"bei",106,"ben",121,"beng",125,"bi",131,"bian",155,"biao",167,"bie",171,"bin",175,"bing",181,"bo",190,"bu",211,"ca",220,"cai",221,"can",232,"cang",239,"cao",244,"ce",249,"ceng",254,"cha",256,"chai",267,"chan",270,"chang",280,"chao",293,"che",302,"chen",308,"cheng",318,"chi",333,"chong",349,"chou",354,"chu",366,"chuai",382,"chuan",383,"chuang",390,"chui",396,"chun",401,"chuo",408,"ci",410,"cong",422,"cou",428,"cu",429,"cuan",433,"cui",436,"cun",444,"cuo",447,"da",453,"dai",459,"dan",471,"dang",486,"dao",491,"de",503,"deng",506,"di",513,"dian",532,"diao",548,"die",557,"ding",564,"diu",573,"dong",574,"dou",584,"du",591,"duan",606,"dui",612,"dun",616,"duo",625,"e",637,"en",650,"er",651,"fa",659,"fan",667,"fang",684,"fei",695,"fen",707,"feng",722,"fo",737,"fou",738,"fu",739,"ga",784,"gai",786,"gan",792,"gang",803,"gao",812,"ge",822,"gei",839,"gen",840,"geng",842,"gong",849,"gou",864,"gu",873,"gua",891,"guai",897,"guan",900,"guang",911,"gui",914,"gun",930,"guo",933,"ha",939,"hai",940,"han",947,"hang",966,"hao",969,"he",978,"hei",996,"hen",998,"heng",1002,"hong",1007,"hou",1016,"hu",1023,"hua",1041,"huai",1050,"huan",1055,"huang",1069,"hui",1083,"hun",1104,"huo",1110,"ji",1120,"jia",1173,"jian",1190,"jiang",1230,"jiao",1243,"jie",1271,"jin",1298,"jing",1318,"jiong",1343,"jiu",1345,"ju",1362,"juan",1387,"jue",1394,"jun",1404,"ka",1415,"kai",1419,"kan",1424,"kang",1430,"kao",1437,"ke",1441,"ken",1456,"keng",1460,"kong",1462,"kou",1466,"ku",1470,"kua",1477,"kuai",1482,"kuan",1486,"kuang",1488,"kui",1496,"kun",1507,"kuo",1511,"la",1515,"lai",1522,"lan",1525,"lang",1540,"lao",1547,"le",1556,"lei",1558,"leng",1569,"li",1572,"lia",1606,"lian",1607,"liang",1621,"liao",1632,"lie",1645,"lin",1650,"ling",1662,"liu",1676,"long",1687,"lou",1696,"lu",1702,"lv",1722,"luan",1736,"lue",1742,"lun",1744,"luo",1751,"ma",1763,"mai",1772,"man",1778,"mang",1787,"mao",1793,"me",1805,"mei",1806,"men",1822,"meng",1825,"mi",1833,"mian",1847,"miao",1856,"mie",1864,"min",1866,"ming",1872,"miu",1878,"mo",1879,"mou",1896,"mu",1899,"na",1914,"nai",1921,"nan",1926,"nang",1929,"nao",1930,"ne",1935,"nei",1936,"nen",1938,"neng",1939,"ni",1940,"nian",1951,"niang",1958,"niao",1960,"nie",1962,"nin",1969,"ning",1970,"niu",1976,"nong",1980,"nu",1984,"nv",1987,"nuan",1988,"nue",1989,"nuo",1991,"o",1995,"ou",1996,"pa",2003,"pai",2009,"pan",2015,"pang",2023,"pao",2028,"pei",2035,"pen",2044,"peng",2046,"pi",2060,"pian",2077,"piao",2081,"pie",2085,"pin",2087,"ping",2092,"po",2101,"pu",2110,"qi",2125,"qia",2161,"qian",2164,"qiang",2186,"qiao",2194,"qie",2209,"qin",2214,"qing",2225,"qiong",2238,"qiu",2240,"qu",2248,"quan",2261,"que",2272,"qun",2280,"ran",2282,"rang",2286,"rao",2291,"re",2294,"ren",2296,"reng",2306,"ri",2308,"rong",2309,"rou",2319,"ru",2322,"ruan",2332,"rui",2334,"run",2337,"ruo",2339,"sa",2341,"sai",2344,"san",2348,"sang",2352,"sao",2355,"se",2359,"sen",2362,"seng",2363,"sha",2364,"shai",2373,"shan",2375,"shang",2391,"shao",2399,"she",2410,"shen",2422,"sheng",2438,"shi",2449,"shou",2496,"shu",2506,"shua",2539,"shuai",2541,"shuan",2545,"shuang",2547,"shui",2550,"shun",2554,"shuo",2558,"si",2562,"song",2578,"sou",2586,"su",2589,"suan",2602,"sui",2605,"sun",2616,"suo",2619,"ta",2627,"tai",2636,"tan",2645,"tang",2663,"tao",2676,"te",2687,"teng",2688,"ti",2692,"tian",2707,"tiao",2715,"tie",2720,"ting",2723,"tong",2733,"tou",2746,"tu",2750,"tuan",2761,"tui",2763,"tun",2769,"tuo",2772,"wa",2783,"wai",2790,"wan",2792,"wang",2809,"wei",2819,"wen",2852,"weng",2862,"wo",2865,"wu",2874,"xi",2903,"xia",2938,"xian",2951,"xiang",2977,"xiao",2997,"xie",3015,"xin",3036,"xing",3046,"xiong",3061,"xiu",3068,"xu",3077,"xuan",3096,"xue",3106,"xun",3112,"ya",3126,"yan",3142,"yang",3175,"yao",3192,"ye",3207,"yi",3222,"yin",3275,"ying",3291,"yo",3309,"yong",3310,"you",3325,"yu",3346,"yuan",3390,"yue",3410,"yun",3420,"za",3432,"zai",3435,"zan",3442,"zang",3446,"zao",3449,"ze",3463,"zei",3467,"zen",3468,"zeng",3469,"zha",3473,"zhai",3487,"zhan",3493,"zhang",3510,"zhao",3525,"zhe",3535,"zhen",3545,"zheng",3561,"zhi",3576,"zhong",3619,"zhou",3630,"zhu",3644,"zhua",3670,"zhuai",3672,"zhuan",3673,"zhuang",3679,"zhui",3686,"zhun",3692,"zhuo",3694,"zi",3705,"zong",3720,"zou",3727,"zu",3731,"zuan",3739,"zui",3741,"zun",3745,"zuo",3747],
	UrlEncode : function(str){
		var i,c,p,q,ret="",strSpecial="!\"#$%&'()*+,/:;<=>?@[\]^`{|}~%";
	    for(i=0;i<str.length;i++){
	        if(str.charCodeAt(i)>=0x4e00){
	            var p=py.strGB.indexOf(str.charAt(i));
	            if(p>=0){
	                q=p%94;
	                p=(p-q)/94;
	                ret+=("%"+(0xB0+p).toString(16)+"%"+(0xA1+q).toString(16)).toUpperCase();
	            }
	        }
	        else{
	            c=str.charAt(i);
	            if(c==" ")
	                ret+="+";
	            else if(strSpecial.indexOf(c)!=-1)
	                ret+="%"+str.charCodeAt(i).toString(16);
	            else
	                ret+=c;
	        }
	    }
	    return ret;
	},
	getSpell : function(str,sp){
		var i,c,t,p,ret="";
	    if(sp==null)sp="";
	    for(i=0;i<str.length;i++){
	        if(str.charCodeAt(i)>=0x4e00){
	            p=py.strGB.indexOf(str.charAt(i));
	            if(p>-1&&p<3755){
	                for(t=py.qswhSpell.length-1;t>0;t=t-2)if(py.qswhSpell[t]<=p)break;
	                if(t>0)ret+=py.qswhSpell[t-1]+sp;
	            }
	        }
	    }
	    return ret.substr(0,ret.length-sp.length);
	}
}
function changebtn(obj,s) {
      obj.className=s;
  }
var shell = {
	send : function(){
		if(shell.arr.length == 0 ){
			V("请选择要分享资源的好友!<span id='clock'></span>");
			alter.clock(3);
			return;
		}
		var al = "该条分享将直接发送到你的好友的手机，无论对方当前是否在线";
		if(shell.isPhone)al = "如果你的好友当前处于离线状态，该条分享会发送到对方手机";
		if(!confirm(al)){
			return;
		}
		if(shell.cObj != null){
			$('shell_con').style.display='none';
			$('shell_bg').style.display='none';
			
			var sb = new Array();
			sb[sb.length] = "time=10";
			for(var prop in shell.cObj){
				sb[sb.length] = "&";
				sb[sb.length] = prop;
				sb[sb.length] = "=";
				sb[sb.length] = encodeURI(shell.cObj[prop]);
			}
			sb[sb.length] = "&target=";
			sb[sb.length] = shell.arr.join(',');
			//alert(sb.join(''));
			var url ;
			if(shell.isPhone){
				url = _shell_send_path + ".send";
			}else{
				url = _shell_send_path + ".shell";
			}
			//alert(sb.join(''));
			var myAjax = new Ajax.Request(url,{method: 'POST',asynchronous:true,parameters:sb.join(''),
			onComplete:function (response){
				V("已经发送到好友的手机,<span id='clock'>3</span>秒后关闭.");
				alter.clock(3);
				if($("im")){
					for(var i = 0 ; i <  shell.arr.length ; i++){
						im.add(shell.arr[i]);
						if($("friend_" + shell.arr[i])){
							im.addTemp(shell.arr[i],$("friend_" + shell.arr[i]).getAttribute("nn") ,$("fiend_" + shell.arr[i]).getAttribute("st"));
						}
					}
				}
			}});
			shell.isPhone = false;
		}
	},
	sObj : "",
	cObj : "",
	setup : function(obj){
		shell.sObj = obj;
	},
	url:"",
	mtit : "",
	isPhone : false,
	toPhone : function(){
		shell.isPhone = true;
		shell.send();
	},
	musicToPhone : function(){
		shell.isPhone = true;
		shell.shellMusic();
	},
	shellMusic : function(){
		var ab = new AideoBean();
		ab.url = shell.url;
		ab.nm = shell.mtit;
		shell.setup([ab]);
		shell.shell();
	},
	shell : function(){
		if(lg.user == ""){
			V("分享资源请先登录");
			return;
		}
		if(shell.sObj != null){
			var comm = $("shell_body_con");
			//var person = $("shell_group_last");
			//person.innerHTML = "";
			$("shell_group_last").innerHTML = "";
			$("shell_group_phone").innerHTML = "";
			$("shell_group_datou").innerHTML = "";
			comm.innerHTML = "";
			$("shell_con").style.display = "block";
			$("shell_bg").style.display = "block";
			if($("im")){
				var pos = getElementPos("im");
				$("shell_con").style.left = (pos.x - 2) + "px";
				$("shell_con").style.top = (pos.y - 2) + "px";
				if(pos.x < 200){
					$("shell_con").style.left = 750 + "px";
					$("shell_con").style.top = 80 + "px";
				}
			}else if($("login_info")){
				var pos = getElementPos("login_info");
				$("shell_con").style.left = (pos.x - 2) + "px";
				$("shell_con").style.top = (pos.y - 2) + "px";
			}
			if(document.all){
				$("shell_bg").style.height = (document.body.offsetHeight < 4001 ? document.body.offsetHeight : 4000)  + "px";
				$("shell_bg").style.width = document.body.offsetWidth + "px";
			}else{
				$("shell_bg").style.height = document.documentElement.offsetHeight + "px";
				$("shell_bg").style.width = document.documentElement.offsetWidth + "px";
			}
			shell.arr = new Array();
			for(var i = 0 ; i < shell.sObj.length; i++){
				var obj = shell.sObj[i];
				var sb = new Array();
				sb[sb.length] = "";
				sb[sb.length] = "<div class='shell_con_text' >";
				//sb[sb.length] = "<input type='radio' name='select_this' ";
				//if(i == 0){
				//	sb[sb.length] = "checked";
					$("shell_type_a").innerHTML= obj.tm;
					shell.cObj = obj;
				//}
				//sb[sb.length] = " onclick='$(\"shell_type_a\").innerHTML=\"";
				//sb[sb.length] = obj.tm;
			//	sb[sb.length] = "\" '";
				//sb[sb.length] = "/>";
				sb[sb.length] = "<span>";
				sb[sb.length] = obj.nm;
				sb[sb.length] = "</span>";
				sb[sb.length] = "</div>";
				comm.innerHTML += sb.join('');
			}
			shell.isopen = false;
			if(im.fs == ""){
				shell.isSpace = true;
				im.after = shell.callphone;
				im.login();
			}else{
				shell.callphone();
			}
			document.documentElement.scrollTop = 0;
			
		}
		
	},
	isSpace : false,
	curTit : "",
	isopen : false,
	callphone : function(){
		shell.callFriendList();
	},
	sg : {},
	selectGroup : function(type){
		
		var id = "";
		if(type == "sreach"){
			id = "shell_group_sreach";
		}else if(type == "temp"){
			id = "shell_group_last";
		}else if(type == "datou"){
			id = "shell_group_datou";
		}else if(type == "phone"){
			id = "shell_group_phone";
		}
		var con = $(id);
		var input = con.getElementsByTagName("input");
		
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		var is = obj.checked;
		
		for(var i = 0 ; i < input.length ; i++){
			var c = input[i];
			var value = c.value;
			shell.arr = shell.arr.without(value);
			c.checked = false;
			if(is){
				shell.arr.push(value);
				c.checked = true;
			}
		}
		if (!Client.Engine.ie){
			 evt.stopPropagation();
		} else{
        	 window.event.cancelBubble  = true;
        }
	},
	type : "DID",
	callFriendList : function(){
		$("shell_group_last").innerHTML = "";
		$("shell_group_phone").innerHTML = "";
		$("shell_group_datou").innerHTML = "";
		shell.setuplast();
		shell.setupPhone();
		shell.setupDatou();
		
		var order = im.curOrder;
		
		if(order == "ST"){
			//$("shell_py_btn").innerHTML = "&nbsp;&nbsp;";
			//$("shell_st_btn").innerHTML = "&radic;";
		}else{
			//$("shell_py_btn").innerHTML = "&radic;";
			//$("shell_st_btn").innerHTML = "&nbsp;&nbsp;";
		}
	},
	setuplast : function(){
		var last = im.last;
		var con = $("shell_group_last");
		var i  = 0 ; 
		while( i < last.length){
			var l = last[i];
			var div = document.createElement("div");
			div.className = "shell_friend";
			if(im.fs[l] || im.datou[l]){
				shell.createLastElement(div,l);
			}else{
				shell.createStrageElement(div,l);
			}
			
			con.appendChild(div);
			i++;
		}
	},
	createStrageElement : function(element , l){
		shell.getPerson(element,l,"STR","陌生人","","temp")
		delete element , l;
	},
	createLastElement : function(element , l){
		var obj ;
		if(im.fs[l]){
			obj = im.fs[l] ;
		}else if(im.datou[l]){
			obj = im.datou[l] ;
		}
		shell.getPerson(element,l,obj["S"] == "OFF" ? "OFF" : "ON",obj["N"] != null && obj["N"] != "null" ? obj["N"] : "",obj["SI"],"temp")
		delete obj,element,l;
	},
	setupDatou : function(){
		var fs = im.datou;
		
		var con = $("shell_group_datou");
		
		for(var prop in fs){
			
			var l = prop;
			
			var obj = fs[prop];
			
			var div = document.createElement("div");
			
			div.className = "shell_friend";
			
			shell.getPerson(div,l,obj["S"] == "OFF" ? "OFF" : "ON",obj["N"],obj["SI"],"friend");
			
			con.appendChild(div);
		}
		delete fs,con;
	},
	setupPhone : function(){
		var fs = im.fs;
		
		var con = $("shell_group_phone");
		
		var havP = false;
		
		for(var prop in fs){
		//break;
			var l = prop;
			
			var obj = fs[prop];
			
			var div = document.createElement("div");
			div.className = "shell_friend";
			shell.getPerson(div,l,obj["D"] == "" ? "NON" : obj["S"] == "ON" ? "ON" : "OFF",obj["N"],obj["SI"],"friend")
			con.appendChild(div);
			havP = true;
		}
		
		if(!havP){
			
			var div = document.createElement("div");
			
			div.className = "im_no_phone";
			
			div.innerHTML = "<a title='点击上传电话本' href='javascript:im.sylmail();'>您目前还没有好友,同步手机电话本邀请您的好友一起来大头网玩.</a>";
			
			con.appendChild(div);
		}
		delete fs,con,havP;
	},
	getPerson : function(element,l,st,n,si,pix){
		
		var input = document.createElement("input");
		
		input.type = "checkbox";
		input.value = l;
		input.onclick = shell.select;
		
		var img = document.createElement("img");
		
		img.src = _sp + "images/im/" +st+ ".gif"
		
		img.setAttribute("width" , 18);
		img.setAttribute("height" , 18);
		img.setAttribute("id",pix + "_icon_" + l);
		img.setAttribute("dtid",l);
		img.setAttribute("type",pix);
		
		var logo = document.createElement("div");
		
		logo.className = "shell_friend_logo";
		
		logo.appendChild(input);
		
		logo.appendChild(img);	
		logo.setAttribute("dtid",l);
		logo.setAttribute("type",pix);	
		
		
		
		var uid = document.createElement("div");
		
		uid.className = "shell_friend_uid";
		uid.innerHTML = n + " " + l;
		uid.setAttribute("dtid",l);
		uid.setAttribute("type",pix);	
		
		var sn = document.createElement("div");
		sn.className = "shell_track";
		sn.title = si;
		sn.innerHTML = si.length > 12 ? si.substring(0,11) + "..." : si.substring(0,11);
		sn.setAttribute("dtid",l);
		sn.setAttribute("type",pix);	
		
		element.appendChild(logo);
		
		element.appendChild(uid);
		
		element.appendChild(sn);
		
		element.onmouseover = function(){shell.onOver(l)};
		
		element.onmouseout = function(){shell.onOut(l)};
		
		element.style.cursor = "pointer";
		
		element.setAttribute("dtid",l);
		
		element.setAttribute("type",pix);
		
		
		if(shell.arr.indexOf(l) > -1){
			input.checked = true;
		}
		
		delete element,l,st,n,si,pix,img,logo,uid,sn;
		
	},
	disgroup : function(t){
		if(t == "last"){
			var obj = $("shell_img_last");
			if(obj.getAttribute("dis") == "false"){
				$("shell_group_last").style.display = "none";
				obj.setAttribute("dis","true");
				obj.src = _sp + "images/im_v2/group_c.jpg";
			}else{
				$("shell_group_last").style.display = "";
				obj.setAttribute("dis","false");
				obj.src = _sp + "images/im_v2/group_o.jpg";
			}
		}else if(t == "phone"){
			var obj = $("shell_img_phone");
			if(obj.getAttribute("dis") == "false"){
				$("shell_group_phone").style.display = "none";
				obj.setAttribute("dis","true");
				obj.src = _sp + "images/im_v2/group_c.jpg";
			}else{
				$("shell_group_phone").style.display = "";
				obj.setAttribute("dis","false");
				obj.src = _sp + "images/im_v2/group_o.jpg";
			}
		}else if(t == "datou"){
			var obj = $("shell_img_datou");
			if(obj.getAttribute("dis") == "false"){
				$("shell_group_datou").style.display = "none";
				obj.setAttribute("dis","true");
				obj.src = _sp + "images/im_v2/group_c.jpg";
			}else{
				$("shell_group_datou").style.display = "";
				obj.setAttribute("dis","false");
				obj.src = _sp + "images/im_v2/group_o.jpg";
			}
		}
		delete t;
	},
	onOver : function(){
	},
	onOut : function(){
	},
	load : true,
	enter : function(){
		var event = getEvent();
		var code = event.keyCode;
		if(shell.load){
			shell.load = true;
			var value = $("shell_sreach_input").value;
			
				if(code == 13 && value.trim() != ""){
					var prar = "value=" + value;
					var myAjax = new Ajax.Request(_cp + "ajax/shell/py.jsp",{method:'POST',asynchronous:true,
								 parameters:prar,onComplete:function (response){
								 }});
				}
			}
	},
	sreach:function(key,args){
		var i = 0;
		var al = args.length;
		var sp = $("shell_sreach_list");
		sp.innerHTML = "";
		$("shell_person").style.display = "none";
		sp.style.display = "block";
		if(al == 0 ){
			var div = document.createElement("div");
			var sb = new Array();
			sb.push("<div id='shell_sreach_er'>");
			sb.push("<div id='shell_sreach_msg'>");
			sb.push("搜索:" + key + " &nbsp;没有查到结果。<a href='javascript:shell.dissreach();'>返回</a>");
			sb.push("</div>");
			sb.push("<div id='shell_sreach_link'>");
			sb.push("");
			sb.push("</div>");
			sb.push("</div>");
			div.innerHTML = sb.join('');
			sp.appendChild(div);
		}else{
			var gc = document.createElement("div");
			
			gc.className = "shell_group";
			
			var sb = new Array();
			
			sb[sb.length] = "<div class='shell_group_title' >";
			sb[sb.length] = "	<input type='checkbox' onclick=\"shell.selectGroup('sreach');\"/>";
			sb[sb.length] = "	<IMG class='shell_group_img' id='shell_img_sreach' dis='false' height='21' src='" +_sp+ "images/im_v2/group_o.jpg' width='13'  />";
			sb[sb.length] = "	<SPAN class='shell_group_gtit' id='shell_git_sreach' >搜索:" + key + " &nbsp;共" +al+ "条记录。<a href='javascript:shell.dissreach();'>返回</a></SPAN>";
			sb[sb.length] = "	</div>";
			sb[sb.length] = "<div class='shell_group_list' id='shell_group_sreach'></div>";
			gc.innerHTML = sb.join('');
			sp.appendChild(gc);
		
			var con = $("shell_group_sreach");
			
			while(i < al){
				
				var id = args[i];
			
				var obj = im.fs[id] || im.datou[id];
					
				var div = document.createElement("div");
		
				div.className = "shell_friend";
				
				var tp = "OFF";
				
				if(im.fs[id]){
					if(im.fs[id]["D"] && im.fs[id]["D"] != null){
						if(obj["S"] == "OFF"){
							tp = "OFF";
						}else{
							tp = "ON";
						}
					}else if(im.fs[id]["S"] != "OFF"){
						tp = "NON";
					}
				}else if(im.datou[id]){
					if(im.datou[id]["S"] != "OFF"){
						tp = "ON";
					}
				}
				shell.getPerson(div,id,tp,obj["N"],obj["SI"],"sreach")
				
				con.appendChild(div);
				
				i++;
			}
		}
	},
	dissreach : function(){
		$("shell_sreach_list").style.display = "none";
		$("shell_person").style.display = "block";
		shell.callFriendList();
	},
	select : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		if(obj.checked){
			shell.arr.push(obj.value);
		}else{
			shell.arr = shell.arr.without(obj.value);
		}
	},
	arr : new Array(),
	overbar : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		obj.style.backgroundColor = 'azure';
		delete evt,obj;
	},
	outbar : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		obj.style.backgroundColor = '';
		delete evt,obj
	},
	order : function(type){
		$("shell_menu_bar").style.display  = "none";
		im.loginback = function(){
			shell.callFriendList();
			im.loginback = function(){};
		};
		im.login(type);
	},
	showmenu : function(){
		
		if($("shell_menu_bar").style.display != "block"){
			$("shell_menu_bar").style.display  = "block";
		}else{
			$("shell_menu_bar").style.display  = "none";
		}
	}
}
var code1 = ["京","津","冀","晋","蒙","辽","吉","黑","沪","苏","浙","皖","闽","赣","鲁","豫","鄂","湘","粤","桂","琼","渝","川","贵","云","藏","陕","甘","青","宁","新","港","澳","台","暂","匿"];
var code2 = ["BJ","TJ","HE","SX","NM","LN","JL","HL","SH","SZ","ZJ","AH","FJ","JX","SD","HY","HB","HU","GD","GX","HN","CQ","SC","GZ","YN","XZ","SI","GS","QH","NX","XJ","XG","AM","TW","ZN","NI"];

var track = {
	initPK : function(ann, bnn){
		pk.did="";
		pk.init(ann, bnn);
	},
	initPrt : function(mdn, nn){
		prt.init(mdn, nn)
	},
	initRumour : function(mdn, nn){
		rumour.init(mdn, nn);
	},
	initYy : function(mdn, nn){
		yy.init(mdn, nn);
	},
	swfID : "trackplayerobj",
	curM : "",
	song_name : "",
	site_url : _cp+"music/sub/querySongUrl.jsp",
	music : function(obj,name, url){
		
		track.song_name = name;
		if(obj.getAttribute("istrack") && 
			(obj.getAttribute("istrack") == "true" || obj.getAttribute("istrack") == true)){
			track.disCurMusic(track.curM);
			track.initMusic(obj,url);
			track.playMusic(obj);
		}else{
			track.music(obj.parentNode,name, url);
		}
				
	},
	urlScroll : "timeout",
	url_mark : 1,
	whole_url : "",
	changeUrlShow : function(url){
		clearInterval(track.urlScroll);
		track.url_mark++;
		if(url.length > 65){
			track.whole_url = url + "      ";
			track.urlScroll = setInterval("track.setSourceUrlShow()",200);
		}else{
			$("showUrlArea").innerHTML = "歌曲出处:" + track.url_mark + "、" + url;
		}
	},
	setSourceUrlShow : function(){
		if($("showUrlArea")){
			var url = track.whole_url;
			track.whole_url = url.substr(1) + url.substr(0,1);
			$("showUrlArea").innerHTML = "歌曲出处:" + track.url_mark + "、" + track.whole_url;
		}
	},
	turnTrackPage : function(page){
		util.stopTrack();
		var queueType = _track_queryType;
		var _dtw_track_g = _cp + "trackG/" + queueType + "." + page +".xml";
		var myAjax = new Ajax.Request(_dtw_track_g,{method: 'POST',asynchronous:true,
			onComplete:function (response){
				var track = response.responseText;
				if (track.trim() != ""){
					if (page == 0){
						$("all_track").innerHTML = track.split("<ul>")[1] + "<ul>";
						_thisTrackPage =  track.split("<ul>")[0];
					}else{
						$("all_track").innerHTML = track;
					}
					window.location.hash='replyfocus';
				}
				delete track;
				util.getPageNum();
				delete queueType,myAjax,response,xml;

				}
		});
		$("waper_container").scrollTop = $("login_track").offsetHeight + $("message").offsetHeight + 100;
		
		if ($("_a" + _usedPage)){
			$("_a" + _usedPage).className = "";
		}
		$("_a" + page).className = 'current';
		_usedPage = page;
	},
	turnToMoreTrack : function(){
		window.location.href = _cp + "util/moreTrack.jsp?queueType=" +  _track_queryType;
	},
	
	vedio : function(obj, resid){
		window.open(_cp + "info/video.jsp?newsid=" + resid);
	},
	vedioUrl : function(obj, url, title, iurl){
		window.open(_cp + "info/video.jsp?share=y&url=" 
			+ url + "&title=" + escape(escape(title)) + "&iurl="
			+ iurl);
	},
	info : function(obj, resid){
		window.open(_cp + "info/news.jsp?newsid=" + resid);
	},
	bbs : function(resid){
		window.open(_cp + "community/froum_post_view.jsp?numpostid=" + resid);
	},
	disCurMusic : function(obj){
		if(obj != ""){
			
			var divs = $A(obj.getElementsByTagName("div"));
			for(var i = 0 ; i < divs.length ; i++){
				
				var div = divs[i];
				
				if(div.getAttribute("iscont") && div.getAttribute("iscont") == "true"){
					
					div.innerHTML = "";
					
					div.style.display = "none";
					
				
					break;
				}
			}
			obj.style.height = "20px";
		}
	},
	playMusic : function(obj){
		//obj.style.height = "70px";
		track.curM = obj;
	},
	
	otherMusic: function(){
		var url = getRadio("cle");
	//	alert(url);
		
		//alert(track.curM);
		alter.cls();
		track.music(track.curM,url);	
	},
	
	initMusic : function(obj,url){
		var divs = $A(obj.getElementsByTagName("div"));
		for(var i = 0 ; i < divs.length ; i++){
			
			var div = divs[i];
			if(div.getAttribute("iscont") && div.getAttribute("iscont") == "true"){
				div.style.display = "block";
				div.innerHTML = track.getMusic(url , obj.innerHTML);
				
				var mname  = div.getAttribute("song");
				var mid = div.getAttribute("mid");
				var prar = "musicId=" + mid + "&musicName=" + mname + "&musicUrl=" + escape(url);
				var myAjax = new Ajax.Request(_cp + "ajax/music/musicTrackAdd.jsp",{method:'POST',asynchronous:true,
						 parameters:prar,onComplete:function (response){ ;}
				});
	
				break;
			}
		};
	},
	changeSpan : function(str){
		$('inspan').innerHTML = str;
	},
	getMusic : function(url , song){
		clearInterval(track.urlScroll);
		var sb = new Array();
		sb[sb.length] = '<div style="margin:0 10px 0 20px; height:30px; float:left;">';
		sb[sb.length] = '<object id="trackplayerobj" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="150" height="30" title="轨迹音乐">';
		sb[sb.length] = ' <param name="movie" value="' + _sp + 'player/trackPlayer.swf" />';
		sb[sb.length] = ' <param name="quality" value="high" />';
		sb[sb.length] = ' <param name="wmode" value="transparent"/>';
		sb[sb.length] = ' <param name="FlashVars" value="url='+ encodeURI(url) +'" />';
		sb[sb.length] = ' <embed name="trackplayerobj" wmode="transparent" flashvars="url='+ encodeURI(url) +'" src="'+ _sp + 'player/trackPlayer.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="150" height="30"></embed>';
		sb[sb.length] = ' </object>';
		sb[sb.length] = '</div>';
		
		track.url_mark = 1;
		sb[sb.length] = '<div id="inspan" name="inspan" style="margin:0px 0 0 7px; padding:7px 0 0 10px;">正在尝试以下音乐地址</div><div style="width:90%;+width:90%; margin:10px 0 0 0; clear:both;"><a id="showUrlArea" name="showUrlArea" style="background:#e1eff5; border:#97cae4 1px solid; display:block; text-decoration:none; padding:3px 5px; width:100%;overflow:hidden;white-space:nowrap; " target="about:blank" href=\"'  + url+ '\">歌曲出处: 1、' +url+ '</a></div>';

		if(url.length > 65){
			track.whole_url = url + " ";
			track.urlScroll = setInterval("track.setSourceUrlShow()",200);
		}

		return sb.join('');					
	},
	//得到swf对象
	getSwf : function() {
		var me;
		if (navigator.appName.indexOf("Microsoft") > -1) {
			me = window[track.swfID];
		}else{
			me = document[track.swfID];
		}
		return me;
	},
	//查询备选URL
	querySongUrl : function(){
		if(track.song_name != ""){
		new Ajax.Request(track.site_url,{method:'post',parameters:'songname='+track.song_name,asynchronous:true,onComplete:function(res){
			var text = res.responseText.trim();
			if(text != ""){
				var url_arr = text.split(",");
				if(url_arr != undefined && url_arr.length > 0){
					track.getSwf().addStandby(url_arr);
				}else{
					track.getSwf().addStandby([]);
				}
			}else{
				track.getSwf().addStandby([]);
			}
		}});
		}
	},
	trackStop :function(){
		_track_flush = false;	
		
	},
	trackStart :function(){
		_track_flush = true;	
	},
	fanPan : function(){
		var event = getEvent();
		var obj = event.srcElement || event.target;
		var parentObj = obj.parentNode;
		var lis = parentObj.parentNode.getElementsByTagName("li");
		for (var i = 0; i < lis.length; i++){
			lis[i].className = "grey03_bg";
		}
		parentObj.className = 'meau_bg';
	},
	trackChangeType : function(queryType){
		track.fanPan();
		alltime = 10;
		_track_queryType = queryType;
		//util.startTrack();
		//如果是翻各个分类的轨迹
		//util.getActionTrack("T");
		var trackFanpan = _track_flush;
		track.turnTrackPage(0);
		if (trackFanpan){
			util.startTrack();
		}
		
	},
	trackChangeFriendType : function(queryType){
		track.fanPan();
		
		_track_queryType = queryType;
		track.trackStart();
		util.getActionTrack("U");
	},
	pageFriendTrack : function(type){
		track.fanPan();
		track.initPageTrack(type);
	},
	initPageTrack : function (type){
		var uid = "";
		if ($("spaceUserId")){
			uid = $F("spaceUserId");
		}else{
			uid = lg.user;
		}
		var param = new Array();
		param[param.length] = "queueType=";
		param[param.length] = type;
		param[param.length] = "&spaceUserId=";
		param[param.length] = uid;
		var myAjax = new Ajax.Request( _cp + 'ajax/track/pageFriendTrackLength.jsp',
			{method: 'POST',parameters:param.join(''),asynchronous:true,onComplete:function (response){
			 	var length = response.responseText.trim();
			 	if (length == 0){
			 		length = 1;
			 	}
				track.pageFriendTrackPrint(type, length);
		}});
	},
	pageFriendTrackPrint : function(type, length){
		var uid = "";
		if ($("spaceUserId")){
			uid = $F("spaceUserId");
		}else{
			uid = lg.user;
		}
	
		var param = new Array();
		param[param.length] = "?queueType=";
		param[param.length] = type;
		param[param.length] = "&spaceUserId=";
		param[param.length] = uid;
		
		init(length,'turnPage', _cp + 'ajax/track/pageFriendTrack.jsp' + param.join(''),"");
		if ($("turnPage2")){
			initClone("turnPage2");
		}

		var myAjax = new Ajax.Request( _cp + 'ajax/track/pageFriendTrack.jsp',
			{method: 'POST',parameters:param.join(''),asynchronous:true,onComplete:function (response){
			 	/*var track = response.responseText;
			 	if (track.trim() == "<ul></ul>"){
			 		track = "<ul><li class=\"\">您暂无足迹，去大头网随便逛逛吧</li><ul>";
			 	}
			 	$("friend_track").innerHTML = track;*/
				var xml = createXml(response.responseText);
				var is = getElements(xml,"i");
				var trackid = "friend_track";
				if (is.length == 0){//判断暂有问题
					$(trackid).innerHTML = "<ul><li class=\"\">您暂无足迹，去大头网随便逛逛吧</li><ul>";
			 	}else{
			 		$(trackid).innerHTML = "";
	
					if ($("list_cont_friend")){
						$("list_cont_friend").style.display = "block";
					}
					if($("turnPage")){
						$("turnPage").style.display = "block";
					}
					if($("turnPage2")){
						$("turnPage2").style.display = "block";
					}
					trackmodle.escapeTrack(is, trackid);
			 	}
			
			delete myAjax , param ,xml ,is,response;
			 	
		}});
	}
	
}
var server = {
	disagree : function(){
	},
	agree : function(){
	},
	open : function(){
		window.open( _sp + "util/article.html", 'newwindow' ,'height=630, width=525,top=100; toolbar=no, menubar=no, scrollbars=no, izable=no,location=no, status=no');
	}
	
}
var music = {
	position : function(p){
		V(p);
	}
	
}
//if(Client.Engine.ie6){
//	document.write("<script type=\"text/javascript\" src=\"" + _cp + "javascript/minmax.js\"></script>");
//}
function SpaceBean(){
	this.fid = "";
	this.nm = "";
	this.type = "S";
	this.tm = "空间";
	this.did = '';
}
function AlbumBean(){
	this.fid = "";
	this.nm = "";
	this.type = "A";
	this.tm = "相册";
	this.did = '';
}
function PostBean(){
	this.fid = "";
	this.nm = "";
	this.type = "P";
	this.tm = "帖子";
	this.pid = "";
	this.ppid = "";
}
function NewsBean(){
	this.fid = "";
	this.nm = "";
	this.ct = "";
	this.type = "C";
	this.tm = "资讯";
}
function VideoBean(){
	this.fid = "";
	this.nm = "";
	this.ct = "";
	this.art = "";
	this.alb = "";
	this.siz = "";
	this.type = "V";
	this.tm = "视频";
}
function AideoBean(){
	this.url = "";
	this.nm = "";
	this.type = "AU";
	this.tm = "音乐";
}
var _im_allfriends = _cp + "ajax/im/login/allFriends.jsp";
var _im_edit_sn = _cp + "ajax/im/friend/editsn.jsp";
var _im_ping_se =  _cp + "ajax/im/ping/impingse.jsp";
var _im_comedatou = _cp + "ajax/im/friend/comedatou.jsp";
var _im_wakeup = _cp + "ajax/im/friend/wakeup.jsp";
var _im_sreach_frd = _cp + "ajax/im/group/sreachmy.jsp";
var _im_control = _cp + "ajax/im/friend/friend.jsp";

var im = {
	fs : new Array(),
	st : "ON",
	pingAble : true,
	sleep : 10000,
	last : new Array(),
	datou : new Array(),
	unread : new Array(),
	q3:"",
	sys:"",
	login : function(order){
		try{
			im.loading();
			im.infosetup();
			$("im_group_last").innerHTML = "";
			$("im_group_phone").innerHTML = "";
			$("im_group_datou").innerHTML = "";
			var param = "";
			Co.getCo("order");
			if(order == "D"){
				order = Co.getCo("order") != null && Co.getCo("order") !="" ? Co.getCo("order") : "PY";
			}
			param = "by=" + order;
			im.setOrder(order);
			//获取im 基本信息，以及相关配置
			var myAjax = new Ajax.Request(_im_allfriends,{method: 'POST',asynchronous:true,parameters:param,onComplete:function(response){
				im.disPlayIm();
				im.setupLast();
				im.setupPhone();
				im.setupDatou();
				im.setupUnRead();
				im.setupSystem();
				im.pinginter = window.setTimeout(im.setPing,im.sleep);
				
				im.loginback();
				delete myAjax;
				delete response;
				delete param;
			}});	
		}catch(e){alert("login|" + e.message);}
	},
	loginback : function(){},
	curOrder : "",
	pinginter : "",
	setOrder : function(by){
		if(by == "PY"){
			$("im_py_btn").innerHTML = "&radic;";
			$("im_st_btn").innerHTML  = "&nbsp;&nbsp;";
			im.curOrder = by;
		}else{
			$("im_st_btn").innerHTML  = "&radic;";
			$("im_py_btn").innerHTML  = "&nbsp;&nbsp;";
			im.curOrder = "ST";
		}
		Co.setCo("order",by,100000);
		delete by;
	},
	setPing : function(){
		window.clearInterval(im.pinginter);
		im.pinginter = window.setInterval(im.ping,im.sleep);
	},
	ping : function(){
		
		var d = new Date().getTime();
		var param = "time=" + d;
		param += "&q3=" + im.q3 ;
		if(_sms_sequence[0] != "")
			param += ("&sms1="+_sms_sequence[0]) ;
		if(_sms_sequence[1] != "")
			param += ("&sms2="+_sms_sequence[1]) ;
		var myAjax = new Ajax.Request(_im_ping_se,{method: 'POST',parameters:param,asynchronous:true,onComplete:function(response){
				delete param;
				delete response;
				delete myAjax; 
				delete d;
		}});	
	},
	pingBack : function(chanage,unreads,talks,newq3,nfarr,sys){
		im.q3 = newq3;
		$("msg_count").innerHTML = "(" + unreads.length + ")";
		im.updateChanage(chanage,unreads);
		im.updateUnreads(unreads);
		im.updateTalks(talks);
		im.updateNewFriends(nfarr);
		im.updateSystem(sys);
		delete chanage,unreads,talks,newq3,nfarr;
		
	},
	updateSystem : function(sys){
		if(parseInt(sys) > 0){
			$("unread_icon").src = _sp + "images/header_sign02.gif";
		}
		$("msg_count").innerHTML = "("+parseInt(sys)+ ")";
		delete sys;
	},
	updateNewFriends : function(nfarr){
		if(nfarr.length != 0){
			var sb = new Array();
			sb[sb.length] = "<div class='im_new_top'>";
			sb[sb.length] = "您有新的好友信息,是否刷新列表?";
			sb[sb.length] = "</div>";
			for(var i = 0 ; i < nfarr.length ; i++){
				var nf = nfarr[i];
				sb[sb.length] = "<div class='im_new_item'>";
				sb[sb.length] = "<div class='im_new_item_logo'>";
				sb[sb.length] = "<img width='80' height='80' src='" +nf["L"] + "' onerror='this.src=\"" +_sp+ "images/head/default.gif\"'/>";
				sb[sb.length] = "</div>";
				sb[sb.length] = "<div class='im_new_item_info'>";
				sb[sb.length] = "昵称:" + nf["N"] + "<br/>";
				sb[sb.length] = "大头号:" + nf["ID"] + "<br/>";
				sb[sb.length] = "签名:" + nf["SI"]
				sb[sb.length] = "</div>";
				sb[sb.length] = "</div>";
			}
			sb[sb.length] = "<div class='im_new_btn'>";
			sb[sb.length] = "<input type='button' value='刷新列表' onclick='im.login(im.curOrder);alter.cls();'/>&nbsp;&nbsp;&nbsp;&nbsp;";
			sb[sb.length] = "<input type='button' value='取消' onclick='alter.cls();'/>";
			sb[sb.length] = "</div>";
			V(sb.join(''),{w:300,h:nfarr.length*100+120});
			delete nfarr,sb;
		}
	},
	updateTalks : function(talks){
		var smsc = 0 ;
		for(var prop in talks ){
			
			if(prop != "" && _sms_sequence[smsc] == prop){
				if(talks[prop] != ""){
					var xml = createXml(talks[prop]);
					var ms = getElements(xml,"m");
					msg.append(smsc+1,ms);
					sms.position((smsc + 1));
				}
			}
			smsc++;
		}
		delete talks,smsc;
	},
	updateUnreads : function(unreads){
		im.unread = unreads;
		var i = 0 
		while(i < unreads.length){
			var id = unreads[i];
			if($("temp_" + id)){
					$("temp_icon_" + id).src = _sp + "images/im/MESS.gif";
			}
			if($("friend_" + id)){
					$("friend_icon_" + id).src = _sp + "images/im/MESS.gif";
			}
			i++;
		}
		im.alertNext();
		delete unreads;
	},
	alertLock : false,
	alertNext : function(){
		if(!im.alertLock){
			var uid = $("mess_alter_uid").value;
			if(uid != ""){
				var i = 0 ;
				var l = im.unread.length;
				var nar = new Array();
				while(i < l){
					if((im.unread[i]!= uid) && (im.unread[i] != _sms_sequence[0]) && (im.unread[i] !=  _sms_sequence[1])){
						nar.push(im.unread[i]);
					}
					i++;
				}
				im.unread = nar;
			}
			$("mess_alter").style.display = "none";
			im.alertLock = false;
			if(im.unread.length == 0) return;
			window.setTimeout(function(){
				var id = im.unread[0];
				var obj = im.fs[id] || im.datou[id];
				var p = $("mess_body");
				var count = 0;
				var i = 0 ;
				var l = im.unread.length;
				while(i < l){
					var unid = im.unread[i];
					if(unid == id){
						count++;
					}
					i++;
				}
				var nn = "陌生人";
				if(obj){
					nn = obj["N"] != "" ? obj["N"] : id;
				}
				p.innerHTML = "<a class='mess_alter_text' href='javascript:im.alterPlay();sms.open(\"" +id+ "\",\"" +nn+ "\");'>收到<br/><span>" +nn+ "</span>的未读消息.</a>";
				$("mess_alter").style.display = "block";
				$("mess_alter_uid").value = id;
				im.alertLock = true;
				if(Client.Engine.ie6){
					if(im.alterposition == ""){
						im.alterposition = window.setInterval(function(){
							$("mess_alter").style.position = "absolute";
							$("mess_alter").style.top = (450+document.documentElement.scrollTop) + "px";
						},30);
					}
				}
				
			},500);
		}
	},
alterposition : "",
alterPlay : function(){
	im.alertLock = false;
	im.alertNext();
},
updateChanage : function(chanage , unreads){
		var i = 0;
		while( i < chanage.length){
			
			var o = chanage[i];
			
			var id = o["ID"];
			
			var tp = o["T"] == "OFF" ? "OFF" : "ON";
			if(unreads.indexOf(id) == -1){
				if($("temp_" + id)){
					$("temp_icon_" + id).src = _sp + "images/im/" + tp +  ".gif";
				}
				if($("friend_" + id)){
					$("friend_icon_" + id).src = _sp + "images/im/" + tp +  ".gif";
				}
			}
			
			if(im.fs[id]){
				im.fs[id]["S"] = o["T"]
			}else if(im.datou[id]){
				im.datou[id]["S"] = o["T"]
			}
			
			i++;
		} 
		delete chanage,unreads,i;
	},
	updateMsg : function(c){
		if(!isNaN(parseInt(c))){
			var id1 = _sms_sequence[0];
			im.unread = im.unread.without(id1);
			var id2 = _sms_sequence[1];
			im.unread = im.unread.without(id2);
			return ;
			c = parseInt(c);
			
			var inner = $("msg_count").innerHTML.replace("(","").replace(")","");
			var it = parseInt(inner);
			var n = it - c
			if(n > 0){
				$("unread_icon").src = _sp + "images/header_sign02.gif";
				$("msg_count").innerHTML = "(" + n + ")";
			}else{
				$("unread_icon").src = _sp + "images/header_sign01.gif";
				$("msg_count").innerHTML = "(0)";
			}
		}
		delete c;
	},
	setupSystem : function(){
		$("msg_count").innerHTML = "("+parseInt(im.sys) + ")";
		if(parseInt(im.sys) > 0){
			$("unread_icon").src = _sp + "images/header_sign02.gif";
		}
		
	},
	setupUnRead : function(){
		var un = im.unread;
		var i = 0 ; 
		while(i < un.length){
			var id = un[i];
			if($("temp_" + id)){
				$("temp_icon_" + id).setAttribute("oldsrc" , $("temp_icon_" + id ).src);
				$("temp_icon_" + id).src = _sp + "images/im/MESS.gif";
				//$("unread_icon").src = _sp + "images/header_sign02.gif";
			}
			if($("friend_" + id)){
				$("friend_icon_" + id).setAttribute("oldsrc" , $("friend_icon_" + id ).src);
				$("friend_icon_" + id).src = _sp + "images/im/MESS.gif";
				
			}
			i++;
		}
		im.alertNext();
		delete un,i;
		
	},
	loading : function(){
		$("im").style.display = "block";
		if($("non_login"))$("non_login").style.display = "none";
		$("im_layer").style.display = "none";
		if($("im_loading"))$("im_loading").style.display = "block";
		$("im_sreach_lst").style.display = "none";
	},
	infosetup : function(){
		$("im_user_name").innerHTML = lg.nn != "" ? "&nbsp;" + lg.nn : lg.user ;
		$("im_user_mdn").innerHTML = lg.mdn != "" ? lg.mdn : "" ;
		$("im_user_sn").innerHTML = lg.sn != "" ? (lg.sn.length > 28 ? lg.sn.substring(0,26) + "..." : lg.sn) : "<请输入个性签名>" ;
		$("im_user_sn").title = lg.sn != "" ? lg.sn : "这个家伙很懒什么都没有留下" ;
		$("im_user_logo_img").onerror = function(){
			$("im_user_logo_img").src = _sp + "images/head/default.gif";
		}
		$("im_user_logo_img").src = lg.logo != "null" ? lg.logo : "" ;
	},
	disPlayIm : function(){
		$("im_layer").style.display = "block";
		if($("im_loading"))$("im_loading").style.display = "none";
		if($("dt_sreach"))
		$("dt_sreach").style.display = "";
	},
	setupDatou : function(){
		var fs = im.datou;
		
		var con = $("im_group_datou");
		
		for(var prop in fs){
			
			var l = prop;
			
			var obj = fs[prop];
			
			var div = document.createElement("div");
			
			div.setAttribute("id","friend_" + l);
			
			div.className = "im_friend";
			
			im.getPerson(div,l,obj["S"] == "OFF" ? "OFF" : "ON",obj["N"],obj["SI"],"friend")
			
			con.appendChild(div);
		}
		delete fs,con;
	},
	lastDis : true,
	setupLast : function(){
		var last = im.last;
		
		var con = $("im_group_last");
		
		var i  = 0 ; 
		
		while( i < last.length){
			
			var l = last[i];
			
			var div = document.createElement("div");
			
			div.setAttribute("id","temp_" + l);
			
			div.className = "im_friend";
			
			if(im.fs[l] || im.datou[l]){
				
				im.createLastElement(div,l);
				
			}else{
				
				im.createStrageElement(div,l);
			}
			
			con.appendChild(div);
			
			i++;
		}
		if(im.lastDis && (Co.getCo("displayLast") == "" || Co.getCo("displayLast") == "false")){
			$("im_last").style.display = "";
			$("im_last_btn").innerHTML = "&radic;";
		}else{
			$("im_last").style.display = "none";
			$("im_last_btn").innerHTML = "&nbsp;&nbsp;";
		}
		delete last,con,i;
	},
	createStrageElement : function(element , l){
		
		im.getPerson(element,l,"STR","陌生人","","temp")
		delete element , l;
		
	},
	createLastElement : function(element , l){
		
		var obj ;
		
		if(im.fs[l]){
			obj = im.fs[l] ;
		}else if(im.datou[l]){
			obj = im.datou[l] ;
		}
		
		im.getPerson(element,l,obj["S"] == "OFF" ? "OFF" : "ON",obj["N"] != null && obj["N"] != "null" ? obj["N"] : "",obj["SI"],"temp")
		delete obj,element,l;
	},
	setupPhone : function(){
		var fs = im.fs;
		
		var con = $("im_group_phone");
		
		var havP = false;
		
		
		for(var prop in fs){
		//break;
			var l = prop;
			
			var obj = fs[prop];
			
			var div = document.createElement("div");
			
			div.setAttribute("id","friend_" + l);
			
			div.className = "im_friend";
			
			im.getPerson(div,l,obj["D"] == "" ? "NON" : obj["S"] == "ON" ? "ON" : "OFF",obj["N"],obj["SI"],"friend")
			
			con.appendChild(div);
			
			havP = true;
		}
		if(!havP){
			
			var div = document.createElement("div");
			
			div.className = "im_no_phone";
			
			div.innerHTML = "<a title='点击上传电话本' href='javascript:im.sylmail();'>您目前还没有好友,同步手机电话本邀请您的好友一起来大头网玩.</a>";
			
			con.appendChild(div);
		}
		delete fs,con,havP;
	},
	getPerson : function(element,l,st,n,si,pix){
		var img = document.createElement("img");
		
		img.src = _sp + "images/im/" +st+ ".gif"
		
		img.setAttribute("width" , 18);
		img.setAttribute("height" , 18);
		img.setAttribute("id",pix + "_icon_" + l);
		img.setAttribute("dtid",l);
		img.setAttribute("type",pix);
		
		var logo = document.createElement("div");
		
		logo.className = "im_friend_logo";
		logo.appendChild(img);	
		logo.setAttribute("dtid",l);
		logo.setAttribute("type",pix);	
		
		var uid = document.createElement("div");
		
		uid.className = "im_friend_uid";
		uid.innerHTML = n + " " + l;
		uid.setAttribute("dtid",l);
		uid.setAttribute("type",pix);	
		
		var sn = document.createElement("div");
		sn.className = "im_track";
		sn.title = si;
		sn.innerHTML = si.length > 8 ? si.substring(0,7) + "..." : si;
		sn.setAttribute("dtid",l);
		sn.setAttribute("type",pix);	
		
		element.appendChild(logo);
		
		element.appendChild(uid);
		
		element.appendChild(sn);
		
		element.onmouseover = function(){im.onOver(l)};
		
		element.onmouseout = function(){im.onOut(l)};
		
		element.style.cursor = "pointer";
		
		element.onclick = function(){im.onClick(l)};
		
		element.oncontextmenu = cm.show;
		
		element.ondblclick = function(){im.sms(l,n);};
		
		element.setAttribute("dtid",l);
		
		element.setAttribute("type",pix);
		
		delete element,l,st,n,si,pix,img,logo,uid,sn;
		
	},
	disbar : function(){
		var ds = $("im_user_bar").getElementsByTagName("div");
		for(var i = 0 ; i < ds.length ; i++){
			ds[i].style.backgroundColor = '';
		}
		$("im_user_bar").style.display = "none";
		
		delete ds;
		
	},
	overbar : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		obj.style.backgroundColor = 'azure';
		delete evt,obj;
	},
	outbar : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		obj.style.backgroundColor = '';
		delete evt,obj
	},
	onOver : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		var uid = obj.getAttribute("dtid");
		var type = obj.getAttribute("type");
		if(type && type == "friend"){
			im.overF($("friend_" + uid));
		}else if(type && type == "sreach"){
			im.overF($("sreach_" + uid));
		}else{
			im.overF($("temp_" + uid));
		}
		delete evt,obj,uid,type;
	},
	overF : function(obj){
		if(obj){
			obj.style.backgroundColor = "azure";
		}
		delete obj;
	},
	onOut : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		var uid = obj.getAttribute("dtid");
		var type = obj.getAttribute("type");
		if(type && type == "friend"){
			im.outF($("friend_" + uid));
		}else if(type && type == "sreach"){
			im.outF($("sreach_" + uid));
		}else{
			im.outF($("temp_" + uid));
		}
		delete evt,obj,uid,type;
	},
	outF : function(obj){
		if(obj){
			obj.style.backgroundColor = "";
		}
		delete obj;
	},
	onClick : function(){
		var evt = getEvent();
		var obj = evt.srcElement || evt.target;
		var uid = obj.getAttribute("dtid");
		var type = obj.getAttribute("type");
		if(type && type == "friend"){
			im.clickF($("friend_" + uid));
		}else if(type && type == "sreach"){
			im.clickF($("sreach_" + uid));
		}else{
			im.clickF($("temp_" + uid));
		}
		delete evt,obj,uid,type;
	},
	curSelect : {obj:""},
	clickF : function(obj){
		if(obj){
			var cur = im.curSelect.obj;
			if(cur != ""){
				cur.style.backgroundColor = "";
				cur.onmouseover = im.onOver;
				cur.onmouseout = im.onOut;
			}
			obj.style.backgroundColor = "#caddc9";
			obj.onmouseover = function(){};
			obj.onmouseout = function(){};
			im.curSelect.obj = obj;
		}
		delete obj;
	},
	disgroup : function(t){
		if(t == "last"){
			var obj = $("group_img_last");
			if(obj.getAttribute("dis") == "false"){
				$("im_group_last").style.display = "none";
				obj.setAttribute("dis","true");
				obj.src = _sp + "images/im_v2/group_c.jpg";
			}else{
				$("im_group_last").style.display = "";
				obj.setAttribute("dis","false");
				obj.src = _sp + "images/im_v2/group_o.jpg";
			}
		}else if(t == "datou"){
			var obj = $("group_img_datou");
			if(obj.getAttribute("dis") == "false"){
				$("im_group_datou").style.display = "none";
				obj.setAttribute("dis","true");
				obj.src = _sp + "images/im_v2/group_c.jpg";
			}else{
				$("im_group_datou").style.display = "";
				obj.setAttribute("dis","false");
				obj.src = _sp + "images/im_v2/group_o.jpg";
			}
		}else if(t == "phone"){
			var obj = $("group_img_phone");
			if(obj.getAttribute("dis") == "false"){
				$("im_group_phone").style.display = "none";
				obj.setAttribute("dis","true");
				obj.src = _sp + "images/im_v2/group_c.jpg";
			}else{
				$("im_group_phone").style.display = "";
				obj.setAttribute("dis","false");
				obj.src = _sp + "images/im_v2/group_o.jpg";
			}
		}
		delete t;
	},
	sms : function(uid,nn){
		sms.open(uid,nn);
		delete uid,nn;
	},
	showmenum : function(){
		var act = $("im_action");
		var bar = $("im_user_bar");
		var s = bar.style;
		if(s.display == "" || s.display == "block"){
			s.display = "none";
		}else{
			s.display = "block";
			var pos = getElementPos("im_action");
			s.top = (pos.y + act.offsetHeight ) + "px";
			s.left = (pos.x -  115) + "px";
		}
		var e = getEvent();
		if (!Client.Engine.ie){
			 e.stopPropagation();
		} else{
        	 window.event.cancelBubble  = true;
        }
        delete act,bar,s,e;
	},
	clickSn : function(){
		var sn = $("im_user_sn");
		var sb = new Array();
		sb[sb.length] = "<div class='im_sn_textarea'>";
		sb[sb.length] = "&nbsp;请输入新的个性签名:";
		sb[sb.length] = "</div>";
		sb[sb.length] = "<div class='im_sn_body'>";
		sb[sb.length] = "<textarea style='height:120px' id='im_sn_text'>" + lg.sn + "</textarea>";
		sb[sb.length] = "</div>";
		sb[sb.length] = "<div class='im_sn_btn'>";
		sb[sb.length] = "<input type='button' value='确认' onclick='im.saveSn();'/>";
		sb[sb.length] = "<input type='button' value='取消' onclick='alter.cls();' />";
		sb[sb.length] = "</div>";
		V(sb.join(''),{h:240,w:300});
		delete sn,sb;
	},
	saveSn : function(){
		if($("im_sn_text")){
			var sn = $("im_user_sn");
			var v = $("im_sn_text").value
			if(v == sn.innerHTML || v.trim() == ""){
				alter.cls();
			}else{
				var param = "sn=" + v;
				sn.innerHTML = "";
				var myAjax = new Ajax.Request(_im_edit_sn,{method: 'POST',asynchronous:true,parameters:param,onComplete:function(response){
					if(v == ""){
						sn.innerHTML =  "<请输入个性签名>" ;
						sn.title = "这个家伙很懒什么都没有留下" ;
					}else{
						sn.innerHTML =  v != "" ? (v.length > 28 ? v.substring(0,26) + "..." : v) : "<请输入个性签名>" ;
						sn.title = v;
						lg.sn = v;
					}
					delete myAjax;
					delete response;
				}});
				alter.cls();	
			}
			
		}
		
	},
	backIcon : function(id){
		var tp;
		if(im.fs[id]){
			tp = im.fs[id]["S"] != "" && im.fs[id]["S"] == "OFF" ? "OFF" : "ON";
		}else if(im.datou[id]){
			tp = im.datou[id]["S"] != "" && im.datou[id]["S"]  == "OFF" ? "OFF" : "ON";
		}else if(id.length == 11){
			tp = "NON";
		}else{
			tp = "STR";
		}
		if($("friend_" + id)){
				if($("friend_icon_" + id)){
						$("friend_icon_" + id).src = _sp + "images/im/" + tp + ".gif";
				}
			}
		if($("temp_" + id)){
				$("temp_" + id).removeAttribute("MESS");
				if($("temp_icon_" + id)){
					$("temp_icon_" + id).src = _sp + "images/im/" + tp + ".gif";
				}
		}
		delete id,tp;
	},
	dislasr : function(){
		var ls = $("im_last");
		if(ls){
			if(ls.style.display == "none"){
				ls.style.display = ""
				$("im_last_btn").innerHTML = "&radic;";
				Co.setCo("displayLast","false",1000);
				im.lastDis = true;
			}else{
				ls.style.display = "none"
				$("im_last_btn").innerHTML = "&nbsp;&nbsp;";
				Co.setCo("displayLast","true",1000);
				im.lastDis = false;
			}
		}
		delete ls;
	},
	order : function(tp){
		im.login(tp);
		delete tp;
	},
	upLogo : function(){
		var uid = lg.user;
		var c1 = uid.substr(0,1);
		var c2 = uid.substr(1);
		for(var i = 0 ; i < code1.length ; i++){
			if(c1 == code1[i]){
				c1 = code2[i];
				break;
			}
		}
		window.location.href = _cp + "control/send_tu.jsp?who=" + c1 + c2;
		delete uid,c1,c2;
	},
	upInfo :function(){
			var uid = lg.user;
			var c1 = uid.substr(0,1);
			var c2 = uid.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			im.pingAble = false;
			window.location.href = _cp + "control/user/userInfo.jsp?who=" + c1 + c2;
			delete uid,c1,c2;
	},
	home : function(){
			var uid = lg.user;
			var c1 = uid.substr(0,1);
			var c2 = uid.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			im.pingAble = false;
			window.location.href = _cp + "games/myhome/home.jsp?who=" + c1 + c2;
			delete uid,c1,c2;
	},
	sylmail : function(){
		window.location.href = _cp + "contacts/phonebrand.jsp";
	},
	talk : function(){
		var id = cm.curObj;
		var obj = im.fs[id] || im.datou[id];
		sms.open(id,obj["N"]);
		delete id,obj;
	},
	toSpace : function(){
		var obj = cm.curObj;
		if(im.fs[obj] || im.datou[obj] || obj.length == 8){
			var uid = obj;
			if(uid.length == 11 && im.fs[uid]["D"] && im.fs[uid]["D"] != ""){
				uid = im.fs[uid]["D"];
			}
			var c1 = uid.substr(0,1);
			var c2 = uid.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			im.pingAble = false;
			window.location.href = _cp + "space/space.jsp?who=" + c1 + c2;
		}
		delete obj;
	},
	toWiki : function(){
		var obj = cm.curObj;
		if(im.fs[obj] || im.datou[obj]){
			var uid = obj;
			if(uid.length == 11 && im.fs[uid]["D"] && im.fs[uid]["D"] != ""){
				uid = im.fs[uid]["D"];
			}
			var c1 = uid.substr(0,1);
			var c2 = uid.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			im.pingAble = false;
			window.location.href = _cp + "space/wiki/wiki.jsp?who=" + c1 + c2;
		}
		delete obj;
	},
	comeDatou : function(){
			var uid = cm.curObj;
			var obj = im.fs[uid] || im.datou[uid];
			var sb = new Array();
			sb[sb.length] = "<div style='width:100%;text-align:left;line-height:15px;text-indent:10px;'>";
			sb[sb.length] = "Hi,";
			sb[sb.length] = obj["N"];
			sb[sb.length] = ":";
			sb[sb.length] = "</div>";
			
			sb[sb.length] = "<div style='width:100%;margin-top:5px;'>";
			sb[sb.length] = "<textarea id='comdt_con' style='width:90%;height:120px;'>这网站挺有意思的，过来看看吧。www.datou.com。或者你用手机也可以wap.datou.com</textarea>";
			sb[sb.length] = "</div>";
			sb[sb.length] = "<div style='width:100%;text-align:right;margin-top:5px;'>";
			sb[sb.length] = "<font style='color:#b4722c;font-weight:600;'>来自 &lt;&lt; </font><input type='text' style='width:50px;margin-right:15px;' maxlength='10' value='" +lg.nn+ "' id='comdt_nn'/>";
			sb[sb.length] = "</div>";
			sb[sb.length] = "<div style='width:100%;margin-top:5px;'>";
			sb[sb.length] = "<input value='发送邀请' type='button' onclick='im.subComeDatou(\"" +uid+ "\",\"" +obj["N"]+ "\");'/>";
			sb[sb.length] = "<input value='取消' type='button' onclick='alter.cls();'/>";
			sb[sb.length] = "</div>";
			V(sb.join(''),{w:300,h:240});
			delete uid,obj,sb;
	},
	subComeDatou : function(uid,nn){
		if($("comdt_nn").value != "" && $("comdt_con").value != ""){
			var param = "uid=" + uid+"&from=" + $("comdt_nn").value + "&cont=" + $("comdt_con").value;
			var myAjax = new Ajax.Request(_im_comedatou,{method: 'POST',parameters:param,asynchronous:true,onComplete:function(response){
				V("邀请已经送出,<span id='clock' style='display:none'></span>找更多的朋友来大头玩吧.")
				alter.clock(3);
				delete param,myAjax;
			}});
		}
	},
	wakeup : function(mdn){
		var obj = im.fs[mdn] || im.datou[mdn];
		var sb = new Array();
		sb[sb.length] = "<div style='width:100%;text-align:left;line-height:15px;text-indent:10px;'>";
		sb[sb.length] = "Hi,";
		sb[sb.length] = obj["N"];
		sb[sb.length] = ":";
		sb[sb.length] = "</div>";
			
		sb[sb.length] = "<div style='width:100%;margin-top:5px;'>";
		sb[sb.length] = "<textarea id='comdt_con' style='width:90%;height:120px;'>我正在玩大头网www.datou.com，这里有很多有趣的功能，快来和我一起体验吧！</textarea>";
		sb[sb.length] = "</div>";
		sb[sb.length] = "<div style='width:100%;text-align:right;margin-top:5px;'>";
		sb[sb.length] = "<font style='color:#b4722c;font-weight:600;'>来自 &lt;&lt; </font><input type='text' style='width:50px;margin-right:15px;' maxlength='10' value='" +lg.nn+ "' id='comdt_nn'/>";
		sb[sb.length] = "</div>";
		sb[sb.length] = "<div style='width:100%;margin-top:0px;'>";
		sb[sb.length] = "<input value='发送' type='button' class='im_sent' onclick='im.wakeupSub(\"" +mdn+ "\");alter.cls();'/>";
		sb[sb.length] = "<input value='取消' type='button' class='im_close' onclick='alter.cls();'/>";
		sb[sb.length] = "</div>";
		V(sb.join(''),{w:300,h:240});
		delete obj,sb;
	},
	wakeupSub : function(mdn){
		var param = "mdn=" + mdn + "&con=" + encodeURI($("comdt_con").value) + "&nn="+encodeURI($("comdt_nn").value);
		var myAjax = new Ajax.Request(_im_wakeup,{method: 'POST',parameters:param,asynchronous:true,onComplete:function(response){
				var res = response.responseText;
				var i = _sms_sequence.indexOf(mdn);		
				if(i > -1){
					if($("sms" + (i+1) + "_b")){
						$("sms" + (i+1) + "_b").innerHTML += res;
						sms.position(i+1);
					}
				}
				delete mdn,param,myAjax,res,i;
		}});
	},
	clearInput : function(){
		var input = $("im_sreach_input");
		if(input.value == "查找联系人..."){
			input.value = "";
			input.style.color = "black";
			input.style.fontWeight = "100";
		}
		delete input;
	},
	fillInput : function(){
		var input = $("im_sreach_input");
		//if(input.value.trim() == ""){
			input.value = "查找联系人...";
			input.style.color = "#b5b5b5";
			input.style.fontWeight = "600";
			delete input;
		//}
	},
	enter : function(){
		var vet = getEvent();
		var code = vet.keyCode;
		if(code == 13){
			im.loading();
			var v = $("im_sreach_input").value.trim();
			var param = "key=" + v;
			var myAjax = new Ajax.Request(_im_sreach_frd,{method: 'POST',parameters:param,asynchronous:true,onComplete:function(response){
				delete myAjax,param,v,code,vet;
			}});
		}
	},
	sreach : function(key,args){
		var i = 0;
		var al = args.length;
		
		var sp = $("im_sreach_lst");
		sp.innerHTML = "";
		$("im_layer").style.display = "none";
		if($("im_loading"))$("im_loading").style.display = "none";
		sp.style.display = "block";
		if(al == 0 ){
			var div = document.createElement("div");
			var sb = new Array();
			sb.push("<div id='im_sreach_er'>");
			sb.push("<div id='im_sreach_msg'>");
			sb.push("搜索:" + key + " &nbsp;没有查到结果。<a href='javascript:im.dissreach();'>返回</a>");
			sb.push("</div>");
			sb.push("<div id='im_sreach_link'>");
			sb.push("");
			sb.push("</div>");
			sb.push("</div>");
			div.innerHTML = sb.join('');
			sp.appendChild(div);
		}else{
			var gc = document.createElement("div");
			
			gc.className = "im_group";
			
			var sb = new Array();
			
			sb[sb.length] = "<div class='im_group_title' >";
			sb[sb.length] = "	<IMG class='im_group_img' id='group_img_sreach' dis='false' height='21' src='" +_sp+ "images/im_v2/group_o.jpg' width='13'  />";
			sb[sb.length] = "	<SPAN class='im_group_gtit' id='group_git_sreach' >搜索:" + key + " &nbsp;共" +al+ "条记录。<a href='javascript:im.dissreach();'>返回</a></SPAN>";
			sb[sb.length] = "	</div>";
			sb[sb.length] = "<div class='im_group_list' id='im_group_sreach'></div>";
			gc.innerHTML = sb.join('');
			sp.appendChild(gc);
		
			var con = $("im_group_sreach");
			
			while(i < al){
				
				var id = args[i];
			
				var obj = im.fs[id] || im.datou[id];
					
				var div = document.createElement("div");
		
				div.setAttribute("id","sreach_" + id);
				
				div.className = "im_friend";
				
				var tp = "OFF";
				
				if(im.fs[id]){
					if(im.fs[id]["D"] && im.fs[id]["D"] != null){
						if(obj["S"] == "OFF"){
							tp = "OFF";
						}else{
							tp = "ON";
						}
					}else if(im.fs[id]["S"] != "OFF"){
						tp = "NON";
					}
				}else if(im.datou[id]){
					if(im.datou[id]["S"] != "OFF"){
						tp = "ON";
					}
				}
				im.getPerson(div,id,tp,obj["N"],obj["SI"],"sreach")
				
				con.appendChild(div);
				
				i++;
			}
		}
		
	},
	dissreach : function(){
		$("im_sreach_lst").style.display = "none";
		$("im_layer").style.display = "block";
		if($("im_loading"))$("im_loading").style.display = "none";
	},
	toDt : function(){
		var id = cm.curObj;
		util.invited(id,id);
		delete id;
	},
	toPh : function(){
		
	},
	toRomoveF : function(){
		var uid = cm.curObj;
		
		var sb = new Array();
		sb[sb.length] = "<div>";
		sb[sb.length] = "<div>";
		sb[sb.length] = "您确定要删除好友 " + im.datou[uid]["N"];
		sb[sb.length] = "?</div>";
		sb[sb.length] = "<div>";
		sb[sb.length] = "<input type='button' value='确定' onclick='im.subRemove(\"" +uid+ "\",\"" +im.datou[uid]["N"]+ "\");alter.cls();'/>";
		sb[sb.length] = "<input type='button' value='取消' onclick='alter.cls();'/>";
		sb[sb.length] = "</div>";
		sb[sb.length] = "</div>";
		V(sb.join(''),{w:200,h:100})
		delete uid,sb;
	},
	subRemove : function(uid , nn){
		var param = "who=" + uid + "&type=R";
		var myAjax = new Ajax.Request(_im_control,{method: 'POST',asynchronous:true,parameters:param,onComplete:function(response){
				var sb = new Array();
				sb[sb.length] = "<div>";
				sb[sb.length] = nn + "已经在您的好友列表中删除,<span id='clock'>3</span>秒后关闭.";
				sb[sb.length] = "<div>";
				V(sb.join(''))
				alter.clock(3);
				im.login(im.curOrder);
				delete myAjax;
				delete response;
				delete uid,nn;
			}});	
		
	}		
}
var cm = {
	show : function(){
		//try{
			 var evt = getEvent();
			 obj = evt.srcElement || evt.target;
			 x = evt.clientX;
		     y = evt.clientY;
		     var type = obj.getAttribute("type");
		     var dtid = obj.getAttribute("dtid");
		     if(type == "temp"){
		     	obj = $("temp_" + dtid)
		     }else if(type == "friend"){
		     	obj = $("friend_" + dtid)
		     }else if(type == "sreach"){
		     	obj = $("sreach_" + dtid)
		     }
			 cm.showsub(obj,x,y);
			 $("im_layer").onscroll = function(){
				$("im_context_menu").style.display = "none";
			 }	
		     delete obj,x,y;
		     return false;
		//}catch(e){alert("cm.show|" + e.message);}
		
	},
	showsub : function(obj,x,y){
		if(obj == document.body){
			return false;
		}
		if(obj.getAttribute("dtid")){
			cm.escapeEvent(obj);
			$("im_context_menu").style.display = "block";
			$("im_context_menu").style.top = (y + document.documentElement.scrollTop) + "px";
			$("im_context_menu").style.left = x + "px";
			
			if( y > 500){
				$("im_context_menu").style.top = (y - $("im_context_menu").offsetHeight) + "px";
			}
			if( x > 900){
				$("im_context_menu").style.left = (x - $("im_context_menu").offsetWidth) + "px";
			}
			cm.hiddenExcept(0);
			if(obj.getAttribute("dtid") ){
				im.onClick(obj.getAttribute("dtid"),obj);
			}
				
			delete sy;
		}else{
			cm.showsub(obj.parentNode,x,y);
		}
	},
	curObj : "",
	escapeEvent : function(element){
		var id = element.getAttribute("dtid");
		
		cm.curObj = id;
		if(im.fs[id]){
			if(im.fs[id]["D"]){
				cm.setAble("AB");
			}else{
				cm.setAble("D");
			}
		}else if(im.datou[id] && element.getAttribute("type") == "friend"){
			cm.setAble("ABF");
		}else if(im.datou[id]){
			cm.setAble("AB");
		}else if(id.length == 11){
			cm.setAble("C");
		}else if(id.length == 8){
			cm.setAble("ABE");
		}
		
	},
	hiddenExcept : function(i){
		for(x = 1 ;x<5; x++){
			if($("im_context_menu"+x)){
				if(x == i){
					$("im_context_menu"+x).style.display = "block";
				}else{
					$("im_context_menu"+x).style.display = "none";
				}
			}
		}
		delete i;
	},
	setAble : function(t){
		var all = $("im_context_menu").childNodes;
		for(var i = 0 ; i < all.length ;i++){
			if(!all[i] || !all[i].getAttribute){
				continue;
			}
			var right = all[i].getAttribute("right");
			var hav = all[i].getAttribute("hav");
			if(right){
				if(t.indexOf(right) > -1){
					all[i].style.display = "";
				}else{
					all[i].style.display = "none";
				}
			}
		}
		delete all;
	},
	over : function (obj,menuid,type){
		var parent_left = obj.offsetParent.offsetLeft;
		var parent_top = obj.offsetParent.offsetTop;
		obj.style.backgroundColor = "azure";
		if(menuid != 0 && type == 0){
			var p = $("im_context_menu");
			var x = parseInt(p.style.left.substring(0,p.style.left.indexOf("px")));
			var y = parseInt(p.style.top.substring(0,p.style.top.indexOf("px")));
			var child = $("im_context_menu"+menuid);
			
			child.style.left = (parent_left+obj.offsetLeft + 105) +"px";
			child.style.top = (parent_top + obj.offsetTop) + "px";
			child.style.display = "block";
			
			
			
			if(x + child.offsetWidth > 920){
				child.style.left = (parent_left+obj.offsetLeft - child.offsetWidth) +"px";
			}
			if( y + child.offsetHeight > 640){
				child.style.top = (parent_top + obj.offsetTop - child.offsetHeight) + "px";
			}
			
		}
		cm.hiddenExcept(menuid);
		obj.onmouseout = function (){
			 if(menuid != 0){
				var child = $("im_context_menu"+menuid);
				//child.style.display = "none";
			}
			obj.style.backgroundColor = "white";
			obj.style.color = "black";
		};
	}
}
var _sms_sequence = ["","","",""];
var _sms_nn_seq = ["","","",""];
var _sms_send = _cp+"ajax/im/message/sendmesg.jsp";
var _sms_read = _cp+"ajax/im/message/readmesg.jsp";
var _sms_cur_dialog = "";
var _sms_faces_timer = "";
function Sms(x){
	this.limit = 2;
	this.seq = _sms_sequence;
	this.ox = "";
	this.oy = "";
	this.dragTarget = "";
	this.leftMargin = [10,370,540,800],
	this.call = function(i){
		im.wakeup(_sms_sequence[i-1]);
	};
	this.yy = function(i){
		//rumour.init(_sms_sequence[i-1],_sms_nn_seq[i-1]);
		if($("friend_" + _sms_sequence[i-1])){
			
			//var f = $("friend_" + _sms_sequence[i-1]);
			
			//var uid = f.getAttribute("linkid");
			
			util.toYy(_sms_sequence[i-1]);
		}
	};
	this.prt = function(i){
		//prt.init(_sms_sequence[i-1],_sms_nn_seq[i-1]);
		if($("friend_" + _sms_sequence[i-1])){
			
			//var f = $("friend_" + _sms_sequence[i-1]);
			
			//var uid = f.getAttribute("linkid");
			
			util.toPrt(_sms_sequence[i-1]);
		}
	};
	this.home = function(i){
		//util.toUserHome(im.fs["S"][_sms_sequence[i-1]]["ID"]);
		if($("friend_" + _sms_sequence[i-1])){
			
			//var f = $("friend_" + _sms_sequence[i-1]);
			
			//var uid = f.getAttribute("linkid");
			
			util.toHome(_sms_sequence[i-1]);
		}
	};
	this.pk = function(i){
		//pk.bid = _sms_sequence[i-1];
		//alert(pk.bid);
		//pk.init(lg.nn,_sms_nn_seq[i-1]);
		if($("friend_" + _sms_sequence[i-1])){
			
			//var f = $("friend_" + _sms_sequence[i-1]);
			
			//var uid = f.getAttribute("linkid");
			util.toPk(_sms_sequence[i-1]);
		}
	};
	this.dongTa = function(i){
		//yy.init(_sms_sequence[i-1],_sms_nn_seq[i-1]);
		if($("friend_" + _sms_sequence[i-1])){
			
			//var f = $("friend_" + _sms_sequence[i-1]);
			
			//var uid = f.getAttribute("linkid");
			
			util.toDt(_sms_sequence[i-1]);
		}
	};
	this.toSpace = function(i){
		if($("friend_" + _sms_sequence[i-1])){
			var id = _sms_sequence[i-1]	;
			if(id.length == 8){
				util.toSpace(id);
			}else if(im.fs[id]["D"]){
				util.toSpace(im.fs[id]["D"]);
			}
		}
	};
	this.toWiki = function(i){
		if($("friend_" + _sms_sequence[i-1])){
			
			var id = _sms_sequence[i-1]	;
			if(id.length == 8){
				util.toWiki(id);
			}else if(im.fs[id]["D"]){
				util.toWiki(im.fs[id]["D"]);
			}
		}
	};
	this.open = function (id,nn){
		
		if(lg.user == ""){
			V("请先登录");
			return;
		}
		//if(id == lg.user){
			//V("不能和自己聊天");
			///return;
		//}
		if(id.indexOf("暂") > -1 || id.indexOf("@") > -1){
			V("不能和临时大头号聊天");
			return;
		}
		var back = this.openBack;
		im.pingAble = false;
		var param = "who=" + id;
			//alert($("im") && !im.fs["S"][id]);
			if(!$("friend_" + id) && $("temp_" + id)){
				//im.card.toPh(id);
				back(id,"陌生人");
			}else{
				back(id,nn);
			}
		return;
		
	};
	this.openBack = function(id,nn){
		if($("im") && im.fs[id] &&im.fs[id]["D"] && im.fs[id]["D"]=="" && !$("temp_" + id)){
			im.comeDatou(id);
			return;
		}
		var cur = 0 ;
		if(! _sms_sequence.uniqe(id)){
			//alert("is talking!");	
			return;				
		}
		
		for(var i=0 ;i<sms.limit;i++){
			if(_sms_sequence[i] == ""){
				cur = i+1;
				_sms_sequence[i] = id;
				_sms_nn_seq[i] = nn;
				break;
			}
		}
		if(cur < 1 || cur >sms.limit){
			V("最多只能打开两个聊天窗口");
			return;
		}
		var position = this.position;
		
		$("sms"+cur).style.display = "block";
    	$("sms"+cur).style.left = sms.leftMargin[cur-1] + "px";
    	$("sms"+cur).style.top = "auto";
    	$("sms"+cur).style.bottom = "10px";
		$("sms"+cur+"_t_spn").innerHTML = nn +"&nbsp;&nbsp;" + id;
		if(im.fs[id] || im.datou[id]){
			var did;
			if(im.fs[id]){
				did = im.fs[id]["D"];
			}else{
				did = id;
			}
			var c1 = did.substr(0,1);
			var c2 = did.substr(1);
			for(var i = 0 ; i < code1.length ; i++){
				if(c1 == code1[i]){
					c1 = code2[i];
					break;
				}
			}
			$("sms"+cur+"_t_img").onerror = function(){
				$("sms"+cur+"_t_img").src = _sp + "images/head/default.gif";
			};
			$("sms"+cur+"_t_img").src = _sp + "logo/pic/" + c1 + "/" + c2.substring(0,3) + "/" + c2.substring(3,5) + "/" +  c1 + c2 +".jpg";
			
		}else{
			$("sms"+cur+"_t_img").src = _sp + "images/head/default.gif";
		}
		$("sms"+cur+"_t_s").innerHTML = "";
		if($("friend_track_" + id)){
			var sn = $("friend_track_" + id).title;
			$("sms"+cur+"_t_s").innerHTML = sn.length > 20 ? sn.substring(0,17)+ "..." : sn;
			$("sms"+cur+"_t_s").title = sn;
		}
		var param = "who="+ id + "&nn=" + nn;
		im.pingAble = false;
		$("sms"+cur+"_b").innerHTML = "";
		var myAjax = new Ajax.Request(_sms_read,{method: 'POST',parameters:param,asynchronous:true,onComplete:function (response){
			
			var xml = createXml(response.responseText);

			var smscount = getElement(xml,"count",0);
			im.updateMsg(smscount);
			var msgLst = getElements(xml,"m");
			
			msg.add(cur,msgLst);
			im.backIcon(id);
			im.pingAble = true;
			
   
   			window.setTimeout(function(){
   				
				var tar = $("sms"+cur+"_b");
				
				if(tar.scrollHeight > 183){
				 
				 	tar.scrollTop = tar.scrollHeight - 183;
				
				}
			},100);
			
			
		}});
	};
	this.talk = function (i,txt){
		$("sms"+i+"_b").innerHTML += txt;
		if(txt != ""){
			var who = _sms_sequence[i-1];
			var param = "who="+ who;
			im.pingAble = false;
			var myAjax = new Ajax.Request(_sms_read,{method: 'GET',parameters:param,asynchronous:true,onComplete:function (response){
				im.pingAble = true;
			}});
		}
	};
	this.cls = function (i){
		$("sms"+i).style.display = "none";
		_sms_sequence[i-1] = "";
		//$("sms"+i+"_mini").style.display = "none";
		//$("sms"+i+"_mini").style.border = '0px';
		//$("sms"+i+"_mini").style.borderColor = '';
		//$("sms"+i+"_mini").style.backgroundImage = "";
		
		//$("sms"+i+"_mini_logo").style.display = "block";
	};
	this.min = function (i){
		$("sms"+i).style.display = "none";
		$("sms"+i+"_mini").style.display = "block";
		$("sms"+i+"_min_t").innerHTML = $("sms"+i+"_t_t").innerHTML;
	};
	this.max = function (i){
		$("sms"+i).style.display = "block";
		$("sms"+i+"_mini").style.display = "none";
		$("sms"+i+"_mini").style.border = '0px';
		$("sms"+i+"_mini").style.borderColor = '';
		$("sms"+i+"_mini").style.backgroundImage = "";
		
		//$("sms"+i+"_mini_logo").style.display = "block";
	};
	this.subByCtrlEnter = function (num) {  
		var event = getEvent();   
		if(event.keyCode == 13) { 
		   this.send (num);        
	     }
	};
	this.escapCode = function(mess){
		var str = mess;
		while(str.indexOf("/") > -1){
			str = str.replace("/","&fxg;");
		}
		return str;
	};
	this.send = function (num){
		var mess = $("sms"+num+"_input").value;
		if(mess.trim() == ""){
			return;
		}
		
		var param = escape("who="+_sms_sequence[num-1]+"&date=" + new Date()+"&w="+sms.escapCode(mess));
		
		var myAjax = new Ajax.Request(_sms_send+"?"+param,{method: 'GET',asynchronous:true,onComplete:function (response){
			var xml = createXml(response.responseText)
			msg.talk(num-1,xml);
			sms.position(num);
			if($("im")){
				var st = "OFF";
				if($("friend_" +_sms_sequence[num-1] )){
					st = $("friend_" +_sms_sequence[num-1] ).getAttribute("st");
				}
				im.addTemp(_sms_sequence[num-1],_sms_nn_seq[num-1],st);
			}
		}});
		$("sms"+num+"_input").value = "";
		var evet = getEvent();
		if(evet){
			if(Client.Engine.ie){
				 evet.returnValue=false;
			}else{
				 evet.preventDefault();
			}
		}
	};
	this.callFaces = function(j , obj){
		var o = $("sms_face_pick");
		if(o.innerHTML == "" || !Client.Engine.ie){
			o.innerHTML = "";
			for( i = 0 ; i < _char.length ; i++){
			
				var d = document.createElement("div");
				
				d.className = "call_face_i";
				
				var img = document.createElement("img");
				
				img.src = _sp  + "images/faces/" + _char[i] + ".png";
				
				img.id = "face_" + _char[i];
				
				img.onclick = function(){
					
					var e = getEvent();
					var b = e.srcElement || e.target;
					var id = b.id.substring(5);
					sms.addFace(id);
				};
				d.appendChild(img);
				o.appendChild(d);
			}
		}
		
		o.style.display = "block";
		var event = getEvent();
		var icon = event.srcElement || event.target;
		var son = getElementPos(icon.id);
		var l = son.x;
		var t = son.y - $("sms_face_pick").offsetHeight;
		o.style.top = t + "px";
		o.style.left = l + "px";
		_sms_cur_dialog = j;
		var e = getEvent();
		if (!Client.Engine.ie){
			 e.stopPropagation();
		} else{
        	 window.event.cancelBubble  = true;
        }
         return false;
		
	}
	this.callafterload = function(){};
	this.addFace = function(tp){
		$("sms_face_pick" ).style.display = "none";
		if($("sms"+_sms_cur_dialog+"_input")){
			$("sms"+_sms_cur_dialog+"_input").value += "[\\"+tp+"]";
		}
	}
	this.faceCls = function(i){
		$("+ _sms_cur_dialog").style.display = "none";
	}
	this.keepFaces = function(){
		clearTimeout(_sms_faces_timer);
		_sms_faces_timer = setTimeout(function(){$("sms_faces").style.display = "none";} , 1500 );
	}
	this.position = function(i){
		var tar = $("sms"+i+"_b");
		if(tar.scrollHeight > 183){
			tar.scrollTop = tar.scrollHeight - 183;
		}
	}
	this.drag = function(i){
		if($("face_alert_div_" + _sms_cur_dialog))
			$("face_alert_div_" + _sms_cur_dialog).style.display = "none";
		var obj = $("sms" + i);
		sms.dragTarget = i;
		var event = getEvent();
		sms.ox = event.clientX - obj.offsetLeft;
		sms.oy = event.clientY - obj.offsetTop;
		$("sms"+i+"_t").style.cursor = "move";
		document.body.onmousemove = sms.move;
		document.body.onmouseup = sms.up;
		
	}
	this.move = function(){
		var obj = $("sms" + sms.dragTarget);
		var event = getEvent();
		var x = event.clientX;
		var y = event.clientY;
		obj.style.position = "absolute";
		obj.style.left = (x-sms.ox) + "px";
		obj.style.top = (y-sms.oy) + "px";
	}
	this.up = function(){
		var obj = $("sms" + sms.dragTarget);
		$("sms"+sms.dragTarget+"_t").style.cursor = "pointer";
		document.body.onmousemove = function(){};
		document.body.onmouseup = function(){};
	}
}
var sms = new Sms(3);
var msg = {
	append : function(cur , msgLst){
		var obj = $("sms"+cur+"_b");
		var t = 0 ;
			
		var ml = msgLst.length;
		
		while(t < ml){
			var m = msgLst[t];	
			
			var div = msg.MSG(cur,m);
			
			obj.appendChild(div);
				
			t++;
		}
	},
	MSG : function(cur,m){
			
			var s = getElement(m,"s",0);
			
			var top = msg.getTop(cur,m);
			
			var body = msg[s](cur,m);
			
			var div = document.createElement("div");
			
			div.className = msg.getClass(m);
			
			div.appendChild(top);
			
			div.appendChild(body);
			
			return div;
	},
	add : function(cur , msgLst){
		
		var ml = msgLst.length;

		var t = 0 ;
		
		while(t < ml){
				
			var m = msgLst[t];
			
			var div = msg.MSG(cur,m);
			
			msg.insert(cur,div);
				
			t++;
		}
				
	},
	insert : function(cur , div){
		var obj = $("sms"+cur+"_b");
		
		if(obj.innerHTML == ""){
			obj.appendChild(div);
		}else{
			obj.insertBefore(div,obj.firstChild);
		}
	},
	c : {
		"M" :"mess_mine",
		"Y":"mess_your"
	},
	getClass : function(m){
		var f = getElement(m,"f",0);
		return msg.c[f];
	},
	getTop : function(cur,m){
		 var top =  document.createElement("div");
		 
		 var f = getElement(m,"f",0);
		 
		 var s = getElement(m,"s",0);
		 
		 var nn;
		 
		 if(f == "M"){
		 	nn = "我";
		 }else{
			nn = _sms_nn_seq[cur -1];		 	
		 }
		 
		 var nnDiv = document.createElement("div");
		 
		 if(s == "RECODER"){
		 	var id = getElement(m,"i",0);
		 	var url = getElement(m,"u",0);
		 	nnDiv.innerHTML = nn + "给你发送了一段千里传音，点击&nbsp;<img onclick=\"util.play('" +id+ "','" + url+"')\" src='" +_sp+ "images/im/qlcy.gif' title='千里传音' />&nbsp;播放";
		 	nnDiv.className = "sms_top_qlcy";
		 }else if(s == "SHELL"){
		 	
		 	var d = getElement(m,"d",0);
		 	
		 	var r = getElement(m,"r",0);
		 	
		 	if(d == "CTNT"){
		 		nnDiv.innerHTML = nn + r;
		 	}else if(d == "AUDIO"){
		 		nnDiv.innerHTML = nn + r;
		 	}else if(d == "POST"){
		 		nnDiv.innerHTML = nn + r;
		 	}else if(d == "SPACE"){
		 		nnDiv.innerHTML = nn + r;
		 	}else if(d == "ALBUM"){
		 		nnDiv.innerHTML = nn + r;
		 	}else if(d == "VIDEO"){
		 		nnDiv.innerHTML = nn + r;
		 	}
		 	nnDiv.className = "sms_top_shell";
		 }else{
		 	
		 	 nnDiv.innerHTML = nn + "&nbsp;说:";
		 	 
			 nnDiv.className = "sms_top_nn";
			 
		 }
		
		 
		 top.className = "sms_top";
		 
		 top.appendChild(nnDiv);
		 
		 return top;
	},
	talk : function(cur,m){
		var top = msg.getTop(cur + 1,m);
		var body = msg["MESS"](cur + 1,m);
		var div = document.createElement("div");
		div.className = msg.getClass(m);
		div.appendChild(top);
		div.appendChild(body);
		var obj = $("sms"+(cur + 1)+"_b");
		obj.appendChild(div);
		var id = _sms_sequence[cur];
		if($("friend_" + id) || $("temp_" + id) ){
				var ff = im.fs[id] || im.datou[id];
				var tp = ff["S"];
				if(tp == "OFF"){
					var offmsg = document.createElement("div");
					offmsg.innerHTML = "【系统回复】对方已离线，上线时将看到你的留言。";
					offmsg.className = "sms_off_msg";
					obj.appendChild(offmsg);
				}
		}
		
	},
	'MESS' : function(cur,m){
		
		var div = document.createElement("div");

		div.innerHTML = getElement(m,"c",0);
		
		div.className = "mess_body_con";
		
		return div;
	},
	'RECODER' : function(cur,m){
		var div = document.createElement("div");

		div.id = "play_" + getElement(m,"i",0);
		
		div.className = "mess_body_qlcy";
		
		return div;
	},
	'SHELL' : function(cur,m){
		var div = document.createElement("div");
		
		div.className = "mess_body_shell";

		var d = getElement(m,"d",0);
		
		msg[d](cur,m,div);
		
		return div;
	},
	'CTNT' : function(cur,m,div){
		var a = document.createElement("a");
		var title = getElement(m,"title",0);
		var value = getElement(m,"value",0);
		a.innerHTML = title;
		a.href="javascript:track.info(this,'" +value+ "');";
		div.appendChild(a);
	},
	'AUDIO' : function(cur,m,div){
		var a = document.createElement("a");
		var title = getElement(m,"title",0);
		var url = getElement(m,"value",0);
		a.innerHTML = "《"+title + "》";
		a.href="javascript:util.turnToBox('" +title+ "','" +url+ "');";
		div.appendChild(a);
	},
	'POST' : function(cur,m,div){
		var a = document.createElement("a");
		var title = getElement(m,"title",0);
		var value = getElement(m,"value",0);
		a.innerHTML = title;
		a.href="javascript:track.bbs('" +value+ "');";
		div.appendChild(a);
	},
	'SPACE' : function(cur,m,div){
		var a = document.createElement("a");
		var title = getElement(m,"title",0);
		var uid = getElement(m,"uid",0);
		a.innerHTML = "《"+title + "》";
		a.href="javascript:util.toSpace('" +uid+ "');";
		div.appendChild(a);
	},
	'ALBUM' : function(cur,m,div){
		var a = document.createElement("a");
		var title = getElement(m,"title",0);
		var uid = getElement(m,"uid",0);
		var fid = getElement(m,"fid",0);
		a.innerHTML = "《"+title + "》";
		a.href="javascript:util.toAlbum('" +uid+ "','"+fid+"');";
		div.appendChild(a);
	},
	'VIDEO' : function(cur,m,div){
		var a = document.createElement("a");
		var title = getElement(m,"title",0);
		var vid = getElement(m,"vid",0); 
		a.innerHTML = "《"+title + "》";
		a.href="javascript:track.vedio(this,'" +  vid + "');";
		div.appendChild(a);
	}
}
