df_tabs_storage = new Array;
df_tabs_lookup = new Array;
df_tabs_fragments = new Array;
df_condition_states = new Array;
df_condition_subscribers = new Array;
df_cloning_plans = new Array;

function df_find_xpath(xpath,context_node)
{
	alert(context_node);
}

function df_tabs_register(tabs_id, tab_ids, fragments)
{
	df_tabs_storage[tabs_id] = tab_ids;
	df_tabs_fragments[tabs_id] = fragments;

	for (idx in tab_ids)
	{
		df_tabs_lookup[tab_ids[idx]] = tabs_id;
		document.getElementById(tab_ids[idx]).style.display='none';
	}

	active_tab = tab_ids[0];

	if (fragments)
		for (idx in fragments)
			if (('#' + fragments[idx]) == window.location.hash)
				active_tab = idx;

	df_tabs_click(active_tab);
}

function df_tabs_click(o)
{
	if (typeof o != 'object')
	{
		var cont_id = df_tabs_lookup[o];
		for (idx in by_id(cont_id).getElementsByTagName('A'))
		{
			if (by_id(cont_id).getElementsByTagName('A')[idx].href.substr(by_id(cont_id).getElementsByTagName('A')[idx].href.indexOf('#')+1) == o)
			{
				o = by_id(cont_id).getElementsByTagName('A')[idx];
				break;
			}
		}
	}
	var tab_id = o.href.substr(o.href.indexOf('#')+1);
	var tab_ids = df_tabs_storage[df_tabs_lookup[tab_id]];

	for (idx in tab_ids)
		document.getElementById(tab_ids[idx]).style.display='none';

	document.getElementById(tab_id).style.display='block';

	for (idx in o.parentNode.parentNode.childNodes)
		df_remove_class(o.parentNode.parentNode.childNodes[idx],'active');

	df_add_class(o.parentNode,'active');

	if (df_tabs_fragments[df_tabs_lookup[tab_id]])
	{
		window.location.hash = '#' + df_tabs_fragments[df_tabs_lookup[tab_id]][tab_id];
		var form_obj;
		if ((form_obj = find_parent_by_tagname(o,'form')))
			if (form_obj.action == '')
				form_obj.action = '#' + df_tabs_fragments[df_tabs_lookup[tab_id]][tab_id];
			else
				form_obj.action = df_change_url_fragment(form_obj.action,df_tabs_fragments[df_tabs_lookup[tab_id]][tab_id]);
	}
}

function df_tabs_get_active_key()
{

}

function df_tabs_preactivate_by_fragment()
{

}

function df_set_condition(cond_name)
{
	df_condition_states[cond_name] = true;
	df_evaluate_conditions();
}
function df_clear_condition(cond_name)
{
	df_condition_states[cond_name] = false;
	df_evaluate_conditions();
}

function df_subscribe_to_condition(subscriber,condition)
{
	if (!df_condition_subscribers[condition])
		df_condition_subscribers[condition] = new Array;
	df_condition_subscribers[condition].push(document.getElementById(subscriber));

	df_evaluate_conditions();
}

function df_evaluate_conditions()
{
	for (condition in df_condition_subscribers)
	{
		if (df_condition_states[condition])
		{
			// Abonnenten sichtbar machen
			for (idx in df_condition_subscribers[condition])
				df_show_form_node(df_condition_subscribers[condition][idx]);
		}
		else
		{
			// Abonnenten unsichtbar machen
			for (idx in df_condition_subscribers[condition])
				df_hide_node(df_condition_subscribers[condition][idx]);
		}
	}
}

function df_show_node(o)
{
	o.style.display = 'block'; // Benutzt man eh nur mit divs. ;) Leider NEIN! Bei der subscribe_to_condition in den Formularen kommt das auch vor
}

function df_show_form_node(o)
{
	o.style.display = ''; // Benutzt man eh nur mit divs. ;) Leider NEIN! Bei der subscribe_to_condition in den Formularen kommt das auch vor
}

function df_hide_node(o)
{
	o.style.display = 'none';
}

function df_upload_field_engage(obj_field,processor_url)
{
	var obj_form = obj_field.form;
	var obj_iframe = obj_field.nextSibling;

	var temp_target = obj_form.target;
	var temp_action = obj_form.action;
	var temp_enctype = obj_form.enctype;
	var temp_encoding = obj_form.encoding;

	obj_form.action = processor_url;
	obj_form.target = obj_iframe.name;
	obj_form.enctype = 'multipart/form-data';
	obj_form.encoding = 'multipart/form-data';
	obj_form.submit();

	obj_form.target = temp_target;
	obj_form.action = temp_action;
	obj_form.enctype = temp_enctype;
	obj_form.encoding = temp_encoding;
}

function df_input_clear_button(obj)
{
	if (!df_reset_input(obj))
	{
		for (idx in obj.childNodes)
		{
			df_reset_input(obj.childNodes[idx]);
		}
	}
}

function df_reset_input(obj)
{
	if (obj.tagName && obj.tagName == 'INPUT' && obj.type == 'checkbox')
		obj.checked = false;
	else if (obj.tagName && obj.tagName == 'INPUT' && obj.type == 'text')
		obj.value = '';
	else if (obj.tagName && obj.tagName == 'SELECT')
	{
		obj.selectedIndex = 0;

		for (i = 0; i < obj.length; i++)
		{
			if (obj.options[i].defaultSelected)
				obj.selectedIndex = i;
		}
	}
	else
		return false;

	return true;
}

function df_add_class(obj,cls)
{
	if (!obj.className)
		return false;

	var ca = obj.className.split(' ');
	var found = false;
	for (idx in ca)
		if (ca[idx].toLowerCase() == cls.toLowerCase())
			return true; // Schon drin, nichts tun

	obj.className += ' '+cls;
}

function df_remove_class(obj,cls)
{
	if (!obj.className)
		return false;

	var ca = obj.className.split(' ');
	new_cls = '';
	for (idx in ca)
		if (ca[idx].toLowerCase() != cls.toLowerCase())
			new_cls += ' '+ca[idx];

	obj.className = new_cls;
}

function df_has_class(obj,cls)
{
	if (!obj.className)
		return false;

	var ca = obj.className.split(' ');
	var found = false;
	for (idx in ca)
		if (ca[idx].toLowerCase() == cls.toLowerCase())
			return true;

	return false;
}


function df_enhance_node(obj)
{
	if (obj)
	{
		obj.find_parent_by_tagname = function(tn) { return find_parent_by_tagname(this,tn); }
		obj.find_predecessor_by_tagname = function(tn) { return find_predecessor_by_tagname(this,tn); }
		obj.insert_before = function(n) { return this.parentNode.insertBefore(n,this); }
		obj.insert_after = function(n) { return this.parentNode.insertBefore(n,this.nextSibling); }
		obj.insert_into = function(n) { return this.appendChild(n); }
		obj.add_class = function(cn) { return df_add_class(this,cn); }
		obj.remove_class = function(cn) { return df_remove_class(this,cn); }
		obj.has_class = function(cn) { return df_has_class(this,cn); }
		obj.hide = function() { df_hide_node(this); }
		obj.show = function() { df_show_node(this); }
		obj.ajax = function(url,post_body,timeout,callafter) { var temp = this; df_ajax(url,post_body,function(res) { temp.innerHTML = res; if (callafter) callafter(res); },timeout); }
		if (obj.tagName == 'INPUT' || obj.tagName == 'SELECT' || obj.tagName == 'TEXTAREA')
			obj.reset_input = function() { return df_reset_input(this); }
		// Hier kann ich mir auch ein enhancetes Select machen (gibts jetzt Setter oder nicht?)
	}
	return obj;
}

function by_id(i)
{
	return df_enhance_node(document.getElementById(i));
}

function first_by_name(i)
{
	return df_enhance_node(document.getElementsByName(i)[0]);
}

function find_parent_by_tagname(obj,tn)
{
	while (obj)
	{
		if (!obj.parentNode)
			return false;
		obj = obj.parentNode;
		if (obj.tagName == tn.toUpperCase())
			return df_enhance_node(obj);
	}
}

function find_predecessor_by_tagname(obj,tn)
{
	while (obj)
	{
		if (obj.previousSibling)
			obj = obj.previousSibling;
		else if (obj.parentNode && obj.parentNode.previousSibling && obj.parentNode.previousSibling.lastChild)
				obj = obj.parentNode.previousSibling.lastChild;

		if (obj && obj && obj.tagName == tn.toUpperCase())
			return df_enhance_node(obj);
	}
}

function df_change_url_fragment(the_url,new_fragment)
{
	if (the_url.indexOf("#") == -1)
		return the_url;

	return the_url.substr(0,the_url.indexOf("#")) + '#' + new_fragment;
}

function df_remove(obj)
{
	return obj.parentNode.removeChild(obj);
}

function df_append_to_url(to_append,the_url)
{
	if (the_url.indexOf("?") != -1)
		the_url += '&';
	else
		the_url += '?';
	the_url += to_append;
	return the_url;
}

function df_modal_show(frame_url,return_handler,options)
{
	TB_return_handler = return_handler;
	frame_url = df_append_to_url('TB_iframe=true&modal=true',frame_url);
	if (options && options.height && options.width)
		/*
		Im Thickbox steht geschrieben:
			TB_WIDTH = (params['width']*1) + 30 || 630;
			TB_HEIGHT = (params['height']*1) + 40 || 440;
			ajaxContentW = TB_WIDTH - 30;
			ajaxContentH = TB_HEIGHT - 45;
			width: (ajaxContentW + 29)
			height: (ajaxContentH + 17)

		Das Ergebnis (29 und 12) kompensieren wir:
		*/
		frame_url = df_append_to_url('width='+(options.width-29)+'&height='+(options.height-12),frame_url);
	tb_show('Fenster',frame_url);

	if ($.browser.msie && $.browser.version == '6.0')
		$("#TB_iframeContent").get(0).contentWindow.document.location.reload();

	return false;
}

function df_modal_return(obj)
{
	window.parent.tb_remove();
	if (window.parent.TB_return_handler)
	{
		window.parent.TB_return_handler(obj);
		delete(window.parent.TB_return_handler);
	}
}
/*
function df_reproduce_subform(n)
{
	c = by_id(n+'_master').cloneNode(true);
	inc = by_id(n);
	cp = df_cloning_plans[n]['fields'];
	ni = ++df_cloning_plans[n]['next_index'];
	vc = df_cloning_plans[n]['value_conservation'];
	els = c.getElementsByTagName('*')
	for (idx in els)
	{
		if (cp[els[idx].name])
		{
			if (cp[els[idx].name] == 'generic')
			{
				// Bevor wir den Namen ändern, holen wir uns noch den Wert
				if (vc && vc[ni] && vc[ni][els[idx].name])
					els[idx].value = vc[ni][els[idx].name];
				els[idx].name = inc.id+'['+ni+']['+els[idx].name+']';
			}
		}
	}
	inc.appendChild(c);
	c.style.display = '';
}

function df_preclone_subform(n)
{
	vc = df_cloning_plans[n]['value_conservation'];
	for (idx in vc) // Nur für die Anzahl
		df_reproduce_subform(n);
}
*/

function df_add_obj_to_objcoll(frm,id_pfx,coll,mandatory_errtxt)
{
	var a = frm.getElementsByTagName('*');
	var obj_data = new Object;
	var resetees = new Array;

	for (idx in a)
	{
		var e = a[idx];
		if (e.id && e.id.substr(0,id_pfx.length) == id_pfx)
		{
			var subname = e.id.substr(id_pfx.length+1,e.id.length-(id_pfx.length+2));
			obj_data[subname] = e.value;
			resetees.push(e);

			if (mandatory_errtxt && !e.value)
			{
				alert(mandatory_errtxt);
				return false;
			}
		}
	}
	for (idx in resetees)
		df_reset_input(resetees[idx]);
	coll.innerHTML += df_objcoll_create_object(obj_data, id_pfx);

	return true;
}

function df_objcoll_create_object(obj_data, id_pfx)
{
	if (id_pfx == 'new_partner')
		return df_sjax('contract_edit_object_partner.php',JSON.stringify(obj_data)); // Hierfür...
	// ... gibt es zwei Möglichkeiten der Implementierung:
	// - Es wird der Objektname dem Link und damit der Funktion übergeben, die ruft dann die
	//   gleichnamige PHP-Datei auf. Das ist nicht etwa ein Sicherheitsrisiko, denn die Datei
	//   wäre ja ohnehin öffentlich abrufbar.
	// - Es wird der Name/die ID/der Key/sonstwas der Collection dem Link und damit der Funktion
	//   übergeben. Diese gibt das weiter an einen zentralen Loader (im Framework enthalten), der
	//   anhand der Formularsignatur schaut, welches Objekt zu laden ist.
	else if (id_pfx == 'reminder')
		return df_sjax('contract_edit_object_reminder.php',JSON.stringify(obj_data));
}

function df_create_xmlhttprequest()
{
	// Code aus der deutschen Wikipedia ;)

	var xmlHttp = null;
	// Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
	if (typeof XMLHttpRequest != 'undefined') {
	    xmlHttp = new XMLHttpRequest();
	}
	if (!xmlHttp) {
	    // Internet Explorer 6 und älter
	    try {
	        xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
	    } catch(e) {
	        try {
	            xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
	        } catch(e) {
	            xmlHttp  = null;
	        }
	    }
	}

	return xmlHttp;
}

function df_sjax(url,post_body)
{
	var xmlHttp = df_create_xmlhttprequest();

	if (xmlHttp)
	{
		xmlHttp.open((post_body ? 'POST' : 'GET'), url, false);
		xmlHttp.send(post_body);
		return xmlHttp.responseText;
	}

}

function df_ajax(url,post_body,callback,timeout)
{
	var xmlHttp = df_create_xmlhttprequest();

	if (xmlHttp)
	{
		xmlHttp.open((post_body ? 'POST' : 'GET'), url, true);
		if (timeout)
			window.setTimeout(function() { xmlHttp.abort(); },timeout*1000);

		xmlHttp.onreadystatechange = function()
		{
			if (xmlHttp.readyState == 4 && xmlHttp.status != 0) { callback(xmlHttp.responseText); }
			if (xmlHttp.readyState == 4 && xmlHttp.status == 0) { callback(false); }
		};
		xmlHttp.send(post_body);
	}
}

function df_callstack(cs)
{
	/*
		--- Designstudie ---
		Aufruf so:
		df_callstack(
			[
				function() { some_code(); },
				new dfCallstackFunction (function() { some_code(); }), // gleichwertig zum Code darüber
				new dfAjaxCall(url,post_body),
				function(result_from_ajax) { alert(result_from_ajax); }
			]
		);
	*/
}


function df_create_dom_from_html(html,container_hint)
{
	var n = document.createElement(df_fallback(container_hint,'div'));
	n.innerHTML = html;
	return (container_hint == 'table') ? n.firstChild.firstChild : n.firstChild;
}

function df_multiselect_reference_field_add(a_obj,nam,delhtml,uniqueness_errtxt)
{
	if (find_predecessor_by_tagname(a_obj,'select').value == 0)
	{
		alert(find_predecessor_by_tagname(a_obj,'select').options[find_predecessor_by_tagname(a_obj,'select').selectedIndex].text);
		return false;
	}
	//var t = '<tr><td>#TEXT#</td><td><a href="javascript:;" onclick="df_multiselect_reference_field_remove(this); return false;">#DELHTML#</a><input type="hidden" name="#NAME#" value="#VALUE#"></td></tr>';
	var t = '#TEXT#';
	var r = '<a href="javascript:;" onclick="df_multiselect_reference_field_remove(this); return false;">#DELHTML#</a><input type="hidden" name="#NAME#" value="#VALUE#">';
	r = r.replace('#NAME#',nam+'[]');
	r = r.replace('#VALUE#',find_predecessor_by_tagname(a_obj,'select').value);
	t = t.replace('#TEXT#',find_predecessor_by_tagname(a_obj,'select').options[find_predecessor_by_tagname(a_obj,'select').selectedIndex].text);
	r = r.replace('#DELHTML#',delhtml);
	t = document.createTextNode(t);
	if (uniqueness_errtxt)
	{
		var l = document.getElementsByName(nam+'[]');
		for (idx in l)
		{
			if (l[idx].name && l[idx].name == nam+'[]' && l[idx].value == find_predecessor_by_tagname(a_obj,'select').value)
			{
				alert(uniqueness_errtxt);
				return false;
			}
		}
	}
	var tr1 = document.createElement('tr');
	var td1 = document.createElement('td');
	var td2 = document.createElement('td');
	td1.appendChild(t);
	td2.innerHTML = r;
	tr1.appendChild(td1);
	tr1.appendChild(td2);
	find_parent_by_tagname(a_obj,'tr').insert_before(tr1);
	find_predecessor_by_tagname(a_obj,'select').reset_input();
}

function df_multiselect_reference_field_remove(obj)
{
	df_remove(obj.parentNode.parentNode);
}

function df_fallback()
{
	for (var idx = 0; idx < arguments.length; idx++) // for-in funktioniert nicht mit arguments, daher diese komische Konstruktion
	{
		if ((typeof arguments[idx]) != 'undefined')
			return arguments[idx];
	}
}

function df_fadeout_register(obj_id,seconds)
{
	var obj = by_id(obj_id);
	window.setTimeout(function() {
		obj.style.display = 'none';
	}, 1000 * seconds);
}


function df_navigation_toggle(evt, recv_obj)
{
	if (recv_obj === (evt.target || evt.srcElement)) // Nur wenn wirklich das li geklickt wurde
	{
		ul = df_enhance_node(recv_obj.parentNode.getElementsByTagName('UL')[0]);
		if (ul.has_class('df_collapsed'))
			ul.remove_class('df_collapsed');
		else
			ul.add_class('df_collapsed');
	}
}

function df_set_cookie(cname,cvalue,expiry_days)
{
	var cookie_string;
	cookie_string = cname + '=' + JSON.stringify(cvalue);
	if (expiry_days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(expiry_days * 24 * 60 * 60 * 1000));
		cookie_string += '; expires='+date.toGMTString();
	}
	cookie_string += '; path=/';
	document.cookie = cookie_string;
}

function df_get_cookie(name)
{
	re = new RegExp(name+'=([^;]*)');
	res = re.exec(document.cookie);
	if (res)
		return JSON.parse(res[1]);
	else
		return null;
}

function df_clear_cookie(name)
{
	df_set_cookie(name,'',-1);
}

function df_set_debug_panel_flags()
{
	var flags = new Array();
	els = by_id('df_debug_panel').getElementsByTagName('FORM')[0].elements;
	for (idx in els)
	{
		el = els[idx];
		if (el.name && el.name.substr(0,20) == 'df_debug_panel_flag_' && el.checked)
			flags.push(el.name.substr(20));
	}
	df_set_cookie('df_debug_panel_flags',flags);
}

function df_restore_debug_panel_state()
{
	state = df_get_cookie('df_debug_panel_state');
	if (state == 'hidden')
	{
		by_id('df_debug_panel_content').hide();
		by_id('df_debug_panel').getElementsByTagName('SPAN')[0].innerHTML = '&#x25B6;';
	}
	else
	{
		by_id('df_debug_panel_content').show();
		by_id('df_debug_panel').getElementsByTagName('SPAN')[0].innerHTML = '&#x25BC;';
	}
}

function df_restore_debug_panel_flags()
{
	flags = df_get_cookie('df_debug_panel_flags');
	for (idx in flags)
	{
		el = first_by_name('df_debug_panel_flag_'+flags[idx]);
		if (el)
			el.checked = true;
	}
}

function df_toggle_debug_panel_state()
{
	if (df_get_cookie('df_debug_panel_state') == 'hidden')
		df_clear_cookie('df_debug_panel_state');
	else
		df_set_cookie('df_debug_panel_state','hidden');
	df_restore_debug_panel_state();
}

function df_reexec_scripts(el)
{
	var ss = el.getElementsByTagName('SCRIPT');
	for (var i=0 ; i < ss.length ; i++)
	{
		df_eval_globally(ss[i].innerHTML);
	}
}

function df_eval_globally(s)
{
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
	// http://piecesofrakesh.blogspot.com/2008/10/understanding-eval-scope-spoiler-its.html ist anscheinend falsch

	if (window.execScript)
	{
		window.execScript(s);
	}
	else
	{
		var w = function()
		{
			window.eval.call(window,s);
		}
		w();
	}
}

function df_spin_wheel(button_obj)
{
	// Button-Objekt jqueryfizieren
	button_obj = $(button_obj);

	if (button_obj.hasClass('disabled'))
		return;

	var table_obj = button_obj.parents('table');
	var content_source = table_obj.next().val();
	if (!table_obj.data('spin_count'))
		table_obj.data('spin_count',0);

	if (button_obj.parents('td').next().length)
	{
		var direction = 'right'; // Linker Pfeil, Inhalt rollt nach rechts
		var stage_obj = button_obj.parents('td').next().next().children().eq(0).children();
		if (
			stage_obj.children().eq(0).contents().length == 1 &&
			stage_obj.children().eq(0).contents()[0].nodeType == 3 &&
			stage_obj.children().eq(0).contents()[0].nodeValue == String.fromCharCode(160)
		)
			return;
		table_obj.data('spin_count',table_obj.data('spin_count')-1); // Vorherige Seite
		var next_page = table_obj.data('spin_count')-1;
	}
	else
	{
		var direction = 'left'; // Rechter Pfeil, Inhalt rollt nach links
		var stage_obj = button_obj.parents('td').prev().prev().children().eq(0).children();
		if (
			stage_obj.children().eq(2).contents().length == 1 &&
			stage_obj.children().eq(2).contents()[0].nodeType == 3 &&
			stage_obj.children().eq(2).contents()[0].nodeValue == String.fromCharCode(160)
		)
			return;
		table_obj.data('spin_count',table_obj.data('spin_count')+1); // Nächste Seite
		var next_page = table_obj.data('spin_count')+1;
	}

	button_obj.addClass('disabled');

	var left_val = stage_obj.parent().eq(0).width();
	stage_obj.css('left','-'+left_val+'px');

	stage_obj.animate({left : (direction == 'left'?('-'+(left_val*2)+'px'):'0px') },'slow','swing',function(){
		var visible_box = stage_obj.children().eq(direction == 'left'?2:0);
		var opposite_box = stage_obj.children().eq(direction == 'left'?0:2);
		if (direction == 'left')
			opposite_box.insertAfter(visible_box);
		else
			opposite_box.insertBefore(visible_box);
		stage_obj.css('left','-100%');
		$.ajax( {
			data: { spin_count : next_page },
			dataType: 'html',
			success: function(data, textStatus){
				if(!data) data = '&nbsp;';
				opposite_box.html(data);
				button_obj.removeClass('disabled');
			},
			url: content_source
		} );
	});
}
