function sendRequest(strData, intID)
{
    strData += "&target=ajax&ajax_unset=0";
    var return_format = "txt";
    if(intID == 15 || intID == 5 || intID == 14)
    {
        return_format = "json";
    }
    else if (intID == 2 || intID == 99 || intID == 66)
    {
        return_format = "xml";
    }
    if(intID == 5)
    {
        strData += "&type=json";
    }

    $.ajax({
        type: "POST",
        url: "ajax.server.php",
        data: strData,
        success: function(data)
                 {
                     processData(data, intID);
                 },
        error: function(XMLHttpRequest, textStatus, errorThrown)
               {
                   console.log('Beginn');
                   console.log(textStatus+' bei '+strData);
                   console.log(XMLHttpRequest);
                   console.log(errorThrown);
                   console.log('Ende');
                   alert(textStatus+' bei '+strData);
               },
        dataType: return_format
    });
};

// process data from server
function processData(data, intID)
{
    switch(intID)
    {
        // fuellen von Selectboxen
        // benoetigt xml Rueckgabe
        case 2:
            fillSelectbox(data);
        break;

        // setzt Werte in Infobox (z.B. in Daten vererben)
        // benoetigt json Rueckgabe
        case 5:
            showInfoResults(data);
        break;

        // benoetigt json Rueckgabe
        case 14:
           fillElement(data);
        break;

        // wird von getElementsToShow aufgerufen, um
        // Elemente anzuzeigen oder auszublenden
        // benoetigt json Rueckgabe
        case 15:
		   manageElementsToShow(data);
        break;

        // fuer das Lightboxdiv in der Einsatplanung
        // benoetigt json Rueckgabe
        case 16:
			showDialog(data);
		break;

		case 99:
		  fillTextFields(data);
		break;

		case 66:
          fillSelectbox(data, true);
		break;

        default:
            //alert("default: "+unescape(decode64(xmlHttp.responseText)));
        break;
    }
};

// id 16
/**
 * Zeigt einen Lightboxdialog in der Einsatzplanung
 */
function showDialog(data)
{
    $('<div><div class="notify_messages">'+ decodeURIComponent(data) +'</div></div>').dialog({
	    title: 'Meldungen',
        bgiframe: true,
		resizable: false,
		draggable: false,
		height: 500,
		width: 400,
		modal: true,
		overlay: {
			backgroundColor: '#000',
			opacity: 0.5
		},
		buttons: {
	       'Ok': function(){
		      $(this).dialog('close');
			}
		}
	});
};

// id 99
function fillTextFields(xml)
{
    var elements = xml.getElementsByTagName("element");
    var el_cnt = elements.length;

	//wenn xml keine elemente enthaelt, brauchen wir auch nichts machen
	if(el_cnt == 0)
	{
	    return false;
	}

	for(var i = 0; i < el_cnt; i++)
	{
		//fuer jedes element im xml, suchen wir auch das element in der html seite
		var el_name   = elements[i].getAttribute("name");
		var object = document.getElementById(el_name);

		//wenn das html object nicht vorhanden, springen wir zum naechsten
		if(!object)
		{
		    continue;
		}

		var values  = elements[i].getElementsByTagName("value");
    	var val_cnt = values.length;
    	//wenn das xml objekt keine values hat, gibts auch nichts zu fuellen
    	if(val_cnt == 0)
    	{
    	    return false;
    	}

    	//wert holen, unscapen
    	for(var i = 0; i < val_cnt; i++)
    	{
    		val = values[i].firstChild.nodeValue;
    		val = unescape(val);
    		object.value = val;
    	}
	}
}


// id 14
/**
 * Füllt ein HTML-Element mit den üergebenen Werten
 */
function fillElement(data)
{
    $(jqid(data['element'])).html(data['value']);
    setElementHeight(new Array(data['element']));
}


// id 5
/**
 * Füllt eine Infotabelle mit den übergebenen Werten
 *
 * @param array data
 */
function showInfoResults(data)
{
    var bgcolor_cnt = 0;
    var row = null;

    var table = $(jqid("infobox"));
    $('.inserted_content').remove();
    $.each(data, function()
    {
        $.each(this, function(key, value)
        {
            row = $('<tr><td>'+key+'</td><td>'+value+'</td></tr>').attr({
                    bgcolor: bgcolor_cnt++ % 2 == 1 ? "#FFFFFF":"#d9d9d9",
                    id: key
                  }).addClass("contenttext inserted_content");
            table.append(row);
        });
    });
}

/********/
/* ID 2 */
/********/
/**
 * Fuellt Selectboxen anhand einer uebergebenen XML-Struktur
 *
 * @param object $xmlHttp xmlhttp rueckgabe object
 */
function fillSelectbox(xml)
{
    var elements = xml.getElementsByTagName("element");
    var el_cnt = elements.length;

	//wenn xml keine elemente enthaelt, brauchen wir auch nichts machen
	if(el_cnt == 0)
	{
	    return false;
	}

	for(var i = 0; i < el_cnt; i++)
	{
		//fuer jedes element im xml, suchen wir auch das element in der html seite
		var el_name   = elements[i].getAttribute("name");
		var is_ams    = elements[i].getAttribute("type") == 'ams';
		var objSelect = document.getElementById(el_name);

		//wenn das html object nicht vorhanden, springen wir zum naechsten
		if(!objSelect)
		{
		    continue;
		}

		//erstmal loading div ueber selectbox legen
		showLoadingInfo(objSelect);

		//option werte fuer selectbox erstellen
		var ret = new createOptions(elements[i], is_ams);
		if(ret)
		{
			//wenn wir noch nicht alle optionwerte von der ajaxserver
			//bekommen haben, bitten wir ihn, uns den naechsten schwung zu schicken
			if(ret.end < ret.totalresult)
			{
	        	function_name = 'getValues';
	    		data 		  = "element_id="+ret.elementname+
	    						 "&function="+function_name+
	    						 "&begin="+ret.end+
	    						 "&reset_selectbox=0";
	    		sendRequest(data, 2);
    		}
    		else
    		{
    			//wenn wir fertig sind, verstecken wir das loading div wieder
    			hideLoadingInfo(objSelect);
    			//setzen der selected options felder
    			setSelectedFields(objSelect);
    			//var element = el_name.replace(/\[/g,"\\[").replace(/\]/g,"\\]");
    			//$("#"+element).change();
    		}
		}
	}
}

/**
 * loadingdiv element wieder ausblenden bzw entfernen
 *
 * @param object $obj html objekt das entfernt werden soll
 */
function hideLoadingInfo(obj)
{
	if(!obj)
	{
	    return;
	}

	//parent element ermitteln
	var parent_el  = obj.parentNode;
	var loading_id = obj.id+"_loading";
	//loading div ermitteln
	loading_el = document.getElementById(loading_id);
	if(loading_el)
	{
		obj.disabled = false;
		//loading div aus parentelment entfernen
		parent_el.removeChild(loading_el);
	}
}

/**
 * div element erzeugen und ueber uebergebenes objekt legen
 *
 * @param object $obj html objekt ueber das, das loading div erscheinen soll
 */
function showLoadingInfo(obj)
{
	var parent_el  = obj.parentNode;
	var loading_id = obj.id+"_loading";
	var loading_el = document.getElementById(loading_id);
	var node   	   = obj;
	var height 	   = 0;
	var mydiv      = document.createElement("DIV");

	if(loading_el)
		return false;

	/**
 	 * vielleicht kann man den naechsten schritt auch anders loesen aber mein ansatz ist wie folgt
 	 * wir positionieren das loading div relative zum parentNode, der im normalfall das td ist.
 	 * da wir aber leider td nicht direkt fragen koennen wir hoch es ist, muessen wir alle kinder durchlaufen
 	 * und die hoehe jedes einzelnen ermitteln und finden so herraus
 	 * welches das hoechste ist (im normalfall ist es die selectbox selber aber man weiss ja nie)
 	 * das heisst wir wissen jetzt, wie hoch unsere selectbox ist,
 	 * wie hoch unser div ist(genauso hoch wie die selectbox) und wie hoch die gesamte td ist
 	 * da wir das div relative dran haengen muessen wir die div hoehe und die hoehe vom td abziehen
 	 * um die top postionen zu bestimmen.
 	 * kling kompliziert ist aber am ende ganz einfach :-)
 	 *
 	 */

	//hoechstes element bestimmten
	while (node != null)
	{
		if(node.offsetHeight && node != obj)
		{
		    height = height < node.offsetHeight ? node.offsetHeight : height;
		}
  		node = node.nextSibling;
	}
	//hoechstes element und hoehe div addieren
	height += obj.offsetHeight;
	width   = obj.offsetWidth ? obj.offsetWidth-2 : 0;
	mydiv.className    = "loadingdiv";
	//top possition minus der gesammt hoehe
    mydiv.style.top    = "-" + height;
    mydiv.style.width  = width;
    mydiv.style.height = obj.offsetHeight;
    mydiv.id 		   = loading_id;
    //vorsichtshalber noch die selectbox disablen, damit keiner mehr klicken kann
    obj.disabled 	   = true;

    parent_el.appendChild(mydiv);
}


/**
 * Erzeugt Optionsfelder fuer eine Selectbox
 *
 * Dabei wird über den Parameter is_ams angegeben, ob die Options für eine AMS sind.
 * In dem Fall werde die schon selectierten Einträge nicht für die AMS übernommen,
 * damit die Daten nicht zweimal ausgewählt werden können
 *
 * @author Martin Kluge <m.kluge@ipark-media.de>
 * @param object $obj xml objekt fuer eine selectbox
 * @param is_ams bool
 */
function createOptions(obj, is_ams)
{
	var el_name   = obj.getAttribute("name");

	var objSelect = document.getElementById(el_name);
	var objSelect = $(jqid(el_name));
	var val = "";
	var key = 0;
	var j   = 0;
	this.inserted  	  = 0;
	this.totalresult  = 0;
	this.start        = 0;
	this.end          = 0;
	this.elementname  = el_name;
	this.resetelement = 1;
	var selected_name = el_name.substring(0, el_name.length - 2);
	selected_name += '-t';
	var selected = new Array;


	if(document.getElementById(selected_name))
	{
	    var cnt = 0;
        $(jqid(selected_name)+' option').each(function()
        {
            selected[cnt++] = this.value;
        });
	}

	if(obj.getAttribute("totalResults"))
	{
	    this.totalresult = Number(obj.getAttribute("totalResults"));
	}

	if(obj.getAttribute("start"))
	{
	    this.start = Number(obj.getAttribute("start"));
	}

	if(obj.getAttribute("end"))
	{
	    this.end = Number(obj.getAttribute("end"));
	}

	if(obj.getAttribute("resetElement"))
	{
	    this.resetelement = obj.getAttribute("resetElement");
	}

	//wenn wir noch kein nachgeladenes objekt sind, sprich start auf 0 steht
	//speichern wir alle bisher selektieren werte, da sie sonst verloren gehn
	if(this.start == 0)
	{
	    getSelectedFieldsJQ(el_name);
	}

	//wenn wir noch kein nachgeladenes objekt sind, sprich resetelement auf 1 steht
	//loeschen wir alle optionswerte aus der selectbox
	//ansonsten setzen wir den zaehler j, damit weiter unten ab dieser stelle
	//weitere optionsfelder hinzugefuegt werden
	if(this.resetelement == 1)
	{
            $(jqid(el_name)+' option').remove();
	}
	else
	{
	    j = $(jqid(el_name)+'options').size();
	}

	var values  = obj.getElementsByTagName("value");
	var val_cnt = values.length;
	//wenn das xml objekt keine values hat, gibts auch nichts zu fuellen
	if(val_cnt == 0)
	{
	    return false;
	}

	// Durchlauf der zurückgelieferten XML-Daten
	for(var i = 0; i < val_cnt; i++)
	{
		val = values[i].firstChild.nodeValue;
		val = decodeURIComponent(val);
        key = values[i].getAttribute("id");
		var is_selected = false;

    	if(is_ams && is_ams == true)
    	{
   		   // Durchlaufen des selected Array
            for(var c = 0 ; c < cnt ; c++)
            {
                // Vergleich ob die aktuelle Option im selected Array vorhanden ist
                // Wenn ja, als selected markieren
                if(key == selected[c])
                {
                    is_selected = true;
                    break;
                }
            }
            // Wenn die aktuelle Option nicht als selected markiert ist und es sich nicht
            // um eine Standard Antwort handelt key > 0 dann diese Option auch verwenden
            if(is_selected == false && key > 0)
            {
                $(jqid(el_name)).append('<option value="'+key+'">'+val+'</option>')
                j++;
            }
    	}
    	// Wenn es sich um eine normale Selectbox handelt, dann werden alle Optionen
    	// verwendet
    	else
    	{
            $(jqid(el_name)).append('<option value="'+key+'">'+val+'</option>')
            j++;
    	}
	}
	this.inserted = i;
	return this;
}



// alle Funktionen ab hier muessen geprueft werden, ob sie raus koennen


/********************************************************************
  * Aufruf: Funktion fuer job.search_profile.form.inc.php
  *
  * @param objSelect, object HTMLSelectElement
  * @param serverFile, string, name of file which shall create the response
  * @param comeFrom, string, indicates the php-file which produced this site
  * @param onlyContact, boolean, true if only the customer ID is needed
  *********************************************************************/
function changeSelectboxesForJob(objSelect, serverFile, comeFrom, onlyContact)
{
    if(typeof(document.getElementsByName("contact_id")[0]) != "undefined")
    {
        var str = '&';
        str = str + document.getElementsByName("contact_id")[0].name
                + "="
                + document.getElementsByName("contact_id")[0].value;
    }
    else
    {
        var str = "";
    }

    if(!onlyContact)
    {

        str = str + getSelectedItemsAsString(document.getElementById("project_id"));

        str = str + getSelectedItemsAsString(document.getElementById("job_id"));
    }

    str = str + "&comeFrom=" + comeFrom;
    str = str + "&browser=" + navigator.appName;

    sendRequest(serverFile, str, 2);

};

/********************************************************************************************
  * unterstuetzende Funktion: liefert selektierte Optionswerte einer Selectbox in einem String
  *
  * @param objSelect, object HTMLSelectElement
  *******************************************************************************************/
function getSelectedItemsAsString(objSelect)
{
    var str = "&" + objSelect.id + "=";
    var hasItems = false;

    for(opt in objSelect.options)
    {
        try
        {
            if(objSelect.options[opt].selected)
            {
                str = str + objSelect.options[opt].value + ",";
                hasItems = true;
            }
        }
        catch(e)
        {
            continue;
        }
    }
    if(hasItems)
    {
        return str.substr(str, str.length - 1);
    }
    else return '';
}
