// LSM Formlib - common functions used by all forms

// declare global variables
var formlib_select_values = new Array();	// to store old select values

function participant_view(participant_id)
{
	info = window.open('/participants/view?participant_id='
		+ participant_id +
		'&print=1', 'participant_view',
		'location=no,scrollbars=yes,status=yes,toolbar=no,width=800,height=600,resizable=yes,hotkeys=no');
}

function booking_view(booking_id)
{
	info = window.open('/bookings/view?booking_id='
		+ booking_id +
		'&print=1', 'booking_view',
		'location=no,scrollbars=yes,status=yes,toolbar=no,width=800,height=600,resizable=yes,hotkeys=no');
}

// get the text of a selectbox option specified by value
function select_text(element, value)
{
	for(var i=0; i<element.options.length; i++)
	{
		if((element.options[i].text == value) || (element.options[i].value == value))
			return element.options[i].text;
	}
}

function select_option(element, value)
{
	for(var i=0; i<element.options.length; i++)
	{
		if(element.options[i].text == value || (value != "" && element.options[i].value == value))
			element.selectedIndex = i;
	}
}

function confirm_selection(event)
{
	var old_value = false;
	var new_value = false;

	if(!event)
		event = window.event;

	element = event.target ? event.target : event.srcElement;

	if(element.type != "select-one")
	{
		// call old event handler
		if(element._onchange_stack)
			element._onchange_stack(event);

		return true;
	}
		
	// use previous selected value or defaultSelected value if nothing was
	// changed by the user yet
	if(formlib_select_values[element.name])
		old_value = formlib_select_values[element.name];
	else
	{
		for(i=0; i<element.options.length; i++)
			if(element.options[i].defaultSelected)
				old_value = element.options[i].value;
	}
	
	new_value = element.options[element.selectedIndex].value;
	
	// if user was on "-- please select --" before we just accept
	if(!old_value || old_value == "" || old_value == 0)
	{
		formlib_select_values[element.name] = new_value;

		// call old event handler
		if(element._onchange_stack)
			element._onchange_stack(event);

		return true;
	}

	// get text for old_value and new_value
	old_text = select_text(element, old_value);
	new_text = select_text(element, new_value);
	
	if(!confirm(sprintf(translate('msg_confirm_selection'), old_text, new_text))) 
	//Please confirm change.\n\nold value: ' + old_text + '\n\nnew value: ' + new_text
	{
		select_option(element, old_value);
	}
	else
	{
		formlib_select_values[element.name] = new_value;
		
		// call old event handler
		if(element._onchange_stack)
			element._onchange_stack(event);
	}
}

// TODO: jump over fields not visible right now (used in boooking form)
function handleEnter(event)
{
	if(!event)
		event = window.event;

	field = event.target ? event.target : event.srcElement;

	var keyCode = event.keyCode ? event.keyCode : 
		event.which ? event.which : event.charCode;

	if(field.type != "text" && field.type != "select-one" && field.type != "checkbox" && field.type != "radio")
		return true;

	if(keyCode == 13)
	{
		var i;
		var ignorefields = "hidden,image,submit,button";

		for(i = 0; i < field.form.elements.length; i++)
		{
			if(field == field.form.elements[i])
				break;
		}

		try {
			current_tab = field.form.elements[i].attributes.getNamedItem("tabfolder").value;
		}
		catch(e)
		{
			current_tab = false;
		}

		for(i=i+1; i<field.form.elements.length; i++)
		{
			if(ignorefields.indexOf(field.form.elements[i].type) == -1)
				break;
		}

		try {
			new_tab = field.form.elements[i].attributes.getNamedItem("tabfolder").value;
		}
		catch(e)
		{
			new_tab = false;
		}

		if(new_tab != current_tab)
			return false;

		if(i == field.form.elements.length)
			return false;

		// try / catch block to catch errors (i.e. if the chosen element is invisible)
		try {
			field.form.elements[i].focus();
		}
		catch(e) {};

		if(field.form.elements[i].type == "text")
			field.form.elements[i].select();

		return false;
	}
	else
		return true;
}

// INITIALIZE BEHAVIOUR

function lsm_init_select_behaviours()
{
	Behavior.register(
		"select",
			function(element)
			{
				try {
					if(element.attributes.getNamedItem("confirm_selection").value == 'false')
						return;
				} catch(e) {};

				// remember old event handler - will be chained in confirm_selection
				if(element.onchange)
					element._onchange_stack = element.onchange;

				element.onchange = confirm_selection;
			}
	);
}

function confirm_cancel()
{
	if(!confirm(translate('msg_confirm_cancel')))
		return false;
	else
		return true;
}

//////////// ARCHIVE

// display a specific HTML entitiy
function show_entity(name)
{
	d = document.all[name];

	if(d)
	{
		d.style.visibility = 'visible';
		d.style.display = 'inline';
	}
}

// display a specific HTML entitiy
function hide_entity(name)
{
	d = document.all[name];

	if(d)
	{
		d.style.visibility = 'hidden';
		d.style.display = 'none';
	}
}

// disable field
function df(form, field, boxit)
{
	var f = fe(form, field);

	boxit = (typeof boxit == "undefined") ? true : boxit;

	// ignore buttons
	if(f.type == 'submit' || f.type == 'button')
		return;

	if(f)
	{
		f.disabled = true;

		// special handling of select boxes
		if(f.type == 'select-one')
		{
			// let's see if we have a static field template available
			fstatic = fe(form, '_' + field);

			if(fstatic)
			{
				// hide select-box
				f.style.visibility = 'hidden';
				f.style.display = 'none';

				// display static template
				fstatic.style.visibility = 'visible';
				fstatic.style.display = 'inline';
				fstatic.value = f.options[f.selectedIndex].text;
				ll = Math.round(fstatic.value.length/2+5) + 'em';
				fstatic.style.width = ll;

				// border around static field
				fstatic.style.borderWidth = '2px';
				fstatic.style.borderStyle = 'solid';
				fstatic.style.borderColor = '#99CCFF';
				fstatic.disabled = true;
			}
		}

		if(f.style)
		{
			if(boxit)
			{
				//// Redesign f.style.borderWidth = '2px';
				//// Redesign f.style.borderStyle = 'solid';
				// f.style.borderColor = '#99CCFF';
				//// Redesign f.style.borderColor = '#CCCCCC';
			}
			else
			{
				// normal behaviour
				f.disabled = true;
				//// Redesign f.style.backgroundColor = '#DDDDDD';
			}
		}
	}

	// check if there is a date button
	button = document.getElementById('trigger_' + field);

	if(button)
	{
		button.src = '/images/icon_calendar_disabled.gif';
		button.disabled = true;
	}
}

// enable field
function ef(form, field)
{
	var f = fe(form, field);

	if(f)
	{
		f.disabled = false;
		if(f.style)
		{
			//// Redesign f.style.backgroundColor = '#D1E2F3';	// nice blue
			//// Redesign f.style.borderStyle = 'solid';
			//// Redesign f.style.borderWidth = '1px';
			//// Redesign f.style.borderColor = '#555555';
		}

		// special handling of select boxes
		if(f.type == 'select-one')
		{
			// let's see if we have a static field template available
			fstatic = fe(form, '_' + field);

			if(fstatic)
			{
				// show select-box
				f.style.visibility = 'visible';
				f.style.display = 'inline';

				// hide static template
				fstatic.style.visibility = 'hidden';
				fstatic.style.display = 'none';
				fstatic.disabled = true;

				// we empty the field cause it was empty before
				// could otherwise cause confusion with some
				// javascript routines around...
				fstatic.value = '';
			}
		}
	
		// check if there is a date button
		button = document.getElementById('trigger_' + field);

		if(button)
		{
			button.src = '/images/icon_calendar.gif';
			button.disabled = false;
		}
	}
}

function fe(form, name)
{
	return form.elements[name];
}

function select_default(form, flx, _val)
{
	var value = _val;
	
	// fetch field object
	var field = fe(form, flx);
	
	// already selected a field
    // if(field.selectedIndex > 0)
	//	return;
		
	for(var i=0; i<field.length; i++)
	{
		if(field.options[i].text == value || (value != "" && field.options[i].value == value))
			field.selectedIndex = i;
	}
}

function get_data(data, field)
{
	var value = data[field];
	
	if(!value)
		return '';
	else
		return value;
}

// init a form with supplied user data (must be an array)
function init_form(form, data)
{
	var action_index = 0;
	
	// loop over form
	for(j=0; j<form.elements.length; j++)
	{
		var e = form.elements[j];

		// if element name starts with a "_" we don't treat it
		if(e.name.substr(0, 1) == '_')
			continue;

		switch(e.type)
		{
			case "text":
				e.value = get_data(data, e.name);
				break;
				
			case "textarea":
				e.value = get_data(data, e.name);
				break;

			case "radio":
				if(e.value == data[e.name])
					e.checked = true;
				else
					e.checked = false;
				break;
				
			case "checkbox":
				if(data[e.name] >= "1")
					e.checked = true;
				else
					e.checked = false;
				break;
				
			case "select-one":
				formlib_select_values[e.name] = data[e.name];	// store initial value
				select_default(form, e.name, data[e.name]);
				break;
			
			case "hidden":
				// alert("hidden :-) " + e.name);
				break;
		}
	}
	return;
}	

function freeze_all_fields(form, exceptions)
{
	if(!exceptions)
		exceptions = new Array;

	// loop over form
	for(j=0; j<form.elements.length; j++)
	{
		var e = form.elements[j];

		if(!exceptions[e.name])
			df(form, e.name);

		if(e.type == "radio")
		{
			e.disabled = true;
		}
	}
}

function unfreeze_all_fields(form)
{
	// loop over form
	for(j=0; j<form.elements.length; j++)
	{
		var e = form.elements[j];

		ef(form, e.name);

		if(e.type == "radio")
		{
			e.enabled = true;
		}
	}
}

// enable all our allowed fields
function enable_allowed_fields(f, my_fields)
{
	// disable all fields
	freeze_all_fields(f);

	for(i = 0; i<=my_fields.length-1; i++)
	{
		ef(f, my_fields[i]);
	}
}

// some misc functions
function replace_all(c, n, s)
{
	s2 = '';
	while(s2 != s)
	{
		s2 = s;
		s = s2.replace(c, n);
	}
	
	return s2;
}

function replace_umlaute(s)
{
	s = replace_all('ä', 'ae', s);
	s = replace_all('ö', 'oe', s);
	s = replace_all('ü', 'ue', s);
	s = replace_all('ß', 'ss', s);
	s = replace_all(' ', '', s);		// get rid of spaces
	s = replace_all('-', '', s);		// get rid of '-'
	s = replace_all('_', '', s);		// get rid of '_'
	s = replace_all('/', '', s);		// get rid of '/'
	s = replace_all('&', '', s);		// get rid of '&'
	
	return s;
}

function change_element(element_name, new_value)
{
	element = document.getElementById(element_name);
	if(element)
		element.firstChild.nodeValue = new_value;
}

function is_checked_checkbox(form, elem)
{
	var elems = document.forms[form].elements;
	var checkbox = false;
	var hidden = false;

	for(i=0;i!=elems.length;i++)
	{
		if(elems[i].name == elem)
		{
			if(elems[i].type == "hidden")
				hidden = elems[i];
			else if(elems[i].type == "checkbox")
				checkbox = elems[i];
		}
	}

	if(hidden && checkbox)
		return checkbox.checked;
	else if(!hidden && checkbox)
		return ckeckbox.checked;
	else if(hidden && !checkbox)
	{
		if(hidden.value == 0)
			return false;
		else
			return true;
	}
	else
		return false;
}

function show_field(field_name)
{
	field = $(field_name);
	if(field)
	{
		if(!field.hasClassName('_hidden'))
			field.show();
	}
}

function hide_field(field_name)
{
	field = $(field_name);
	if(field)
	{
		field.hide();
	}
}

function sprintf()
{
	if( sprintf.arguments.length < 2 ) return;

	var data = sprintf.arguments[ 0 ];

	if( typeof( sprintf.arguments[ 1 ] ) == 'object' )
	{
		var k = 0;
		var replace = sprintf.arguments[ 1 ];
	}
	else
	{
		var k = 1;
		var replace = sprintf.arguments;
	}

	for( k; k<sprintf.arguments.length; ++k )
	{
		switch( typeof( replace[ k ] ) )
		{
			case 'string':
				data = data.replace( /%s/, replace[ k ] );
				break;

			case 'number':
				data = data.replace( /%d/, replace[ k ] );
				break;

			case 'boolean':
				data = data.replace( /%b/, replace[ k ] ? 'true' : 'false' );
				break;

			default:
			/// function | object | undefined
			break;
		}
	}

	return( data );
}

function setDateBocksFieldValue(name, value)
{
	obj = DatetimeToolbocks.Collection.find(name);
	$(name).value = value;
	obj.magicDate();
}

function disableDateBocksField(name)
{
	obj = DatetimeToolbocks.Collection.find(name);
	obj.disable();
}

function enableDateBocksField(name)
{
	obj = DatetimeToolbocks.Collection.find(name);
	obj.enable();
}

function resetDateBocksFieldValue(name)
{
	obj = DatetimeToolbocks.Collection.find(name);
	$(name).value = "";
}

var LSM_Site = {
	
	// initialisiert den mechanismus
	init: function(){
		LSM_Site.tooltipps();
	},

	// Tooltips fuer "funktionicon"
	tooltipps: function(){
		$$('.funktionicon').each(function(element){
			new Tip(element, element.alt);
		});

		$$('.documenticon').each(function(element){
			divobj = $('div_' + element.id);
			new Tip(element, divobj,
				{
					fixed: true,
					hideOn: 'closeButton',
					title: translate('document_download'),
					closeButton: true,
					showOn:	'click',
					stem: 'topRight',
					hook: { tip: 'topRight', target: 'bottomMiddle' },
					border: 2,
					hideOthers: true
				}
			);
		});

		$$('.actionselectoricon').each(function(element){
			divobj = $('div_' + element.id);
			new Tip(element, divobj,
				{
					fixed: true,
					hideOn: 'closeButton',
					title: "",
					closeButton: true,
					showOn:	'click',
					stem: 'topRight',
					hook: { tip: 'topRight', target: 'bottomMiddle' },
					border: 2,
					hideOthers: true
				}
			);
		});
	}
};

document.observe('dom:loaded', LSM_Site.init);

// Dojo helper function
function dojo_setInnerHTML (content, dom_node)
{
    dojo.query('[widgetId]', dom_node).forEach(function(n) { dijit.byNode(n).destroy() })
	dom_node.update(content);
	dojo.parser.parse(dom_node);
}

// overwrite the function document.getElementById according to http://webbugtrack.blogspot.com/2007/08/bug-152-getelementbyid-returns.html

//use browser sniffing to determine if IE or Opera (ugly, but required)
var isOpera, isIE = false;
if(typeof(window.opera) != 'undefined'){isOpera = true;}
if(!isOpera && navigator.userAgent.indexOf('Internet Explorer')){isIE = true;}

//fix both IE and Opera (adjust when they implement this method properly)
if(isOpera || isIE){
  document.nativeGetElementById = document.getElementById;
  //redefine it!
  document.getElementById = function(id){
    var elem = document.nativeGetElementById(id);
    if(elem){
      //verify it is a valid match!
      if(elem.attributes['id'] && elem.attributes['id'].value == id){
        //valid match!
        return elem;
      } else {
        //not a valid match!
        //the non-standard, document.all array has keys for all name'd, and id'd elements
        //start at one, because we know the first match, is wrong!
        for(var i=1;i<document.all[id].length;i++){
          if(document.all[id][i].attributes['id'] && document.all[id][i].attributes['id'].value == id){
            return document.all[id][i];
          }
        }
      }
    }
    return null;
  };
}

// Implement hover-over function for datagrids to highlight current row
function hover(e,doit)
{
        var target = e.srcElement;
        if (target && target.nodeName.toLowerCase() == "td")
        {
                target.parentNode.className = doit ? "hover":"";
        }
}

function zeroPad(integer){
    if (integer < 10) {
      return '0' + integer;
    } else {
      return integer;
    }
}

