var logical_child = 'false';

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

    $.ajax({
        type: "POST",
        url: "ajax.server.php",
        data: strData,
        success: function(data)
                 {
                     processData(data, intID, change);
                 },
        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);
               },
        async:   async,
        dataType: return_format
    });
};

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

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

        case 9:
            fillHtml(data);
        break;

        case 10:
            fillDialog(data);
        break;

        // benoetigt json Rueckgabe
        case 14:
           fillElement(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;

		case 42:
		  // Diese Fall wird gebraucht wenn nach dem Ajax-Request ein Seiten reload erfolgen soll.
		  var here = document.location.href;
		  document.location.href= here;
		break;

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

    done = true;
    if(logical_child != 'false')
    {
        setSelected(logical_child);
    }
};


function fillHtml(data)
{
    $(jqid('feedback_id')).html(data);

}


// id: 10
/**
*
*/
function fillDialog(data)
{
    $(jqid('dialog')).html(data);
    $(jqclass('ui-dialog')).show();
	$("#tags").autocomplete("ajax.server.php", {
		highlight: false,
		scroll: true,
		scrollHeight: 300,
		multiple: true,
		multipleSeparator: ", ",
		element_id: 'suggestion'
	});

    $('.select_tags').dblclick(function(){
        var id = this.id;
        var selected = $(jqid(id)+' option:selected').text();
        $(jqid(id)+' option:selected').remove();
        var tags = $(jqid('tags')).val();
        if(tags != '' && tags.charAt(tags.length - 2) != ',')
        {
            selected = ', '+selected;
        }
        selected += ', ';
        $(jqid('tags')).val(tags+selected);
    });

}
// 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, is_ams, change)
{
    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';
		logical_child = 'false';
		if(elements[i].getAttribute("logical_child") == 'true' && el_name.indexOf('-f') != -1)
		{
	      logical_child = el_name.substr(0, el_name.length - 2);
		}
		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)
			{
            	if(is_ams && is_ams == true)
            	{
            	    var return_type = 66;
            	}
            	else
            	{
            	    var return_type = 2;
            	}
	        	function_name = 'getValues';
	    		data 		  = "element_id="+ret.elementname+
	    						 "&function="+function_name+
	    						 "&begin="+ret.end+
	    						 "&reset_selectbox=0";
	    		sendRequest(data, return_type);
    		}
    		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();
    			if(change == true)
    			{
        			$(jqid(el_name)).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;
	}
    var options = new Array();

	// 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");
       options.push(key);
		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 && key != -2 && key != -1))
            {
               $(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++;
    	}
	}
    var diff = array_diff(selected, options);
	if(document.getElementById(selected_name))
	{
        selected_name = selected_name.substr(0, selected_name.length - 2);
	    $.each(diff, function(key, value)
        {
            $(jqid(selected_name)+' option[value="'+value+'"]').remove();
            $(jqid(selected_name+'-f')+' option[value="'+value+'"]').remove();
            $(jqid(selected_name+'-t')+' option[value="'+value+'"]').remove();
        });
	}

	this.inserted = i;
	return this;
};


function array_diff()
{
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Sanjoy Roy
    // +    revised by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld']);
    // *     returns 1: ['Kevin']

    var arr1 = arguments[0], retArr = {};
    var k1 = '', i = 1, k = '', arr = {};

    arr1keys:
    for (k1 in arr1)
    {
        for (i = 1; i < arguments.length; i++)
        {
            arr = arguments[i];
            for (k in arr)
            {
                if (arr[k] === arr1[k1])
                {
                    // If it reaches here, it was found in at least one array, so try next value
                    continue arr1keys;
                }
            }
            retArr[k1] = arr1[k1];
        }
    }
    var diff = new Array();
    for(var a in retArr)
    {
        diff.push(retArr[a]);
    }
    return diff;
};



// 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 '';
}

