/***** Sommaire *****/
// 00 - Variables
// 01 - Base
/*******************/

/***** 00 - Variables *****/
var actURL = document.location.href;
var isOpera = (navigator.userAgent.indexOf('Opera') != -1)? true : false;
var isIE = (document.all && !isOpera && navigator.platform == "Win32")? true : false;
var isIE7 = (navigator.userAgent.indexOf('MSIE 7') != -1)? true : false ;

/***** 01 - Base *****/		
/**
Cibler un objet
-------------------
* Pour cibler une ID : $('id');
* Pour cibler plusieurs IDs : $('id1|id2|...|idn');
* Pour cibler un noeud enfant : $('tag',lvl);   >   $('tag1',lvl1,'tag2',lvl2,...,'tagn',lvln);
* Pour cibler une ID puis un noeud enfant : $('id','tag',lvl);   >   $('id','tag1',lvl1,'tag2',lvl2,...,'tagn',lvln);
* Pour cibler des TAG : $('tag',-1);
* Pour cibler une ID puis des TAG : $('id','tag',-1);
-------------------
* Retourne : Objet ou Array
**/
function $(){
	var returnString = 'document';
	if(arguments.length == 1){
		var ids = arguments[0].split('|');
		if(ids.length > 1){
			var idsTab = new Array();
			for(var i=0; i<ids.length; i++){
				idsTab[idsTab.length] = $(ids[i]);					
			}
			return idsTab;
		} else {
			returnString += '.getElementById(\''+arguments[0]+'\')';
		}
	} else {
		for(var i=0; i<arguments.length; i++){
			var p = i+1;
			if(typeof arguments[p] == 'string' && typeof arguments[i] != 'number' || p > arguments.length){
				returnString += '.getElementById(\''+arguments[i]+'\')';
			} else if(typeof arguments[p] == 'number'){
				if(arguments[p] == -1){
					returnString += '.getElementsByTagName(\''+arguments[i]+'\')';
				} else {
					returnString += '.getElementsByTagName(\''+arguments[i]+'\')['+arguments[p]+']';
				}
			}
		}
	}
	return eval(returnString);
}

/**
Cibler des élément par leur class
-----------------------------------------
* Pour cibler un couple TAG / Class : $$('tag','class');
* Pour cibler plusieurs TAG pour une class : $$('tag1|tag2|...|tagn',class');
-----------------------------------------
* Retourne : Array
**/
function $$(){
	var classedTab = new Array();
	var tagTab = arguments[0].split('|');
	for(i=0; i<tagTab.length; i++){
		var elemTab = $(tagTab[i],-1);
		for(j=0; j<elemTab.length; j++){
			var classTab = arguments[1].split('|');
			for(k=0; k<classTab.length; k++){
				if(elemTab[j].className == classTab[k] || elemTab[j].className.indexOf(classTab[k]+' ') != -1 || elemTab[j].className.indexOf(' '+classTab[k]) != -1){
					classedTab[classedTab.length] = elemTab[j];
				}
			}
		}
	}
	return classedTab;
}

/**
Récupérer une coordonée absolue 'x' ou 'y' ciblé par la fonction $
------------------------------------------------------------------------------------
* Coordonnée X : $C('x',$('id')); 
* Coordonnée Y : $C('y',$('id')); 
------------------------------------------------------------------------------------
* Retourne : Integer
**/
function $C(){
	var obj = arguments[1];
	switch(arguments[0]){
		case 'y':
			objCoord = obj.offsetTop;
			while(obj.offsetParent != null) {
				objParent = obj.offsetParent;
				objCoord += objParent.offsetTop;
				obj = objParent;
			}
		break;
		case 'x':
			objCoord = obj.offsetLeft;
			while(obj.offsetParent != null) {
				objParent = obj.offsetParent;
				objCoord += objParent.offsetLeft;
				obj = objParent;
			}
		break;
		default:
			objCoord = null;
		break;
	}
	return objCoord;
}

/**
Valeur d'un champ
-----------------------
* Par son formualire / nom : $F('nom_form','nom_champ');
* Par son id : $F('id');
-----------------------
* Si SELECT, TEXT, PASSWORD, HIDDEN, TEXTAREA, FILE, RADIO (renseigné) retourne la value du champ
* Si RADIO (non renseigné), retourne FALSE
* Si CHECKBOX retourne TRUE ou FALSE fonction de CHECKED
-----------------------
* Retourne : String (value)  / False (si radio / checkbox vide)
**/
function $F(){
	if(arguments.length == 1){
		var field = $(arguments[0]);
	} else {
		var field = document.forms[arguments[0]].elements[arguments[1]];
	}
	var fieldValue;
	var fieldType = field.type;
	// Cas particuliers du bouton radio et du select
	if(field.length > 1){
		if(field[0].type == 'radio'){
			fieldType = 'radios';
		} else {
			fieldType = 'select';
		}
	}
	switch(fieldType){
		case 'text': case 'password': case 'hidden': case 'textarea': case 'file': case 'radio': case 'select':
			fieldValue = field.value;
		break;
		case 'radios':
			for(var i=0; i<field.length; i++){
				if(field[i].checked){
					fieldValue = field[i].value;
					return fieldValue;
					break;
				}
			}
			return false
		break;
		case 'checkbox':
			if(field.checked){
				fieldValue = field.value;
				return fieldValue;
				break;
			}
			return false;
		break;
		default:
			fieldvalue = null;
		break;
	}
	return fieldValue;
}

/**
Ajouter / Supprimer une CLASS a un objet ciblé par la fonction $
-----------------------------------------------------------------------------------
* Pour ajouter une CLASS : $S('add',$('id'),'nom_class');
* Pour supprimer une CLASS : $S('del',$('id'),'nom_class');
-----------------------------------------------------------------------------------
**/
function $S(){
	var postClass = '';
	var preClass = arguments[1].className;
	var classTab = preClass.split(' ');
	switch(arguments[0]){
		case 'add':
			var isClass = false;
			for(var i=0; i<classTab.length; i++){
				if(classTab[i] == arguments[2]){
					isClass = true;
				}
			}
			postClass = (!isClass)? preClass+' '+arguments[2] : preClass ;
		break;
		case 'del':
			var classSpacer;
			for(var i=0; i<classTab.length; i++){
				classSpacer = (i == 0)? '' : ' ';
				if(classTab[i] != arguments[2]){
					postClass +=  classSpacer+classTab[i]
				}
			}
		break;
	}
	arguments[1].className = postClass;
}

/**
Récupérer le z-index parent le plus haut ciblé par la fonction $
----------------------------------------------------------------------
* Pour récupérer le z-index parent le plus élevé : $Z($('id'));
----------------------------------------------------------------------
* Retourne : Integer
**/
function $Z(){
	var obj = arguments[0];
	var highestIndex = obj.style.zIndex;
	while(obj.offsetParent != null) {
		highestIndex = (obj.offsetParent.style.zIndex > highestIndex)? obj.offsetParent.style.zIndex : highestIndex;
		obj = obj.offsetParent;
	}
	return highestIndex;
}