//######################################################
//
// Библиотеку придумал Ворон
// ICQ#: 295-941-268
// http://nightfolk.net/
//
//######################################################

function ajax(){

//Свойства

	this.connector = null;
	this.type = undefined;
	this.variables = new Array();
	this.variables_count = new Number(0);
	this.errors = new Array();
	this.successfull = false;
	
//Сервисные переменные	
	var error_messages = new Array(
		'Ошибка: Ошибочное число атрибутов.',
		'Ошибка: Экземпляр AJAX не инициализирован.',
		'Ошибка: Имена переменных не должны дублироватся. Имя переменной: ',
		'Ошибка: Переменная таким именем не найдена. Имя переменной: ',
		'Ошибка: ',
		'Ошибка: Браузер не поддерживает или в нем запрещен запуск ActiveX расширений. В последнем случае - измените настройки безопасности. Сообщение: ',
		'Ошибка: AJAX не поддерживается браузером.',
		'Ошибка: Не найден запрошеный файл. Имя файла: ',
		'Ошибка: Запрос обрабатывается. Подождите его завершения.',
		'Ошибка: В данный момент запрос не обрабатывается.',
		'Ошибка: Ошибка в индексе сообщения.'
	);
	var type_names = new Array(
		'XMLHttpRequest',
		'ActiveX'
	);
	var last_uri = new String('');

// Методы
	this.onLoaded = new Function();
	this.onReceiving =  new Function();
	this.onSent =  new Function();
	this.onOpen =  new Function();
	this.onUninitialized =  new Function();

	this.get_type = function (number){
		return type_names[number];
	}
	
	this.error_code = function(number){
		if((number<0)||(number>(error_messages.length-1))){
			this.errors[this.errors.length]=(this.error_code(10));
			return false;	
		}
		return error_messages[number];
	}
	
	this.out_last_uri = function(){
		return last_uri;
	}
	
	this.abort = function(){
		if((this.connector==null)){
			this.errors[this.errors.length]=(error_messages[1]);
			return false;
		}
		if((this.connector.readyState==0)||(this.connector.readyState==4)){
			this.errors[this.errors.length]=(error_messages[9]);
			return false;
		}
		this.connector.abort();
		return true;
	}
	
	this.add_variable = function(name,value){
		if((Math.floor(arguments.length/2)!=(arguments.length/2))||(arguments.length<2)){
			this.errors[this.errors.length]=(error_messages[0]);
			return;	
		}
		for(var i=0;i<arguments.length;i=i+2){
			if(arguments[i] in this.variables){
				this.errors[this.errors.length]=(error_messages[2]+arguments[i]);
				continue;	
			}
			this.variables[arguments[i]]=arguments[i+1];
			this.variables_count++;
		}
	}

	this.remove_variable = function(name){
		if(arguments.length==0){
			this.errors[this.errors.length]=(error_messages[0]);
			return;	
		}
		for(var i=0;i<arguments.length;i++){
			if(!(arguments[i] in this.variables)){
				this.errors[this.errors.length]=(error_messages[3]+arguments[i]);
				continue;	
			}
			delete this.variables[arguments[i]];
			this.variables_count--;
		}
	}

	this.send = function(url,method){
	  //this.successfull="fff";
		if(arguments.length==0){
			this.errors[this.errors.length]=(error_messages[0]);
			return;	
		}
		
		var send_data=null;
		
		if(((method==undefined)||(method=='GET'))&&(request.length<(255-url.length))){
			method='GET';
		}else{
			method='POST';
		}
		var request = write_request(this);
		last_uri = url;
		if (method=='GET'){
			if(request){url+="?"+request;}
		}else{
			send_data=request;
		}
		if((this.connector!==null)){
			if((this.connector.readyState!==0)||(this.connector.readyState!==4)){
				this.errors[this.errors.length]=(error_messages[8]);
				return false;
			}
		}
		
		init(this);
		
		try{
			this.connector.open(method,url,true);	
			if((method=='POST')&&(this.variables_count>0)){
				this.connector.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	
			}
		}catch(error){
			this.errors[this.errors.length]=(error_messages[4]+error);	
			return false;
		}
		
		try{
			this.connector.send(send_data);
		}catch(error){	
			this.errors[this.errors.length]=(error_messages[4]+error);	
			return false;
		}
			
	return true;
	}
	
	//Сервисные функции	

	var write_request = function(obj){
		if(obj.variables_count==0){
			return false;
		}
		var request = new String();
		var num = new Number(0);
		for (var i in obj.variables) {
			if (obj.method='GET'){
				request+=i+"="+encodeURIComponent(obj.variables[i]);
			}else{
				request+=i+"="+obj.variables[i];
			}
			if(num<obj.variables_count-1){
				num++;
				request+="&";
			}
		}
		
		return request;
	}
	
	var create_state_listener = function(ajax_obj){
		return function(){
		switch(ajax_obj.connector.readyState){
			case 0:
					ajax_obj.onUninitialized();
				break;
			case 1:
					ajax_obj.onOpen();
				break;
			case 2:
					ajax_obj.onSent();
				break;
			case 3:
					ajax_obj.onReceiving();
				break;
			case 4:
				if (ajax_obj.connector.status == 200){
					ajax_obj.successfull = true;
					ajax_obj.onLoaded();
					break;
 				}else if (ajax_obj.connector.status == 404){
					ajax_obj.errors[ajax_obj.errors.length]=(ajax_obj.error_code(7)+ajax_obj.out_last_uri());
					break;
 				}else{
 					
 				}
 				
			}
		}
	}
	
	var init = function(ajax_obj){
		ajax_obj.connector = createRequestObject();
		ajax_obj.connector.onreadystatechange = create_state_listener(ajax_obj);
		return true;
	}
	
	var createRequestObject = function(){
	    if (window.XMLHttpRequest) {
	        try {
	            return new XMLHttpRequest();
	        } catch (e){}
	    } else if (window.ActiveXObject) {
	        try {
	            return new ActiveXObject('Msxml2.XMLHTTP');
	        } catch (e){}
	        try {
	            return new ActiveXObject('Microsoft.XMLHTTP');
	        } catch (e){}
	    }
	    return null;
	}	
}
