
/**
 * _ptools.Ajax
 *
 * @author PCSG - Henning
 * @package com.pcsg.ptools.ajax
 *
 * @copyright  2008 PCSG
 * @version    0.4 $Revision: 4419 $
 * @since      Class available since Release P.MS 0.1
 */

if (typeof _ptools == 'undefined') {
	var _ptools = {};
};

function ajax() { };

ajax.prototype.sync = function(php, params)
{
	var AjaxSync = new _ptools.Ajax({
		'host'        : _ptools._System.getAttribute('host'),
		'name'        : '_ajax_get_products',
		'request_url' : _ptools._System.getAttribute('ajax')
	});

	var result = false;

	if (params)
	{
		result = AjaxSync.request(php, '', params);
	} else
	{
		result = AjaxSync.request( php );
	};

	return this.ExceptionCheck(result, AjaxSync);
};

ajax.prototype.syncPost = function(php, params)
{
	var AjaxSync = new _ptools.Ajax({
		host        : _ptools._System.getAttribute('host'),
		name        : '_ajax_post_sync',
		request_url : _ptools._System.getAttribute('ajax'),
		type        : 'POST'
	});

	var result = false;

	if (params)
	{
		result = AjaxSync.request(php, '', params);
	} else
	{
		result = AjaxSync.request( php );
	};

	return this.ExceptionCheck(result, AjaxSync);
};

ajax.prototype.async = function(php, func, params)
{
	var AjaxASync = new _ptools.Ajax({
		'host'        : _ptools._System.getAttribute('host'),
		'name'        : '_ajax_get_products',
		'request_url' : _ptools._System.getAttribute('ajax'),
		'func'        : func
	});

	if (params)
	{
		AjaxASync.request(php, this.ExceptionCheckAsync, params);
		return;
	};

	AjaxASync.request(php, this.ExceptionCheckAsync);
};

ajax.prototype.asyncPost = function(php, func, params)
{
	var System  = _ptools._System;
	var _params = params || {};

	_params.host = System.getAttribute('host');
	_params.name = '_ajax_post_async';
	_params.type = 'POST',
	_params.func = func;
	_params.request_url = System.getAttribute('ajax');

	var AjaxASync = new _ptools.Ajax(_params);

	if (params)
	{
		AjaxASync.request(php, this.ExceptionCheckAsync, params);
		return;
	};

	AjaxASync.request(php, this.ExceptionCheckAsync);
};

ajax.prototype.ExceptionCheck = function(result, AJAX)
{
	if (typeof result.type == 'undefined' ||
		(result.type != '_ptools::Exception' && result.type != '_ptools::DBException'))
	{
		return result;
	};

	// Eigenes Error des Objektes
	if (typeof AJAX.getAttribute('onError') == 'function')
	{
		AJAX.getAttribute('onError')(result, AJAX);
		return null;
	};

	// Wenn Exception geworfen UND onError deklariert wurde
	if (typeof _ptools.onError == 'function')
	{
		_ptools.onError(result, AJAX);
		return null;
	};

	// Wenn Exception geworfen aber keine User Funktion deklatiert wurde
	throw result;
};

ajax.prototype.ExceptionCheckAsync = function(result, AJAX)
{
	// Wenn kein Exception geworfen wurde
	if (typeof result.type == 'undefined' ||
		(result.type != '_ptools::Exception' && result.type != '_ptools::DBException'))
	{
		var f = AJAX.getAttribute('func');

		if (typeof f == 'function')
		{
			f( result, AJAX );
			return;
		};

		eval(f + "( result, AJAX )");
		return;
	};

	// Eigenes Error des Objektes
	if (typeof AJAX.getAttribute('onError') == 'function')
	{
		AJAX.getAttribute('onError')(result, AJAX);
		return;
	};

	// Wenn Exception geworfen UND onError deklatiert wurde
	if (typeof _ptools.onError == 'function')
	{
		_ptools.onError(result, AJAX);
		return;
	};

	// Wenn Exception geworfen aber keine User Funktion deklatiert wurde
	throw result;
};


_ptools.Ajax = function(settings)
{
	var t = this;
	var _settings = settings || {};

	t.http_request = false;

	t.name   = settings.name;
	t.type   = '_ptools::Ajax';
	t.params = [];

	t.getAttribute = function(name)
	{
		if (_settings[name]) {
			return _settings[name];
		};

		return false;
	};

	t.setAttribute = function(name, value)
	{
		_settings[name] = value;
	};

	t.getParams = function(name)
	{
		if (t.params[name]) {
			return t.params[name];
		};

		return false;
	};

	t.request_url = 'ajax_request.php';

	if (settings && settings.request_url) {
		t.request_url = settings.request_url;
	};
};

/**
 * Request verarbeiten
 */
_ptools.Ajax.prototype.request = function(phpFunction, jsFunction, params)
{
	var t     = this;
	var async = false;

	t.http_request = false;
	t.params       = params || {};

	// PCSG Params
	t.params.pcsg_uri = window.location;

	if (jsFunction) // Asyncron
	{
		async = true;
		t.setAttribute('jsFunction', jsFunction);
	};

    if (window.XMLHttpRequest)
    { // Mozilla, Safari,...
        t.http_request = new XMLHttpRequest();

        if (t.http_request.overrideMimeType) {
            t.http_request.overrideMimeType('text/xml');
        };

    } else if (window.ActiveXObject)
    { // IE
        try
        {
            t.http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e)
        {
            try
            {
                t.http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {};
        };
    };

    if (!t.http_request)
    {
        alert('XMLHTTP-Instanz konnt nicht erzeugt');
        return false;
    };

    if (async == true)
    {
	    var self = t;

		t.http_request.onreadystatechange = function() {
	    	self.result();
	    };
    };

    var request_host   = t.getAttribute('host') +  t.request_url;
    var request_string = "pcsg_rf=" + phpFunction;

    if (params)
    {
    	for (k in params)
    	{
    		if (typeof params[k] == 'undefined') {
    			continue;
    		};

    		if (typeof params[k] == 'function') {
    			continue;
    		};

    		if (typeof params[k].nodeName != 'undefined') {
    			continue;
    		};

    		str2 = params[k].toString();
    		str2 = str2.replace(/\+/g, '%2B');
    		str2 = str2.replace(/\&/g, '%26');
    		str2 = str2.replace(/\'/g, '%27');

    		request_string = request_string + "&" + k +"=" + str2;
    	};
    };

	if (t.http_request.overrideMimeType) {
		t.http_request.overrideMimeType('text/plain; charset=utf-8');
	};

	if (t.getAttribute('type') == 'POST')
	{
		if (async == false) // syncron
	    {
		    var r = t.http_request.open('POST', request_host, false);
		    t.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		    t.http_request.send(request_string);

		    return t.ajaxreturn(t.http_request.responseText);
	    } else // asyncron
	    {

	    	var r = t.http_request.open('POST', request_host, true);
		    t.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		    t.http_request.send(request_string);
	    };

	} else
	{
	    if (async == false) // syncron
	    {
		    var r = t.http_request.open('GET', request_host+'?'+request_string, false);
		    t.http_request.send(null);

		    return t.ajaxreturn(t.http_request.responseText);
	    } else // asyncron
	    {
	    	var r = t.http_request.open('GET', request_host+'?'+request_string, true);
		    t.http_request.send(null);
	    };
	};
};

/**
 * Resulat vom Request
 */
_ptools.Ajax.prototype.result = function()
{
	if (this.http_request.readyState != 4) {
		return;
	};

	if (this.http_request.status != 200 &&
		this.http_request.status != 500)
	{
		return;
	};

	try
	{
		var l = this.http_request.responseText.length;
		var f = this.getAttribute('jsFunction');

		if (typeof f == 'function')
		{
			f( this.ajaxreturn(this.http_request.responseText), this);
			return true;
		};

		eval(f + "(this.ajaxreturn(this.http_request.responseText), this)");
		return true;

	} catch (e)
	{
		alert(e + "\n\n" + this.getAttribute('jsFunction') + "(this.ajaxreturn( this.http_request.responseText, true ))" + "\n\n" + this.ajaxreturn( this.http_request.responseText ));
	};
};

_ptools.Ajax.prototype.ajaxreturn = function(str)
{
	var len = str.length;
	var end = len-6;

	// Fehler abfangen
	if (str.substring(0, 6) == '<pcsg>' && str.substring(len-7, len) == '</pcsg>')
	{
		var result = eval('('+ str.substring(6, len-7) +')');

		// Hilfetexte
		if (result.helper && result.helper.length)
		{
			for (var i = 0, len = result.helper.length; i < len; i++)
			{
				var m = result.helper[i];

				_ptools._Helper.addNotice(
					false,
					m.text,
					m.solution,
					m.docu
				);
			};
              
			_ptools._Helper.show();
			
		};

		if (result.ajax_result) {
			return result.ajax_result;
		};

		if (result.PException)
		// Fehlermeldungen abfangen
		{
			var message = result.PException.message ? result.PException.message : '';
			var code    = result.PException.code ? result.PException.code : 404;
			var type    = result.PException.type ? result.PException.type : false;

			if (code == 401 &&
				typeof _pcsg != 'undefined' &&
				_pcsg.Controls &&
				_pcsg.Controls.Login) {

				_pcsg.Controls.Login.open();
			};

			return new _ptools.Exception(message, code, type);
		};

		if (result.PExceptionDBError)
		{
			var message = result.PExceptionDBError.message ? result.PExceptionDBError.message : '';
			var code    = result.PExceptionDBError.code ? result.PExceptionDBError.code : 404;

			return new _ptools.DBException(message, code);
		};

	} else
	{
		if (typeof this.getAttribute('onError') == 'function')
		{
			this.getAttribute('onError')(new _ptools.Exception('No PCSG XML', 500), this);
			return null;
		};

		// Wenn Exception geworfen UND onError deklariert wurde
		if (typeof _ptools.onError == 'function')
		{
			_ptools.onError(new _ptools.Exception('No PCSG XML', 500), this);
			return null;
		};

		throw new _ptools.Exception('No PCSG XML', 500);
	};

	return false;
};

