  var ajax_helper_version = '0.1';
  var uid_prefix = 'unique_id_prefix_';
  var uid = 1;
  var ajax_in_progress = 0;

  // SWF Functions

  function sendEvent(swf,typ,prm) {
    thisMovie(swf).sendEvent(typ,prm);
  };

  function getUpdate(typ,pr1,pr2,swf) {};

  function thisMovie(swf) {
    if(navigator.appName.indexOf("Microsoft") != -1) {
      return window[swf];
    } else {
      var movie = document[swf];
      return movie;
    }
  };

  function loadMovie(dest_id, file_url, thumb_url, width, height)
  {
 	var so = new SWFObject('mediaplayer.swf','jstest', width, height, '8');
  	so.addParam('allowscriptaccess','always');
  	so.addParam('allowfullscreen','true');
  	so.addParam('width', '100%');
  	so.addParam('height', '100%');
	so.addParam('wmode', 'opaque');
	so.addVariable('javascriptid','jstest');
	so.addVariable('file', file_url);
	so.addVariable('image', thumb_url);
	so.addVariable('enablejs','true');
	so.addVariable('play', true);
	so.addVariable('background', '#000000');
	so.write(dest_id);
	return so;
  }

  // The AJAX Functions

  function log(message) {
    if (!log.window_ || log.window_.closed) {
        var win = window.open("", null, "width=400,height=200," +
                              "scrollbars=yes,resizable=yes,status=no," +
                              "location=no,menubar=no,toolbar=no");
        if (!win) return;
        var doc = win.document;
        doc.write("<html><head><title>Debug Log</title></head>" +
                  "<body></body></html>");
        doc.close();
        log.window_ = win;
    }
    var logLine = log.window_.document.createElement("div");
    logLine.appendChild(log.window_.document.createTextNode(message));
    log.window_.document.body.appendChild(logLine);
  }

  function showAjaxFailure(msg) 
  {
	  alert(msg);
  }

  function getNodeText (obj) 
  {
	  //mozilla
	  text = obj.textContent;
	
	  //ie
	  if (text == undefined)
	  {
		text = obj.text;
	  }
	
	  if (text == undefined)
	  {
		text = "NO TEXT CONTENT";
	  }
	  return text;
  }

  function handleCommand(commandNode) 
  {
	switch (commandNode.getAttribute('type'))
    {
      case 'replace_html':
    	  $(commandNode.getAttribute('dest_id')).innerHTML = getNodeText(commandNode.getElementsByTagName('html_content')[0]);
      break;
      case 'replace':
		e = $(commandNode.getAttribute('dest_id'));
		Element.insert(commandNode.getAttribute('dest_id'), getNodeText(commandNode.getElementsByTagName('html_content')[0]), 'after');
		e.remove();
      break;
      case 'insert_html':
        Element.insert(commandNode.getAttribute('dest_id'), getNodeText(commandNode.getElementsByTagName('html_content')[0]), 'after');
      break;
      case 'remove_html':
	    var e = $(commandNode.getAttribute('dest_id'));
	    var start = commandNode.getAttribute('start_time');
	    var interval = commandNode.getAttribute('interval');
	    var selector = commandNode.getAttribute('selector');
		var elements = new Array();

		if (selector != '')
			elements = $(e).select(selector);
		else
			elements.push(e);

		// if elements should rotate to another direction
		if (interval < 0) start -= (interval) * elements.length;

		for (var i = 0; i < elements.length; i++) 
		{
			// mark element as to delete
			$(elements[i]).writeAttribute({to_delete: '1'});
			
			if ((start == 0) && (interval == 0))
				Element.remove(elements[i].id);
			else
				setTimeout("if ($('" + elements[i].id + "')) Element.remove('" + elements[i].id + "');", start + i * interval);
		}

      break;
      case 'make_id_unique':
	    var e = $(commandNode.getAttribute('dest_id'));
	    var selector = commandNode.getAttribute('selector');
		var elements = new Array();

		if (selector != '')
			elements = $(e).select(selector);
		else
			elements.push(e);

		// if elements should rotate to another direction
		if (interval < 0) start -= (interval) * elements.length;

		for (var i = 0; i < elements.length; i++) 
		{
			// mark element as to delete
			elements[i].id = uid_prefix + uid;
			uid++;
		}
      break;
      case 'change_id':
	    var e = $(commandNode.getAttribute('dest_id'));
		if (e) e.id = commandNode.getAttribute('new_id');
      break;
      case 'hide_html':
	    var e = $(commandNode.getAttribute('dest_id'));
	    var start = commandNode.getAttribute('start_time');
	    var interval = commandNode.getAttribute('interval');
	    var selector = commandNode.getAttribute('selector')
		var elements = new Array();

		if (selector != '')
			elements = $(e).select(selector);
		else
			elements.push(e);

		// if elements should rotate to another direction
		if (interval < 0) start -= (interval) * elements.length;

		for (var i = 0; i < elements.length; i++) 
		{
			setTimeout("$('" + elements[i].id + "').hide();", start + i * interval);
		}

      break;
      case 'show_html':
	    var e 		 = $(commandNode.getAttribute('dest_id'));
	    var start 	 = commandNode.getAttribute('start_time');
	    var interval = commandNode.getAttribute('interval');
	    var selector = commandNode.getAttribute('selector')
		var elements = new Array();

		if (selector != '')
			elements = $(e).select(selector);
		else
			elements.push(e);

		// if elements should rotate to another direction
		if (interval < 0) start -= (interval) * elements.length;

		for (var i = 0; i < elements.length; i++) 
		{
			setTimeout("$('" + elements[i].id + "').show();", start + i * interval);
		}
      break;
      case 'change_value':
        $(commandNode.getAttribute('dest_id')).value = commandNode.getElementsByTagName('value')[0].textContent;
      break;
      case 'click':
	    var e = $(commandNode.getAttribute('dest_id'));
	    if (e)
	    {
		    var start 	 = commandNode.getAttribute('start_time');
		    var interval = commandNode.getAttribute('interval');
		    var selector = commandNode.getAttribute('selector')
			var elements = new Array();

			if (selector != '')
				elements = $(e).select(selector);
			else
				elements.push(e);

			// if elements should rotate to another direction
			if (interval < 0) start -= (interval) * elements.length;

			for (var i = 0; i < elements.length; i++) 
			{
				setTimeout("e = $('" + elements[i].id + "'); if (e) e.onclick();", start + i * interval);
			}
		}
      break;
      default:
        throw ('Unknown Command-Type: ' + commandNode.getAttribute('type'));
      break;
    }
  }

  function filterElements(elements) {
	var elements_save = new Array();
	for (var i = 0; i < elements.length; i++)
	{
		if (($(elements[i])) && (!$(elements[i]).readAttribute('to_delete') == '1'))
		{
			elements_save.push(elements[i]);			
		}
	}
	return elements_save;
  }

  function handleEffect(effectNode)
  {
    var e = $(effectNode.getAttribute('dest_id'));
    var start = parseInt(effectNode.getAttribute('start_time'));
    var interval = parseInt(effectNode.getAttribute('interval'));
    var selector = effectNode.getAttribute('selector')
	var elements = new Array();

	if (selector != '')
		elements = $(e).select(selector);
	else
		elements.push(e);

	elements = filterElements(elements);

	// if elements should rotate to another direction
	if (interval < 0)
		start = Math.abs(interval) * elements.length;

 	switch (effectNode.getAttribute('type'))
    {
    	case 'appear':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Appear($('" + elements[i].id + "') , {})", start + i * interval);
			}
    	break;
    	case 'fade':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Fade($('" + elements[i].id + "'), {})", start + i * interval);
			}
    	break;
		case 'slidedown':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.SlideDown($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'slideup':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.SlideUp($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'blinddown':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.BlindDown($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'blindup':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.BlindUp($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'grow':
			for (var i = 0; i < elements.length; i++) {
					setTimeout("new Effect.Grow($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'shrink':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Shrink($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;

		case 'dropout':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.DropOut($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'fold':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Fold($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
    	case 'puff':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Puff($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'squish':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Squish($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'switchoff':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.SwitchOff($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;

		case 'highlight':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Highlight($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'pulsate':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Pulsate($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'shake':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.Shake($('" + elements[i].id + "'))", start + i * interval);
			}
    	break;
		case 'show':
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new $('" + elements[i].id + "').show();", start + i * interval);
			}
    	break;

		case 'moveby':
			x = effectNode.getAttribute('x');
			y = effectNode.getAttribute('y');
			for (var i = 0; i < elements.length; i++) {
				setTimeout("new Effect.MoveBy($('" + elements[i].id + "'), " + y + ", " + x + ",  {})", start + i * interval);
			}
    	break;

      default:
        throw ('Unknown Effect-Type: ' + effectNode.getAttribute('type'));
      break;
    }
  }

  function handleAjaxResponse(request) {

    $('fullscreen_splash').hide();

    try 
    {
     var response = request.responseXML;

     if (response.childNodes[0].tagName != "response")
       throw("malformed xml-response: " + response.childNodes[0].tagName);

     if (parseFloat(response.childNodes[0].getAttribute('version')) > parseFloat(ajax_helper_version))
       throw("ajax-helper-version not supported: " + response.childNodes[0].getAttribute('version'));

     for (var i = 0; i < response.childNodes[0].childNodes.length; i++)
     {
       switch (response.childNodes[0].childNodes[i].tagName)
       {
         case 'command':
           handleCommand(response.childNodes[0].childNodes[i]);
         break;
         case 'effect':
           handleEffect(response.childNodes[0].childNodes[i]);
         break;
         default:
         	throw ('Unknown XML-Tag: ' + response.childNodes[0].childNodes[i].tagName);
         break;
       }
     }

    } 
    catch (exception) 
    {
    	alert('AjaxHandler Exception!!!' + exception);
		ajax_in_progress = 0;
    }

	ajax_in_progress = 0;

    return true;
  }

  function ajaxRequest(url) {
    if ((!url) || (url == ''))
    	return false;
    if (ajax_in_progress != 0)
    	return false;
	new Ajax.Request(url, {onSuccess: handleAjaxResponse});
	ajax_in_progress = Math.round(Math.random() * 30000);
	return true;
  }

  function ajaxRequestForced(url) {
	new Ajax.Request(url, {onSuccess: handleAjaxResponse});
	ajax_in_progress = Math.round(Math.random() * 30000);
  }

  function ajaxRequestWithParameter(url, paramHash) {

    if ((!url) || (url == ''))
    	return false;

    if (ajax_in_progress != 0)
    	return false;

	var params = '';
	for (var k in paramHash) {
		if (params != '') params += '&';
		params += rvar_prefix + '[' + k + ']='+paramHash[k];
	}
	params = params.replace(/\[/g,"%5B");
	params = params.replace(/\]/g,"%5D");
	new Ajax.Request(url, {method: "post", parameters: params, onSuccess: handleAjaxResponse});

	ajax_in_progress = Math.round(Math.random() * 30000);

    $('fullscreen_splash').show();

	return true;
  }
