// Ny Ajax handling Class:

var dAjax = {
	defaults: {
		method:'post',
		xml:false,
		interval:1000,
		log:'on'
	},
	
	create: function(prop) {
		prop = dAjax.genProps(prop);
		if(typeof(prop.url) == 'undefined') {
			alert('No url specified, aborting');
			return false;
		}
		var ajaxObject;
		var axmode = (prop.xml?"Microsoft.XMLDOM":"Msxml2.XMLHTTP");
		
		try {
			// Firefox, Opera 8.0+, Safari  
			ajaxObject = new XMLHttpRequest();
		} catch (e) {
			// Internet Explorer  
			try {
				ajaxObject = new ActiveXObject(axmode);    
			} catch (e) {
				try {
					ajaxObject = new ActiveXObject(axmode);      
				} catch (e) {
					alert("Your browser does not support AJAX!");      
					return false;      
				}    
			}  
		}
		return ajaxObject;
	},

	get: function(prop) {
		prop = dAjax.genProps(prop);
		var aObj	= dAjax.create(prop);
		
		if(aObj) {
			aObj.open('get', prop.url, true);
			aObj.send(null);
			
			aObj.onreadystatechange = function() {
				switch(aObj.readyState) {
					case 1:
						// The request has been set up
						break;
					
					case 2:
						// The request has been sent
						break;
						
					case 3:
						// The request is in process
						break;
						
					case 4:
						// The request is complete
						if(prop.onfinish && typeof(prop.onfinish) == 'function')
							prop.onfinish(aObj.responseText);
						break;
				}
			}
		}
		return false;
	},
	
	href: function(prop) {
		prop = dAjax.genProps(prop);
		var aObj	= dAjax.create(prop);
		
		if(aObj && prop.container) {
			aObj.open('get', prop.url, true);
			aObj.send(null);
			
			aObj.onreadystatechange = function() {
				switch(aObj.readyState) {
					case 1:
						// The request has been set up
						break;
					
					case 2:
						// The request has been sent
						//document.getElementsByTagName('body')[0].style.cursor = 'progress';
						break;
						
					case 3:
						// The request is in process
						//document.getElementsByTagName('body')[0].style.cursor = 'wait';
						break;
						
					case 4:
						// The request is complete
						//document.getElementsByTagName('body')[0].style.cursor = 'default';
						document.getElementById(prop.container).innerHTML = aObj.responseText;
						if(prop.onfinish && typeof(prop.onfinish) == 'function')
							prop.onfinish(aObj.responseText);
						break;
				}
			}
		} else if(!prop.container) {
			alert('No display container defined, you should define the property "container" to the data container which should hold the response text');
		}
		return false;
	},
	
	send: function(prop) {
		prop = dAjax.genProps(prop);
		var aObj	= dAjax.create(prop);
		if(aObj) {
			if(!prop.method)
				prop.method = this.defaults.method;
				
			if(prop.method == "post") {
				if(prop.url.indexOf("?") != -1) {
					var urlpart 	  = prop.url.split("?");
					var params 		  = urlpart[1];
					var headerlength  = params.lenght;
					var gourl 		  = urlpart[0];
				} else {
					var params 		 = null;
					var headerlength = 0;
					var gourl 		 = prop.url;
				}
			} else if(prop.method == "get") {
				var params 	= null;
				var gourl 	= prop.url;
			}

			aObj.open(prop.method, gourl, true);
			
			if(prop.method == "post") {
				aObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
				aObj.setRequestHeader("Content-length", headerlength);
				aObj.setRequestHeader("Connection", "close");	
			}
			
			aObj.send(params);
		}
		
		return false;
	},
	
	submit: function(prop) {
		prop = dAjax.genProps(prop);
		var form;
		if(typeof(prop.form) == 'object') {
			// "this" or a valid object is passed
			form = prop.form;
		} else if(document.getElementById(prop.form)) {
			// Form ID is passed and valid
			form = document.getElementById(prop.form);
		} else if(document.forms[prop.form]) {
			// Form Name is passed and valid
			form = document.forms[prop.form];
		} else {
			// No valid form is passed
			alert('No valid form object could be found');
			return false;
		}
		
		var params = '';
		for(var i=0; i<form.length; i++) {
			if(form[i].name != '') {
				params += form[i].name + '='+form[i].value + '&';
			}
		}
		
 		if(typeof(prop) == 'undefined') prop = this.defaults;
		var aObj	= dAjax.create(prop);
		
		if(aObj) {
			aObj.open('post', prop.url, true);
			aObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
			aObj.setRequestHeader("Content-length", params.length);
			aObj.setRequestHeader("Connection", "close");	
			aObj.send(params);
			
			if(prop.container || prop.onfinish) {
				aObj.onreadystatechange = function() {
					switch(aObj.readyState) {
						case 1:
							// The request has been set up
							break;
						
						case 2:
							// The request has been sent
							document.getElementsByTagName('body')[0].style.cursor = 'progress';
							if(prop.onload && typeof(prop.onload) == 'function')
								prop.onload();
							break;
							
						case 3:
							// The request is in process
							//document.getElementsByTagName('body')[0].style.cursor = 'wait';
							break;
							
						case 4:
							// The request is complete
							//document.getElementsByTagName('body')[0].style.cursor = 'default';
							
							if(prop.container)
								document.getElementById(prop.container).innerHTML = aObj.responseText;
							
							if(prop.onfinish && typeof(prop.onfinish) == 'function')
								prop.onfinish();
								
							break;
					}
				}
			}
		}
		return false;
	},
	
	autoHashCheck: function(prop) {
		prop = dAjax.genProps(prop);
		
		var hashinterVal = setInterval(function() {
			dAjax.hashCheck();
			}, prop.interval);
	},
	
	hashCheck: function(init) {
		var hash = window.location.hash;
		
		if(typeof(window.ajaxHash) != 'undefined' || init == true) {
			if(typeof(window.ajaxHash) == 'undefined' && init == true) {
				window.ajaxHash = new Object();
				window.ajaxHash.lastHash = '';
				}
			if(hash != window.ajaxHash.lastHash || (init == true && hash)) {
				var hashProps = unescape(hash).substring(unescape(hash).indexOf('?') + 1).split('&&');
				var oProps = new Object();
				
				for(var e=0; e<hashProps.length; e++) {
					var cProp = hashProps[e].split('=');
					if(cProp.length > 2) {
						oProps[cProp[0]] = hashProps[e].substring(hashProps[e].indexOf('=') + 1);
					} else {
						oProps[cProp[0]] = cProp[1];
					}
				}

				window.ajaxHash.lastHash = hash;
				var props = {
					mode:oProps.mode,
					url:oProps.url,
					container:oProps.container,
					log:'off'
				}
				dAjax.init(props);
			}
		}
	},
	
	logPage: function(prop) {
		var dprop = '';
		for(key in prop) {
			dprop += key+'='+prop[key]+'&&';
		}

		var hash = window.location.hash;
		
		if(typeof(window.ajaxHash) == 'undefined') {
			window.ajaxHash = new Object();
			window.ajaxHash.props = new Array();
		}

		if(hash) {
			window.ajaxHash.lastHash = hash;
			window.location.hash = escape('Ajax?'+dprop);
		} else {
			window.location.hash = escape('Ajax?'+dprop);
		}
	},
	
	genProps: function(prop) {
		if(typeof(prop) == 'undefined') prop = new Object();
	
		for(key in this.defaults) {
			if(typeof(prop[key]) == 'undefined') {
				prop[key] = this.defaults[key];
			}
		}
		return prop;
	},
	
	init: function(prop) {
		if((typeof(prop.log) != 'undefined' && prop.log == 'on') || (typeof(prop.log) == 'undefined' && this.defaults.log == 'on')) {
			dAjax.logPage(prop);
		}
		prop = dAjax.genProps(prop);
		var func = 'dAjax.' + prop.mode + '(prop)';
		return eval(func);
	}
}

// Ny Ajax Class slutt
