var async = true;

function callFunctions(input)
{
    if(typeof(input) == "object")
    {
        for(var function_to_call in input)
        {
            try
            {
                var params = input[function_to_call];
                if(typeof(params) == "object")
                {
                    switch(function_to_call)
                    {
                        // Einsatzplanung in Promo
                        case "setElementHeight":
                            setElementHeight(params);
                        break

                        case "defaultEventHandler":
                            defaultEventHandler(params);
                        break;

                        case "setSelected":
                            for(var i = 0 ; i < params.length ; i++)
                            {
                                setSelected(params[i]);
                            }
                        break;

                        case "hideHierarchyArrows":
                            hideHierarchyArrows(params);
                        break;


                        default:
                           throw function_to_call+" wurde nicht in loadFunctions definiert";
                        break;
                    }
                }
                else
                {
                    throw "Der Parameter von "+function_to_call+" ist kein Objekt.";
                }
            }
            catch(error)
            {
                alert(error.toString());
            }
        }
    }
};

/**
 * Wandelt eine ID in eine fuer jquery lesbare Form um ([ in \\[, ] in \\])
 * Achtung, der ID-identifier # wird noch vor den ouput gesetzt
 */
function jqid(myid)
{
    return '#'+myid.replace(/\[/g,"\\[").replace(/\]/g,"\\]");
};

function jqclass(myid)
{
    return '.'+myid.replace(/\[/g,"\\[").replace(/\]/g,"\\]");
};

var NOT_SELECTED  = -2;
var NOT_SPECIFIED = -1;
/**
 * Funktionen für Ajax
 */
/**
 * uebermittelt ajax die selektierten items der selectbox
 * @param String el_id, [ID der Selectbox]
 * @params String function_name [abweichende Funktion]
 * @params Int return_type [Datentyp der zurückgeliefert werden soll]
 */
function setSelected(el_id, function_name, return_type, change)
{
    var el = document.getElementById(el_id);
    if(!el)
    {
        //console.log('Das Element '+el_id+' ist nicht vorhanden');
        return;
    }
    var cnt = el.options.length;

    var ids = "";
    if(!function_name)
    {
        function_name = 'setValues';
    }

    for(i = 0; i < cnt; i++)
    {
        if(el.options[i].selected)
        {
            ids += (ids.length == 0 ? el.options[i].value:","+el.options[i].value);
        }
    }

    if(ids.length == 0)
    {
        ids = NOT_SELECTED;
    }

    var data = "function="+function_name+"&element_id="+el_id+"&ids="+ids;
    if(!return_type)
    {
        var return_type = 2;
    }
    sendRequest(data, return_type, change);
};

/**
 * Übermittelt ajax den eingegebenen Suchstring
 *
 * @params String el_id [Id des Zielelementes]
 * @params Object obj [Das Element, das den Suchstring liefert]
 * @params String function_name [alternativ abweichende Funktion]
 * @params Int return_type [Datentyp der zurückgeliefert werden soll]
 */
function getValues(el_id, obj, function_name, return_type, change)
{
    var value = obj.value;
    if(obj.getAttribute("field"))
    	field = obj.getAttribute("field");

	if(obj.id)
	{
	    field = obj.id;
	}
    if(!field)
    {
        return;
    }

    if(!function_name)
    {
        function_name = 'getValues';
    }

    var data  = "element_id="+el_id+"&function="+function_name;
	data += "&field="+field+"&value="+encodeURIComponent(value);
    if(!return_type)
    {
        var return_type = 2;
    }
	sendRequest(data, return_type, change);
};

function saveTags()
{
    var value = $(jqid('tags')).val();
    var object_id = $("input[name='tag_dialog[object_id]']").getValue();
    var object_type = $("input[name='tag_dialog[object_type]']").getValue();
    var data  = "function=saveTags&value="+encodeURIComponent(value)+"&element_id="+object_id+"&field="+object_type;
	sendRequest(data, 42);
}

/**
 * Erzeugt einen Ajax-Request um ein oder mehrere Ajaxelemente zu löschen
 *
 * @author Martin Kluge <m.kluge@ipark.media.de>
 * @params Array source_id [Array mit den zu löschenden Elementen]
 */
function deleteAjaxElements(source_id)
{
    var data = "function=deleteElements&source_id="+source_id;
    sendRequest(data, 2);
}


/**
 * Funktionen zur Bearbeitung von DIVs
 */
/**
 * loescht den div-container mit der uebergebenen id
 * und ggf. auch das dazugehoerende hidden-Feld
 *
 * Diese Funktion loescht rekursiv auch alle Childs
 *
 * @author Martin Kluge
 * @param String id [id des div-container]
 * @param bool delete_ajax_elements [Sollen auch Ajaxelemente gelöscht werden]
*/
function delDiv(id, delete_ajax_elements)
{
    var div, parent, last, primary, hidden, child_block;

    div = document.getElementById(id);
    if(div == null)
    {
        return false;
    }

    parent = div.parentNode;

    // Lies das letzte Element der ID aus
    last = id.substring(id.lastIndexOf('[')+1, id.lastIndexOf(']'));

    // Wenn last keine Zahl ist, bilde daraus den PK, wenn doch lies den PK aus der Id aus
    if(isNaN(parseInt(last)))
    {
        primary = last+'_id';
    }
    else
    {
        primary = getPrimary(id);
    }
    // Die Id mit angehaengtem PK ergibt die Bezeichnung des hidden-Feldes
    hidden = id+'['+primary+']';

    // Durchlaufe alle Childs des DIV-Containers
    for(var i = 0 ; i < div.childNodes.length ; i++)
    {
        child_block = div.childNodes[i];

       // Wenn das Child ein Div ist und die ID des parent in seiner ID vorkommt, dann
        // ist es auch ein logisches Kind
        if(child_block['id'] && child_block.nodeName == 'DIV' && child_block.getAttribute('id').indexOf(id) != -1)
        {
            // loesche rekursiv die Childs des DIV-Containers
            delDiv(child_block.getAttribute('id'));

            // Wenn ein Div geloescht wurde, den Zaehler verringern, da sich die Anzahl der
            // Childs auch um 1 verringert hat.
            i--;
        }
    }

    // Loeschen des hidden-field
    var form = document.forms.form;
    if(form[hidden] != undefined)
    {
        form.removeChild(form[hidden]);
    }

    // Das Div erst ganz zum Schluss loeschen, wegen der verschachtelten Struktur
    parent.removeChild(div);

    if(delete_ajax_elements && delete_ajax_elements == true)
    {
        deleteAjaxElements(new Array(id));
    }
};

/**
 * Löscht das letzte Element aus einer Reihe von Elementen
 *
 * Ausgewählt werden die Elemente die, die die übergebene Klasse oder Id haben
 * per default wird der Klassenselector verwendet
 *
 * @author Martin Kluge <m.kluge@ipark-media.de>
 * @param String identifier [Wert der Klasse oder Id]
 * @param Char selector [JQuery Selector für den Wert]
 */
function delLastElement(identifier, selector)
{
    if(!selector)
    {
        var selector = '.';
    }
    // Suchen der Divs nach den Übergabeparametern
    var divs = $(selector+identifier);

    // Auslesen der Anzahl - 1
    var counter = divs.length - 1;

    // Wenn mehr als ein Element vorhanden ist, dann das letzte löschen
    if(counter > 0)
    {
        delDiv(divs[counter]['id'], true);
    }
}


/**
 * Setzt die Felder eines kopierten Blockes wieder zurück und aktiviert ggf. die Elemente
 *
 * @author Martin Kluge <m.kluge@ipark-media.de>
 * @param Obj obj Der kopierte Div-Container
 **/
function resetField(obj)
{
   // Wenn es kein Option-Feld ist, Inhalte l�schen
    if(obj.value && obj.nodeName != 'INPUT' && obj.nodeName != 'OPTION')
    {
        obj.value = "";
    }
    // Wenn es ein Textfeld ist, Inhalte L�schen
    if(obj.nodeName == 'INPUT' && obj.type == 'text')
    {
        obj.value = "";
    }

    if(obj.type == 'select-one')
    {
        var klasse = obj.className;
        if(klasse != null && klasse.lastIndexOf('empty') != -1)
        {
            obj.options.length = 1;
            obj.options[0] = new Option('----------', -1);
        }
        else
        {
		    obj.selectedIndex = 0;
        }
		obj.disabled      = false;
    }

    if(obj.type == 'select-multiple')
    {
        if(obj.id)
        obj.selectedIndex = -1;
        var klasse = obj.className;
        if(klasse != null && klasse.lastIndexOf('empty') != -1)
        {
            obj.options.length = 0;
        }
    }

    // Buttons aktivieren
    if(obj.type == 'button' || obj.nodeName == 'INPUT')
    {
        obj.disabled = false;
    }

    // Radiobuttons deselectieren
    if(obj.type == 'radio')
    {
        obj.checked = false;
    }
    if(obj.hasChildNodes())
    {
        var cnt_childs = obj.childNodes.length;
        for(var i = 0; i < cnt_childs; i++)
        {
            var child = obj.childNodes[i];
            resetField(child);
        }
    }
};


/**
* funktion loeschen von eingabefeldern
*
* @author Martin Kluge <m.kluge@ipark-media.de>
* @param Objekt obj
* @param String value
*/
function clearInputValue(obj, value)
{
	if(obj.value == value)
	{
		obj.value = '';
	}
};

function changeRadioGroup(element_id, group_class)
{
    id = element_id.replace(/\[/g,"\\[").replace(/\]/g,"\\]");
    var elements = $("."+group_class+"[id!='"+id+"'");
    //console.log('length: '+elements.length);

    var element = $("."+group_class+":checked");
    for(var i = 0 ; i < element.length ; i++)
    {
        if(element[i].id !== element_id)
        {
            element[i].checked = false
        }
    }
}


/**
* Funktion zum Kopieren von div-containern
* dabei werden eventuelle indizes heraufgezaehlt
*
* @author Martin Kluge <m.kluge@ipark-media.de>
* @param source_id 	[zu kopierender container]
* @param create_ajax_elements [Ob ein neuer Zweig eines Ajax-Tree erzeugt werden soll]
*/
function copyDiv2(source_id, create_ajax_elements)
{
    var start_el = document.getElementById(source_id);
    if(!start_el)
    {
        return;
    }

    var parent_el = start_el.parentNode;
    if(!start_el || !parent_el)
    {
        return;
    }

    var el_div_copy = start_el.cloneNode(true);

    var cnt_div = 0;
    // Durchlaufe alle Childs, um den neuen Index zu ermitteln
    var max = 0;
    for(var i = 0 ; i < parent_el.childNodes.length ; i++)
    {
        if(parent_el.childNodes[i].nodeName == 'DIV')
        {
            var child_id = parent_el.childNodes[i].id;
            var start = child_id.lastIndexOf('[');
            var stop = child_id.lastIndexOf(']');
            var id = parseInt(child_id.substring(start+1, stop));
            if(id > max)
            {
                max = id;
            }
        }
    }
    max++;

    // loeschen von subbloecken
    deleteSubblocks(el_div_copy);

    // loeschen eventueller fehlermeldungen
    deleteErrorMessage(el_div_copy, '');


    // Ein zu kopierender Container hat immer einen Index als letztes Element der Id
    // Dieser Index, bzw. die koplette Id ist auch Teil der Ids von Kindelementen
    // sowie Event-Handler Aufrufen. Bei kopieren muß der Index der Id aktualisiert werden
    var new_source_id = source_id.substring(0, source_id.lastIndexOf('[') + 1) + max + ']';

    // escapen von []
    var escaped_source_id = source_id.replace(/\[/g,"\\[").replace(/\]/g,"\\]");

    // erzeugen des Pattern zum ersetzen
    var pattern=eval('/' + escaped_source_id + '/g');

    // ersetzen der source_id im gesammten HTML-Code
    var new_HTML = el_div_copy.innerHTML.replace(pattern, new_source_id);

    // Ersetzen des HTML-Codes
    el_div_copy.innerHTML = new_HTML;

    // Erzeugen der neuen Id für den Div-Container
    var new_id = el_div_copy.getAttribute('id').replace(pattern, new_source_id);

    // Setzen der neuen Id des Div-Containers
    el_div_copy.setAttribute('id', new_id);
    // Zurücksetzen der Formularfelder
    resetField(el_div_copy)

    // kopierten container einfuegen
    parent_el.appendChild(el_div_copy);
    if(create_ajax_elements)
    {
        var data = "function=createRegisteredElements&source_id="+source_id+"&counter="+max;
        sendRequest(data, 2);
    }
    return el_div_copy;
}

/**
* Loeschen von Childs eines DIV-Containers
*
* Dabei werden ausser dem ersten Child alle weiteren Childs geloescht
* damit immer nur eine Formularzeile im neuen Element existiert
* die einzelnen Childs werde rekursiv durchlaufen
*
* @author Martin Kluge <m.kluge@ipark-media.de>
* @param object element
**/
function deleteSubblocks(element)
{
    if(element.id)
    {
        for(var i = 0 ; i < element.childNodes.length ; i++)
        {
            // Nur wenn das Child ein Div und ein logisches Kind des Parent ist,
            // soll dieses bearbeitet werden das bedeutet das die ID im eine Komponente ergänzt wurde
            if(element.childNodes[i]['id'] && element.childNodes[i].nodeName == 'DIV' &&
               element.childNodes[i].getAttribute('id').indexOf(element.getAttribute('id')) == 0)
            {
                var child_block = element.childNodes[i];
                var first = true;
                var length = child_block.childNodes.length;
                for(var j = 0 ; j < child_block.childNodes.length ; j++)
                {
                    if(child_block.childNodes[j].nodeName == 'DIV')
                    {
                        // Das erste Element soll bestehen bleiben daher werden nur die
                        // Childs geloescht
                        if(first == true)
                        {
                            deleteSubblocks(child_block.childNodes[j]);
                            first = false;
                        }
                        // alle weiteren Elemente werden geloescht
                        else
                        {
                            child_block.removeChild(child_block.childNodes[j]);
                            // Wenn ein Div geloescht wurde, den Zaehler verringern, da sich die Anzahl der
                            // Childs auch um 1 verringert hat.
                            j--;
                        }
                    }
                }
            }
        }
    }
}

function emptySelectFields(class_name)
{
    var obj = $(jqclass(class_name));
    for(var i = 0 ; i < obj.length ; i++)
    {
        var select = obj[i];
        select.options.length = 0;
    }
}




/**
* loeschen von fehlermeldungen bei pflichtfeldern
*
* Dabei werden die Childs rekursiv durchlaufen
*
* @author Martin Kluge <m.kluge@ipark-media.de>
* @param obj [zu behandelndes objekt]
*/
function deleteErrorMessage(obj)
{
	for(var i = 0 ; i < obj.childNodes.length ; i++)
	{
		var child = obj.childNodes[i];
		if(child.hasChildNodes())
		{
			deleteErrorMessage(child);
		}
	}
	if(obj.getAttribute('class') == 'error')
	{
		var parent = obj.parentNode;
		// das folgende <br> wird zuerst geloescht
		parent.removeChild(obj.nextSibling);
		parent.removeChild(obj);
	}
};


var selOptAr = new Object;
function getSelectedFieldsJQ(element_id)
{
	if(selOptAr[element_id] && selOptAr[element_id].length > 0)
	{
	    return;
	}

	selOptAr[element_id] = new Array();
    $(jqid(element_id)+' option: selected').each(function()
    {
        if(this.value != 0)
        {
            selOptAr[element_id].push(this.value);
        }
    });
};


function setSelectedFields(obj)
{
	id = obj.id;
	if(!selOptAr[id] || !obj.options)
		return;

    for(var i = 0; i < obj.options.length; i++)
    {
        for(var j = 0; j < selOptAr[id].length; j++)
        {
            if(obj.options[i].value == selOptAr[id][j])
            {
                obj.options[i].selected = true;
                if(obj.type == "select-one")
                {
                	selOptAr[id] = new Array();
                	return;
                }
			}
         }
    }
    selOptAr[id] = new Array();
};



/**
 * Funktionen für Formularfunktionalitäten
 */


/**
 * Default Routine zur Behandlung von Formular-Events.
 *
 * Dem Eventhander wird ein Array aus Abhängigkeiten übergeben, die bestimmen welche
 * Werte mit welchen verglichen werden sollen. Dabei können die Werte aus einem
 * Formularfeld kommen oder statisch a übergeben werden. Ausserdem werden die
 * Zielelemente und die auszuführende Funktion übergeben.
 *
 * @param Array params
 *  source    String [ID des Source-Elementes von dem die Daten kommen]
 *  dest      Array  [Die Keys sind die möglichen JQuery Selektoren (id,class,element)]
 *  value     Array  [Fixe Werte die verglichen werden sollen]
 *  equal     Array  [Werte die auf Gleichheit überprüft werden sollen]
 *  not_equal Array  [Werte die auf Ungleicheit geprüft werden sollen]
 *  additionals Array [Wenn der Wert aufgeteilt werden muss]
 *  func      String [Funktion die im Erfolgsfall aufgerufen werden soll]
 */
function defaultEventHandler(params)
{
    // Durchlauf der einzelnen Abhängigkeiten
    for(var i = 0 ; i < params.length ; i++)
    {
        var input = params[i];
        var destination = input['dest'];
        var func = input['func'];
        var equal = new Array;

        // Unterscheidung ob die Werte aus einem Formularfeld ausgelesen werden sollen
        // oder ob übergebene Werte verwendet werden sollen
        if(input['source'] && !input['value'] && !input['checked'])
        {
            // Wenn die Werte aus dem Formular kommen sollen, das entsprechende Feld
            // auslesen
            var value = $(jqid(input['source'])).val();

            // Wenn der Wert eine zusammengesetzte Zeichenkette ist, dann werden die
            // Parameter zum Auslesen als additionals übergeben.
            if(input['additionals'])
            {
                // Splitten des Wertes
                var data = value.split(input['additionals']['seperator']);

                // Übergabe des benötigten Wertes
                value = data[input['additionals']['counter']]
           }
        }
        else if(input['source'] && input['checked'])
        {
            // Werte von Checkbox werden verarbeitet
            if ($(jqid(input['source'])+':checked').val() == 1)
            {
            	var value = 'true';
            }
            else
            {
            	var value = 'false';
            }
        }
        else
        {
            // Wenn fixe Werte übergeben wurden, dann diese verwenden
            var value = input['value'];
        }

        //console.log(input['value']);

       // Wenn die Vegleichswerte als not_equal übergeben werden, wird die
        // Vergleichsvariable auf false gesetzt,
        if(input['not_equal'])
        {
            var compare = input['not_equal'];
            equal = false;
        }
        else if(input['equal'])
        {
            // nsonsten wird die Vergleichsvariable auf true gesetzt
            var compare = input['equal'];
            equal = true;
        }

        // Wenn einige der benötigten Parameter kein Array sind, wird eines erstellt
        if(typeof(compare) != 'object')
        {
            compare = new Array(compare);
        }
        if(typeof(destination) != 'object')
        {
            destination = new Array(destination);
        }

        if(value == null || typeof(value) != 'object')
        {
            value = new Array(value);
        }

        // Den Erfolgsfall auf false setzen
		var hit = valid = false;

		// Durchlauf der ausgewählten Werte
		for(var value_counter = 0 ; value_counter < value.length ; value_counter++)
		{
			// Durchlauf der einzelnen Vergleichswerte
			for(var counter_compare = 0 ; counter_compare < compare.length ; counter_compare++)
			{
				// Vergleichen der aktuellen Werte, im Erlogsfall wird hit auf true gesetzt
			    if(value[value_counter] != null &&
			       (compare[counter_compare] == value[value_counter] ||
			       compare[counter_compare] == '*'))
				{
					hit = true;
				}
			}
		}

		// Wenn es eine Übereinstimmung gab dann wird das Event verarbeitet
		if((equal == false && hit == false) ||
		   (equal == true && hit == true))
		{
		    valid = true;
		}
		// Durchlauf der einzelnen Typen aus dem dest-Array
		for(var type in destination)
		{
			var dest = destination[type];
			switch(type)
			{
				case "id":
					selector = '#';
				  break;

				case "class":
					selector = '.';
				  break;

				case "element":
					selector = '';
				  break;
			}
			// Durchlauf der einzelnen Elemente pro Typ
			for(var dc = 0 ; dc < dest.length ; dc++)
			{
				object = dest[dc].replace(/\[/g,"\\[").replace(/\]/g,"\\]");
				obj = $(selector+object);
			    switch(func)
				{
					case 'showElement':
						showElement(valid, obj);
					  break;

					case 'resetField':
						if(valid == true)
						{
							switch(type)
							{
								case "id":
									var divs = document.getElementById(dest[dc]);
								  break;

								case "class":
									var divs = getElementsByClassName(dest[dc]);
								  break;
							}
							if(typeof(divs) != 'object')
							{
								divs = new Array(divs);
							}
							for(var index in divs)
							{
								resetField(divs[index]);
							}
						}
					  break;
				}
			}
		}
    }
};


/**
 * Ausblenden von selectBoxen, wenn keine options vorhanden
 *
 * Wenn eine Selectbox die Daten per Ajax bekommt, kann es vorkommen das keine Optionen
 * vorhanden sind. In diesem Fall sollen die entsprechenden Divs ausgeblendet werden.
 * Dieses erfolgt im Normalfall durch ein Event des Elternelements. Beim kopieren
 * von Blöcken kann bei einer AMS jedoch kein Event ausgelöst werden. Daher müssen die
 * entsprechenden Boxen manuell überprüft werden.
 *
 * @author Martin Kluge <m.kluge@ipark-media.de>
 * @param String obj
 */
function checkSelectVisiblity(class_name)
{
    var elements = $('.'+class_name);
    for(var ec = 0 ; ec < elements.length ; ec++)
    {
        if(elements[ec].options.length == 0)
        {
            var id = elements[ec].getAttribute('id')+'_div';
            var id = id.replace(/\[/g,"\\[").replace(/\]/g,"\\]");
            var div = $('#'+id);
            div.hide();
        }
    }
};


/**
 * Funktion zum Auslesen sämtlicher Element einer bestimmten Klasse
 *
 * Diese Funktion macht eigentlich das selbe wie folgender Aufruf:
 * $('.'+class_name);
 * jedoch wird hier mich ein JQuery Objekt übergeben, sonder ein Array aus
 * HtmlObjekten. Nötig ist diese Funktion, da resetFields() noch nicht auf JQuery
 * umgestellt wurde
 *
 * @param String class_name [Klassenname]
 */
function getElementsByClassName(class_name)
{
  var all_obj,ret_obj=new Array(),j=0,teststr;

  if(document.all)
  {
      all_obj = document.all;
  }
  else if(document.getElementsByTagName && !document.all)
  {
      all_obj = document.getElementsByTagName("*");
  }


  for(i=0;i<all_obj.length;i++)
  {
    if(all_obj[i].className.indexOf(class_name)!=-1)
    {
      teststr=","+all_obj[i].className.split(" ").join(",")+",";
      if(teststr.indexOf(","+class_name+",")!=-1)
      {
        ret_obj[j]=all_obj[i];
        j++;
      }
    }
  }
  return ret_obj;
}


/**
* liefert aus der uebergebenen Id die PK Bezeichnung des Objektes zurueck
*
* @author Martin Kluge <m.kluge@ipark-media.de>
* @param String id
* @return String
**/
function getPrimary(id)
{
    var start, stop, substring;

    stop = id.lastIndexOf('][');
    // Wenn es kein Block ist dann gibt es nur eine Ebene
    if(stop != -1)
    {
        substring = id.substring(0, stop);
        start = substring.lastIndexOf('[');
    }
    else
    {
        stop = id.lastIndexOf('[');
        start = -1;
    }
    return id.substring(start+1, stop)+'_id';
}

/**
 * Zeigt ein Objekt an oder versteckt es
 *
 * @author Martin Kluge <m.kluge@ipark-media.de>
 * @param bool show
 * @param Object obj [Objekt, das bearbeitet werden soll]
 */
function showElement(show, obj)
{
    if(show == true)
    {
        obj.show();
    }
    else
    {
        obj.hide();
    }
}


/**
 * Funktion zum Abschicken des Formulars per Enter
 */
function submitEnter(button,e)
{
    var keycode;
    if (window.event) keycode = window.event.keyCode;
    else if (e) keycode = e.which;
    else return true;
    if (keycode == 13)
    {
        var submitbutton = document.getElementById(button);
        if(submitbutton)
        {
            submitbutton.click();
            return false;
        }
    }
    else
    {
        return true;
    }
};


/**
 * Funktion zum Aktivieren einer Checkbox in einem Formular
 *
 * @param String frm [Name des Formulars]
 * @param String field [Name der Checkbox]
 */
function activateCheckbox(frm, field)
{
    if(document.forms[frm].elements[field].checked === false)
    {
        document.forms[frm].elements[field].checked = 1;
    }
    else
    {
        document.forms[frm].elements[field].checked = 0;
    }
};

/**
 * Funktion zum Setzen des Status mehrerer Checkboxen einer Gruppe
 *
 * @param String frm [Name des Formulars]
 * @param String field [Name der Gruppe]
 * @param String status [Status der gesetzt werden soll]
 * @param Int start [Index der ersten Checkbox die bearbeitet werden soll]
 * @param Int number [Index der letzten Checkbox die bearbeitet werden soll]
 */
function activateAllCheckboxes(frm, field, status, start, number)
{
    for (i=start; i<=number; i++)
    {
        if (document.forms[frm].elements[field+'['+i+']'] && document.forms[frm].elements[field+'['+i+']'].disabled != true)
        {
            document.forms[frm].elements[field+'['+i+']'].checked = status;
        }
    }
};

/**
 * Funktion zum Setzen des Status von allen Checkboxen in einer Zeile
 *
 * Diese Funktion wird für eine Kalenderanzeige benötigt, um die Felder einer Woche
 * zu bearbeiten
 *
 * @param String frm [Name des Formulars]
 * @param String field [Name der Gruppe]
 * @param String status [Status der gesetzt werden soll]
 * @param Int start [überflüssig]
 * @param Int number [Index der letzen Checkbox die bearbeitet werden soll]
 * @param Int column [Index der Zeile die bearbeitet werden soll]
 */
function activateColumnCheckboxes(frm, field, status, start, number, column )
{
    var row = 1;

    for (i=1; i<=number; i++)
    {
        if ( i - ((row-1) * 7) == column )
            if (document.forms[frm].elements[field+'['+i+']'] && document.forms[frm].elements[field+'['+i+']'].disabled != true)
                document.forms[frm].elements[field+'['+i+']'].checked = status;

        if ( i / row == 7)
            row += 1;
    }
};

/**
 * This array is used to remember mark status of rows in browse mode
 */
var marked_row = new Array;

/**
 * Sets/unsets the pointer and marker in browse mode
 *
 * @param   object    the table row
 * @param   interger  the row number
 * @param   string    the action calling this script (over, out or click)
 * @param   string    the default background color
 * @param   string    the color to use for mouseover
 * @param   string    the color to use for marking a row
 *
 * @return  boolean  whether pointer is set or not
 */
function setPointer(theRow, theRowNum, theAction, theDefaultColor, thePointerColor, theMarkColor)
{
    var theCells = null;

    // 1. Pointer and mark feature are disabled or the browser can't get the
    //    row -> exits
    if ((thePointerColor == '' && theMarkColor == '') ||
        typeof(theRow.style) == 'undefined')
    {
        return false;
    }

    // 2. Gets the current row and exits if the browser can't get it
    if (typeof(document.getElementsByTagName) != 'undefined')
    {
        theCells = theRow.getElementsByTagName('td');
    }
    else if (typeof(theRow.cells) != 'undefined')
    {
        theCells = theRow.cells;
    }
    else
    {
        return false;
    }

    // 3. Gets the current color...
    var rowCellsCnt  = theCells.length;
    var domDetect    = null;
    var currentColor = null;
    var newColor     = null;
    // 3.1 ... with DOM compatible browsers except Opera that does not return
    //         valid values with "getAttribute"
    if (typeof(window.opera) == 'undefined'
        && typeof(theCells[0].getAttribute) != 'undefined')
    {
        currentColor = theCells[0].getAttribute('bgcolor');
        domDetect    = true;
    }
    // 3.2 ... with other browsers
    else
    {
        currentColor = theCells[0].style.backgroundColor;
        domDetect    = false;
    } // end 3

    // 3.3 ... Opera changes colors set via HTML to rgb(r,g,b) format so fix it
    if (currentColor.indexOf("rgb") >= 0)
    {
        var rgbStr = currentColor.slice(currentColor.indexOf('(') + 1,
                                     currentColor.indexOf(')'));
        var rgbValues = rgbStr.split(",");
        currentColor = "#";
        var hexChars = "0123456789ABCDEF";
        for (var i = 0; i < 3; i++)
        {
            var v = rgbValues[i].valueOf();
            currentColor += hexChars.charAt(v/16) + hexChars.charAt(v%16);
        }
    }

    // 4. Defines the new color
    // 4.1 Current color is the default one
    if (currentColor == ''
        || currentColor.toLowerCase() == theDefaultColor.toLowerCase()) {
        if (theAction == 'over' && thePointerColor != '') {
            newColor              = thePointerColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
            marked_row[theRowNum] = true;
        }
    }
    // 4.1.2 Current color is the pointer one
    else if (currentColor.toLowerCase() == thePointerColor.toLowerCase()
             && (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])) {
        if (theAction == 'out') {
            newColor              = theDefaultColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
            marked_row[theRowNum] = true;
        }
    }
    // 4.1.3 Current color is the marker one
    else if (currentColor.toLowerCase() == theMarkColor.toLowerCase()) {
        if (theAction == 'click') {
            newColor              = (thePointerColor != '')
                                  ? thePointerColor
                                  : theDefaultColor;
            marked_row[theRowNum] = (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])
                                  ? true
                                  : null;
        }
    } // end 4

    // 5. Sets the new color...
    if (newColor) {
        var c = null;
        // 5.1 ... with DOM compatible browsers except Opera
        if (domDetect) {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].setAttribute('bgcolor', newColor, 0);
            } // end for
        }

    } // end 5

    return true;
}; // end of the 'setPointer()' function


/**
 * Baut eine Hierarchie von aufeinander aufbauenden Selectboxen
 *
 * Wenn selected != 0, lösche alles unter mir und führe ein copyDiv2 aus
 * Wenn selected == 0, lösche alle unter mir
*/
function buildHierarchy(source_id, selectbox_id_postfix)
{
    // hole das Level auf dem die event-auslösende Box liegt
    var level = source_id.substring(source_id.lastIndexOf('[') + 1, source_id.length - 1);
    // suche den root-path zur event-auslösenden Box
    var root = source_id.substring(0, source_id.lastIndexOf('['));

    var to_delete;
    var to_delete_string;
    var found = true;
    var deleted = false;
    async = false;

    while(found)
    {
        // alle tieferen Boxen müssen gelöscht werden
        to_delete_string = root+"["+ ++level +"]";
        to_delete = $(jqid(to_delete_string));
        if(to_delete.length)
        {
            to_delete.remove();
            if(!deleted)
            {
                // lösche auch in der Ajax-Session
                var data = "function=deleteElements&source_id="+to_delete_string;
                sendRequest(data, 2);
                deleted = true;
            }
        }
        else
        {
            found = false;
        }
    }

    var select_box = source_id+"["+ selectbox_id_postfix +"]"
    // wenn der Wert nicht 0 ist, soll eine neue Box erscheinen
    if($(jqid(select_box)).val() != 0)
    {
        var new_div = copyDiv2(source_id, true);
        // verstecke letzten Pfeil
        $(jqid(new_div.id+"[arrow]")).hide();
        // zeige vorletzten Pfeil
        $(jqid(source_id+"[arrow]")).show();
        setSelected(select_box);
    }
    async = true;
};


/**
 * Löscht eine Hierarchie aus dem DOM und aus der Ajax-Session
 *
 */
function delHierarchy(to_delete_string)
{
    // entferne die Hierarchie
    $(jqid(to_delete_string)).remove();
    // das hidden Feld muss auch gelöscht werden, damit es keine
    to_delete_string += "[hierarchy_id]";
    to_delete_string = to_delete_string.replace(/\[/g,"\\[").replace(/\]/g,"\\]") ;
    $("[name="+to_delete_string+"]").remove();
    // lösche auch in der Ajax-Session
    var data = "function=deleteElements&source_id="+to_delete_string;
    sendRequest(data, 2);
};


/**
 * Kopiert eine komplette Hierarchie und blendet den letzten Pfeil aus
 */
function copyHierarchy(source_id)
{
    var new_div = copyDiv2(source_id, true);
    // verstecke letzten Pfeil
    $(jqid(new_div.id)+" .hierarchy_arrow").hide();
};


/**
 * Blendet alle überflüssigen Pfeile in den Hierarchies aus
 */
function hideHierarchyArrows(params)
{
    $.each(params, function(key, value)
    {
        $(jqid(value+"[arrow]")).hide();
    });

};


/**
 * Blendet die Update-Selectboxen im Import ein und aus
 */
function toggleUpdateCheck(param)
{
    if($(jqid(param.id)+' option:selected').val() == '1')
    {
        $('.update_check').attr('checked', false);
        $('.update_check').attr('disabled', 'disabled');
    }
    else
    {
        $('.update_check').attr('disabled', '');
    }
};



//// Nur in Promo
////////////////////// RESOURCE PLANNING ///////////////////////////////////////
function copyProductExperience(form, source_id, swap)
{
    var index = copyDiv(source_id, swap);
    _hs_swapOptions(form, 'profile_product_experience['+index+']', 0);

};


/**
* timestamp aus selectbox holen und lesbares datum in inputfelder stecken
*
* @author Tobias Rieke
* @param string  $el_id element id woher der timestamp geholt wird
* @param string  $start element id wohin das startdatum geschrieben wird
* @param string  $finish element id wohin das enddatum geschrieben wird
* @param boolean $reset ob datumsfelder geleert werden sollen
*/
function setViewRange(el_id,reset,start,finish)
{
    if(!el_id) return;
    var el = document.getElementById(el_id);
    var t_stamp = el.options[el.selectedIndex].value;
    if(t_stamp == 0 || reset == true)
    {
        setMultipleValues(start,"","","");
        setMultipleValues(finish,"","","");
        return false;
    }

    var time_start  = new Date(t_stamp*1000);
    var time_finish = new Date(t_stamp*1000);

    time_finish.setDate(time_finish.getDate()+6);

    var month_start  = 1 + parseInt(time_start.getMonth());
    var month_finish = 1 + parseInt(time_finish.getMonth());

    setMultipleValues(start,time_start.getFullYear(),month_start,time_start.getDate());
    setMultipleValues(finish,time_finish.getFullYear(),month_finish,time_finish.getDate());
};


/**
* fragt ajax nach den Job-Tagesinformationen
*
* @author Tobias Rieke
* @param string $el element in dem sich das DIV element befinden, wo alle noetigen
                    informatioen fuer die uebergabe ausgelesen werden koennen
*/
function getJobDayInfo(obj, row_id)
{
    var id   = obj.id;
    var str  = "";
    var data = "";
	if(obj && obj.style.display == 'block' && obj.innerHTML === 'Loading...')
    {
        str = id.split("_");
        data = "element="+id+"&function=getJobDayInfo&project_id="+str[0]+"&job_id="+str[1]+"&t_stamp="+str[2]+"&row="+row_id;
        sendRequest(data, 14);
        setElementHeight(new Array(row_id));
	}
	else
	{
		setElementHeight(new Array(row_id));
	}
};

/**
* klappt alle Job-Tagesinformationen auf bzw zu
*
* @author Tobias Rieke
*/
function toggleAll()
{
	for(var j=0; j < row_ids.length; j++)
	{
    	toggledisplay(row_ids[j]);
	}
};


/**
 * Anpassen der Höhe einer Zeile an ein bestimmtes Feld
 *
 * Diese Funktion kommt aus iPM_Promotion und ist noch statisch ausgelegt
 * Sinvoll wäre die Erweiterung der Übergabeparameter um die Funktion dynamischer
 * zu machen
 */
function setElementHeight(row)
{
	if(row == 'all')
	{
	    row = row_ids;
	}
	else if(typeof(row) == "object")
	{
	    // wenn das aus Ajax kommt, sieht der String anders aus
	    if(row[0].indexOf("_") != -1)
	    {
    	    row = row[0].split("_");
    	    row = new Array(row[1]);
	    }
	}

	var cnt = row.length

	if(cnt == 0)
	{
	    return;
	}

    var job, day, job_height, day_height;

	for(var i = 0 ; i < cnt; i++)
	{
        job = $('#job_row_'+row[i]);
        day = $('#day_row_'+row[i]);

		if(!job.html() || !day.html()) {
            continue;
        }

        job_height = job.height();
        day_height = day.height();

        if(day_height < job_height) {
            // muss wegen IE Problematik gemacht werden, es reicht nicht einfach
            // die Höhe der TR zu setzen
            day.children().each(function(index, element) {
                $(element).height(job_height);
            });
            day.height(job_height);
            day.css('height', job_height);
        } else if(job_height < day_height) {
            job.height(day_height);
            job.css('height', day_height);
            job.children().each(function(index, element) {
                $(element).height(day_height);
            });
        }
	}
};

/**
 * Richtet ein oder mehrere Objekte an Position eines src_obj aus
 *
 * @params Object src_obj [Das Objekt, das die Position vorgibt]
 * @params Array dst [Lister der Objekt die ausgerichtet werden sollen]
 */
function setDivPosition(src_obj,dst)
{
	var y = src_obj.scrollTop;
	var x = src_obj.scrollLeft;
	var cnt = dst.length
	for(var i = 0 ; i < cnt; i++)
	{
		var dst_el 	= document.getElementById(dst[i]);
		if(dst_el)
		{
			dst_el.scrollTop  = y;
			dst_el.scrollLeft = x;
		}
	}
};

/**
* klappt Tagesinformationen fuer einen job auf bzw zu
*
* @author Tobias Rieke
* @param string $el div element, welches auf bzw zu geklappt werden soll
*/
function toggledisplay(el_id)
{
	var el_tr  = document.getElementById("day_row_"+el_id);
	if(!el_tr)
		return;

	//setDetailsShow(el_id);
	//alert(el_tr.firstChild);
	var el_td = null
	el_td  = el_tr.firstChild;
	//alert(el_td);
    while (el_td != null)
    {
    	elDIV  = el_td.getElementsByTagName("DIV")[0];
    	elDIV2 = el_td.getElementsByTagName("DIV")[1];
		if(elDIV && elDIV2)
    	{
        	elDIV.style.display  = (elDIV.style.display == 'block'?'none':'block');
        	elDIV2.style.display = (elDIV.style.display == 'none'?'block':'none');
        	getJobDayInfo(elDIV, el_id)
    	}
    	el_td = el_td.nextSibling;
    }
};


function delElfromHTML(el)
{
	var el_tr  = el.parentNode.parentNode;
	var t_body = el.parentNode.parentNode.parentNode;

	if(el_tr.nodeName != "TR" && t_body.nodeName != "TBODY")
		return;

	t_body.removeChild(el_tr)
};

function deleteErrorSpan(span_tags)
{
    var number_span = span_tags.length;

    for(var i = 0; i < number_span; i++)
    {
        var span = span_tags[i];

        if(span != undefined)
        {
            if((typeof span.className != object) && (span.className == "error"))
            {
                var span_parent = span.parentNode;
                span_parent.removeChild(span);
            }
        }
    }
};

function imposeMaxLength(Object, MaxLen)
{
    return (Object.value.length <= MaxLen);
};

// Funktion fuehrt JS-Suche beim Refresh des Formulares durch
function selecterOnLoad(forn_name, look_for_field, look_for_string, set_selected)
{
    form_field = document.forms[forn_name].elements[look_for_field];

    // Formularfeld-Wert wird zugewiesen, damit die selecter-Funktion damit arbeiten kann
    form_field.wert = look_for_string;

    // Die Liste loeschen
    var i = form_field.length;
    while(i--) form_field.options[i] = null;

    for(var i = 0; i < form_field.defaultList.length; i++)
    {
        var val = form_field.defaultList[i].text;

        look_for = val.toLowerCase();
        result = look_for.indexOf(look_for_string);

        if(result != -1)
        {
            form_field.options[form_field.options.length] = form_field.defaultList[i];
        }
    }

    // Wenn Wert mit uebergeben soll dieser auch selected sein
    if(typeof(set_selected) != "undefined")
    {
        for(var i = 0; i < form_field.options.length; i++)
        {
            if(form_field.options[i].value == set_selected)
            {
                form_field.options[i].selected = true;
            }
            else
            {
                form_field.options[i].selected = false;
            }
        }
    }
};


///////////////////////////////////////////////////////////
// GLobale Werte
var UP = 38, DOWN = 40, BACK = 8, DEL = 46;

function getDefaultList()
{
   var d = document;
   for(var y = 0; y < d.forms.length; y++)
   {
         for(var x = 0; x < d.forms[y].elements.length; x++)
         {
               if(!d.forms[y].elements[x].type)
                  continue;

              var look_for = d.forms[y].elements[x].type.indexOf('select');

              if(look_for == -1)
                  continue;

              var list = d.forms[y].elements[x];
              list.defaultList = new Array();
              var l = list.length - 1;

              for(var i = l; i >= 0; i--)
                  list.defaultList[i] = list[i];

              list.selecter = selecter;
              list.onkeydown = selecter;
              list.wert = '';
         }
   }
};

///////////////////////////////////////////////////////////
// Diese Funktion wird onkeyup des Inputfeldes aufgerufen
// der 1.Parameter ist die Referenz auf das inputfeld
// der 2. auf das Listenfeld

function selecter(form_name, element_name, e)
{
    // Soll nur fuer definierte Elemente funktionieren,
    // also nur bei Aufruf ueber JS-Funktion
    if(typeof(element_name)=="undefined")
    {
        return true;
    }

    if(!e) e = window.event;
    var k = e.keyCode || e.which;

    // Funktioniert im Mozilla nicht!
    // Zuruecksetzen wenn der Gesamte Text im Feld selektiert wurde und entfernt wurde
    if((this.wert == getBrowserSelection()) && (k == DEL))
     {
         this.wert = '';

        // Defaultwerte anzeigen
        for(var i = 0; i < this.defaultList.length; i++)
            this.options[i] = this.defaultList[i];

        return;
    }

    if(!k || k == UP || k == DOWN )
    {
        this.wert = '';
        return;
    }
    //Der String im Textfeld wird zur Suche herangezogen
    this.wert = document.forms[form_name].elements[element_name].value;

    // Aktueller Wert wird in der Statuszeile ausgegeben
    //window.status = 'wert: '+this.wert+', value: '+document.forms[form_name].elements[element_name].value+', k: '+k;
    if(!this.wert)
    {
        // Defaultwerte anzeigen
        for(var i = 0; i < this.defaultList.length; i++)
            this.options[i] = this.defaultList[i];

        return;
    }

    // Die Liste loeschen
    var i = this.length;
    while(i--) this.options[i] = null;

    for(var i = 0; i < this.defaultList.length; i++)
    {
        var val = this.defaultList[i].text;

        look_in  = val.toLowerCase();
        look_for = this.wert.toLowerCase();
        result   = look_in.indexOf(look_for);

        if(result != -1)
          this.options[this.options.length] = this.defaultList[i];
    }
};

/**
 * getElement
 */
function getElement(e,f){
    if(document.layers){
        f=(f)?f:self;
        if(f.document.layers[e]) {
            return f.document.layers[e];
        }
        for(W=0;i<f.document.layers.length;W++) {
            return(getElement(e,fdocument.layers[W]));
        }
    }
    if(document.all) {
        return document.all[e];
    }
    return document.getElementById(e);
};


// Funktion zur Ermittlung der aktuellen Selektion im Browser. Die
// Funktion beruecksichtigt hierbei die unterschiedlichen Funktionen
// zwischen IE und Mozilla.
function getBrowserSelection()
{
    look_for = 'MSIE';
    browser  = navigator.appVersion;

    if(browser.indexOf('MSIE') != -1)
    {
        browser_selection = document.selection.createRange().text;
    }
    else
    {
        browser_selection = getSelection();
    }

    return browser_selection;
};

// alte Funktion zum Kopieren von Tabellenzeilen
function copyElements(source_id, title_cell)
{
	var start_el = document.getElementById(source_id);
	if(!start_el)
	{
	    return;
	}

	while(start_el.nodeName != "TR")
	{
	    start_el = start_el.parentNode;
	}

	var parent_el = start_el.parentNode;

	if(!start_el || !parent_el)
	{
	    return;
	}

	var cnt_childs = start_el.childNodes.length;

	var el_tr_copy = start_el.cloneNode(true);
	var cnt 	   = parent_el.childNodes.length;
	var cnt_tr     = 0;

	for(var i = 0; i < cnt;i++)
	{
		if(parent_el.childNodes[i].nodeName == "TR")
		{
		    cnt_tr++;
		}
	}

	// Wenn Titel-Zeile mit Spalten-Info wie bei Last-Six-Month
	// muss eins abgezogen werden, sonst falsche Indizierung
	if(title_cell == "true")
	{
	    --cnt_tr;
	}

	parent_el.appendChild(el_tr_copy);
	searchAndDestroy(el_tr_copy,cnt_tr);
};

function searchAndDestroy(obj,number)
{
	var cnt_childs = obj.childNodes.length;
	for(var i = 0; i < cnt_childs; i++)
	{
	    var child = obj.childNodes[i];
		if(child.hasChildNodes())
			searchAndDestroy(child,number);

		if(child.name)
		{
		    anzahl_klammern = child.name.match(/(\[[0-9]+\])/g);

		    // Wenn im Namen des Elements mehrmals Indizierungsklammern vorkommen ([215][0])
		    // soll nur die zweite Klammer ersetzt werden
		    if(anzahl_klammern.length > 1)
		    {
		        // String wird aufgeteilt und zweiter Teil wird ersetzt
		        // Dann wird String wieder zusammengesetzt
		        var sTeststring = child.name;
                iPos = sTeststring.search(/(\[[0-9]+\])/);
                sTeil1 =sTeststring.substring(0,iPos+1);
                sTeil2 =sTeststring.substring(iPos+1);
                sTeil2 = sTeil2.replace(/(\[[0-9]+\])/,'[' + number + ']');
                sErgebnis = sTeil1 + sTeil2;

                // Child-Name wird ueberschrieben
                child.name = sErgebnis;
		    }
		    else
		    {
			    child.name = child.name.replace(/(\[[0-9]+\])/g,'[' + number + ']');
		    }

			if(child.value && child.nodeName != 'INPUT')
			{
			    child.value = "";
			}

			if(child.nodeName == 'INPUT' && child.type == 'text')
			{
			    child.value = "";
			}

			if(child.nodeName == 'INPUT')
			{
			    child.disabled = false;
			}

			if(child.type == 'select-one')
			{
				child.selectedIndex = 0;
				child.disabled      = false;
			}

			if(child.type == 'select-multiple')
			{
			    child.selectedIndex = -1;
			}
		}
	}
	return true
};

/**
* Funktion zum Kopieren von div-containern
* dabei werden eventuelle indizes heraufgezaehlt
*
* @author Martin Kluge <m.kluge@ipark-media.de>
* @param source_id 	[zu kopierender container]
* @param swap 		[umkehrung der erhoehung]
*/
function copyDiv(source_id, swap)
{
	if(swap == undefined)
	{
		swap = false;
	}
    var start_el = document.getElementById(source_id);
	if(!start_el)
	{
		return;
	}
	var parent_el = start_el.parentNode;

	if(!start_el || !parent_el)
	{
		return;
	}

	var el_div_copy = start_el.cloneNode(true);


	// da <br> und _ als childs zaehlen, duerfen nur DIVs gezaehlt werden
	var cnt_div = 0;
	for(var i = 0 ; i < parent_el.childNodes.length ; i++)
	{
		if(parent_el.childNodes[i].nodeName == 'DIV')
		{
			cnt_div++;
		}
	}
    el_div_copy.innerHTML = increaseCDATA(el_div_copy.innerHTML, cnt_div);

    // kopierten container einfuegen
	parent_el.appendChild(el_div_copy);
	// loeschen eventueller fehlermeldungen
	deleteErrorMessage(el_div_copy, '');
	// erhoehung der indizees
	increaseIndex(el_div_copy,cnt_div,swap);
//	alert(el_div_copy.innerHTML);
	return cnt_div;
};




/**
* Funktion zum hochzaehlen von Indizees in einem Div-Container
* @param String html HTML-Code des DIV-Containers
* @param int number Neuer Index
* @return String neuer HTML-Code
*/
function increaseCDATA(html, number)
{
    // RegExp zum Suchen des CDATA Codes
    var Ausdruck = /CDATA\[[\s*\w*\[*\]*\'*\,*\;*\:*\{*\}*\=*\-*]*/;
    // Auslesen der entsprechende Codestellen
    var CDATA = String(Ausdruck.exec(html));
    // Ersetzen des Index
    var sErgebnis = CDATA.replace(/(\[[0-9]+\])/g,'[' + number + ']');
    // Ersetzen des CDATA Codes

    return html.replace(Ausdruck, sErgebnis);
};

function increaseAttribute(attribute, number, swap)
{
	var sErgebnis = attribute;
	var anzahl_klammern = attribute.match(/(\[[0-9]+\])/g);
	if(anzahl_klammern != null && anzahl_klammern.length > 1)
	{
		var sTeststring = attribute;
		iPos = sTeststring.search(/(\[[0-9]+\])/);

		sTeil1 =sTeststring.substring(0,iPos+3);
		sTeil2 =sTeststring.substring(iPos+3);
		if(swap == true)
		{
			sTeil1 = sTeil1.replace(/(\[[0-9]+\])/,'[' + number + ']');
		}
		else
		{
			sTeil2 = sTeil2.replace(/(\[[0-9]+\])/,'[' + number + ']');
		}
		sErgebnis = sTeil1 + sTeil2;
	}
	else if(anzahl_klammern != null)
	{
		sErgebnis = attribute.replace(/(\[[0-9]+\])/g,'[' + number + ']');
	}
	return sErgebnis;
};


function increaseIndex(obj,number,swap,message,spacer)
{
    var elements = new Array('name', 'id');
	if(obj.hasChildNodes())
	{
		var cnt_childs = obj.childNodes.length;
		for(var i = 0; i < cnt_childs; i++)
		{
			var child = obj.childNodes[i];
			increaseIndex(child,number,swap,message,'--');
		}
	}

	for (var attrib in elements)
	{
		attrib = elements[attrib];
		if(obj[attrib])
		{
			var attribute = String(obj.getAttribute(attrib));
			var newAttribute = increaseAttribute(attribute, number,swap);
			if(newAttribute != false)
			{
				obj.setAttribute(attrib, newAttribute);
			}
		}
	}
	if(obj.value && obj.nodeName != 'INPUT' && obj.nodeName != 'OPTION')
	{
		obj.value = "";
	}

	if(obj.nodeName == 'INPUT' && obj.type == 'text')
	{
	    obj.value = "";
	}

	if(obj.nodeName == 'INPUT')
	{
	    obj.disabled = false;
	}

	if(obj.type == 'select-one')
	{
		obj.selectedIndex = 0;
		obj.disabled      = false;
	}

	if(obj.type == 'select-multiple')
	{
		obj.selectedIndex = -1;
	}
	if(obj.type == 'button')
	{
		obj.disabled = false;
	}
	if(obj.type == 'radio')
	{
		obj.checked = '';
	}
	return true;
};
