
red.prototype.ajax = {
	
	get : function(url,func,timeout){
		red.prototype.ajax.send(url,func,'GET',null,timeout);
	},
	
	gets : function(url){
		var x=red.prototype.ajax.x();
		x.open('GET',url,false);
		x.send(null);
		return x.responseText
	},
	
	post : function(url,func,args,timeout){
		red.prototype.ajax.send(url,func,'POST',args,timeout)
	},
			
	update : function(url,elm,timeout){
		var e = red.prototype.dom.$(elm);
		var f = function(r){e.innerHTML=r};
		red.prototype.ajax.get(url,f,timeout);
	},
	
	submit : function(url,func,frm,timeout){
		red.prototype.ajax.post(url,func,red.prototype.ajax.serialize(frm),timeout)
	},
		
	x : function(){
		var xmlHttp;
		// Firefox, Opera 8.0+, Safari    
		try{
			return new XMLHttpRequest();    
		}
		// Internet Explorer    
		catch(e){
			try{
				return new ActiveXObject("Msxml2.XMLHTTP");      
			}
			catch (e){      
				try{
					return new ActiveXObject("Microsoft.XMLHTTP");        
				}
				catch (e){
					return false;        
				}      
			}    
		}  
	},
		
	send : function(url,responsefnc,method,arguments,timeout){
		if(timeout == null){timeout=5000;}
		var errorfnc = function(){alert('Ajax Fehler!');}
		var cache = false;
		if(cache == false){
			var jetzt = new Date();
			var zeit = jetzt.getTime();
			if(method == 'GET'){
				url = url + '&xxx=' + zeit;
			}
			else if(method == 'POST'){
				arguments = arguments + '&xxx=' + zeit;
			}
		}
						
		var xmlHttp = red.prototype.ajax.x();
		
		var data = new Object();
		data.xmlHttp 		= xmlHttp;
		data.responsefnc 	= responsefnc;
		data.errorfnc 		= errorfnc;
				
		xmlHttp.onreadystatechange=function(){red.prototype.ajax.statechange(data)};
		xmlHttp.open(method,url,true);
		if(method == 'POST'){
			xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		xmlHttp.send(arguments);
		
		data.timeout = window.setTimeout(
			function() {
				if (red.prototype.ajax.active(data)) {
					data.xmlHttp.abort();
					alert('Ajax Timeout!');
				}
			},
			timeout
		);
			
	},

	statechange : function(data){
		if (data.xmlHttp.readyState==4){ 
			//if(data.xmlHttp.status != 200) {
			//	data.errorfnc(data.xmlHttp.statusText);
			//	return;
			//}
			data.responsefnc(data.xmlHttp.responseText);
			
		}
		return;
	},
	
	active : function(data) {
		switch (data.xmlHttp.readyState) {
			case 1: case 2: case 3:
			return true;
			break;
			// Case 4 and 0
			default:
			return false;
			break;
		}
	},

	serialize : function(f){
		var g = function(n){
			var el = red.prototype.dom.$(f);
			return el.getElementsByTagName(n)
		};
		var nv = function(e){
			if(e.name){
				return encodeURIComponent(e.name)+'='+encodeURIComponent(e.value);
			}
			else{
				return '';
			}
		};
		var i = red.prototype.util.collect(g('input'),function(i){if((i.type!='radio'&&i.type!='checkbox')||i.checked)return nv(i)});
		var s = red.prototype.util.collect(g('select'),nv);
		var t = red.prototype.util.collect(g('textarea'),nv);
		return i.concat(s).concat(t).join('&');
	}


}

