var childControlCollection=new Array();

function RequiredIfValidatorEvaluateIsValid(val)
{
    if (val.controltocompare != "") 
	{
        var ctr=document.getElementById(val.controltocompare);
        var v=GetControlValue(ctr); 
        
	    if (v!=undefined && ctr.style.visibility!='hidden') 
	    { 
	        var isRequired=(val.triggervalue.length==0 || v.substring(0,val.triggervalue.length) == val.triggervalue);
	        	        	        
	        if (val.triggeroperator!="=") 
	        {
	            isRequired=!isRequired;
	        }
	        
            if (isRequired) return RequiredFieldValidatorEvaluateIsValid(val);
            return true;
	    } 
	    else 
	    {
			return true;
		}
	} 
	else 
	{ 
	    return true;
	}
}

function ChildControl()
{
	this.sourceControlID=null;
	this.triggerValue=null;
	this.targetControlID=null;
	this.recControlID=null;
	this.operator='=';
}

var chlSrcCollection=new Array(); // list of source controls
var chlTrgCollection=new Array(); // list of target controls

function GetControlVisibility(ctrlId,debug)
{
    /*if (debug)
    {
        var deb=document.getElementById('debug');    
        deb.innerHTML=deb.innerHTML+"<h1>"+ctrlId+"</h1>";
    }*/
    
    var visible=chlTrgCollection[ctrlId]==null?true:false;
    
    for (var k in chlTrgCollection[ctrlId])
    {
        var chl=chlTrgCollection[ctrlId][k];
        var curVisible=GetChildControlVisibility(chl);
        
        visible=visible|curVisible;
        
        var par=GetControlVisibility(chl.sourceControlID,false);
        
        //if (debug) deb.innerHTML=deb.innerHTML+chl.sourceControlID+": "+curVisible+" - Parent: "+par+"<br/>";
        
        // si la source n'est pas visible... la destination ne le sera sur pas...
        if (!par) return false;
    }
    
    /*if (debug)
    {
        deb.innerHTML=deb.innerHTML+"<h2>"+visible+"</h1>";
    }*/
    
    return visible;
}

function UpdateControlVisibility()
{
    //var deb=document.getElementById('debug');    
    //deb.innerHTML="";

    for (var k in chlTrgCollection)
    {
        var trg=document.getElementById(k);
        if (trg!=null)
        {       
            var visible=GetControlVisibility(k,true);
            trg.style.visibility=visible?'':'hidden';
            trg.style.display=visible?'':'none';                    
        }
    }
}

function RegisterCtrlInCollection(collection,ctrlName,toAdd)
{
    if (collection[ctrlName]==null)
    {
        collection[ctrlName]=new Array();
    }
    collection[ctrlName][collection[ctrlName].length]=toAdd;
}

function RegisterChildControl(sourceControlID,triggerValue,targetControlID,strOperator,recControlID)
{
	var toAdd=new ChildControl();
	toAdd.sourceControlID=sourceControlID;
	toAdd.triggerValue=triggerValue;
	toAdd.targetControlID=targetControlID;
	toAdd.operator=strOperator;
	toAdd.recControlID=recControlID;   

    RegisterCtrlInCollection(chlSrcCollection,toAdd.sourceControlID,toAdd);
    RegisterCtrlInCollection(chlTrgCollection,toAdd.targetControlID,toAdd);
    if (recControlID!=null) RegisterCtrlInCollection(chlTrgCollection,recControlID,toAdd);
       
	UpdateControlVisibility();
}

function left(str, n){
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(0,n);
}
function right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}


function GetControlValue(obj)
{    
	var options=obj.getElementsByTagName('input');
    
    if (obj.checked!=undefined && left(obj.name,5)=='_chk_')
    {        
        return obj.checked?'true':'false';
    }
            
    if (obj.value!=undefined) return obj.value;
        
    if (obj.tagName=='TABLE')
    {
        
        for(i=0;i<options.length;i++)
        {
            var opt = options[i];
            if(opt.checked) return opt.value;                    
        }
    } 
    else 
    {
        return obj.value;
    }
    	    
	return obj.checked?'true':'false';	
}



function GetChildControlVisibility(objChildControl)
{    
    var toRet=false;
    
	var sourceControl=document.getElementById(objChildControl.sourceControlID);		
	var targetControl=document.getElementById(objChildControl.targetControlID);
	
	var recControl=null;
	if (objChildControl.recControlID!=undefined) 
	{
	    recControl=document.getElementById(objChildControl.recControlID);
	}
   
	if (targetControl!=null && sourceControl!=null)
	{	
	    var val=GetControlValue(sourceControl);	    	    
	    	  	    	                    
        if (sourceControl.style.visibility=='hidden' || val==undefined)
        {
        	toRet=false;		    
        } 
        else 
        {        
		    toRet= (val.substring(0,objChildControl.triggerValue.length)==objChildControl.triggerValue) == (objChildControl.operator=='=')  ;
		    //targetControl.style.display=( (val.substring(0,objChildControl.triggerValue.length)==objChildControl.triggerValue) == (objChildControl.operator=='=')  )?'':'none';
		}
	}
	
	return toRet;
}


function ProcessChangeEvent(objSource)
{	
    UpdateControlVisibility();
}


/** Gestion des sessions et redirection  **/
var sessionStrt=new Date();
var sessionRedirect=false;
var sessionRedirectUrl='';
var sessionDelay=0;

function ChronoSession()
{            
    var span=sessionDelay-(new Date().getTime()-sessionStrt.getTime());
    if (span<0) 
    {            
        span=0;
        if (!sessionRedirect) 
        {
            sessionRedirect=true;
            window.location=sessionRedirectUrl;
        }
        
        
        
    }
    var m=parseInt(span/60000);
    var s=parseInt((span/1000)%60);
    
    $(dvChrono).innerHTML=+m+":"+(s<10?"0"+s:s);
}

function InitChronoSession(delay, url)
{
    sessionDelay=delay;
    sessionRedirectUrl=url;
    new PeriodicalExecuter(ChronoSession, 1);
}
