var tom = {
  VERSION: "3.1.1",
  COPYRIGHT: "www.tom.com",
  AUTHOR: "wudi msn:woodlessr@hotmail.com blog:http://blog.tom.com/woodless;",
  fnEmpty: function() {},
  fnTrue: function() { return true; },
  fnFalse: function() { return false; },
  fnEventStop: function(e) { tom.Event.stop(e||window.event); return false; }
};

tom.Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
};
if (typeof($) == 'undefined') {
  Class = tom.Class;
}

if (typeof($) == 'undefined') {
  $ = function(elem) {
    if (arguments.length > 1) {
      for (var i = 0, elems = [], length = arguments.length; i < length; i++)
        elems.push($(arguments[i]));
      return elems;
    }
    if (typeof elem == 'string') {
      return document.getElementById(elem);
    } else {
      return elem;
    }
  };
}
/*
 * 将类数组对象转换成Array对象
 */
if (typeof($A) == 'undefined') {
  $A = function(a) {
    var results = [];
    for (var i = 0, length = a.length; i < length; i++) {
      results.push(a[i]);
    }
    return results;
  };
}
/**
 * 从倒数第一个参数开始逐步将属性复制到前一个参数，参数数目必须大于1
 */
tom.extend = function(dist) {
  for (var i = 1; i < arguments.length; i++) {
    var src = arguments[i];
    for (var p in src) {
      dist[p] = src[p];
    }
  }
  return dist;
}
/*
 * 给String添加trim、startsWith、endsWith方法
 */
tom.extend(
  String.prototype,
  {
  	trim: function(s) {
  	  return s ? this.replace(new RegExp("^" + s + "+|" + s + "+$", "g"), "") : this.replace(/^\s+|\s+$/g, "");
    },
    ltrim: function(s) {
      return s ? this.replace(new RegExp("^" + s + "+", "g"), "") : this.replace(/^\s+|\s+$/g, "");
    },
    rtrim: function(s) {
      return s ? this.replace(new RegExp(s + "+$", "g"), "") : this.replace(/^\s+|\s+$/g, "");
    },
    startsWith: function(pf) {
      return (pf == "") ? true : (this.indexOf(pf) == 0);
    },
    endsWith: function (sf) {
      return (sf == "") ? true : (this.lastIndexOf(sf) == this.length - String(sf).length);
    }
  }
);

/**
 * package tom.util
 */
tom.util = {};
/*
 * class tom.util.List
 */
tom.util.List = tom.Class.create();
tom.extend(tom.util.List.prototype, {
  initialize: function() {
    this._l = [];
  },
  add: function(o) { this._l.push(o); },
  addAll: function(l) {
  	var a = (l instanceof tom.util.List || l instanceof tom.util.Set) ? l._l : l;
  	for (var i = 0; i < a.length; i++) {
  	  this._l.push(a[i]);
  	}
  },
  clear: function() { this._l.length = 0; },
  contains: function(o) { return this.indexOf(o) != -1; },
  get: function(i) { return this._l[i]; },
  indexOf: function(o) {
    for(var i = 0; i < this._l.length; i++){
      if(this._l[i] === o) {
        return i;
      }
    }
    return -1;
  },
  isEmpty: function() { return this._l.length == 0; },
  remove: function(i) { return this._l.splice(i, 1); },
  removeObject: function(o) { 
    var i = this.indexOf(o);
    return i != -1 ? this._l.splice(i, 1)[0] : null;
  },
  size: function() { return this._l.length; },
  toArray: function() { return [].concat(this._l); },
  dump: function() { return "[" + this._l.join(",") + "]"; },
  sort: function(fn) {
    this._l.sort(fn);
    return this;
  },
  filter: function(fnExp, fnCond) {
    return tom.util.Arrays.asList(tom.util.Arrays.filter(fnExp, this._l, fnCond));
  },
  each: function(fn) {
  	var l = this._l;
  	for (var i = 0, len = l.length; i < len; i++) {
  	  if (fn(l[i]) === false) break;
  	}
  }
});
tom.util.Set = tom.Class.create();
tom.extend(tom.util.Set.prototype, tom.util.List.prototype, {
  initialize: function() {
    this._l = [];
  },
  add: function(o) {
    if (this.indexOf(o) == -1) {
      this._l.push(o);
    }
  },
  addAll: function(s) {
  	var a = (s instanceof tom.util.List || s instanceof tom.util.Set) ? s._l : s;
    for (var i = 0; i < a.length; i++) {
      this.add(a[i]);
    }
  },
  filter: function(fnExp, fnCond) {
    return tom.util.Arrays.asSet(tom.util.Arrays.filter(fnExp, this._l, fnCond));
  }
});
tom.util.Map = tom.Class.create();
tom.extend(tom.util.Map.prototype, {
  initialize: function() {
    this._m = {};
  },
  clear: function() { this._m = {}; },
  containsKey: function(k) { return this._m.hasOwnProperty("_" + k); },
  containsValue: function(v) {
    for (var k in this._m) {
      if (this._m["_" + k] === v) {
        return true;
      }
    }
    return false;
  },
  get: function(k) { return this._m["_" + k]; },
  isEmpty: function() {
    for (var k in this._m) {
      return false;
    }
    return true;
  },
  keySet: function() {
  	var set = new tom.util.Set();
    var m = this._m;
    for (var i in m) {
      set.add(i.substring(1));
    }
    return set;
  },
  values: function() {
  	var a = [], m = this._m;
    for (var i in m) {
      a.push(m[i]);
    }
    return tom.util.Arrays.asList(a);
  },
  put: function(k, v) { return this._m["_" + k] = v; },
  remove: function(k) {
    var v = this._m["_" + k];
    delete(this._m["_" + k]);
    return v;
  },
  size: function() {
    var c = 0;
    for (var i in this._m) {
      c++;
    }
    return c;
  },
  filter: function(fnExp, fnCond) {
    fnExp = fnExp ? (typeof(fnExp) == "string" ? (new Function("k", "v", "return " + fnExp + ";")) : fnExp) : function(k, v) { return {k: k, v: v} };
    fnCond = fnCond ? (typeof(fnCond == "string" ? new Function("k", "v", "return (" + fnCond + ");") : fnCond)) : tom.fnTrue;
    
	var rst = new tom.util.Map();
	var m = this._m, v = null, t = null;
    for (var k in m) {
      v = m[k];
      k = k.substring(1);
      if (fnCond(k, v)) {
      	t = fnExp(k, v);
        rst.put(t.k, t.v);
      }
    }
    return rst;
  },
  each: function(fn) {
	var m = this._m, v = null;
    for (var k in m) {
      v = m[k];
      k = k.substring(1);
      if (fn(k, v) === false) break;
    }
  }
});
tom.extend(tom.util.Map, {
  fromObject: function(o) {
    var m = new tom.util.Map();
    for (var i in o) {
      m.put(i, o[i]);
    }
    return m;
  }
});

tom.util.Queue = tom.Class.create();
tom.extend(tom.util.Queue.prototype, {
  initialize: function() { this._q = []; },
  enqueue: function(o) { this._q.push(o); },
  dequeue: function() { return this._q.shift(); },
  peek: function() { return this._q[0]; },
  size: function() { return this._q.length; }
});

tom.util.Arrays = {
  asList: function(a) {
    var l = new tom.util.List();
    l._l = [].concat(a);
    return l;
  },
  asSet: function(a) {
    var s = new tom.util.Set();
    for (var i = 0, len = a.length; i < len; i++) {
      s.add(a[i]);
    }
    return s;
  },
  asMap: function(a, asType) {
  	asType = asType ? asType : 0;
  	var m = new tom.util.Map();
  	var tmp = null;
  	for (var i = 0, len = a.length, v = null; i < len; i++) {
  	  v = a[i];
      switch (asType) {
        case 0:
          m.put(v[0], v[1]);
          break;
        case 1:
          m.put(v, a[++i]);
          break;
        case 2:
          m.put(v.k, v.v);
          break;
        default:
          v = asType(v);
          m.put(v.k, v.v);
          break;
      }
  	}
  	return m;
  },
  filter: function(fnExp, arr, fnCond) {
    fnExp = fnExp ? (typeof(fnExp) == "string" ? new Function("o", "return " + fnExp + ";") : fnExp) : function(o) { return o; };
    fnCond = fnCond ? (typeof(fnCond) == "string" ? new Function("o", "return (" + fnCond + ");") : fnCond) : tom.fnTrue;
    var rst = [], o = null;
    for (var i = 0, l = arr.length; i < l; i++) {
      o = arr[i];
      if (fnCond(o)) {
        rst.push(fnExp(o));
      }
    }
    return rst;
  },
  contains: function(a, o) {
    for (var i = 0, len = a.length; i < len; i++) {
      if (a[i] === o) {
      	return true;
      }
    }
    return false;
  },
  each: function(a, fn) {
    for (var i = 0, c = a.length; i < c; i++) {
      if (fn(a[i]) === false) break;
    }
  }
};

//

tom.Event = {
  addEvent: function(elem, name, fn, useCapture) {
    if (elem.addEventListener) {
      elem.addEventListener(name, fn, useCapture);
    } else if (elem.attachEvent) {
      elem.attachEvent('on' + name, fn);
    }
  },
  removeEvent: function(elem, name, fn, useCapture) {
    if (elem.removeEventListener) {
      elem.removeEventListener(name, fn, useCapture);
    } else if (elem.detachEvent) {
      elem.detachEvent('on' + name, fn);
    }
  },
  pointer: function(e) {
    return {x: this.pointerX(e), y: this.pointerY(e)};
  },
  pointerX: function(e) {
    return e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
  },
  pointerY: function(e) {
    return e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
  },
  stop: function(e) {
    if (e.preventDefault) {
      e.preventDefault();
      e.stopPropagation();
    } else {
      e.returnValue = false;
      e.cancelBubble = true;
    }
  },
  isLeftClick: function(e) {
    return (((e.which) && (e.which == 1)) || ((e.button) && (e.button == 1)));
  }
};

//bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

tom.Cookie = {
  write: function(name, value, hours, path, domain, secure) {
    var expire = "";
    if(hours != null) {
      expire = new Date((new Date()).getTime() + hours * 3600000);
      expire = "; expires=" + expire.toGMTString();
    }
    path = path ? ("; path=" + path) : "";
    domain = domain ? ("; domain=" + domain) : "";
    document.cookie = name + "=" + encodeURIComponent(value) + expire + path + domain;
  },  
  read: function(name) {
    var cookieValue = "";
    var search = name + "=";
    if(document.cookie.length > 0) { 
      offset = document.cookie.indexOf(search);
      if (offset != -1) { 
        offset += search.length;
        end = document.cookie.indexOf(";", offset);
        if (end == -1) end = document.cookie.length;
        cookieValue = decodeURIComponent(document.cookie.substring(offset, end))
      }
    }
    return cookieValue;
  },
  remove: function(name, domain) {
    var exp = new Date();    
    exp.setTime (exp.getTime() - 65535);
    domain = domain ? ("; domain=" + domain) : "";
//    var cval = this.read(name);
    document.cookie = name + "=0; expires=" + exp.toGMTString() + "; path=/" + domain; 
  }
};

tom.Element = {
  getStyle: function(element, style) {
   var elem = typeof element == "string" ? $(element) : element;
    if (tom.util.Arrays.contains(['float','cssFloat'], style.toLowerCase())) {
      style = (typeof elem.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
    }
    var value = elem.style[style];
    if (!value) {
      if (document.defaultView && document.defaultView.getComputedStyle) {
        var css = document.defaultView.getComputedStyle(elem, null);
        value = css ? css[style] : null;
      } else if (elem.currentStyle) {
        value = elem.currentStyle[style];
      }
    }
    if((value == 'auto') && (tom.util.Arrays.contains(['width','height'], style.toLowerCase())) && (this.getStyle(elem, 'display') != 'none')) {
      value = elem['offset'+style.charAt(0).toUpperCase()+style.substring(1, style.length)] + 'px';
    }
    if (window.opera && (tom.util.Arrays.contains(['left', 'top', 'right', 'bottom'], style.toLowerCase()))) {
      if (this.getStyle(elem, 'position') == 'static') value = 'auto';
    }
    if(style == 'opacity') {
      if(value) return parseFloat(value);
      if(value = (elem.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if(value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }
    return value == 'auto' ? null : value;
  },

  setStyle: function(element, style, value) {
    var elem = typeof element == "string" ? $(element) : element;
    if(style == 'opacity') {
      if (value == 1) {
        value = (/Gecko/.test(navigator.userAgent) &&
          !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
        if(/MSIE/.test(navigator.userAgent) && !window.opera)
          elem.style.filter = elem.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
      } else if(value === '') {
        if(/MSIE/.test(navigator.userAgent) && !window.opera)
          elem.style.filter = elem.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
      } else {
        if(value < 0.00001) value = 0;
        if(/MSIE/.test(navigator.userAgent) && !window.opera)
          elem.style.filter = elem.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
            'alpha(opacity='+value*100+')';
      }
    } else if(tom.util.Arrays.contains(name, ['float','cssFloat'])) {
    	name = (typeof elem.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
    }
    elem.style[style] = value;
    return elem;
  }
};

tom.Position = {
  pointer: function(e) {
    return {x: (e.pageX || e.clientX), y: (e.pageY || e.clientY)};
  },
  pointerX: function(e) {
    return e.clientX || (e.pageX - tom.Position.getWindowScrollLeft());
  },
  pointerY: function(e) {
    return e.clientY || (e.pageY - tom.Position.getWindowScrollTop());
  },
  prepare: function() {
    this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
    this.deltaY =  window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
  },
  cumulativeOffset: function(elem, o) {
    var x = 0, y = 0;
    do {
      y += elem.offsetTop  || 0;
      x += elem.offsetLeft || 0;
      elem = elem.offsetParent;
    } while (elem);
    o = o || {};
    o.left = x;
    o.top = y;
    return o;
  },
  within: function(elem, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(elem, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(elem);
    return (y >= this.offset.top &&
            y <  this.offset.top + elem.offsetHeight &&
            x >= this.offset.left &&
            x <  this.offset.left + elem.offsetWidth);
  },
  withinVertical: function(elem, x) {
    this.offset = this.cumulativeOffset(elem);
    return (x >= this.offset.left && x < this.offset.left + elem.offsetWidth);
  },
  withinHorizontal: function(elem, y) {
    this.offset = this.cumulativeOffset(elem);
    return (y >= this.offset.top && y < this.offset.top + elem.offsetHeight);
  },
  withinIncludingScrolloffsets: function(elem, x, y) {
    var offsetcache = this.realOffset(elem);
    this.xcomp = x + offsetcache.left - this.deltaX;
    this.ycomp = y + offsetcache.top - this.deltaY;
    this.offset = this.cumulativeOffset(elem);
    return (this.ycomp >= this.offset.top &&
            this.ycomp <  this.offset.top + elem.offsetHeight &&
            this.xcomp >= this.offset.left &&
            this.xcomp <  this.offset.left + elem.offsetWidth);
  },
  bound: function(elem) {
  	var pos = this.cumulativeOffset(elem);
    return { x: pos.left, y: pos.top, w: elem.offsetWidth, h: elem.offsetHeight };
  },
  makeBound: function(el, bd) {
    this.cumulativeOffset(el, bd);
    bd.x = bd.left;
    bd.y = bd.top;
    bd.w = el.offsetWidth;
    bd.h = el.offsetHeight;
    return bd;
  },
  getWindowClientWidth: function() {
    return window.innerWidth 
        || document.documentElement.clientWidth
        || document.body.clientWidth
        || 0;
  },
  getWindowClientHeight: function() {
    return window.innerHeight 
        || document.documentElement.clientHeight
        || document.body.clientHeight
        || 0;
  },
  getWindowScrollWidth: function() {
    return window.scrollWidth 
        || document.documentElement.scrollWidth
        || document.body.scrollWidth;
  },
  getWindowScrollHeight: function() {
    return window.scrollHeight
        || document.documentElement.scrollHeight
        || document.body.scrollHeight;
  },
  getWindowScrollLeft: function() {
    if (window.scrollWidth) {
      return window.scrollLeft;
    } else if (document.documentElement.scrollWidth) {
      return document.documentElement.scrollLeft;
    } else if (document.body.scrollWidth) {
      return document.body.scrollLeft
    } else {
      return 0;
    }
  },
  getWindowScrollTop: function() {
    if (window.scrollWidth) {
      return window.scrollTop;
    } else if (document.documentElement.scrollWidth) {
      return document.documentElement.scrollTop;
    } else if (document.body.scrollWidth) {
      return document.body.scrollTop;
    } else {
      return 0;
    }
  }
};

tom.Effect = {
  setOpacity: function(elem, val) {
    if (document.all) {
      elem.style.filter = "alpha(opacity=" + val * 100 + ")";
    } else {
      elem.style.opacity = val;
    }
  }
};

tom.Image = {
  resizeImage: function(img, mw, mh) {
    var w = img.offsetWidth;
    var h = img.offsetHeight;
    if (w / h >= mw / mh) {
      if (w >= mw) {
	    img.style.width = mw + "px";
	  }
    } else {
      if (h >= mh) {
        img.style.height = mh + "px";
	  }
    }
  }
};



/** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08        **
 ** Code licensed under Creative Commons Attribution-ShareAlike License      **
 ** http://creativecommons.org/licenses/by-sa/2.0/                           **/
/**
 * Modified at 2007-05-18 By woodless
 * Email: woodlessr@hotmail.com
 */
tom.XHConn = tom.Class.create();
tom.extend(tom.XHConn.prototype, {
  initialize: function() {
    this.xmlhttp = false;
    this.isComplete = false;
    try { this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) { try { this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
    catch (e) { try { this.xmlhttp = new XMLHttpRequest(); }
    catch (e) { this.xmlhttp = false; }}}
  },
  connectAsync: function(url, method, vars, callback) {
    if (!this.xmlhttp) return false;
    this.isComplete = false;
    try {
      if (method.toUpperCase() == "GET") {
        this.xmlhttp.open(method, vars ? (url + "?" + vars) : url, true);
        vars = "";
      } else {
        this.xmlhttp.open(method, url, true);
        this.xmlhttp.setRequestHeader("Method", "POST " + url + " HTTP/1.1");
        this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      }
      var _this = this;
      this.xmlhttp.onreadystatechange = function() {
        if (_this.xmlhttp.readyState == 4 && !_this.isComplete) {
          _this.isComplete = true;
          callback(_this.xmlhttp);
        }
      };
      this.xmlhttp.send(vars);
    } catch(z) {
    	alert(z.message);
    	return false;
    }
    return true;
  },
  connectSync: function(url, method, vars, options) {
    if (!this.xmlhttp) return false;
    options = options ? options : {text: true, xml: false, json: false};
    this.isComplete = false;
    method = method.toUpperCase();
    try {
      if (method == "GET") {
        this.xmlhttp.open(method, url + "?" + vars, false);
        vars = "";
      } else {
        this.xmlhttp.open(method, url, false);
        this.xmlhttp.setRequestHeader("Method", "POST " + url + " HTTP/1.1");
        this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      }
      this.xmlhttp.send(vars);
    } catch(e) {
    	alert(e.message);
    	return false;
    }
    var o = {};
    if (options.text) {
      o["text"] = this.xmlhttp.responseText;
    }
    if (options.xml) {
      o["xml"] = this.xmlhttp.responseXML;
    }
     if (options.json) {
      o["json"] = eval("(" + this.xmlhttp.responseText + ")");
    }
    return o;
  }
});
tom.XHConn.Parameter = tom.Class.create();
tom.extend(tom.XHConn.Parameter.prototype, tom.util.Map.prototype, {
  initialize: function(m) {
  	m = m ? m : {};
  	tom.util.Map.prototype.initialize.apply(this, []);
  	tom.extend(this, m);
  },
  append: function(k, v) {
  	this.put(k, v);
  	return this;
  },
  $: function(k, v) {
  	this.put(k, v);
  	return this;
  },
  stringValue: function() {
  	var m = this._m;
	var s = "";
  	var i = 0;
  	var v = null;
  	for (var k in m) {
  	  if (i++ > 0) {
  	  	s += "&";
  	  }
  	  v = m[k];
  	  k = k.substring(1, k.length);
  	  s += k + "=" + encodeURIComponent(v);
  	}
  	return s;
  }
});
tom.XHConn.parseResult = function(xhq, options) {
  var opt = tom.extend({ text: true, xml: false, json: false}, options || {});
  var o = {};
  if (opt.text) {
    o["text"] = xhq.responseText;
  }
  if (opt.xml) {
    o["xml"] = xhq.responseXML;
  }
  if (opt.json) {
    o["json"] = eval("(" + xhq.responseText + ")");
  }
  return o;
}
tom.XHConn.quickFillGet = function(fillId, url, vars) {
  var xhc = new tom.XHConn();
  xhc.connectAsync(
    url, 
    "get", 
    vars ? vars : "", 
    function(xhq) {
      $(fillId).innerHTML = xhq.responseText;
    });
}

tom.config = {
  alert: {
  	_fnCallBack: function(msg, ico, fn, autoHide) {
  	  var cb = fn ? ((fn instanceof Function) ? fn : ((typeof(fn) == "string") ? new Function("e", fn) : tom.fnTrue)) : tom.fnTrue;
      alert(msg);
      cb();
  	},
  	getCallBack: function() {
  	  return this._fnCallBack;
  	}
  },
  information: {
  	_fnCallBack: function(msg, autoHide, fn) {
      var cb = fn ? ((fn instanceof Function) ? fn : ((typeof(fn) == "string") ? new Function("e", fn) : tom.fnTrue)) : tom.fnTrue;
      alert(msg);
      cb();
  	},
  	getCallBack: function() {
  	  return this._fnCallBack;
  	}
  },
  confirm: {
  	_fnCallBack: function(msg, fnOk, fnCancel, title) {
      var cbOk = fnOk ? ((fnOk instanceof Function) ? fnOk : ((typeof(fnOk) == "string") ? new Function("e", fnOk) : tom.fnTrue)) : tom.fnTrue;
      var cbCancel = fnCancel ? ((fnCancel instanceof Function) ? fnCancel : ((typeof(fnCancel) == "string") ? new Function("e", fnCancel) : tom.fnTrue)) : tom.fnTrue;
      confirm(msg) ? cbOk() : cbCancel();
  	},
  	getCallBack: function() {
  	  return this._fnCallBack;
  	}
  },
  login: {
  	_fnCallBack: function(backUrl) {
      alert("TODO. back to " + backUrl);
  	},
  	getCallBack: function() {
  	  return this._fnCallBack;
  	}
  }
};


/*
 * 提示框（类似alert）
 * msg: 提示信息
 * ico：图标，OK/ERROR/INFO
 * fn: 关闭提示框后执行的回调函数。（可选）
 * autoHide: 自动关闭的时间，如不添则不自动隐藏。（可选）
 */
tom.alert = function(msg, ico, fn, autoHide) {
  tom.config.alert.getCallBack()(msg, ico, fn, autoHide);
}

/*
 * 确认框（类似alert）
 * msg: 提示信息
 * fnOk: 点击ok按钮的回调函数。
 * fnCancel: 点击cancel的回调函数。
 * title: 标题（可选）
 */
tom.confirm = function(msg, fnOk, fnCancel, title) {
  tom.config.confirm.getCallBack()(msg, fnOk, fnCancel, title);
}

/*
 * 提示框（只是一个div）
 * msg: 提示信息
 * autoHide: 自动关闭的时间，如不添则不自动隐藏。
 * fn: 关闭提示框后执行的回调函数。（可选）
 */
tom.information = function(msg, autoHide, fn) {
  tom.config.information.getCallBack()(msg, autoHide, fn);
}

/*
 * 登录框（div）
 * todo
 */
tom.login = function(backUrl) {
  tom.config.login.getCallBack()(backUrl);
}

tom.login.onSubmit = function() {
  var tomid = $("tomidlogin");
  var tompwd = $("tompwdlogin");
  if (tomid.value.trim() == "") {
    alert("请输入用户名");
    return false;
  } else if (!/^(\d|[a-zA-Z])+(-|\.|\w)*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(tomid.value.trim())) {
    alert("请输入正确格式用户名");
    return false;
  }
  if (tompwd.value.trim() == "") {
    alert("请输入密码");
    return false;
  }
  try {
	var params = new tom.XHConn.Parameter().append("tomid", tomid.value).append("tompwd", tompwd.value).append("rdm", new Date().getTime()).stringValue();
	var xhconn = new tom.XHConn();
    xhconn.connectAsync("/passValidate.php", "post", params, function(xhr) {
        if (xhr.responseText == "true") {
          document.getElementById("loginFormLw").submit();
        } else {
          tom.alert("用户名或密码不正确", "ERROR");
          return false;
        }
      });
    } catch (e) {
      return false;
    }  
    return false;
}
tom.login.autoCompleteUserId = function() {
  var tomid	= $("tomidlogin").value.trim();
  var constant = "@tom.com";
  if (tomid.length > 0 && tomid.indexOf("@") == -1) {
    $("tomidlogin").value = tomid + constant;
  }
  return;
}
