﻿/**
author:<a href="http://wolfforjava.spaces.live.com/">wolf</a>
*/
var Prototype = {
  Version: '1.6.0.2',
  //查看浏览器版本
  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  },
  //是否支持xpath
  BrowserFeatures: {
    XPath: !!document.evaluate
  },
  //<script>节点判断
  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  //空方法
  emptyFunction: function() { },
  K: function(x) { return x }
};
/**
创建构造方法
*/
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()[0] == "$super") {
        var method = value, value = Object.extend((function(m) {
          return function() { return ancestor[m].apply(this, arguments) };
        })(property).wrap(method), {
          valueOf:  function() { return method },
          toString: function() { return method.toString() }
        });
      }
      this.prototype[property] = value;
    }

    return this;
  }
};
/**
属性继承
*/
Object.extend = function(destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
	return destination;
};
//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(query.snapshotItem(i));
	return results;
};
if (!window.Element) var Element = new Object();
Element.extend = function(element) {
	if (!element) return;
	if (_nativeExtensions || element.nodeType == 3) return element;
	if (!element._extended && element.tagName && element != window) {
		var methods = Object.clone(Element.Methods),
		cache = Element.extend.cache;
		for (var property in methods) {
			var value = methods[property];
			if (typeof value == 'function' && !(property in element)) element[property] = cache.findOrStore(value);
		}
		var Methods = { }, ByTag = Element.Methods.ByTag;
		var methods = Object.clone(Methods),tagName = element.tagName, property, value;
		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();
		}
	}
	return element;
};
Element.getCheckBoxGroup = function(groupName) {
	return document.getElementsByName(groupName);
};
Element.extend.cache = {
	findOrStore: function(value) {
		return this[value] = this[value] || function() {
			return value.apply(null, [this].concat($A(arguments)));
		}
	}
};
Element.Methods = {
	//节点是否可见
	visible: function(element) {
		return $(element).style.display != 'none';
	},
	//隐藏节点
	hide: function(element) {
		$(element).style.display = 'none';
		return element;
	},
	//显示节点
	show: function(element) {
		$(element).style.display = '';
		return element;
	},
	//移除节点
	remove: function(element) {
		element = $(element);
		element.parentNode.removeChild(element);
		return element;
	},
	//取得某节点下含有class的子节点
	getElementsByClassName: function(element, className) {
		element = $(element);
		return document.getElementsByClassName(className, element);
	},
	//滚动到该节点
	scrollTo: function(element) {
		element = $(element);
		var pos = element.cumulativeOffset();
		window.scrollTo(pos[0], pos[1]);
		return element;
	},
	//取得该节点的坐标
	cumulativeOffset : function(element) {
		element = $(element);
		return Position.cumulativeOffset(element);
	},
	//判断该节点是否含有className
	hasClassName: function(element, className) {
		if (!(element = $(element))) return;
		var elementClassName = element.className;
		if (elementClassName.length == 0) return false;
		if (elementClassName == className ||elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) return true;
		return false;
	},
	//取得所有具有同一属性的节点
	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 $A($(element).getElementsByTagName('*')).each(Element.extend);
	},
	//取得该节点的第一个子节点
	firstDescendant: function(element) {
		element = $(element).firstChild;
		while (element && element.nodeType != 1) element = element.nextSibling;
		return $(element);
	},
	//查找父节点
	up : function(element,expression,index) {
		element = $(element);
		if (arguments.length == 1) return $(element.parentNode);
		var ancestors = element.ancestors();
		return expression?element.findElement(ancestors,expression,index):ancestors[index || 0];
	},
	//查找节点
	findElements : function(element,elements,expression) {
		element = $(element);
		var exprs = [];
		Object.isNumber(expression)? index = expression:exprs = expression.split('.');
		var tagName = exprs[0] || "",className = exprs[1] || "";
		if(tagName.empty() && className.empty()) return elements[index];
		var result = [];
		for(var i = 0 ; i < elements.length;i++) {
			var find = elements[i];
			if(find.tagName.toLowerCase() == tagName) {
				if(className.empty()) {
					result.push(find);
				} else if(find.className ==className) {
					result.push(find);
				}
			}
		}
		return result;
	},
	//查找节点
	findElement : function(element,elements,expression,index) {
		var result = element.findElements(elements,expression);
		return $(result[index || 0]);
	},
	//查找子节点
	down : function(element,expression,index) {
		element = $(element);
		if (arguments.length == 1) return element.firstDescendant();
		var descendants = element.descendants();
		return expression ? element.findElement(descendants,expression,index):descendants[index || 0];
	},
	//判断该节点是否具有某属性
	hasAttribute : function(element,attribute) {
		element = $(element);
		return (element.getAttribute(attribute) == null || (typeof element.getAttribute(attribute) == "undefined"));
	},
	//查找下一个相邻节点
	nextElementSibling: function(element) {
	    element = $(element);
        while (element = element.nextSibling)
	      if (element.nodeType == 1) return $(element);
        return null;
    },
	//查找上一个相邻节点
    previousElementSibling: function(element) {
        element = $(element);
        while (element = element.previousSibling)
          if (element.nodeType == 1) return $(element);
        return null;
    }
};
Element.Methods.ByTag = { };
Object.extend(Element, Element.Methods);
Element._returnOffset = function(l, t) {
	var result = [l, t];
	result.left = l;
	result.top = t;
	return result;
};
var Position = {
	//取得节点坐标
	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);
	},
	//取得节点相对坐标
	offsetParent: 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;
    }
};
document.getElementsByClassName = function(className, parentElement) {
	if (Prototype.BrowserFeatures.XPath) {
		var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
		return document._getElementsByXPath(q, parentElement);
	} else {
		var children = ($(parentElement) || document.body).getElementsByTagName('*');
		var elements = [], child;
		for (var i = 0, length = children.length; i < length; i++) {
			child = children[i];
			if (Element.hasClassName(child, className))elements.push(Element.extend(child));
		}
		return elements;
	}
};
Object.extend(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;
	},
	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].split(",").invoke("strip");
		return names.length == 1 && !names[0] ? [] : names;
	},
	bind: function() {
		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).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)));
		};
	}
});
Object.extend(Number.prototype, {
  succ: function() {
    return this + 1;
  },
  dec : function(){
	return this -1;
  }
});
Object.extend(Date.prototype, {
	format : function(format) {
		var o = {
			"M+" : this.getMonth()+1,
			"d+" : this.getDate(),
			"h+" : this.getHours(),
			"m+" : this.getMinutes(),
			"s+" : this.getSeconds(),
			"q+" : Math.floor((this.getMonth()+3)/3), 
			"S" : this.getMilliseconds()
		}
		if(/(y+)/.test(format)) {
			format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));
		}
		for(var k in o) {
			if(new RegExp("("+ k +")").test(format)) {
				format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
			}
		}
		return format;
	}
});
var $break = new Object();
var $continue = new Object();
var Enumerable = {
	each: function(iterator) {
		var index = 0;
		try {
			this._each(function(value) {
				try {
					iterator(value, index++);
				} catch (e) {
					if (e != $continue) throw e;
				}
			});
		} catch (e) {
			if (e != $break) throw e;
		}
		return this;
	},
	all: function(iterator, context) {
		iterator = iterator ? iterator.bind(context) : Prototype.K;
		var result = true;
		this.each(function(value, index) {
			result = result && !!iterator(value, index);
			if (!result) throw $break;
		});
		return result;
	},
	findAll: function(iterator, context) {
		iterator = iterator.bind(context);
		var results = [];
		this.each(function(value, index) {
			if (iterator(value, index)) results.push(value);
		});
		return results;
	},
	inject: function(memo, iterator, context) {
		iterator = iterator.bind(context);
		this.each(function(value, index) {
			memo = iterator(memo, value, index);
		});
		return memo;
	},
	collect: function(iterator, context) {
		iterator = iterator ? iterator.bind(context) : Prototype.K;
		var results = [];
		this.each(function(value, index) {
			results.push(iterator(value, index));
		});
		return results;
	},
	detect: function(iterator, context) {
		iterator = iterator.bind(context);
		var result;
		this.each(function(value, index) {
			if (iterator(value, index)) {
				result = value;
				throw $break;
			}
		});
		return result;
	},
	include: function(object) {
		var found = false;
		this.each(function(value) {
			if (value == object) {
				found = true;
				throw $break;
			}
		});
		return found;
	},
	pluck: function(property) {
		var results = [];
		this.each(function(value) {
			results.push(value[property]);
		});
		return results;
	},
	invoke: function(method) {
		var args = $A(arguments).slice(1);
		return this.map(function(value) {
			return value[method].apply(value, args);
		});
	}
};
Object.extend(Enumerable,{
	map: Enumerable.collect,
	find: Enumerable.detect
});
var $A = Array.from = function(iterable) {
	if (!iterable) return [];
	if (iterable.toArray) {
		return iterable.toArray();
	} else {
		var results = [];
		for (var i = 0, length = iterable.length; i < length; i++) results.push(iterable[i]);
		return results;
	}
};
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]);
	},
	indexOf: function(object) {
		for (var i = 0, length = this.length; i < length; i++) if (this[i] == object) return i;
		return -1;
	},
	//如果为false,先复制数组再反转,不改变原数组
	reverse: function(inline) {
		return (inline !== false ? this : this.toArray())._reverse();
	},
	//去重复
	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;
		});
    },
	without: function(value) {
		if(Object.isElement(value)) return this.include(value)?this.remove(this.indexOf(value)):this;
		if(Object.isString(value)) {
			var em = this;
			this.each(function(link,index){
				if(link.className.include(value)) {
					em = em.remove(index);
				}			
			});
			return em;
		}
		return this;
	},
	remove : function(num) {
		//掐头去尾
		if(num<0) return this;
		else return this.slice(0,num).concat(this.slice(num+1,this.length));
	},
	clone: function() {
		return [].concat(this);
	}
});
Array.prototype.toArray = Array.prototype.clone;
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++) {
			//constructor 数据类型
			if(arguments[i].constructor == Array) {
				for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) array.push(arguments[i][j]);
			} else {
				array.push(arguments[i]);
			}
		}
		return array;
	}
};
function $(element) {
	if (arguments.length > 1) {
		for (var i = 0, elements = [], length = arguments.length; i < length; i++) elements.push($(arguments[i]));
		return elements;
	}
	if (typeof element == 'string') element = document.getElementById(element);
	return Element.extend(element);
};
var _nativeExtensions = false;
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;
	}
};
var Form = {};
Form.Methods = {
  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;
      }
    );
  },
  serializeElements : function(element) {
	return Form.getElements(element).inject([],function(elements,element) {
		if(element.disabled || element.type=='submit' || (element.tagName.toLowerCase() == "input" && (element.type.toLowerCase() == "radio" || element.type == "checkbox") && !element.checked)) {
			return elements;
		}
		elements.push({key : element.name,value : encodeURIComponent(element.value)});
		return elements;
	});
  }
};
Form.Element = {};
Form.Element.Methods = {
	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;
	},
	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;
	}
};
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, index) {
    if (Object.isUndefined(index))
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, value, single = !Object.isArray(index);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        value = this.optionValue(opt);
        if (single) {
          if (value == index) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = index.include(value);
      }
    }
  },
  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) {
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
};
if (!window.Event) var Event = { };
Object.extend(Event, {
	KEY_RETURN: 13,
	cache: { }
});
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;
  }
  if (window.attachEvent) {
    window.attachEvent("onunload", destroyCache);
  }
  return {
    observe: function(element, eventName, handler) {
      element = $(element);
      var name = getDOMEventName(eventName);

      var wrapper = createWrapper(element, eventName, handler);
      if (!wrapper) return element;

      if (element.addEventListener) {
        element.addEventListener(name, wrapper, false);
      } else {
        element.attachEvent("on" + name, wrapper);
      }
      return element;
    },
    stopObserving: function(element, eventName, handler) {
      element = $(element);
      var id = getEventID(element), name = getDOMEventName(eventName);
      if (!handler && eventName) {
        getWrappersForEventName(id, eventName).each(function(wrapper) {
          element.stopObserving(eventName, wrapper.handler);
        });
        return element;
      } else if (!eventName) {
        Object.keys(getCacheForID(id)).each(function(eventName) {
          element.stopObserving(eventName);
        });
        return element;
      }
      var wrapper = findWrapper(id, eventName, handler);
      if (!wrapper) return element;
      if (element.removeEventListener) {
        element.removeEventListener(name, wrapper, false);
      } else {
        element.detachEvent("on" + name, wrapper);
      }
      destroyWrapper(id, eventName, handler);
      return element;
    },
	fire: function(element, eventName, memo) {
      element = $(element);
      if (element == document && document.createEvent && !element.dispatchEvent)
        element = document.documentElement;
      var event;
      if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent("dataavailable", true, true);
      } else {
        event = document.createEventObject();
        event.eventType = "ondataavailable";
      }
      event.eventName = eventName;
      event.memo = memo || { };
      if (document.createEvent) {
        element.dispatchEvent(event);
      } else {
        element.fireEvent(event.eventType, event);
      }
      return Event.extend(event);
    }
  };
})());
Event.Methods = (function() {
  return {
    element: function(event) {
      var node = $(Event.extend(event).target);
      return node.nodeType == 3 ? node.parentNode : node;
    },
    pointer: function(event) {
      return {
        x: event.pageX || (event.clientX +
          (document.documentElement.scrollLeft || document.body.scrollLeft)),
        y: event.pageY || (event.clientY +
          (document.documentElement.scrollTop || document.body.scrollTop))
      };
    },
    pointerX: function(event) { return Event.pointer(event).x },
    pointerY: function(event) { return Event.pointer(event).y }
  };
})();
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) {
    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,
        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, Event.Methods);
Object.extend(Element.Methods,{
  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
});
Object.extend(String.prototype, {
	len: function() {
		return this.replace(/[^\x00-\xff]/g,"aa").length;
	},
	sub : function(start,end) {
		var str = "";
		for(var i=0;i<this.length;i++){
			str += this.charAt(i).match("[^\x00-\xff]") ? this.charAt(i)+"<" : this.charAt(i);
		}
		return str.substring(start,end).replace(/</g,"");
	},
	truncate: function(length, truncation) {
		length = length || 30;
		//truncation = Object.isUndefined(truncation) ? '...' : truncation;
		truncation = truncation || "...";
		return this.len() > length ? this.sub(0, length - truncation.length) + truncation : String(this);
	},
	trim : function() {
		return this.replace(/\s+$/, '');
	},
	strip: function() {
		return this.replace(/^\s+/, '').replace(/\s+$/, '');
	},
	toArray: function() {
		return this.split('');
	},
	include: function(pattern) {
		return this.indexOf(pattern) > -1;
	},
	escapeHTML : function() {
		return this.replace(/\</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"").replace(/'/g,"").replace(/(^\s*)|(\s*$)/g, "");
	},
	unescapeHTML : function() {
		return this.replace(/<br>/g, "\n");
	},
	empty: function() {
		return this.strip() == '';
	},
	isEmail : function() {
		return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(this);
	},
	isUserName : function() {
		return (/^\w+$/.test(this)&&this.length>3&&this.length<31) || this.isEmail();
	},
	isPass : function() {
		return /^\w+$/.test(this)&&this.length>5&&this.length<17;
	},
	isMobile : function() {
		return /^((\(\d{3}\))|(\d{3}\-)|(\(\d{4}\)))?(0)?(1)(3|5|8|4)\d{9}$/.test(this);
	},
	isPhone : function() {
		return /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/.test(this);
	},
	isZipcode : function() {
		return /^[0-9]\d{5}$/.test(this);
	},
	isNumber : function() {
	  //return /^[0-9]+$/.test(this);
	  return /(^[0-9]+$)|(^[0-9]+)(.[0-9]+$)/.test(this);
	},
	isIDCard : function() {
		return /(^\d{15}$)|(^\d{17}([0-9]|(X|x))$)/.test(this);
	},
	betweenTime : function(DateOne) {
		var DateTwo = this;
		var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-'));
		var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);
		var OneYear = DateOne.substring(0,DateOne.indexOf ('-'));
		var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-'));
		var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);
		var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-'));
		var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);
		return cha;  
	},
	isMoney : function(length) {
		var result = false;
		if(this.isNumber()) {
			var index = this.indexOf(".");
			var ss = this.substring(index+1);
			if(ss.length == length || index==-1){
				result = true;
			}
		}
		return result;
	}
});
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)
});
var Request = Class.create({
	initialize : function(url,options) {
		this.options = {
			method : 'post',
			asynchronous : true,
			contentType : 'application/x-www-form-urlencoded',
			encoding : 'UTF-8',
			parameters : '',
			callback : Prototype.emptyFunction
		};
		this.url = url;
		Object.extend(this.options, options || { });
		this.parameters = this.options.parameters;
	},
	setParameter : function(key,value) {
		if(Object.isArray(key)) {
			for(var i = 0;i<key.length;i++) {
				this.setParameter(key[i].key,key[i].value);	
			}
		} else {
			this.parameters += (this.parameters.empty())?"":"&";
			this.parameters += key + "=" + value;
		}
	},
	XMLHttpRequest : function() {
		var oRequest;
		if (window.ActiveXObject) {
			var axarray = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
			for (var i = 0; i < axarray.length; i++) {
				try {
					oRequest = new ActiveXObject(axarray[i]);
					break;
				} catch (ex) {   }
			}
		} else if (window.XMLHttpRequest) {
			oRequest = new XMLHttpRequest();
		}
		return oRequest;
	},
	send : function() {
		DWREngine._PreHook();
		var xmlhttp = this.XMLHttpRequest();
		this.method = this.options.method;
		var issend = false;
		if(this.method.toLowerCase()=="get") {
			this.url = this.url + "?" + this.parameters;
		} else { issend = true;}
		if(xmlhttp) {
			var callback = this.options.callback.bind(this);
			xmlhttp.open(this.method.toUpperCase(),this.url,this.options.asynchronous);
			xmlhttp.setRequestHeader("Content-Type",this.options.contentType);
			xmlhttp.onreadystatechange = function() {
				if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
					//var reqs = evalJson(xmlhttp.responseText || xmlhttp.responseXML);
					/*if(!reqs.result) {
						if(reqs.msg) alert(reqs.msg);
					} else {
					    callback(reqs);	
					}*/
					callback(xmlhttp.responseText || xmlhttp.responseXML);
					DWREngine._PostHook();
			  	}
			}
		    xmlhttp.send(issend ? this.parameters : null);
		 }
	}
});
function evalJson(json) {
	try{
		return eval('(' + json + ')');
	} catch(e) {}
};
if(!HtmlBuilder) var HtmlBuilder = {};
function reLoad() {
	window.location.reload();
};
var bubble = function(event) {
	var ev = window.event || event;
	ev.cancelBubble = true;
	return ev;
};
var _noselect = function(typ) {
	document.body.style.MozUserSelect = !typ ? "none" : "";
	document.onselectstart = function() {
		return typ;
	};
};
Object.extend(Element.Methods,{
	get : function(element,key){
		return element.getAttribute(key);
	},
	set : function(element,key,value){
		element.setAttribute(key,value);
	},
	//TODO event考虑去掉
	screenCenter : function(element,event) {
		var offHeight = element.offsetHeight;
		var offWidth = element.offsetWidth;
		var scrollTop = document.body.scrollTop;
		if(!document.body.scrollTop){
                     scrollTop = document.documentElement.scrollTop;
               }
		element.hide();
		with(element.style) {
			position = "absolute";
			top = ((document.documentElement.clientHeight - offHeight) / 2 + scrollTop) + "px";
			left = (document.documentElement.clientWidth - offWidth) / 2 + document.body.scrollLeft + "px";
			zIndex = 1001;
		}
		element.show();
	},
	bottomFrm : function(element) {
		var ifm = $(document.createElement('iframe'));
		var pos = element.cumulativeOffset();
		with(ifm.style) {
			position = "absolute";
			zIndex = 1000;
			top = pos[1];
			left = pos[0];
			width = element.offsetWidth + "px";
			height = element.offsetHeight + "px";
			background = "#FFF";
			opacity = 0;
			filter = "alpha(opacity=0)";
		}
		document.body.appendChild(ifm);
		return ifm;
	},
	frameDialog : function(element) {
		var ifm = $(document.createElement("iframe"));
		with(ifm.style) {
			position = "absolute";
			zIndex = 1000;
			left = "0px";
			top = document.body.scrollTop;
			width = "99%";
			height = "99%";
			background = "#FFF";
			opacity = 0;
			filter = "alpha(opacity=0)";
		}
		document.body.appendChild(ifm);
		return ifm;
	},
	gradient : function(element,reverse) {
		element = $(element);
		var show = function(i) {
			element.style.filter = "alpha(opacity="+i+")";
			element.style.opacity = i/100;
			if(reverse && i==10) {
				element.hide();
			}
		};
		if(reverse) {
			for(var j = 100;j>=0;j--) {
				window.setTimeout(show.bind(this,j),(j/100)*5);
		    }
		} else {
			element.style.filter = "alpha(opacity="+1+")";
		    element.style.opacity = 0.1;
		    element.show();
			for(var j = 1;j<=100;j++) {
				window.setTimeout(show.bind(this,j),j*5);
		    }
		}
	}
});
function copyToClipBoard(str) {
	var clipBoardContent = str;
	if(window.clipboardData) {
		window.clipboardData.setData("Text",clipBoardContent);
		alert("复制成功！");
	} else if(window.netscape) {
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
			var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
		    if(!clip) return;
		    var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
			if(!trans) return;
		    trans.addDataFlavor("text/unicode");
		    var str1 = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
		    str1.data = clipBoardContent;
		    trans.setTransferData("text/unicode",str1,clipBoardContent.length * 2);
		    var clipid = Components.interfaces.nsIClipboard;
	        clip.setData(trans,null,clipid.kGlobalClipboard);
			alert("复制成功！");
		}  catch (e) {
			alert("!!被浏览器拒绝！\n请在浏览器地址栏输入’about:config’并回车\n然后将’signed.applets.codebase_principal_support’设置为’true’");
		}
	}
};
var Cook = {
	set : function(name,value,expires){
		var edate = new Date();
		if(expires){
			edate.setTime(edate.getTime()+(expires*1000));
		}
		document.cookie = name + "=" + escape(value) + (expires ? ";expires=" + edate.toGMTString() : "") + ";path=/;domain=.haotehui.com";
	},
	get : function(name){
		var cookie = document.cookie;
		var first = cookie.indexOf(name + "=");
		if(first != -1){
			first += name.length.succ();
			var last = cookie.indexOf(";",first);
			if(last==-1){
				last = cookie.length;
			}
			return unescape(cookie.substring(first,last));
		}
		return "";
	}
};
function evalFunction(obj) {
	Try.these(
		function() {
			obj();
		},
		function() {
			return ;
		}
	);
};
var clearmdown = function() {
	evalFunction(document.onmousedown);
};
var clearkdown = function() {
	evalFunction(document.onkeydown);
};
var _cansel = function(sel) {
	sel.onselectstart = function() {
		window.event.cancelBubble = true;
	};
	sel.onmouseover = function() {
		_noselect(true);
	};
	sel.onmouseout = function() {
		_noselect(false);
	};
};
var checkboxGroup = {
	select : function(groupName) {
		this.selectItem(groupName,true);
	},
	unselect : function(groupName) {
		this.selectItem(groupName,false);
	},
	getSelectItem : function(groupName,element) {
		return this.getSelect(groupName,true,element);
	},
	getUnSelectItem : function(groupName,element) {
		return this.getSelect(groupName,false,element);
	},
	selectItem : function(groupName,selected) {
		var checkboxs = $A(Element.getCheckBoxGroup(groupName));
		checkboxs.each(function(checkbox) {
			checkbox.checked = selected;   
		});
	},
	getSelect : function(groupName,selected,element) {
	    var checkboxs = [];
	    if(element) {
	              checkboxs = $A(element.getElementsByTagName("input")).findAll(function (input) {
	              return input.type == "checkbox" && input.name == groupName;
	              });
	       } else {
	              checkboxs = $A(Element.getCheckBoxGroup(groupName));
	       }
		return checkboxs.findAll(function(checkbox) {
			return checkbox.checked == selected;
		});
	}
};
function radioGroup(groupName) {
	var radios = $A(Element.getCheckBoxGroup(groupName));
	var element = radios.find(function(radio) {
		return radio.checked;
	});
	return $(element);
};
function selectGroup(element) {
    element = $(element);
	var index = element.selectedIndex;
	return $(element.options[index]);
};
function loadImage(url, callback) {
    var img = new Image();
    img.src = url;
    if (img.complete) {
        callback.call(img);
        return;
    }
    img.onload = function () {
        callback.call(img);
    };
};
//TODO 可改进
function DrawImage(ImgD,FitWidth,FitHeight){
	var image = new Image();
	image.src = ImgD.src;
	if(image.width>0 && image.height>0) {
		if(image.width / image.height >= FitWidth / FitHeight) {
			var sw = image.width > FitWidth;
			ImgD.width = sw ? FitWidth : image.width;
			ImgD.height = sw ? ((image.height*FitWidth) / image.width) : image.height;
		} else {
			var ws = image.height > FitHeight;
			ImgD.height = ws ? FitHeight : image.height;
			ImgD.width = ws ? ((image.width * FitHeight) / image.height) : image.width;
		}
	}
};
function clearContent(element,str) {
    if(element.value==str) element.value = "";
};
window.debugModel = false;
function errorHandler(msg,url,line) {
	if(window.debugModel) {
		alert("错误信息:" + msg);
	    alert("行号:" + line);
	    return false;
	}
	return false;
};
window.onerror = errorHandler;
function jump(url) {
	window.location.href = url;
};
function filter(userName) {
    var filterCode = [];
    filterCode[0] = "他妈的";
    filterCode[1] = "好特好";
    filterCode[2] = "管理员";
    filterCode[3] = "haotehao";
    var result = false;
    for(var i = 0 ;i<filterCode.length;i++) {
       if(userName.indexOf(filterCode[i])!=-1) {
          result = true;
          break;
        }
    }
    return result;
};
/*
function messages() {
	var loadingMessage = "请稍候……";
	var dis = document.createElement("div");
	dis.setAttribute("id","dis");
	with(dis.style) {
		position = "absolute";
		zIndex = 1000;
		left = "0px";
		top = document.body.scrollTop;
		width = "99%";
		height = "99%";
		background = "#FFF";
		opacity = 0;
		filter = "alpha(opacity=0)";
	}
	var ifm = document.createElement("iframe");
	ifm.setAttribute("id","disf");
	ifm.style.cssText = dis.style.cssText;
	document.body.appendChild(ifm);
	document.body.appendChild(dis);
	var msg = document.createElement("div");
	msg.setAttribute("id","msgs");
	with(msg.style) {
		position="absolute";
		top = document.body.scrollTop;
		right = "0px";
		background = "#C00";
		color = "white";
		fontFamily = "Arial,Helvetica,sans-serif";
		padding = "4px";
		zIndex = 1001;
	}
	document.body.appendChild(msg);
	var text = document.createTextNode(loadingMessage);
	msg.appendChild(text);
};
function removeMessages() {
	document.body.removeChild(document.getElementById("msgs"));
	document.body.removeChild(document.getElementById("disf"));
	document.body.removeChild(document.getElementById("dis"));
};*/
if(!DWREngine) var DWREngine = {};
Object.extend(DWREngine,{
	preHook : null,
	postHook : null,
	global : false,
	_setPreHook : function(preHook) {
		this.preHook = preHook;
	},
	_setPostHook : function(postHook) {
		this.postHook = postHook;
	},
	_PreHook : function() {
		if(this.global) evalFunction(this.preHook);
	},
	_PostHook : function() {
		if(this.global) evalFunction(this.postHook);
	}
});
//发团4步导航
function changeNavigation(num,gpid,flag){
	if(gpid=="0"){
		alert("此团还没有发布，您不能编辑其他信息！");
		return;
	}
	if(flag){
		alert("请先编辑【基本属性设置】，发布团购第二步！")
		return;
	}
	document.getElementById("menu"+num).className="navigation2";
	for(var i=1;i<=4;i++){
		if(i==num){
			continue;
		}
		document.getElementById("menu"+i).className="navigation1";
	}
	var newNum = num;
	if(num == 0 || num == 1){
		newNum="";
	}
	window.location.href='/admin/groupPurchase/jump'+newNum+'.jhtml?step='+num+'&gpId='+gpid;
}

function changeNavigationKzg(num,gKzgId,flag){
	if(gKzgId=="0"){
		alert("此自定价团购活动还没有发布，您不能编辑其他信息！");
		return;
	}
	if(flag){
		alert("请先编辑【基本属性设置】，发布自定价团购活动第二步！")
		return;
	}
	document.getElementById("menu"+num).className="navigation2";
	for(var i=1;i<=3;i++){
		if(i==num){
			continue;
		}
		document.getElementById("menu"+i).className="navigation1";
	}
	var newNum = num;
	if(num == 0 || num == 1){
		newNum="";
	}
	window.location.href='/admin/kzg/kzgJump'+newNum+'.jhtml?step='+num+'&gKzgId='+gKzgId;
}
function fGetElementsByName(sTag, sName) {
                //非IE
                var objIeTags = document.getElementsByName(sName);
                if (objIeTags.length > 0) return objIeTags;

                //For IE
                var objIeTags = new Array();
                var objIEs = document.getElementsByTagName(sTag);
                for (var iIE = 0; iIE < objIEs.length; iIE++)
                       if (objIEs[iIE].getAttribute("name") == sName)
                               objIeTags[objIeTags.length] = objIEs[iIE];
                return objIeTags;
 }
/*
DWREngine._setPreHook(messages);
DWREngine._setPostHook(removeMessages);*/
function valUser(){
	if($("#userName").val().empty()){
	   alert("请填写您的邮箱");
	   $("#userName").focus();
       return false;
	}
	if(!$("#userName").val().isEmail()){
		alert("您填写的邮箱有误，请重新填写");
		$("#userName").val("");
	    $("#userName").focus();
        return false;
	}
	if($("#userName").val().len()>32){
		alert("您填写的邮箱有误，请重新填写");
		$("#userName").val("");
	    $("#userName").focus();
        return false;
	}
	if($("#password").val().empty()){
	   alert("请填写密码");
	   $("#password").focus();
       return false;
	}
	if(!$("#password").val().isPass()) {
        alert("您填写的密码不符合规则，请按要求重新填写");
        $("#password").val("");
        $("#passwords").val("");
        $("#password").focus();
        return false;
    }
	if($("#passwords").val().empty()){
	   alert("请重复填写密码以确认");
	   $("#passwords").focus();
       return false;
	}
	if(!$("#passwords").val().isPass()) {
        alert("您两次填写的密码不一致，请重新填写");
         $("#password").val("");
        $("#passwords").val("");
        $("#password").focus();
        return false;
    }
    if($("#password").val() != $("#passwords").val()){
       alert("您两次填写的密码不一致，请重新填写");
       $("#password").val("");
       $("#passwords").val("");
       $("#password").focus();
       return false;
    }
	if($("#mobile").val().empty()){
	   alert("请填写您的手机号码");
	   $("#mobile").focus();
       return false;
	}
	if(!$("#mobile").val().isMobile()){
	   alert("您填写的手机号码不正确，请重新填写");
	    $("#mobile").val("");
	   $("#mobile").focus();
       return false;
	}
    var sex=$('input:radio[name="sex"]:checked').val();
    if(!sex){
       alert("请选择性别");
       return false;
    }
    if($("#mainAddress").val() <= 0){
       alert("请选择所在省");
       return false;
    }
    if($("#cityId").val() <= 0){
       alert("请选择所在城市");
       return false;
    }
   $("tj").disabled=true;
   	return flase;
}
function vallogUser(){
	if($("#log_username").val().empty()){
	   alert("请填写您的邮箱");
	   $("#log_username").focus();
       return false;
	}
	if(!$("#log_username").val().isEmail()){
		alert("您填写的邮箱有误，请重新填写");
		  $("#log_username").val("");
	    $("#log_username").focus();
        return false;
	}
	if($("#log_psw").val().empty()){
	   alert("请填写密码");
	   $("#log_psw").focus();
       return false;
	}
	if(!$("#log_psw").val().isPass()) {
        alert("您填写的密码错误，请重新填写");
        $("#log_psw").focus();
        return false;
    }
    return true;
};
function chageCity(){
		if($("#mainAddress").val()!='0'){
			$.ajax({  
				url : "/ajax/citys.jhtml",
				data : {cid : $("#mainAddress").val()},   
				type : "post",  
				cache : false,
				dataType : "json",  
				success:function(data){
					  $("#cityId").find("option").remove();
				    	var con = '<option value="">请选择</option>';
				    	$.each(data.address,function(i,n){
				    		con += '<option value="'+n.regionId+'">'+n.localName+'</option>';
				    	});
						$("#cityId").html(con);
						$("#cityId").show();
				}
			});
		}else{
			$("#cityId").hide();
		}
}
