function pc3Ajax(url,params,method){
	this.setURL(url);
	this.setParams(params);
	this.setMethod(method);
	
	this.onSuccess = null;
	this.onError = null;
}

pc3Ajax.createRequest = function (){
	if ( window.XMLHttpRequest ) return new XMLHttpRequest();
	if ( window.ActiveXObject ){
		try {
			return new ActiveXObject("MSXML2.XMLHTTP.3.0");
		} catch(e){
			return null;
		}
	}
	return null;
}

pc3Ajax.addParams = function(url,params){
	if ( !params ) return url;
	
	var paramString = '';
	switch ( typeof params ) {
		case 'object':
			for( var name in params ) {
				paramString += (paramString?'&':'') + encodeURIComponent(name) +'='+ encodeURIComponent(params[name]);
			}
			break;
			
		default:
			paramString = params;
			break;
	}
	
	if ( url.indexOf('?') >= 0 ) url += '&';
	else url += '?';
	
	return url + paramString;
}

pc3Ajax.getFormData = function(form){
	var params = '';
	
	for ( var i=0; i<form.elements.length; i++ ) {
		var element = form.elements[i];
		if ( !element.name ) continue;
		if ( element.type == 'checkbox' && !element.checked ) continue;
		if ( element.type == 'radio' && !element.checked ) continue;
		params += (params?'&':'') + encodeURIComponent(element.name) +'='+ encodeURIComponent(element.value);
	}
	
	return params;
}

pc3Ajax.prototype.setURL = function (url){
	this.url = url;
}

pc3Ajax.prototype.setParams = function (params){
	this.params = params;
}

pc3Ajax.prototype.setMethod = function (method){
	this.method = method;
	
	if ( !this.method ) this.method = 'GET';
	else this.method = this.method.toUpperCase();
	
	if ( this.method != 'GET' ) this.method = 'POST';
}

pc3Ajax.prototype.onStateChange = function(request){
	if ( request.readyState == 4 ){
		if ( (request.status == 200 || request.status == 304) ){
			if ( this.onSuccess ) this.onSuccess(request.responseText, request.responseXML );
		} else {
			if ( this.onError ) this.onError('Request failed: '+'['+request.status+', '+request.statusText+']');
		}
	}
	
	return false;
}



pc3Ajax.prototype.doRequest = function(){
	if ( !this.url ) return false;
	
	var postParams = '';
	
	var url = this.url;
	
	if ( this.method == 'GET' ) {
		url = pc3Ajax.addParams(url,this.params);
	} else {
		postParams = this.params;
	}
	
	var self = this;
	var request = pc3Ajax.createRequest();
	if ( !request ) return false;
	
	request.onreadystatechange = function(){ self.onStateChange(request); }
	
	request.open( this.method, url, true );
	if ( this.method == 'POST' ) request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	if ( this.onRequest ) this.onRequest();
	
	request.send(postParams);
	
	return true;
}

pc3Ajax.evaluateScriptBlocks = function(content){
	//make sure js-blocks are executed
	elements = content.getElementsByTagName('script');
	for (var i=0;i<elements.length;i++) {
		eval(elements[i].text);
	}
}

function pc3AjaxContent(id,onRequestHTML,onErrorHTML){
	this.defaultContent = document.getElementById(id);
	if ( !this.defaultContent ) return;
	
	this.id = id;
	this.onRequestHTML = onRequestHTML;
	this.onErrorHTML = onErrorHTML;
	
	this.replaceDefaultContent = function(newHTML){
		while( this.defaultContent.firstChild ) this.defaultContent.removeChild(this.defaultContent.firstChild);
		
		pc3CreateElementsByHTML(newHTML,this.defaultContent);
	}
	
	this.onSuccessHandler = function(responseText,responseXML){
		this.replaceDefaultContent(responseText);
		
		pc3Ajax.evaluateScriptBlocks(this.defaultContent);
	}
	
	this.onRequestHandler = function(){
		if ( this.onRequestHTML ) this.replaceDefaultContent(this.onRequestHTML);
	}
	
	this.onErrorHandler = function(errorMsg){
		this.replaceDefaultContent(this.onErrorHTML);
	}
	
	this.requestContent = function(url,postData){
		url = pc3Ajax.addParams(url,'pc3AjaxContent='+ this.id);
		var ajax = new pc3Ajax(url,postData,(postData?'POST':'GET'));
		
		var self = this;
		ajax.onRequest = function(){ self.onRequestHandler(); }
		ajax.onSuccess = function(responseText,responseXML){ self.onSuccessHandler(responseText,responseXML); }
		ajax.onError = function(errorMsg){ self.onErrorHandler(errorMsg); }
		
		if ( !ajax.doRequest() ) return false;
		
		return true;
	}
}

pc3AjaxContent.requestPost = function(form,id,url){
	if ( !document.pc3AjaxContentObjects[id] ) return true;
	var ajaxContent = document.pc3AjaxContentObjects[id];
	
	var data = pc3Ajax.getFormData(form);
	
	if ( !ajaxContent.requestContent((url?url:form.action),data) ) return true;
	
	return false;
}

pc3AjaxContent.requestLinkOnClick = function(event,link,id,url){
	if ( !document.pc3AjaxContentObjects[id] ) return false;
	
	var ajaxContent = document.pc3AjaxContentObjects[id];
	
	if ( !ajaxContent.requestContent(url) ) return false;
	
	cp(event);
	
	return true;
}

pc3AjaxContent.requestLink = function(event,link,id,url){
	if ( !document.pc3AjaxContentObjects[id] ) return;
	
	if ( !url ) {
		if ( !link.pc3AjaxRequest ) link.pc3AjaxRequest = link.href;
		url = link.pc3AjaxRequest;
	}
	
	var ajaxContent = document.pc3AjaxContentObjects[id];
	
	if ( !ajaxContent.requestContent(url) ) return;
	
	link.href = 'javascript: void(0);';
	
	cp(event);
}