/*************************************
* $Id: sitools.js,v 1.89 2006/06/12 10:52:02 lcarbonn Exp $
**************************************/

/***********************/
/*  SiTools functions  */
/***********************/
var fenetre_thumbnail=null;
var jeton = 0;
function openThumbnailPopup(url) {
	if(jeton==0){
	jeton = 1;
	fenetre_thumbnail = window.open(url,'thumbnail','width=1000,height=360');
	fenetre_thumbnail.focus();
	}
}

function closeThumbnailPopup() {
	fenetre_thumbnail.close();
	jeton=0;
}

// Search HTML element by name in form
function searchElt(win,name) {
	if (win!=null && typeof(win)!="undefined")
		var elts=win.document.getElementsByName(name);
	else
		var elts=document.getElementsByName(name);
	if (elts!=null && typeof(elts)!="undefined" && 
	    elts[0]!=null && typeof(elts[0])!="undefined")
		return elts[0];
	else {
		// IE bug, no retreive HTML element when they have bean created by js
		var form=document.forms["invokeSvaForm"];
		if (win!=null && typeof(win)!="undefined")
			form=win.document.forms["invokeSvaForm"];
		if (form.document) { // IE only
			// Search into form children
			for (var i=form.children.length-1;i>=0;i--) {
				if (form.children[i].name==name)
					return form.children[i];
			}
		}
		return null;
	}
}

function selectAllInLists(form) {
  // Select all values of selects for multiple values criteria only
  // Only selected items in selects are send to the server
  var selElts=document.getElementsByTagName("SELECT");
  for (var i=0;i<selElts.length;i++) {
    var selElt=selElts[i];
    if (selElt.size>1 && selElt.name.indexOf("].")!=-1) {
      var classe=searchElt(null,selElt.name.substring(0,selElt.name.indexOf("].")+2)+"classe");
      if (classe!=null) {
        if (classe.value.indexOf("multiple_")!=-1) {
          for (var j=0;j<selElt.options.length;j++) {
            if (selElt.options[j].value!="")
              selElt.options[j].selected=true;
          }
        }
      }
    }
  }
}
function gotoPage(num,champNumPage,form) {
  champNumPage.value=num;
  form.submit();
}
function gotoRelativePage(num,champNumPage,form) {
  var numPage=new Number(champNumPage.value);
  numPage=numPage+num;
  champNumPage.value=numPage;
  form.submit();
}
function submitFormulaireSva(form,sva,ext,target,paramPopup) {
  if (typeof(ext)!="undefined" && ext!="")
  	form.action=form.action+"?"+ext;
  if (typeof(target)!="undefined") {
    form.formValid.value=false;
    form.target=target;
    var w=window.open("about:blank",target,paramPopup);
    w.focus();
  }
  form.svaParent.value=form.sva.value;
  form.sva.value=sva;
  form.submit();
  if (typeof(target)!="undefined") {
    form.target="";
    form.sva.value=form.svaParent.value;
  }
}
function searchDataset(form) {
  selectAllInLists(form);
  form.formValid.value=true;
  if (validForm(form))
    form.submit();
  else
    return false;
}
function searchData(form,sva,formValid) {
  if (typeof(sva)!="undefined")
	  form.sva.value=sva;
  form.formValid.value=true;
  if (typeof(formValid)!="undefined")
    form.formValid.value=formValid;
  selectAllInLists(form);
  if (validForm(form))
    form.submit();
  else
    return false;
}
function updateData(form) {
  selectAllInLists(form);
  form.sva.value="detailData";
  form.formValid.value=true;
  if (validForm(form))
    form.submit();
  else
    return false;
}
function returnToCriteria(form,sva) {
  if (typeof(sva)=="undefined")
    form.sva.value=form.svaSearch.value;
  else
    form.sva.value=sva;
  if (form.dataSetFullName)
    form.dataSetFullName.value="";
  if (form.svaSearch.value=="thumbnailSearch")
    form.pageNumberTh.value="1";
  form.formValid.value="false";
  form.submit();
}
function returnToResultSearch(form) {
  form.sva.value="browseCatalog";
  form.pageNumberData.value=0;
  form.forUpdate.value="false";
  form.submit();
}
function resultDataSet(form,dataSetFullName,sva) {
  form.sva.value="browseCatalog";
  if (typeof(sva)!="undefined") {
    form.formValid.value=true;
    form.sva.value=sva;
  }
  form.pageNumber.value=1;
  form.dataSetFullName.value=dataSetFullName;
  form.sortedAttribute.value="";
  form.sortedOrder.value=0;
  form.submit();
}
function sortColumn(form,att,order) {
  var isTh=(form.svaSearch.value=="browseThumbnails" || form.svaSearch.value=="thumbnailSearch");
  if (isTh) {
    form.formValid.value=true;
    form.sva.value=form.svaSearch.value;
  }
  if (form.typeNavigation.value=="donnees")
    form.sva.value="browseCatalog";
  form.pageNumber.value=1;
  form.sortedAttribute.value=att;
  form.sortedOrder.value=order;
  form.submit();
}
function pageNumber(form,page){
  form.formValid.value=false;
  if (form.typeNavigation.value=="donnees")
    form.sva.value="browseCatalog";
  if (form.typeNavigation.value=="detailData") {
    form.sva.value="detailData";
    form.pageNumberData.value=page;
  }
  else if (form.typeNavigation.value=="thumbnails")
    form.pageNumberTh.value=page;
  else
    form.pageNumber.value=page;
  if (typeof(form.dataIdent)!="undefined") 
    form.dataIdent.value="";
  form.target="_self";
  form.submit();
} 
function detailData(numPage,form,dataSetFullName,dataIdent,isEdit) {
  form.dataSetFullName.value=dataSetFullName;
  form.dataIdent.value=dataIdent;
  form.pageNumberData.value=numPage;
  form.forUpdate.value=isEdit;
  form.formValid.value=false;
  submitFormulaireSva(form,"detailData");
}
function saveSnapshotQuery(form,message,errorMsg) {
	var snapShotQuery=prompt(message,'');
	if (snapShotQuery==null || snapShotQuery=="") {
	  if (snapShotQuery=="")
	    alert(errorMsg);
	}
  else {
  	form.snapShotQuery.value=snapShotQuery;
  	submitFormulaireSva(form,"snapshotQuery","action=save");
  }
}
function addAllDatasInMySelection(form,maxData,msg,allDatasets) {
  if (allDatasets)
    var ok=(form.nbTotalDatas.value<=maxData);
  else {
    for (var i=0;i<form.nbDataSets.value;i++) {
      if (form.elements["dataSets["+i+"].source"].value+"$"+form.elements["dataSets["+i+"].name"].value==form.dataSetFullName.value) {
        var ok=(form.elements["dataSets["+i+"].nbTotal"].value<=maxData);
        break;
      }
    }
  }
  if (!ok)
    ok=confirm(msg);
  if (ok) {
    if (allDatasets)
      submitFormulaireSva(form,"addToSelection","action=allDatas");
    else
      submitFormulaireSva(form,"addToSelection","action=datasetDatas");
  }
}
function updateCheckBox(curCB,form,tab) {
	var check=curCB.checked;
	for (var i=0;i<tab.length;i++) {
	  form.elements[tab[i]].checked=check;
	}
	return;
}
function updateCheckBoxDataSet(cbData,cbDataSet) {
	if (cbData.checked==false)
		cbDataSet.checked=false;
}
function toggleBox(szDivID,iState) { // 1 visible, 0 hidden
  // NN4+
  if (document.layers)	{   
    document.layers[szDivID].visibility=iState?"show":"hide";
    document.layers[szDivID].display=iState?"block":"none";
  }
  // Gecko(NN6) + IE 5+
  else if(document.getElementById) {  
    var obj=document.getElementById(szDivID);
    obj.style.visibility=iState?"visible":"hidden";
    obj.style.display=iState?"block":"none";
  }
  // IE 4
  else if(document.all)	{
    document.all[szDivID].style.visibility=iState?"visible":"hidden";
    document.all[szDivID].style.display=iState?"block":"none";
  }
}
function showHideDiv(szDivID) {
	var visibility;
  // NN4+
  if(document.layers)	   
    visibility=document.layers[szDivID].visibility;
  //gecko(NN6) + IE 5+
  else if(document.getElementById) {
    var obj=document.getElementById(szDivID);
    visibility=obj.style.visibility;
  }
  // IE 4
  else if(document.all)	
    visibility=document.all[szDivID].style.visibility;

  if (visibility=="show" || visibility=="visible")
  	toggleBox(szDivID,0);
  else
  	toggleBox(szDivID,1);
  return false;
}

/*************************/
/* MY HOME SPACE methods */
/*************************/
function removeAllCtxEU(form) {
	form.sva.value='deleteHomeSpaceContext';
	form.homeSpaceContext.value="";
	form.submit();
}
function removeCtxEU(form) {
	form.sva.value='deleteHomeSpaceContext';
	form.submit();
}
function removeDatasCtxEU(form) {
	form.sva.value='deleteHomeSpaceDatas';
	form.submit();
}
function getHomeSpaceContext(form,ctxName) {
	form.sva.value='browseHomeSpace';
  form.homeSpaceContext.value=ctxName;
  form.dataSetFullName.value="";
  form.submit();
}
function openTextFile(url) {
  var win=window.open(url,"TextFile","scrollbars=yes,toolbar=no,width=800,height=600,location=no,status=no");
  win.focus();
}
function downloadFile(url) {
  var win=window.open(url,"DownloadFile","scrollbars=no,toolbar=no,width=0,height=0,location=no,status=no");
  win.focus();
}

/******************/
/* GRAPHS methods */
/******************/
function graphDatasetInfo(dataset,form) {
	form.dataset.value=dataset;
	form.submit();
}

function graphNodeInfo(graphPath,form) {
	form.graphPath.value=graphPath;
	form.submit();
}

function graphDeployAll(graphName) {
	return false;
}

function graphCollapseAll(graphName) {
	return false;
}

/**************************/
/* COLUMNS CHOICE methods */
/**************************/
function updateChoixColonnes(form) {
  form.formValid.value=true;
  form.submit();
}
/****************************/
/* Field Validation methods */
/****************************/
var VALUE_VALID=0;
var VALUE_INVALID=1;
var VALUE_MANDATORY=2;
var VALUE_LOWER=3;
var VALUE_GREATER=4;
var VALUE_DELETED=5;
// Array of Widget objects to manage field validation
var ValidWidgets=new Array();
var idxValidWidgets=0;
function AddValidWidget(widget) {
  ValidWidgets[idxValidWidgets]=widget;
  idxValidWidgets++;
}
// Valid all fields of the form
function validForm(form) {
  var ret=true;
  if (typeof(ValidWidgets)!="undefined" && idxValidWidgets>0) {
    for (var i=0;i<ValidWidgets.length && ret;i++) {
      ret=ValidWidgets[i].Valid();
      if (ret!=VALUE_VALID) break;
    }
  }
  return ret;
}
function checkSubCriterion(scId) {
  var sc=document.getElementById(scId);
  if (sc.value=="") {
    deleteSubCriterion(sc.name);
    return VALUE_DELETED;
  }
  return VALUE_VALID;
}
// Delete all hidden fields of a sub-criterion
function deleteSubCriterion(scName) {
	var hdnBase=scName.substring(0,scName.indexOf(".values"));
	var hdn=document.getElementsByName(scName);
	if (hdn!=null && typeof(hdn)!="undefined") {
	  for (var i=0;i<hdn.length;i++)
		  hdn[i].parentNode.removeChild(hdn[i]);
	}
	hdn=document.getElementsByName(hdnBase+".name");
	if (hdn!=null && typeof(hdn)!="undefined")
	  hdn[0].parentNode.removeChild(hdn[0]);
	hdn=document.getElementsByName(hdnBase+".type");
	if (hdn!=null && typeof(hdn)!="undefined")
	  hdn[0].parentNode.removeChild(hdn[0]);
	hdn=document.getElementsByName(hdnBase+".classe");
	if (hdn!=null && typeof(hdn)!="undefined")
	  hdn[0].parentNode.removeChild(hdn[0]);
	hdn=document.getElementsByName(hdnBase+".valuesOperator");
	if (hdn!=null && typeof(hdn)!="undefined")
	  hdn[0].parentNode.removeChild(hdn[0]);
}
// Create all hidden fields of a sub-criterion
function createSubCriterion(form,scBaseName,nom,type,classe,operator) {
  createHidden(form,scBaseName+".name",nom);
  createHidden(form,scBaseName+".type",type);
  createHidden(form,scBaseName+".classe",classe);
  createHidden(form,scBaseName+".valuesOperator",operator);
}

/*****************************************************************/
/* Widget object, used to define field validation options        */
/*****************************************************************/
/*    Parameters:                                                */
/*      field        : Field object (mandatory)                  */
/*      validMethod  : Javascript Valid Method (mandatory)       */
/*      checkSubCrit : Check empty sub-criterion (true or false) */
/*      format       : Format used to validate value             */
/*      mandatory    : Value is mandatory                        */
/*      min          : Value min                                 */
/*      max          : Value max                                 */
/*      noValidMsg   : Message "Invalid value"                   */
/*      mandatoryMsg : Message "Value is mandatory"              */
/*      minMsg       : Message "Value is greater than min"       */
/*      maxMsg       : Message "Value is lower than max"         */
/*****************************************************************/
function Widget(params) {
  this.field=params.field;
  this.validMethod=params.validMethod;
  this.checkSubCrit=false;
  if (typeof(params.checkSubCrit)!="undefined")
    this.checkSubCrit=params.checkSubCrit;
  if (typeof(params.format)!="undefined")
    this.format=params.format;
  this.mandatory=false;
  if (typeof(params.mandatory)!="undefined")
    this.mandatory=params.mandatory;
  this.min="";
  if (typeof(params.min)!="undefined")
    this.min=params.min;
  this.max="";
  if (typeof(params.max)!="undefined")
    this.max=params.max;
  this.noValidMsg="The value is not valid";
  if (typeof(params.noValidMsg)!="undefined" && params.noValidMsg!="")
    this.noValidMsg=params.noValidMsg;
  this.mandatoryMsg="The value is mandatory";
  if (typeof(params.mandatoryMsg)!="undefined")
    this.mandatoryMsg=params.mandatoryMsg;
  this.minMsg="The value must be greater or equal than";
  if (typeof(params.minMsg)!="undefined")
    this.minMsg=params.minMsg;
  this.maxMsg="The value must be lower or equal than";
  if (typeof(params.maxMsg)!="undefined")
    this.maxMsg=params.maxMsg;
  return this;
}
// Call validation method of the widget with field options
// Show an error message, if the value is not valid
Widget.prototype.Valid = function () {
  var ret=VALUE_VALID;
  if (this.checkSubCrit)
    ret=checkSubCriterion(this.field.id);
  if (ret==VALUE_VALID) {
    if (this.mandatory && this.field.value=="") {
      ret=VALUE_MANDATORY;
      alert(this.mandatoryMsg);
    }
    else if (this.field.value!="") {
      // Call Validation method of the widget
      if(this.format!="" || this.min!="" || this.max!="")
        ret=this.validMethod(this.field,this.format,this.min,this.max);
      else
        ret=this.validMethod(this.field);
      // Value not valid
      if (ret==VALUE_INVALID) {
        alert(this.noValidMsg);
      }
      // Value lower than min
      else if (ret==VALUE_LOWER) {
        alert(this.minMsg+" "+this.min);
      }
      // Value greater than max
      else if (ret==VALUE_GREATER) {
        alert(this.maxMsg+" "+this.max);
      }
    }
    if (ret==VALUE_VALID)
      return true;
    else {
      this.field.focus();
      this.field.select();
      return false;
    }
  }
  else 
    return true;
};
/************************************************/
/* Validate a date                              */
/* Used by template classes for date attributes */
/************************************************/
/*    Parameters:                               */
/*      field  : Field object                   */
/*      format : format of the number           */
/*      min    : Number min                     */
/*      max    : Number max                     */
/************************************************/
/*    Return:                                   */
/*      VALUE_VALID   : Date valid              */
/*      VALUE_INVALID : Invalid date            */
/*      VALUE_LOWER   : Date lower than min     */
/*      VALUE_GREATER : Date greater than max   */
/************************************************/
function validDate(field,format,min,max) {
  var ret=-1;
  if (isDateValid(field.value,format)!=0) {
    if (typeof(min)!="undefined" && min!="" && isDate(min,format)!=0) {
      ret=compareDates(field.value,format,min,format)
      if (ret==1 || ret==0) {
        if (typeof(max)!="undefined" && max!="" && isDate(max,format)!=0) {
          ret=compareDates(field.value,format,max,format)
          if (ret==2 || ret==0)
            return VALUE_VALID;
          else
            return VALUE_GREATER;
        }
        return VALUE_VALID;
      }
      else
        return VALUE_LOWER;
    }
    return VALUE_VALID;
  }
  return VALUE_INVALID;
}
/**************************************************/
/* Validate a number                              */
/* Used by template classes for number attributes */
/**************************************************/
/*    Parameters:                                 */
/*      field  : Field object                     */
/*      format : Not used                         */
/*      min    : Number min                       */
/*      max    : Number max                       */
/**************************************************/
/*    Return:                                     */
/*      VALUE_VALID   : Number valid              */
/*      VALUE_INVALID : Invalid number            */
/*      VALUE_LOWER   : Number lower than min     */
/*      VALUE_GREATER : Number greater than max   */
/**************************************************/
function validNumber(field,format,min,max) {
  // Remove non-numeric characters
  field.value=field.value.replace(/[^0-9,\.,\-]/g,'');
  if (!isNaN(field.value)) {
    // format is integer and value is float, error
    if (format!=null && format.indexOf('.')==-1 && field.value.indexOf('.')!=-1)
      return VALUE_INVALID;
    var numTemp=new Number(field.value);
    if (typeof(min)!="undefined" && min!="" && !isNaN(min)!=0) {
      if (numTemp>=new Number(min)) {
        if (typeof(max)!="undefined" && max!="" && !isNaN(max)!=0) {
          if (numTemp<=new Number(max))
            return VALUE_VALID;
          else
            return VALUE_GREATER;
        }
        return VALUE_VALID;
      }
      else
        return VALUE_LOWER;
    }
    return VALUE_VALID;
  }
  return VALUE_INVALID;
}
/*************************/
/* Date and Time methods */
/*************************/
// Call on onchange evenement on datetime attribute
// Update hidden field (used by validate method)
function dateTimeChange(fieldName,fieldHdn) {
  var fields=document.getElementsByName(fieldName);
  fieldHdn.value="";
  if (fields[0].value!=""){
    for (var i=0;i<fields.length;i++){
    	if (fields[i].value!="pm" && fields[i].value!="am") {
	      fieldHdn.value+=fields[i].value;
	      if (i==0) fieldHdn.value+=" ";
	      if (i>0 && i<3) fieldHdn.value+=":";
    	}
    	else {
    		fieldHdn.value+=" "+fields[i].value;
    	}
    }
  }
  return true;
}    
function isDateValid(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
}
function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0)
		return -1;
	else if (d1>d2)
		return 1;
	else if (d1<d2)
	  return 2;
	return 0;
}
function _isInteger(val) {
	var digits="1234567890";
	for (var i=0;i<val.length;i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
	}
	return true;
}
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
	}
	return null;
}
function getDateFromFormat(val,format) {
	val=val+"";
	format=format+"";
  var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
  var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
		}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
  }
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
}

/*********************/
/* HISTOGRAM methods */
/*********************/
function openHistogram(baseURL,title,datasetName,dataIdent,attributeName)
{
  var win;
  win=window.open(baseURL+"/jsp/tiles/bof/histogram_popup.jsp?title="+title+"&dataset_name="+datasetName+"&data_ident="+dataIdent+"&attribute_name="+attributeName,
                  "Histo","height=600,width=800,menu=no,scrollbar=no,status=no");
  win.focus();
  return false;
}

/***************************/
/* LISTE_CHOIX_DYN methods */
/***************************/
function addToListDyn(select,input) {
  var value=input.value;
  if (value!=null && value!="") {
    select.options.add(new Option(value,value));
    select.options[select.options.length-1].selected=true;
  }
  sortSelect(select);
  input.value="";
}

/********************/
/* IDS_ASSO methods */
/********************/
function idsAssoModification(openerForm,hiddenName,spanName) {
	var url=openerForm.action+"?sva=updateIdsAsso&hidden="+hiddenName+"&span="+spanName;
	var win=window.open(url,"updateIdsAsso","top=200,left=250,height=400,width=500,menu=no,scrollbar=no,status=no");
	win.focus();	
}
function createIdsAssociation(currentDataset,form) {
	var value='';
  var i=0;
  var stop=false;
  var first=true;
  for (i=0;!stop;i++) {
		var inputKey=searchElt(null,"criteria("+currentDataset+").cle["+i+"].name");
    if (inputKey==null || typeof(inputKey)=="undefined")
      stop=true;
    else {
      var inputValue=searchElt(null,"criteria("+currentDataset+").cle["+i+"].value");
      if (inputValue!=null) {
        if (first) {
          var dsFullName=form.elements['datasets'].value;
          var dsName=dsFullName.substring(dsFullName.indexOf("$",0)+1,dsFullName.length);
          value=dsName+"#"+inputKey.value+"="+inputValue.value;
          first=false;
        }
        else
	        value+="&"+inputKey.value+"="+inputValue.value;
	      inputValue.value='';
	    }
    }
  }
  return value;
}
function saveIdsAssociation(select,destHidden,destSpan) {
  var hdnValue='';
  var spanValue='';
  for (var i=0;i<select.options.length;i++) {
    if (i>0) {
      hdnValue+=";";
      spanValue+="<br />";
    }
    hdnValue+=select.options[i].value;
    spanValue+=select.options[i].value;
  }
	createOrUpdateHidden(document.invokeSvaForm,destHidden,hdnValue);
	var myDiv=document.getElementById(destSpan);
  myDiv.innerHTML=spanValue;
  myDiv.style.width="100%";
  myDiv.style.height="100%";
}
function selectDivForDataset(dataset, newDataset) {
  if (dataset!='')
	  toggleBox('dataset_'+dataset,0);
	toggleBox('dataset_'+newDataset,1);
	currentDataset=newDataset;
}
function onLoadIdsAsso(hdnName) {
	var origOL=document.onload;
	if (origOL)
		eval(origOL);
	selectDivForDataset('',document.invokeSvaForm.datasets.options[0].value);
	var hdn=searchElt(opener,hdnName);
	if (hdn!=null && typeof(hdn)!="undefined") {
		if (hdn.value!='') {
			var values=hdn.value.split(";");
			var select=searchElt(null,'selectedIds');
			for (var i=0;i<values.length;i++) {
				select.options[i]=new Option(values[i],values[i]);
			}
		}
	}
}
function addIdsAssociation(form,datasets,selectedIds) {
  var select=searchElt(null,datasets);
	var toselect=searchElt(null,selectedIds);
	var ids=createIdsAssociation(select.options[select.options.selectedIndex].value,form);
	if (ids!='')
		toselect.options[toselect.options.length]=new Option(ids,ids);
}

/***************************/
/* MULTIPLE_VALUES methods */
/***************************/
function sortSelect(select) {
  var tOptsSel=new Array();j=0;
  var tOpts=new Array();
  for (var i=0;i<select.options.length;i++) {
    tOpts[i]=new Array(select.options[i].text,select.options[i].value);
    if (select.options[i].selected)
      tOptsSel[j]=tOpts[i][0];j++;
  }
  tOpts.sort(sortList);
  for(var i=select.options.length-1;i>=0;i--){
  	select.options[i]=null;
  }
  for (var i=0;i<tOpts.length;i++) {
    select.options.add(new Option(tOpts[i][0],tOpts[i][1]));
    for (var j=0;j<tOptsSel.length;j++) {
      if (tOptsSel[j]==tOpts[i][0]) {
        select.options[select.options.length-1].selected=true;
        break;
      }
    }
  }  
}
function sortList(a,b) {
  if (a[0]<b[0]) return -1;
  if (a[0]>b[0]) return 1;
  return 0;
}
function addToList(form,select,msg)
{
  if (typeof(msg)!="undefined")
    var value=prompt(msg,"");
  else
    var value=prompt("Enter a value: ","");
  if (value!=null && value!="") {
    removeBlank(select);
    select.options.add(new Option(value,value));
  }
}
function addInterToList(form,select,msg,errMsg)
{
  if (typeof(msg)!="undefined")
    var value=prompt(msg,"");
  else
    var value=prompt("Enter an interval with '|' separator: ","");
  if (value!=null) { 
    if (value.indexOf("|")!=-1) {
      if (value!=""){
        removeBlank(select);
        select.options.add(new Option(value,value));
      }
    }
    else {
      if (typeof(errMsg)!="undefined")
        alert(errMsg);
      else
        alert("value does not contains separator, please click on '+' button to retry");
    }
  }
}
function removeInList(select,allValues)
{
  for (var i=select.options.length-1;i>=0;i--) {
    if (select.options[i].selected || allValues)
      select.options[i]=null;
  }
}
function removeBlank(select) {
  for (var i=0;i<select.options.length;i++) {
    if (select.options[i].value=="") {
      select.options[i]=null;
    }
  }
}

/*************************/
/* HIDDEN FIELDS methods */
/*************************/
function createHidden(form,name,value) {
	var tagTemp=document.createElement("input");
	tagTemp.type="hidden";
	tagTemp.setAttribute("id",name.replace("[","_").replace("]","_").replace(".","_"));
	tagTemp.setAttribute("name",name);
	tagTemp.value=value;
	form.appendChild(tagTemp);	
}
function createOrUpdateHidden(form,name,value) {
  var hdn=searchElt(null,name);
	if (hdn!=null && typeof(hdn)!="undefined") {
		hdn.value=value;
	}
	else
		createHidden(form,name,value);
}
function deleteHidden(form,hdnName) {
  var hdn=searchElt(null,hdnName);
	if (hdn!=null && typeof(hdn)!="undefined")
		form.removeChild(hdn);
  else {
  	hdn=document.getElementById(hdnName);
  	if (hdn!=null && typeof(hdn)!="undefined")
  		hdn.parentNode.removeChild(hdn);
	}
}

/***********************/
/* SVA Helpers methods */
/***********************/
function openHelperSva(url,helperSva,attr,textarea,prefix,paramPopup) {
	var url=url+"?sva=helperSva&helperSva="+helperSva+"&textarea="+textarea+"&attr="+attr+"&prefix="+prefix;
	if (typeof(paramPopup)=="undefined" || paramPopup=="")
	  paramPopup="top=200,left=250,height=300,width=500,menu=no,scrollbar=no,status=no";
	var popup=window.open(url,"helperSva",paramPopup);
	popup.focus();
}
function onLoadHelperSva(openerWin,prefix,sva,fromSelect,toSelect) {
	var origOL=document.onload;
	if (origOL)
		eval(origOL);
	// Move all selected elements
	var i=0;
	var stop=false;
	while (!stop) {
    var hdn=searchElt(openerWin,prefix+"svaElements["+i+"].value");
		if (hdn!=null && typeof(hdn)!="undefined") {
			// Select this element in fromSelects
			for (var j=0;j<fromSelect.options.length;j++) {
				if (fromSelect.options[j].value==hdn.value) {
					fromSelect.options[j].selected=true;
					break;
				}
			}
		}
		else
			stop=true;
		i++;
	}
	moveElements(fromSelect,toSelect);
}
function clearHelperSvaValues(form,sva,prefix,textarea) {
  form[textarea].value="";
	var stop=false;
	var i=0;
	while (!stop) {
    var hdn=searchElt(null,prefix+"svaElements["+i+"].value");
		if (hdn!=null && typeof(hdn)!="undefined")
			hdn.parentNode.removeChild(hdn);
		else
			stop=true;
		i++;
	}
}
function updateHelperSvaValues(form,sel,notsel,attr,textarea,sva,prefix) {
  clearHelperSvaValues(form,sva,prefix,textarea);
	for (var i=0;i<sel.options.length;i++) {
		createHidden(form,prefix+"svaElements["+i+"].value",sel.options[i].value);
    var txtArea=searchElt(null,textarea)
		if (txtArea!=null) {
			if (txtArea.value!="")
		  	txtArea.value+="\n";
			txtArea.value+=sel.options[i].text;
		}
	}
}
function moveElements(fromSelect,toSelect) {
	var toNb=toSelect.options.length;
	var fromNb=fromSelect.options.length;
	for (var i=0;i<fromNb;) {
	  var curOption=fromSelect.options[i];
	  if (curOption.selected) {
	    toSelect.options.length=toNb+1;
	    toSelect.options[toNb]=new Option(curOption.text,curOption.value);
	    toNb++;
	    for (var j=i;j<fromNb-1;j++) {
	     	var nextOption=fromSelect.options[j+1];
	     	fromSelect.options[j]=new Option(nextOption.text,nextOption.value,nextOption.defaultSelected,nextOption.selected);
	    }
	    fromNb--;
	  }
	  else
	    i++;
    fromSelect.options.length=fromNb;
	}
}

/*************************/
/* Manage Combined Lists */
/*************************/

// Method call in sitools.jsp when page is load (onload of BODY)
function sort(a,b) {
  if (a<b) return -1;
  if (a>b) return 1;
  return 0;
}
var selValues;
var refSelects;
function initCombinedLists(f) {
  if (typeof(t_combinedLists)=="undefined") {
    return;
  }
  var t_num=new Array();j=0;
  for (var i=0;i<t_combinedLists.length;i++) {
    var pos=t_combinedLists[i].lastIndexOf("_");
    var num=t_combinedLists[i].substring(pos+1);
    name=t_combinedLists[i].substring(2,pos);j++;
    t_num[j]=new Number(num);j++;
  }
  t_num.sort(sort);
  var tLists=new Array();j=0;
  for (var i=0;i<t_num.length;i++) {
    if (typeof(t_num[i])!="undefined") {
      var s=f.elements[name+"["+t_num[i]+"].values"];
      if (s!=null && s.options) {
      	sortSelect(s);
        if (hasSelValues(s))
          tLists[j]=s;j++;
      }
      else {
      	selValues=new Array();
      	refSelects=new Array();
        refreshAssListsValue(f,s,s.value)
      }
    }
  }
  if (tLists.length>0)
    refreshListe(f,tLists[0]);
}
// Refresh list and its dependances
function refreshListe(f,s,isDep)
{
  if(typeof(s)=="undefined")
  	return;
  var tList=getTList(s);
  if(tList==null)
  	return;
  if(isDep!=true){
  	selValues=new Array();
  	refSelects=new Array();
  }
  var selV=new Array();j=0;
  // Search selected values
  for(var i=0;i<s.options.length;i++){
  	if (s.options[i].selected)
  	  selV[j]=s.options[i].value;j++;
  }
  // If list has selected values, refresh associated lists for each selected values
  if(selV.length>0 && selV[0]!=""){
//    alert("Refresh selected values of "+s.name+" - nb: "+selV.length);
  	for(var i=0;i<selV.length;i++){
      if (typeof(selV[i])!="undefined")
  	    refreshAssListsValue(f,s,selV[i]);
  	}
	  // Refresh all associated lists
    fillAllAssoLists(f,tList,s)
  	
  // Else, refresh associated lists with all values
  }else{
//    alert("Refresh all values of "+s.name+" - nb: "+s.options.length);
    // Reset all selected values associated lists
    resetSelValues(f,tList);
	  // Refresh associated lists with all select values
    for(var i=0;i<s.options.length;i++){
	    refreshAssListsValue(f,s,s.options[i].value);
    }
	  // Refresh all associated lists
    fillAllAssoLists(f,tList,s)
	  // Refresh all dependante lists
//    fillAllDepLists(f,tList,s)  
  }
}
// Clear list and add blank line
function clearList(s)
{
  if (typeof(selValues[s.name])!="undefined" && selValues[s.name].length>0)
    j=selValues[s.name].length;
  else
    selValues[s.name]=new Array();j=0;
  for(var i=s.options.length-1;i>=0;i--){
  	if(s.options[i].selected)
  	  selValues[s.name][j]=s.options[i].value;j++;
  	s.options[i]=null;
  }
	s.options.add(new Option("",""));
	s.options[0].selected=true;
}
// Has selected values
function hasSelValues(s)
{
  for(var i=0;i<s.options.length;i++){
    if(s.options[i].selected && s.options[i].value!="")
      return true;
  }
  return false;
}
// Is value exist
function isValueExist(s,v)
{
  for(var i=0;i<s.options.length;i++){
    if(s.options[i].value==v)
      return true;
  }
  return false;
}
// Is value selected into global selected values
function isSelValue(s,v)
{
  if(typeof(selValues[s.name])!="undefined"){
    for(var i=0;i<selValues[s.name].length;i++){
      if(selValues[s.name][i]==v){
        s.options[0].selected=false;
        return true;
      }
    }
  }
  return false;
}
// Is value selected into list
function isSelValueInSel(s,v)
{
  for(var i=0;i<s.options.length;i++){
    if(s.options[i].value==v && s.options[i].selected)
      return true;
  }
  return false;
}
// Fill all valid values in associated lists
function fillAllAssoLists(f,tList,s)
{
  if (tList[0][0]!=null){
	  for(var i=0;i<tList[0][0].length;i++){
			var sAss=f.elements[tList[0][0][i].replace("_","[")+"].values"];
  	  if (sAss!=null){
    		if(refSelects[s.name+"$"+sAss.name]!=""){
    		  refSelects[s.name+"$"+sAss.name]="";
  	  	  sortSelect(sAss);
//          alert("Refresh associated list: "+sAss.name+" of "+s.name);
    	    refreshListe(f,sAss,true);
    		}
      }
    }
  }
}
// Fill all valid values from dependants lists
function fillAllDepLists(f,tList,s)
{
  if (tList[0][1]!=null){
	  for(var i=0;i<tList[0][1].length;i++){
			var sDep=f.elements[tList[0][1][i].replace("_","[")+"].values"];
  	  if (sDep!=null){
    		if(refSelects[sDep.name+"$"+s.name]!="" && refSelects[s.name+"$"+sDep.name]!=""){
    		  refSelects[sDep.name+"$"+s.name]="";
    		  refSelects[s.name+"$"+sDep.name]="";
  	  	  sortSelect(sDep);
//          alert("Refresh dependant list: "+sDep.name+" of "+s.name);
    		  refreshListe(f,sDep,true);
    		}
      }
    }
  }
}
// Reset all selected values in associated lists
function resetSelValues(f,tList)
{
  if (tList[0][0]!=null){
	  for(var j=0;j<tList[0][0].length;j++){
			var sAss=f.elements[tList[0][0][j].replace("_","[")+"].values"];
  	  if (sAss!=null){
        sAss.selectedIndex=0;
        sAss.options[0].selected=true;
      }
    }
  }
}
// Get Javascript array of values of the select
function getTList(s)
{
  // ex: select name = criteres[i].valeur --> t_name = criteres_i
  var pos=s.name.indexOf("[");
  var name=s.name.substring(0,pos)+"_"+s.name.substring(pos+1,s.name.indexOf("]"));
  eval("var tList=null; if (typeof(t_"+name+")!=\"undefined\") tList=t_"+name+";");
  if(tList!=null)
	  return tList;
  return null;
}
// Refresh associated lists according to selected value or all values
function refreshAssListsValue(f,s,selValue)
{
  var tList=getTList(s);
  if(tList!=null){
    if (tList[0][0]!=null){
  	  for(var i=0;i<tList[0][0].length;i++){
  			var nAss=tList[0][0][i];
		  	eval("var tListAsso=t_"+nAss+";");
        var message="";
  			if(typeof(tListAsso)!="undefined"){
  			  var sAss=f.elements[nAss.replace("_","[")+"].values"];
      		if(refSelects[s.name+"$"+sAss.name]=="")
  	  	    sAss=null;
      	  if (sAss!=null){
            for(var j=1;j<tList.length;j++){
              // Search selected value in values list of the select
              if(selValue==null || tList[j][0]==selValue){
            		var tAsso=tList[j][2];
            		if(tAsso!=null){
            		  // Add each values in associated list
            		  for(var k=0;k<tAsso.length;k++){
            		  	if(tAsso[k][0]==i){
            		  	  if(selValue!=null)
          	            message+="select: "+s.name+" - select associé: "+sAss.name+" - selValue: "+selValue+"\n";
          	          else
          	            message+="select: "+s.name+" - select associé: "+sAss.name+" - option value: "+tList[j][0]+"\n";
              				indAsso=tAsso[k][1];
          	          message+="\tindex value asso: "+indAsso+"\n";
          	          // Clear associated list
                  		if(refSelects[sAss.name]!="") {
                  		  refSelects[sAss.name]="";
              	  	    clearList(sAss);
              	  	  }
          	          // If value not already exist in associated list, add it
              				if(indAsso>0 && !isValueExist(sAss,tListAsso[indAsso][0])){
          	            message += "\t\tvalue asso: "+tListAsso[indAsso][0];
              				  sAss.options.add(new Option(tListAsso[indAsso][1],tListAsso[indAsso][0]));
              				  // If value was selected, select it
              				  if(isSelValue(sAss,tListAsso[indAsso][0])){
              				 	  sAss.options[sAss.options.length-1].selected=true;
              				    message+=" is selected\n";
              				 	}
              				  else
              				    message+="\n";
            		    	}
            		    	// If associated list must be cleared and a value is selected, clear associated list
            		      else if(indAsso==-1){
            		        if(isSelValueInSel(s,selValue))
            		          clearList(sAss);
            		      }
          		      }
          	  	  }
          	    }
          	  }
            }
          }
        }
//        if(message != "")
//          alert(message);
      }
    }
  }
}
