//取得一个对象，相当于getElementById()
function $() {
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string') element = document.getElementById(element);
	Method.Element.apply(element);
    if (arguments.length == 1) return element;
    elements.push(element);
  }
  return elements;
}

//把它接收到的单个的参数转换成一个Array对象。
function $A(list){
	var arr = [];
	for (var i=0,len=list.length; i<len; i++){arr[i] = list[i];}
	return arr;
};

//常用函数扩展
var Method = {
	Element	: function(){
		this.hide = function(){this.style.display="none"; return this};
		this.show = function(){this.style.display=""; return this};
		this.getValue = function(){if(this.value===undefined) return this.innerHTML; else return this.value;}
		this.setValue = function(s){if(this.value===undefined) this.innerHTML = s; else this.value = s;}
		this.subTag = function(){return $A(this.getElementsByTagName(arguments[0])).each(function(n){$(n);});};
		this.remove = function(){return this.parentNode.removeChild(this);};
		this.nextElement = function(){var n = this;	for(var i=0,n; n = n.nextSibling; i++) if(n.nodeType==1) return $(n); return null;};
		this.previousElement = function(){var n = this;	for (var i=0,n; n = n.previousSibling; i++) if(n.nodeType==1) return $(n); return null;};
	},
	Array :	function(){
		this.indexOf = function(){for (i=0; i<this.length; i++) if (this[i]==arguments[0]) return i; return -1;};
	},
	String : function(){
		this.trim = function(){var _re,_argument = arguments[0] || " ";	typeof(_argument)=="string"?(_argument == " "?_re = /(^\s*)|(\s*$)/g : _re = new RegExp("(^"+_argument+"*)|("+_argument+"*$)","g")) : _re = _argument; return this.replace(_re,"");};
		this.stripTags = function(){return this.replace(/<\/?[^>]+>/gi, '');};
		this.cint = function(){return this.replace(/\D/g,"")*1;};
		this.hasSubString = function(s,f){if(!f) f="";return (f+this+f).indexOf(f+s+f)==-1?false:true;};
	}
};

Method.Array.apply(Array.prototype);
Method.String.apply(String.prototype);

//cookie处理
var Cookie = {
    get : function(n){
	    var dc = "; "+document.cookie+"; ";
	    var coo = dc.indexOf("; "+n+"=");
	    if (coo!=-1){
		    var s = dc.substring(coo+n.length+3,dc.length);
		    return unescape(s.substring(0, s.indexOf("; ")));
	    }else{
		    return null;
	    }
    },
    set : function(name,value,expires,path,domain,secure){
        var expDays = expires*24*60*60*1000;
        var expDate = new Date();
        expDate.setTime(expDate.getTime()+expDays);
        var expString = expires ? "; expires="+expDate.toGMTString() : "";
        var pathString = "; path="+(path||"/");
		var domain = domain ? "; domain="+domain : "";
        document.cookie = name + "=" + escape(value) + expString + domain + pathString + (secure?"; secure":"");
    },
    del : function(n){
	    var exp = new Date();
	    exp.setTime(exp.getTime() - 1);
	    var cval=this.get(n);
	    if(cval!=null) document.cookie= n + "="+cval+";expires="+exp.toGMTString();
    }
}

//form相关函数
var Form = {
	//把表格内容转化成string
  serialize: function(form) {
    var elements = Form.getElements($(form));
    var queryComponents = new Array();
    for (var i = 0; i < elements.length; i++) {
      var queryComponent = Form.Element.serialize(elements[i]);
      if (queryComponent) queryComponents.push(queryComponent);
    }
    return queryComponents.join('&');
  },
  //取得表格内容为数组形式
  getElements: function(form) {
    form = $(form);
    var elements = new Array();
    for (tagName in Form.Element.Serializers) {
      var tagElements = form.getElementsByTagName(tagName);
      for (var j = 0; j < tagElements.length; j++)
        elements.push(tagElements[j]);
    }
    return elements;
  },
  //disable表格所有内容
  disable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.blur();
      element.disabled = 'true';
    }
  },
  //enable表格所有内容
  enable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.disabled = '';
    }
  },
  //Reset表格
  reset: function(form) {
    $(form).reset();
  }
}

//form里面元素定义
Form.Element = {
  serialize: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);
    if (parameter) {
      var key = encodeURIComponent(parameter[0]);
      if (key.length == 0) return;
      if (parameter[1].constructor != Array) return key + '=' + encodeURIComponent(parameter[1]);
	  tmpary = new Array();
	  for (var i = 0; i < parameter[1].length; i++) {
		  tmpary[i] = key + encodeURIComponent('[]') + '=' + encodeURIComponent(parameter[1][i]);
	  }
      return tmpary.join('&');
    }	
  },
  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);
    if (parameter) return parameter[1];
  }
}

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'submit':
      case 'hidden':
      case 'password':
      case 'text':
        return Form.Element.Serializers.textarea(element);
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
    }
    return false;
  },

  inputSelector: function(element) {
    if (element.checked) return [element.name, element.value];
  },

  textarea: function(element) {
    return [element.name, element.value];
  },

  select: function(element) {
    return Form.Element.Serializers[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var value = '', opt, index = element.selectedIndex;
    if (index >= 0) {
      opt = element.options[index];
      value = opt.value;
      if (!value && !('value' in opt))
        value = opt.text;
    }
    return [element.name, value];
  },

  selectMany: function(element) {
    var value = new Array();
    for (var i = 0; i < element.length; i++) {
      var opt = element.options[i];
      if (opt.selected) {
        var optValue = opt.value;
        if (!optValue && !('value' in opt))
          optValue = opt.text;
        value.push(optValue);
      }
    }
    return [element.name, value];
  }
}

//取form里面物件的值，等同于Form.Element.getValue()
var $F = Form.Element.getValue;

//ajax实现
/*
	var ajax = new jieqi_ajax();

	ajax.onLoading = function() {...};
	ajax.onLoaded = function() {...};
	ajax.onInteractive = function() {...};
	ajax.onComplete = function() {...};
	
	//直接提交form
	ajax.submitForm("formname");  

	//人工赋值提交
	ajax.setVar("name", 'value'); 
	ajax.method = "GET";
	ajax.requestFile = "url";
	ajax.runAJAX();
*/
function jieqi_ajax(url) {
	this.handler = null;
	//初始化
	this.init = function() {
		this.method = "POST";
  		this.queryStringSeparator = "?";
		this.argumentSeparator = "&";
		this.URLString = "";
		this.encodeURIString = true;
  		this.execute = false;
		this.requestFile = url;
		this.vars = new Object();
		this.responseStatus = new Array(2);
		this.failed = false;
		this.response = "";
		this.asynchronous = true;

		this.onLoading = function() { };
  		this.onLoaded = function() { };
  		this.onInteractive = function() { };
  		this.onComplete = function() { };
  		this.onError = function() { };
		this.onFail = function() { };

		try {
			this.handler = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.handler = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				this.handler = null;
			}
		}

		if (! this.handler) {
			if (typeof XMLHttpRequest != "undefined") {
				this.handler = new XMLHttpRequest();
			} else {
				this.failed = true;
			}
		}
  	};

	//设置变量
	this.setVar = function(name, value){
		this.vars[name] = Array(value, false);
	};

	//变量编码
	this.encVar = function(name, value, returnvars) {
		if (true == returnvars) {
			return Array(encodeURIComponent(name), encodeURIComponent(value));
		} else {
			this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
		}
	}

	//拆分查询字符串
	this.processURLString = function(string, encode) {
		encoded = encodeURIComponent(this.argumentSeparator);
		regexp = new RegExp(this.argumentSeparator + "|" + encoded);
		varArray = string.split(regexp);
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split("=");
			if (true == encode){
				this.encVar(urlVars[0], urlVars[1]);
			} else {
				this.setVar(urlVars[0], urlVars[1]);
			}
		}
	}
	
	//建立编码后的查询字符串
	this.createURLString = function(urlstring) {
		if (urlstring) {
			if (this.URLString.length) {
				this.URLString += this.argumentSeparator + urlstring;
			} else {
				this.URLString = urlstring;
			}
		}
		this.setVar("ajax_request", new Date().getTime());
		urlstringtemp = new Array();
		for (key in this.vars) {
			if (false == this.vars[key][1] && true == this.encodeURIString) {
				encoded = this.encVar(key, this.vars[key][0], true);
				delete this.vars[key];
				this.vars[encoded[0]] = Array(encoded[1], true);
				key = encoded[0];
			}

			urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
		}
		if (urlstring){
			this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);
		} else {
			this.URLString += urlstringtemp.join(this.argumentSeparator);
		}
	}

	//运行结果
	this.runResponse = function() {
		eval(this.response);
	}
	
	//提交信息
	this.runAJAX = function(urlstring) {
		if (this.failed) {
			this.onFail();
		} else {
			if(this.requestFile.indexOf(this.queryStringSeparator) > 0){
				var spoint = this.requestFile.indexOf(this.queryStringSeparator);
				this.processURLString(this.requestFile.substr(spoint + this.queryStringSeparator.length), false);
				this.requestFile = this.requestFile.substr(0, spoint);
			}
			this.createURLString(urlstring);
			if (this.handler) {
				var self = this;
				
				if (this.method == "GET") {
					totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
					this.handler.open(this.method, totalurlstring, this.asynchronous);
				} else {
					this.handler.open(this.method, this.requestFile, this.asynchronous);
					try {
						this.handler.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					} catch (e) { }
				}

				this.handler.onreadystatechange = function() {
					switch (self.handler.readyState) {
						case 1:
							self.onLoading();
							break;
						case 2:
							self.onLoaded();
							break;
						case 3:
							self.onInteractive();
							break;
						case 4:
							self.response = self.handler.responseText;
							self.responseXML = self.handler.responseXML;
							self.responseStatus[0] = self.handler.status;
							self.responseStatus[1] = self.handler.statusText;

							if (self.execute) {
								self.runResponse();
							}

							if (self.responseStatus[0] == "200") {
								self.onComplete();
							} else {
								self.onError();
							}

							self.URLString = "";
							break;
					}
				}
				this.handler.send(this.method == "GET" ? null : this.URLString);
			}
		}
	}

	//提交form
	this.submitForm = function(form) {
		if(this.requestFile == null) this.requestFile = $(form).attributes["action"].value;
		this.runAJAX(Form.serialize(form));
	}

	this.init();
}

var Ajax = {
	Request	: function(vname, vars){
		var ajax = new jieqi_ajax();
		var param = {method:"",asynchronous:true,onLoading:function(){},onLoaded:function(){},onInteractive:function(){},onComplete:function(){},onError:function(){},onFail:function(){}};
		for (var key in vars) param[key] = vars[key];
		ajax.asynchronous = param["asynchronous"];
		ajax.onLoading = param["onLoading"];
		ajax.onLoaded = param["onLoaded"];
		ajax.onInteractive = param["onInteractive"];
		ajax.onError = param["onError"];
		ajax.onFail = param["onFail"];
		ajax.onComplete = param["onComplete"];
		if($(vname) != null && $(vname).tagName.toLowerCase() == "form"){
			ajax.method = param["method"]=="" ? "POST" : param["method"];
			ajax.submitForm(vname);
		}else{
			ajax.method = param["method"]=="" ? "GET" : param["method"];
			ajax.requestFile = vname;
			ajax.runAJAX();
		}
	},
	Update : function(vname, vars){
		var param = {outid:"",tipid:"",loading:"", outhide:3000, cursor:"wait"};
		for (var key in vars) param[key] = vars[key];

		var isform = $(vname) != null && $(vname).tagName.toLowerCase() == "form" ? true : false;
		var loading = function(){
			if(param["cursor"] != "") document.body.style.cursor=param["cursor"];
			if(param["tipid"] != "") {$(param["tipid"]).setValue(param["loading"]);$(param["tipid"]).show();}
			if(isform) Form.disable(vname);
		}
		var complete = function(){
			if(param["cursor"] != "") document.body.style.cursor="auto";
			if(param["tipid"] != "") {$(param["tipid"]).setValue("");$(param["tipid"]).hide();}
			if(param["outid"] != "") {$(param["outid"]).setValue(this.response);$(param["outid"]).show();}
			if(param["outhide"] != "") {setTimeout(function(){$(param["outid"]).hide()},param["outhide"]);}
			if(isform) Form.enable(vname);
		}
		var error = function(){
			if(param["outid"] != "")  $(param["outid"]).setValue("ERROR:"+ajax.responseStatus[1]+"("+ajax.responseStatus[0]+")");
			if(isform) Form.enable(vname);
		}
		var fail = function() {
			alert("Your browser does not support AJAX!");
			if(isform) Form.enable(vname);
		}
		this.Request(vname, {onLoading:loading, onComplete:complete, onError:error, onFail:fail});
	}
};

//提交ajax，返回html直接显示
//vname-提交地址或者form名字， method－提交方式GET或者POST, outid-显示返回结果对象名, tipid-显示提示信息对象名, onLoading-提交时显示文字, onLoaded-提交完显示文字, onInteractive-开始接收显示文字, onComplete-接收完成提示（本内容为空则隐藏提示信息）
function ajax_request(){
	if(arguments.length < 2) return false;
	var param = {method:"GET",asynchronous:true,outid:"",tipid:"",onLoading:"",onLoaded:"",onInteractive:"",onComplete:"",onError:"",onFail:""};
	for (var key in arguments[1]) param[key] = arguments[1][key];
	var vname = arguments[0];
	var isform = false;
	if($(vname) != null && $(vname).tagName.toLowerCase() == "form"){vname = $(vname); isform = true;}

	var ajax = new jieqi_ajax();
	ajax.method = param["method"];
	ajax.asynchronous = param["asynchronous"];
	if(param["tipid"] != ""){
		$(param["tipid"]).setValue("");
		$(param["tipid"]).show();

		if(typeof param["onLoading"] == 'string' && param["onLoading"] != "") ajax.onLoading = function(){$(param["tipid"]).setValue(param["onLoading"]);Form.disable(vname);};

		if(typeof param["onLoaded"] == 'string' && param["onLoaded"] != "") ajax.onLoaded = function(){$(param["tipid"]).setValue(param["onLoaded"]);};

		if(typeof param["onInteractive"] == 'string' && param["onInteractive"] != "") ajax.onInteractive = function(){$(param["tipid"]).setValue(param["onInteractive"]);};

		if(typeof param["onError"] == 'string') ajax.onError = function() {if(param["onError"] == "") $(param["tipid"]).setValue("ERROR:"+ajax.responseStatus[1]+"("+ajax.responseStatus[0]+")"); else $(param["tipid"]).setValue(param["onError"]); if(isform) Form.enable(vname);};
		
		if(typeof param["onFail"] == 'string') ajax.onFail = function() {if(param["onFail"] == "") $(param["tipid"]).setValue("Your browser does not support AJAX!"); else $(param["tipid"]).setValue(param["onFail"]); if(isform) Form.enable(vname);};
	}
	if(typeof param["onLoading"] == 'function') ajax.onLoading = param["onLoading"];
	if(typeof param["onLoaded"] == 'function') ajax.onLoaded = param["onLoaded"];
	if(typeof param["onInteractive"] == 'function') ajax.onInteractive = param["onInteractive"];
	if(typeof param["onError"] == 'function') ajax.onError = param["onError"];
	if(typeof param["onFail"] == 'function') ajax.onFail = param["onFail"];
	if(typeof param["onComplete"] == 'function'){
		ajax.onComplete = param["onComplete"];
	}else{
		ajax.onComplete = function(){
			if(param["tipid"] != ""){
				if(param["onComplete"] != ""){
					$(param["tipid"]).setValue(param["onComplete"]);
				}else if(param["tipid"] != param["outid"]){
					$(param["tipid"]).setValue("");
					$(param["tipid"]).hide();
				}
			}
			$(param["outid"]).setValue(this.response);
			if(isform) Form.enable(vname);
		};
	}
	if(isform){
		ajax.submitForm(vname);
	}else{
		ajax.requestFile = vname;
		ajax.runAJAX();
	}
}