//ajax

function AjaxTask(){//消息发送任务
  var msg;//发送的消息
  var url;//发送的地址

  this.beforeLoad=function(){}//消息发送成功前执行的方法
  this.load=function(){}//根据信息执行操作
  this.afterLoad=function(){}//消息发送成功后执行的方法
  this.exception=function(e){alert("未能成功获取信息，错误代码："+e+"\r\n请求地址:"+this.url);}//未能获取消息反馈所执行的方法
  this.statusChanged=function(){}
  var msg_text;//消息发送后获得的字符串
  var msg_doc;//消息发送后获得的结点

  var state;//等待中:0 发送中:1 发送完毕:2

  //将msg_text解析成XML，保存到msg_doc
  this.loadDoc = function(){
    if(window.ActiveXObject){
      this.msg_doc = new ActiveXObject('Microsoft.XMLDOM');
      this.msg_doc.async = false;
      this.msg_doc.loadXML(this.msg_text);
    }
    else if (document.implementation&&document.implementation.createDocument){
      this.msg_doc = document.implementation.createDocument('', '', null);
      this.msg_doc.loadXML(this.msg_text);
    }
  }
}

function AjaxTaskQueue(){//消息发送任务队列
  var size;//消息发送任务队列大小
  var queue;//消息发送任务队列
  var started;//消息发送是否启动
  var task;//当前执行的任务
  var http_request;
  var thread;//线程号


  this.addTask = function(task){
	if(this.queue == null){
	  this.queue = new Array();
	  this.size = 0;
	}
	this.queue[this.size] = task;
	task.state = 0;
	this.size ++;
	if(!this.started){
	  this.started = true;
	  this.thread = window.setInterval(func_bind(this.executeTask,[this]),100);
	}
  }


  this.executeTask = function(q){
	if(q.queue && q.size > 0 && (!q.task || q.task.state == 2)){
	  q.task = q.queue[0];
	  for(var i = 1;i < q.size;i++){
		q.queue[i-1] = q.queue[i];
	  }
	  q.size --;
	  q.load();
	}
	else if(q.queue && q.size <= 0 && q.task && q.task.state == 2){
	  q.task = null;
	  this.started = false;
	  if(thread){
		clearInterval(q.thread);
	  }
	}
  }

  this.load = function(){
	if(!this.task)return;
	this.task.state = 1;//task任务开始执行
    this.http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
      this.http_request = new XMLHttpRequest();
      if (this.http_request.overrideMimeType) {
        this.http_request.overrideMimeType('text/xml');
      }
    }
    else if (window.ActiveXObject) { // IE
      try {
        this.http_request = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e) {
        try {
          this.http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
	    catch (e) {}
      }
    }
    if (!this.http_request) {
      alert('你所使用的浏览器不支持AJAX，建议更换至IE6.0以上版本');
      return false;
    }
	this.task.beforeLoad();
    this.http_request.onreadystatechange = func_bind(this.receiveRequest,[this]);
    this.http_request.open('POST', this.task.url, true);
	this.http_request.setRequestHeader("contentType","text/html;charset=gb2312");
	this.http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    this.http_request.send(this.task.msg);
  }
  this.receiveRequest = function(queue){
    if (queue.http_request.readyState == 4) {
      if (queue.http_request.status == 200) {
		queue.task.msg_text = queue.http_request.responseText;
		queue.task.load();
	    queue.task.afterLoad();
      } else {
        queue.task.exception(queue.http_request.status);
      }
	  queue.task.state = 2;//消息发送完成
    }
	queue.task.statusChanged();
  }
}

function func_bind(func, args) { 
  return function() { 
    func.apply(null, args); 
  }; 
} 