//type des elements formulaire qui peut reçoit le focus ,"image" non-valide
var arrElemType = new Array("text","password","radio","checkbox","file","select-one","select-multiple","textarea","button","submit","reset");
//tags des elements qui peut reçoit le focus
var arrElemTagName = new Array("a","input","select","textarea");

//attributes qui invalidate un element formulaire si ils sont setter à "true"
var arrAttrInvalid = new Array("disabled","readOnly");

function contains(objArray, strValue){
	bool = false;
	if(strValue != null){
		for(j=0;j<objArray.length;j++){
			if(objArray[j].toUpperCase()==strValue.toUpperCase()){
				bool = true;
				break;
			}
		}
	}
	return bool;
}

function validateAttributes(obj){
	//TODO utiliser un tableau des attributes "invalide" (arrAttrInvalid)
	if(obj.style){
		if(obj.disabled || obj.style.display == "none"
						|| obj.style.visibility == "hidden" || obj.parentNode.style.display == "none"
						|| obj.parentNode.style.visibility == "hidden")
			return false;
		else
			return true;
	} else {
		return true;
	}
}

//placer le focus sur le première champ valide d'un page
function focusFirstElement(){

	//si le page contienne un formulaire ou pas
	boolForm = false;
	boolFocus = false;
	
	formTags = document.forms;
	if(formTags.length > 0)
		boolForm = true;

	//placer le focus sur le première element de le formulaire
	if(boolForm){
		//recuperer le formulaire et le première element de la formulaire qui peut receptionner le focus
		objForm = formTags[0];
		for(i=0; i<objForm.elements.length; i++){
			tmpElem = objForm.elements[i];
			validType = contains(arrElemType,tmpElem.type);
			if(!validType)
				continue;
			validAtts = validateAttributes(tmpElem);
			if(validAtts){
				tmpElem.focus();
				boolFocus = true;
				break;
			}
		}
	}
}

//TODO placer le focus sur la premiere element d'un page (dehors formulaire)

//mettre le focus sur le titre de la page
function focusFirstTitleElement(){
	arrPageLinks = document.links;
	//boucle sur les links, mettre le focus sur le link avec acceskey="b"
	for(k=0; k<arrPageLinks.length; k++){
		tmpLink = arrPageLinks[k];
		if(tmpLink.accessKey.toLowerCase() == "b"){
			tmpLink.focus();
		}
	}
}

//recuperer l'index d'un champ
function getElementIndex(field){
	for(i=0; i<objForm.elements.length; i++){
		tmpElem = objForm.elements[i];
		if(tmpElem==field)
			return i;
	}
}

//pour passer le focus au prochaine champ valide
function focusNextElement(field){
/*	if(isNS4()){
    	field.blur();
    	return;
    }	*/
	//recuperer l'indice de l'element active
	fieldIndex = getElementIndex(field)+1;
	//boucle sur les fields a partir de l'element prochaine
	for(i=fieldIndex; i<objForm.elements.length; i++){
		tmpField = objForm.elements[i];
		if(tmpField.tagName)
			if(contains(arrElemTagName,tmpField.tagName))
				if(validateAttributes(tmpField)){
					field.blur();
					tmpField.focus();
					break;
				}
	}
}

function focusElementById(id,field){
/*    if(isNS4()){
        if(field != null)
	    	field.blur();
    	return;
    }	*/
	if(document.getElementById(id))
		document.getElementById(id).focus();
	else if(field != null)
		focusNextElement(field);
	else
		return;
}