/* This lib can't run without prototype */
function ajaxCallSuccess($r)
{
	var $onEnd = false;
	var $response = $r.responseText;

	$response = $response.replace(/^\s+/, '').replace(/\s+$/, '');

  	if( $response.substring( 0, 6 ) !== 'JSON::' )
	{
		return handleError($response);
	}
	try {
		eval( 'var $res = ' + $response.substring( 6, $response.length ) );
	} catch ( Error ) {
		return handleError(Error.message);
	}

	$res.each( function( $r )
	{
		try {
			switch($r.c)
			{
				// alert
				case 'al':alert(unescape($r.data));break;

				// assign
				case 'as':eval(unescape($r.params.i)+'.'+$r.params.p+'=$r.data;');break;

				// replace
				case 'rp':eval('var $ajaxTmp='+unescape($r.params.i)+'; new Insertion.Before('+unescape($r.params.i)+',$r.data);');$ajaxTmp.remove();break;

				// replaceContent
				case 'rco':eval(unescape($r.params.i)+'.innerHTML=$r.data;');break;

				// script
				case 'sc':eval($r.data);break;

				// var/json
				case 'json':
				case 'va':eval(unescape($r.params.i)+'=$r.data;');break;

				// eval
				case 'ev':eval(unescape($r.params.i)+'=eval($r.data)');break;

				// console
				case 'co':if(navigator.appName.indexOf('Opera') != -1){opera.postError(eval($r.data));break;}if(console){console.log($r.data);break;} alert($r.data);break;

				// insert before
				case 'ib':eval('new Insertion.Before('+unescape($r.params.i)+',$r.data);');break;

				// insert after
				case 'ia':eval('new Insertion.After('+unescape($r.params.i)+',$r.data);');break;

				// eval insert before first
				case 'if':eval('new Insertion.Top('+unescape($r.params.i)+',$r.data);');break;

				// eval insert after last
				case 'il':eval('new Insertion.Bottom('+unescape($r.params.i)+',$r.data);');break;

				// effekt fade out
				case 'fo':eval('new Effect.Fade('+unescape($r.params.i)+');');break;

				// effekt fade in
				case 'fi':eval('new Effect.Appear('+unescape($r.params.i)+');');break;

				// remove
				case 'rm':eval(unescape($r.params.i)+'.remove();');break;

				// select box; select an item in a selectBox
				case 'sb':
					eval('var $elem='+unescape($r.params.i)+';');
					if (!$elem) {
						break ;
					}

					var $l=$elem.length;
					for(var $it=0;$it<$l;$it++)
					{
						var $e=$elem.options[$it];
						$e.selected=$e.value==$r.params.v;
					}
					break;

				// select-replace; Select-Listen Inhalt austauschen
				case 'sr':
					eval('var $l={'+$r.data+'};');
					eval('$lst='+unescape($r.params.i));
					$lst.length=$r.params.l;
					var $e=0;
					for($item in $l)
					{
						$lst.options[$e].value=unescape($item);
						$lst.options[$e].text=unescape($l[$item]);
						$lst.options[$e].selected=false;
						$e++;
					}
					break;

				// alle elemente mit einer bestimmten klasse entfernen
				case 'rc':
					var $class = unescape($r.params.cl);
					$$('.'+$class).each( function(item){ item.parentNode.removeChild(item); });
					break;
				// alle elemente mit einer bestimmten klasse aendern - afs
				case 'cc':
					var $class = unescape($r.params.c1);
					$$('.'+$class).each( function(item){ item.className = unescape($r.params.c2) });
					break;
				case 'onEnd':
					$onEnd = unescape($r.data);
					break;
			}
		} catch ( Error ) {
			handleError(Error.message);
		}
	} );

	if ( $onEnd!==false ) {
		eval($onEnd);
	}
}

function ajaxCall()
{
	var $args = ajaxCall.arguments;
	var $link = $args[0];
	var $params = '';

	var $onSuccess = ajaxCallSuccess ;
	var $onFailure ;
	var $onStart = false;
	var $onEnd = false;

	if (typeof ($args[1]) == 'object') // ist ein Array
	{
		for ($k in $args[1])
		{
			if ($params.length)
			{
				$params+='&';
			}
			$params+=$k+'='+escape($args[1][$k]);
		}

		if (typeof ($args[2]) == 'object') // Array mit den Funktionen onSuccess etc.
		{
			for ($k in $args[2])
			{
				if ($k == 'onSuccess')
				{
					$onSuccess = $args[2][$k] ;
					continue ;
				}
				if ($k == 'onFailure')
				{
					$onFailure = $args[2][$k] ;
					continue ;
				}
				if ($k == 'onStart')
				{
					$onStart = $args[2][$k] ;
					continue;
				}
				if ($k == 'onEnd')
				{
					$onEnd = $args[2][$k] ;
					continue;
				}
			}
		}
	}
	else // sind Strings etc.
	{
		for(var $i=1;$i<$args.length;$i++)
		{
			$params+=($params.length)?'&param'+($i-1)+'='+escape($args[$i]):'param'+($i-1)+'='+escape($args[$i]);
		}
	}

	if ( $onEnd ) {
		$params += (($params.length) ? '&' : '?') + 'onEnd='+escape($onEnd);
	}

	if($onStart) $onStart();
	var ajaxObj=new Ajax.Request($link,{method:"post",postBody:$params,onSuccess:$onSuccess,onFailure:$onFailure});
}


function ajaxPost()
{
	var $args=ajaxPost.arguments;
	var $link=$args[0];
	var $params= $( $args[1] ).serialize(true);
	var $onStart = false;
	var $onEnd = false;

	$params = Object.toQueryString($params);

	if (typeof ($args[2]) == 'object') // Array mit den Funktionen onSuccess etc.
	{
		for ($k in $args[2])
		{
			if ($k == 'onStart')
			{
				$onStart = $args[2][$k] ;
				continue;
			}
			if ($k == 'onEnd')
			{
				$onEnd = $args[2][$k] ;
				continue;
			}
		}

		for(var $i=3;$i<$args.length;$i++)
		{
			$params+=($params.length)?'&param'+($i-1)+'='+escape($args[$i]):'param'+($i-1)+'='+escape($args[$i]);
		}
	} else {
		for(var $i=2;$i<$args.length;$i++)
		{

			$params+=($params.length)?'&param'+($i-1)+'='+escape($args[$i]):'param'+($i-1)+'='+escape($args[$i]);
		}
	}

	if ( $onEnd ) {
		$params += (($params.length) ? '&' : '?') + 'onEnd='+escape($onEnd);
	}

	if($onStart) $onStart();
	var ajaxObj=new Ajax.Request($link,{method:"post",postBody:$params,onSuccess:ajaxCallSuccess});
}

function handleError($response) {

	if( navigator.appName.indexOf('Opera') != -1 )
	{
		alert( 'AJAX: Es ist ein Fehler aufgetreten. Bitte schaue in deine Opera-Console' );
		opera.postError( $response );
		return;
	}
	// if firefox - firebug
	else if( typeof console != "undefined" && typeof console.debug != "undefined")
	{
		alert( 'AJAX: Es ist ein Fehler aufgetreten. Bitte schaue in deine Firebug-Console' );
		console.log( $response );
		return;
	}
	// other browsers
	else
	{

		if( confirm( 'AJAX: Es ist ein Fehler aufgetreten. Rueckgabe anzeigen?' ) )
		{
			alert( $response );
		}
		return;
	}

}
