﻿//
//
// Тестовая библиотека Богданова Дмитрия Владимировича
//
// Реализует основные методы работы с технологией Ajax
//
//

function Ajax() {
	
//переменная, которая является основным интерфейсом к AJAX технологии
    this.http = null;

//события, для загрузки и для ошибки
    this.onload  = null;
    this.onerror = null;

//масивы для хранения GET и POST параметров
    this.get  = new Array();
    this.post = new Array();

//переменные, для хранения результата
    this.text = null;
    this.xml  = null;

//переменная для хранения описания ошибки
    this.errtext = null;
//переменная для хранения таймера соеденения
    this.timeout = null;

//переменная для хранения флага выполнения запроса
    this.wait = 0;


  		this.onLoading = function() { };
  		this.onLoaded = function() { };
  		this.onInteractive = function() { };


//Инициализация технологии AJAX
this.createAjax = function() {

if(window.XMLHttpRequest) {

  this.http = new XMLHttpRequest();

}
 else if(window.ActiveXObject) {

try{
// Последние версии Internet Explorer
this.http = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
// Старые версии Internet Explorer
this.http = new ActiveXObject("Microsoft.XMLHTTP");
}

//this.http = new ActiveXObject("Microsoft.XMLHTTP");

}


}
//-------------------------------



//функции для добавления GET, POST параметров
this.setget = function(vname, value) {

  var i = this.get.length;
  this.get[i] = '';

   this.get[vname] = value;
}

this.setpost = function(vname, value) {

  var i = this.post.length;
  this.post[i] = '';

   this.post[vname] = value;
}
//-----------------------------------




//Функция для отправки запроса серверу, в параметре передается путь и имя файла
this.request = function(file) {

//  if (this.wait == 1) { return; }

  var v;
  var post;

  this.http.abort(); //Закрываем предыдущие соеденение


				var self = this;

//функция для обработки состояния соеденения
this.http.onreadystatechange = function() {

  switch (self.http.readyState) {
	case 1:
		self.onLoading();
		break;
	case 2:
		self.onLoaded();
		break;
	case 3:
		self.onInteractive();
		break;
	case 4:

    clearTimeout(self.timeout);
    self.timeout = null;

// происходит глюк, если еще раз нажать на ссылку..
if(self.http.status != null ) {
    if(self.http.status == 200 || self.http.status == 0) {
      self.text = self.http.responseText;
      self.xml = self.http.responseXML;

      //Если событие onload отслеживается, то сгенерируем его
      if(self.onload !== null) self.onload();

    }
	else {

      //Ошибка!!! Если событие onerror отслеживается, то сгенерируем его
      self.errtext = self.http.statusText;
      if(self.onerror !== null) self.onerror();
    }


			delete self.http['onreadystatechange'];
			self.http = null;
     		self.text = null;
			self.xml = null;
}
  break;
}

}
//-------------------------------

  


  var url = file;

  if(this.get.length !== 0) {
    url += "?";
    for(v in this.get) {
      url += v + "=" + encodeURIComponent(this.get[v]) + "&";
    }
  }




  if(this.post.length === 0) {
    this.http.open("GET", url, true);
    post = null;
  } else {
    this.http.open("POST", url, true);
    post = '';
    for(v in this.post) {
      post += v + "=" + encodeURIComponent(this.post[v]) + "&";
    }

    this.http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    this.http.setRequestHeader("Content-Length", post.length);
  }

  this.http.send(post);
  this.get  = new Array();
  this.post = new Array();
  this.timeout = setTimeout("this.etimeout();", 30000);

}
//-------------------------------






//функция для обработки таймаута
this.etimeout = function() {
  this.http.abort();
  this.errtext = "Timeout";
  if(this.onerror !== null) this.onerror();
}
//-------------------------------



  //Здесь обрабатываем удачную загрузку
this.onload = function() {
  
 // NewInner('debug', this.text);
  
}
//-------------------------------


 //здесь обрабатываем ошибки
this.onerror = function() {
//  alert(this.errtext);
//  alert("error fetching data!"
//   +"\n\nreadyState:"+this.http.readyState
//   +"\nstatus: "+this.http.status
//   +"\nheaders: "+this.http.getAHResponseHeaders());
}
//-------------------------------


this.createAjax();

}


    /*
object vehicle(){
// Характеристики класса venicle
var num_doors;
var color;
var typer;
// Методы, которые используются для приведения автомобиля в
// движение и остановки.
// Обратите внимание, что метод move() использует аргумент
// direction (направление).
// Направление можно указывать такими словами, как, например,
// forward (вперед), backward (назад), left (налево)
// или right (направо).
//  move(direction);
//  stop () ;
}
  */


