var xf_object_list = new Array() ;
var xf_case_list = new Array() ;
var xf_evhandler_list = new Array() ;

function xf_fireChange (element)
{
	var obj = document.getElementById(element) ;
	if (document.createEvent)
	{
		var evt = document.createEvent ("HTMLEvents") ;
		evt.initEvent ('change', true, true) ;
		return !obj.dispatchEvent(evt) ;
	}
}

function xf_sigChange (event)
{
	if (event instanceof Object)
		event = event.target.id ;
	setTimeout ("xf_fireChange('" + event + "');",100) ;
}

function xf_listenDD (nomobj)
{
	var target = document.getElementById(nomobj) ;
	if (target.addEventListener)
		target.addEventListener('dragdrop',xf_sigChange,false) ;
}

function xf_dragEnter ()
{
	var ua = navigator.userAgent.toLowerCase() ;
	if (ua.indexOf("safari")>=0)
	{
		alert ("Depose impossible, il faut recopier") ;
	}
}

function xf_object_new (model_id,object_name, field_id, object_value)
{
	var obj = {model: model_id, name: object_name, field: field_id, value: object_value, elems: new Array()} ;
	xf_object_list.push (obj) ;
}

function xf_case_new (switch_id,case_id,elem_id,sel)
{
	var ocase = {swid: switch_id, caid: case_id, elid: elem_id, select: sel} ;
	xf_case_list.push(ocase) ;
}

function xf_object_attach (model_id, object_name, elem_id, elem_type,elem_value,lstToggles)
{
	for (var i in xf_object_list)
		if ((xf_object_list[i].name == object_name) && ((model_id == '') || (model_id == xf_object_list[i].model)))
		{
			var elem = {id: elem_id, type: elem_type, value: elem_value, toggles: lstToggles} ;
			xf_object_list[i].elems.push (elem) ;
		}
}

function xf_changeobj (obj,elem_id,value)
{
	if ((typeof(value) == 'boolean') && (elem_id != null))	// selected item
	{
		var defval = '' ;
		for (var i in obj.elems)
			if (obj.elems[i].id == elem_id)
				defval = obj.elems[i].value ;
		if ((value) && (obj.value.match(defval)==null))		// add a value
			obj.value = obj.value + ' ' + defval ;
		if ((!value) && (obj.value.match(defval)!=null))		// remove a value
		{
			var tab = obj.value.split(' ') ;
			for (var i in tab)
				if (tab[i] == defval)
					tab.splice(i,1) ;
			obj.value = tab.join(' ') ;
		}
	}
	else			// regular item
		obj.value = value ;
	
	var ref_field = document.getElementById(obj.field) ;
	if (ref_field)
		ref_field.value = obj.value ;
	
	for (var i in obj.elems)
		if (obj.elems[i].id != elem_id)
		{
			var att_field = document.getElementById(obj.elems[i].id) ;
			if (att_field)
				switch (obj.elems[i].type)
				{
				case 'select_full' :		// checkbox
				case 'select1_full' :		// radio button
					att_field.checked = obj.value.match(att_field.value) != null ;
					break ;
				case 'select' :				// select multiple
					att_field.selected = obj.value.match(att_field.value) != null ;
					break ;
				default :						// others
					att_field.value = obj.value ;
					break ;
				}
		}
}

function xf_change (model_id, object_name,elem_id, value, changehandler)
{
	for (var i in xf_object_list)
		if ((xf_object_list[i].name == object_name) && ((model_id == '') || (model_id == xf_object_list[i].model)))
		{
			xf_changeobj (xf_object_list[i],elem_id,value) ;
			
			for (var j in xf_object_list[i].elems)
				if (xf_object_list[i].elems[j].value == value)
					xf_runhandler (null,xf_object_list[i].elems[j].toggles) ;
		}
			
	xf_runhandler (changehandler,null) ;
}

function xf_runhandler (handler,toggles)
{
	if (toggles != null)
	{
		var toggleTab = toggles.split('|') ;
		for (var i in toggleTab)
			if (toggleTab[i].length != 0)
				xf_togglecase (toggleTab[i]) ;
	}
	
	if (handler != null)
		if ((!xf_submit(handler)) &&
			(!xf_runscript(handler)))
				alert ("Handler ni submit ni script="+handler) ;
}

function xf_togglecase (caseid)
{	
	var switchid = null ;
	for (var i in xf_case_list)
		if (xf_case_list[i].caid == caseid)
		{
			switchid = xf_case_list[i].swid ;
			
			if (switchid != null)
				for (var j in xf_case_list)
					if (xf_case_list[j].swid == switchid)
					{
						var elem = document.getElementById(xf_case_list[j].elid) ;
						if (xf_case_list[j].caid == caseid)	// select
						{
							elem.style.zIndex=1 ;
							elem.style.display="block" ;
						}
						else				// deselect
						{
							elem.style.zIndex=0 ;
							elem.style.display="none" ;
						}
					}	
		}
}

function xf_changeselect (model_id,object_name, changehandler)
{
	for (var i in xf_object_list)
		if ((xf_object_list[i].name == object_name) && ((model_id == '') || (model_id == xf_object_list[i].model)))
		{
			var nvalue = '' ;
			for (var j in xf_object_list[i].elems)
				if (xf_object_list[i].elems[j].type == 'select')
				{
					var att_field = document.getElementById(xf_object_list[i].elems[j].id) ;
					if ((att_field) && (att_field.selected) && (nvalue.match(xf_object_list[i].elems[j].value)==null))
					{
						if (nvalue.length > 0)
							nvalue = nvalue + ' ' ;
						nvalue = nvalue + xf_object_list[i].elems[j].value ;
					}
				}
				
			xf_changeobj (xf_object_list[i],null,nvalue) ;
		}
	xf_runhandler (changehandler,null) ;
}

function xf_initobj ()
{
	for (var i in xf_object_list)
		xf_changeobj (xf_object_list[i],null,xf_object_list[i].value) ;

	// Case init. necessary for FF (cursor pb)
	for (var i in xf_case_list)
		if (xf_case_list[i].select == 'true')
		{
			var elem = document.getElementById(xf_case_list[i].elid) ;
			elem.style.zIndex=1 ;
			elem.style.display="block" ;
		}

	for (var i in xf_evhandler_list)
		if (xf_evhandler_list[i].event == 'xforms-ready')
			xf_evhandler_list[i].action.call (null, xf_evhandler_list[i].param) ;
}

var xf_submission_list = new Array() ;

function xf_submission_new (submission_id, action, method, form_id)
{
	var subm = {id: submission_id, action: action, method: method, form: form_id} ;
	xf_submission_list.push (subm) ;
}

function xf_submit (submission_id)
{
	var oksubmit = false ;
	for (var i in xf_submission_list)
		if (xf_submission_list[i].id == submission_id)
		{
			var form = document.getElementById (xf_submission_list[i].form) ;
			if (form)
			{
				oksubmit = true ;
				form.action = xf_submission_list[i].action ;
				switch (xf_submission_list[i].method)
				{
				case 'urlencoded-post' :		// usual POST
					form.method = 'post' ;
					form.enctype = 'application/x-www-form-urlencoded' ;
					break ;
				case 'form-data-post' :		// file POST
					form.method = 'post' ;
					form.enctype = 'multipart/form-data' ;
					break ;
				default :
					form.method = xf_submission_list[i].method ;
					break ;
				}
				form.submit() ;
			}
		}
	return (oksubmit) ;
}

function xf_runscript (script_id)
{
	var sid = document.getElementById(script_id) ;
	if ((sid != null) && (sid.nodeName == 'SCRIPT'))
	{
		// var ret = eval (sid.text) ;	// Pas compatible Safari
		var ret = eval (sid.innerHTML) ;
		return (true) ;
	}
	return (false) ;
}

function xf_element_visible ( idElem )
{
	var elem = document.getElementById( idElem ) ;

	do {
		if ((elem.style !== undefined) && (elem.style.display !== undefined) && (elem.style.display == 'none'))
			return (false) ;
		elem = elem.parentNode ;
	} while (elem != null) ;

	return (true) ;
}

function xf_setfocus (fieldName)
{
	for (var i in xf_object_list)
		if (xf_object_list[i].name == fieldName)
			for (var j in xf_object_list[i].elems)
				if ( (	(xf_object_list[i].elems[j].type == 'input') ||
					(xf_object_list[i].elems[j].type == 'secret') )
				     &&	(xf_element_visible(xf_object_list[i].elems[j].id))	)
				{
					document.getElementById (xf_object_list[i].elems[j].id).focus() ;
					// return ;
				}
}

function xf_evhandler_add ( eventName, eventFct, eventParm )
{
	var hdl = { event : eventName, action : eventFct, param : eventParm } ;
	xf_evhandler_list.push (hdl) ;
}

function xf_submitEnter ( modelId, objectName, elemId, valeur, evt )
{
	var keycode=null ;
	var cpt ;
	var idSub ;

	if (window.event)
		keycode = window.event.keyCode;
	else
		if (evt)
			keycode = evt.which;

	if (keycode == 13)
	{
		if (modelId == '')
		{
			cpt = 0 ;
			for (var i in xf_object_list)
				if (xf_object_list[i].name == objectName)
				{
					modelId = xf_object_list[i].model ;
					cpt++ ;
				}
			if (cpt != 1)
				return (false) ;
		}

		cpt = 0 ;
		for (var i in xf_submission_list)
			if (xf_submission_list[i].form == modelId)
			{
				idSub = xf_submission_list[i].id ;
				cpt++ ;
			}
		if (cpt != 1)
			return (false) ;

		xf_change ( modelId, objectName, elemId, valeur, null) ;

		xf_submit (idSub) ;

		return (true) ;
	}

	return (true) ;
}

