var waitProcess = new Array();

var AJAX = {
	
	XMLHttpRequest: function()
	{
		var req = false;
		
		if(window.XMLHttpRequest && !(window.ActiveXObject))
		{
			try
			{
				req = new XMLHttpRequest();
			}
			catch(e)
			{
				req = false;
			}

		}
		else if(window.ActiveXObject)
		{
			try
			{
				req = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e)
			{
				try
				{
					req = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e)
				{
					req = false;
				}
			}
		}
		
		return(req);
	},
	
	Response: function(xmlobject)
	{
		this.status = xmlobject.status;
		this.statusText = xmlobject.statusText;
		this.responseText = xmlobject.responseText;
		this.responseXML = xmlobject.responseXML;
	},
	
	Request: function(url, options)
	{
		if (!isset(url))
		{
			return(false);
		}
		
		this.url = url;
		this.method = (isset(options.method)) ? options.method : 'POST';
		this.asynchronous = (isset(options.asynchronous) && typeof(options.asynchronous) == "boolean") ? options.asynchronous : true;
		this.contentType = (isset(options.contentType)) ? options.contentType : 'application/x-www-form-urlencoded';
		this.parameters = (isset(options.parameters)) ? options.parameters : '';
		
		if (this.parameters != '' && typeof(this.parameters.join) != "Undefined")
		{
			this.parameters = this.parameters.join("&");
		}
		
		this.encoding = (isset(options.encoding)) ? options.encoding : 'iso-8859-1';
		
		this.callbacks = {};
		
		this.dispatch = function(event, parameter)
		{
			if (isset(this.callbacks[event]))
			{
				if (isset(parameter))
				{
					this.callbacks[event](parameter);
				}
				else
				{
					this.callbacks[event]();
				}
			}
		}
		
		this.handler = function()
		{
			switch(this.object.readyState)
			{
					
				case 1:
					this.dispatch('onLoading');//, _load_calendar_load_month(this.object) //new AJAX.Response(this.object)
					break;
					
				case 2:
					this.dispatch('Loaded');
					break;
					
				case 3:
					this.dispatch('Interactive');
					break;
				
				case 4:
					this.dispatch('onComplete', new AJAX.Response(this.object));
					break;
			}
		}
				
		if (isset(options.onLoading))
		{
			this.callbacks['onLoading'] = options.onLoading;
		}
				
		if (isset(options.Loaded))
		{
			this.callbacks['Loaded'] = options.Loaded;
		}
				
		if (isset(options.Interactive))
		{
			this.callbacks['Interactive'] = options.Interactive;
		}
		
		if (isset(options.onComplete))
		{
			this.callbacks['onComplete'] = options.onComplete;
		}
		
		if (isset(options.onFailure))
		{
			this.callbacks['onFailure'] = options.onFailure;
		}
		
		this.object = new AJAX.XMLHttpRequest();
		
		if (!this.object)
		{
			this.dispatch('onFailure');
			return false;
		}

		this.object.onreadystatechange = this.handler.bind(this);
		
		if (this.method == "GET")
		{
			this.object.open(this.method, this.url + "?" + this.parameters, this.asynchronous);
		}
		else
		{
			this.object.open(this.method, this.url, this.asynchronous);
			
		}
		
		this.object.setRequestHeader("Content-Encoding", this.encoding);
		this.object.setRequestHeader("Content-Type", this.contentType);
		
		if (this.method == "GET")
		{
			this.object.send("");
		}
		else
		{
			this.object.send(this.parameters);
		}
		
		if (!this.asynchronous)
		{
			this.response = new AJAX.Response(this.object);
		}
	}
	
}

function isset(check)
{
	return(typeof(check) != "undefined");
}

Function.prototype.bind = function()
{
	var __method = this;
	args = $A(arguments);
	object = args.shift();
	
	return function()
	{
		return __method.apply(object, args.concat($A(arguments)));
	}
}

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;
	}
}

function send_ajax_form(formName, urlPath)
{
	var formFields 	= new Object();
	var theForm 	= $(formName);
	
	for(i=0; i<theForm.elements.length; i++)
	{
		if (theForm.elements[i].type != 'hidden' && theForm.elements[i].disabled != true)
		{
			formFields[theForm.elements[i].name] = theForm.elements[i].value;
		}
	}
	
	var serializedArray = js_array_to_php_array(formFields);
	var req = new AJAX.Request(base_url + urlPath + encode64(serializedArray),
		{
			method: 'POST',
			parameters: [],
			onComplete : function(e) {ajax_eval(e.responseText)} 
		}			
	);
	
	return false;
}

function ajax_show(div,answer,visible)
{
	var objChange = top.document.getElementById(div);
	objChange.innerHTML = answer;
	
	// Compatibilité, règle un bug de IE6 
	if (objChange.parent)
	{
		objChange.parent.innerHTML = objChange.parent.innerHTML;
	}
	else
	{
		objChange.innerHTML = objChange.innerHTML;
	}
	
	visible = (visible == null) ? true : visible;
	
	if (visible)
	{
		objChange.style.visibility = 'visible';
	}
	else
	{
		objChange.style.visibility = 'hidden';
	}
}

function url_encode_elements_form(the_form)
{
    inputs 		= the_form.getElementsByTagName('input');
    selects 	= the_form.getElementsByTagName('select');
    textareas 	= the_form.getElementsByTagName('textarea');
    var elements_id = '';
    
    for(i in inputs)
    {
        if(inputs[i].id)
        {
            elements_id	+= ',' + inputs[i].id;
        }				
    }
    
    for(i in selects)
    {
        if(selects[i].id)
        {
            elements_id	+= ',' + selects[i].id;
        }				
    }
    
    for(i in textareas)
    {
        if(textareas[i].id)
        {
            elements_id	+= ',' + textareas[i].id;
        }				
    }
    
    return url_encode_elements(elements_id.substr(1));
}

function url_encode_elements(string_elements, is_separator)
{	
    array_elements = string_elements.split(',');

    var url_encode = ''

    for(i in array_elements)
    {
        if(is_separator == true)
        {
            separator = (i==0) ? '?' : '&amp;';
        }
        else
        {
            separator = ',';	
        }

        current_element = array_elements[i];
        current_value = '';
        
        if($(current_element))
        {			
            if($(current_element).innerHTML)
            {
                current_value = escape($(current_element).innerHTML)
            }
                        
            if($(current_element).value )
            {
                current_value = $(current_element).value
            }
        
            if($(current_element).type == "radio")
            {
                if($(current_element).checked)
                {
                    current_value = '1'
                }
                else
                {
                    current_value = '0'
                }
                
            }
        
            if($(current_element).type == "checkbox")
            {
                if($(current_element).checked)
                {
                    current_value = $(current_element).value;
                }
                else
                {
                    continue;
                }
            }
        }
        else
        {
            eval('if(' + current_element + ') { current_value = ' + current_element + '.toString();} else {v="";}  ')
        }			
        
        var reg=new RegExp("(,)", "g");
        current_value = current_value.replace(reg,"~");
        var reg=new RegExp("(=)", "g");
        current_value = current_value.replace(reg,"°");
        current_url = separator + encode64(current_element + '=' + current_value); 
        url_encode += current_url;	
    }

    if(!is_separator)
    {
        return url_encode = 'ajax_encode_fields=' + escape(url_encode.substr(1))
    }

    return escape(url_encode)
}

function loopProcess()
{
	if (waitProcess.length > 0)
	{
		eval(waitProcess.shift());
	}
}

function ajax_eval(evalCode)
{
	eval(evalCode);
	loopProcess();
}