/*
 *	ComboBox
 *	By Jared Nuzzolillo
 *
 *	Updated by Erik Arvidsson
 *	http://webfx.eae.net/contact.html#erik
 *	2002-06-13	Fixed Mozilla support and improved build performance
 *
 */

Global_run_event_hook = true;
Global_combo_array    = new Array();

Array.prototype.remove=function(dx)
{ 
    if(isNaN(dx)||dx>this.length){self.status='Array_remove:invalid request-'+dx;return false}
    for(var i=0,n=0;i<this.length;i++)
    {  
        if(this[i]!=this[dx])
        {
            this[n++]=this[i]
        }
    }
    this.length-=1
}

function ComboBox_make()
{
    var bt,nm;
    nm = this.name+"txt"; 
    
    this.txtview = document.createElement("INPUT")
    this.txtview.type = "text";
    this.txtview.name = nm;
    this.txtview.id = nm;
	//#MODIF YANN
	this.txtview.onclick = new Function ("", this.name + ".toggle();\n");	
	//#
    this.txtview.className = "combo-input";
	this.txtview.setAttribute('readonly','');
	this.view.appendChild(this.txtview);
        
    this.valcon = document.createElement("INPUT");
    this.valcon.type = "hidden";
    this.view.appendChild(this.valcon)
   
    var tmp = document.createElement("IMG");
    tmp.src = "___";
    tmp.style.width = "1px";
    tmp.style.height = "0";
    this.view.appendChild(tmp);
    
    var tmp = document.createElement("A");
    tmp.appendChild(document.createTextNode(" "));
    tmp.className = "combo-button";
    
	this.view.appendChild(tmp);
   	tmp.onfocus = function () { this.blur(); };
	tmp.onclick = new Function ("", this.name + ".toggle()");
}

function ComboBox_choose(realval,txtval)
{
    this.value         = realval;
    var samstring = this.name+".view.childNodes[0].value='"+txtval+"'"
    window.setTimeout(samstring,1)
    this.valcon.value  = realval;
}

function ComboBox_mouseDown(e)
{
    var obj,len,el,i;
    el = e.target ? e.target : e.srcElement;
    while (el.nodeType != 1) el = el.parentNode;
    var elcl = el.className;
    if(elcl.indexOf("combo-")!=0)
    {
				
        len=Global_combo_array.length
        for(i=0;i<len;i++)
        {
        
            curobj = Global_combo_array[i]
            
            if(curobj.opslist)
            {
                curobj.opslist.style.display='none'
            }
        }
    }
}

function ComboBox_handleKey(e)
{
    var key,obj,eobj,el,strname;
    eobj = e;
    key  = eobj.keyCode;
    el = e.target ? e.target : e.srcElement;
    while (el.nodeType != 1) el = el.parentNode;
    elcl = el.className
    if(elcl.indexOf("combo-")==0)
    {
        if(elcl.split("-")[1]=="input")
        {
            strname = el.id.split("txt")[0]
            obj = window[strname];
			
            obj.expops.length=0
            obj.update();
            obj.build(obj.expops);
            if(obj.expops.length==1&&obj.expops[0].text=="(No matches)"){}//empty
            else{obj.opslist.style.display='block';}
            obj.value = el.value;
            obj.valcon.value = el.value;
        }
     }
}

function ComboBox_update()
{
    var opart,astr,alen,opln,i,boo;
    boo=false;
    opln = this.options.length
    astr = this.txtview.value.toLowerCase();
    alen = astr.length
    if(alen==0)
    {
        for(i=0;i<opln;i++)
        {
            this.expops[this.expops.length]=this.options[i];boo=true;
        }
    }
    else
    {
        for(i=0;i<opln;i++)
        {
            opart=this.options[i].text.toLowerCase().substring(0,alen)
            if(astr==opart)
            {
                this.expops[this.expops.length]=this.options[i];boo=true;
            }
        }
    }
    if(!boo){this.expops[0]=new ComboBoxItem("(No matches)","")}
}


function ComboBox_remove(index)
{
    this.options.remove(index)
}

function ComboBox_add()
{
    var i,arglen;
    arglen=arguments.length
    for(i=0;i<arglen;i++)
    {
        this.options[this.options.length]=arguments[i]
    }
}

function ComboBox_build(arr)
{
    var str,arrlen
    arrlen=arr.length;
    str = '<table class="combo-list-width" cellpadding=0 cellspacing=0>';
    var strs = new Array(arrlen);
    for(var i=0;i<arrlen;i++)
    {
        
        strs[i] = '<tr>' +
			'<td class="combo-item" onClick="'+this.name+'.choose(\''+arr[i].value+'\',\''+arr[i].text+'\');'+this.name+'.opslist.style.display=\'none\'; var sel=document.forms[\'' + this.form_source + '\'].elements[\'' + this.form_select_name + '\']; if (sel) sel.selectedIndex='+i+'; '+this.event_onchange+';" ' +
			'onMouseOver="this.className=\'combo-hilite\';" onMouseOut="this.className=\'combo-item\'" >&nbsp;'+arr[i].text+'&nbsp;</td>' +
			'</tr>';
    }
    str = str + strs.join("") + '</table>'
    
    if(this.opslist){this.view.removeChild(this.opslist);}
    
    this.opslist = document.createElement("DIV")
    this.opslist.innerHTML=str;
    this.opslist.style.display='none';
    this.opslist.className = "combo-list";
    this.opslist.onselectstart=returnFalse;
    this.view.appendChild(this.opslist);    
}

function ComboBox_toggle()
{	
    if(this.opslist)
    {
        if(this.opslist.style.display=="block")
        {
            this.opslist.style.display="none"
        }
        else
        {
            this.update();
            this.build(this.options);
            this.view.style.zIndex = ++ComboBox.prototype.COMBOBOXZINDEX
            this.opslist.style.display="block"
        }
    }
    else
    {
        this.update();
        this.build(this.options);
        this.view.style.zIndex = ++ComboBox.prototype.COMBOBOXZINDEX
        this.opslist.style.display="block"
    }
}


/*#modif yann ducrocq pix-l.fr
permet de lier la nouvelle combo a la combo originale
*/
function ComboBox_setvalue(v) {	
	eval(this.name+".view.childNodes[0].value='"+v+"'");
}

function ComboBox_setFormSource(v) {
	this.form_source=v;
}

function ComboBox_setSelectName(v) {
	this.form_select_name=v;
}

function ComboBox_setOnChange(v) {
	if (this.form_source!='' && this.form_select_name!='')
	this.event_onchange=v;
}

function ComboBox()
{
    if(arguments.length==0)
    {
        self.status="ComboBox invalid - no name arg"
    }

    this.name     = arguments[0];
    this.par      = arguments[1]||document.body
    this.view     = document.createElement("DIV");
    this.view.style.position='absolute';
	this.view.setAttribute('id','ComboboxView_'+this.name);
    this.options  = new Array();
    this.expops   = new Array();
	this.value    = ""	
	
	this.build  = ComboBox_build;
    this.make   = ComboBox_make;
    this.choose = ComboBox_choose;
    this.add    = ComboBox_add;
    this.toggle = ComboBox_toggle;
    this.update = ComboBox_update;
    this.remove = ComboBox_remove;
	
	//#MODIF YANN
	this.form_source	= '';
	this.form_select_name= '';
	this.event_onchange	 = '';
	
	this.setvalue 		= ComboBox_setvalue;
	this.setFormSource  = ComboBox_setFormSource;
	this.setSelectName  = ComboBox_setSelectName;
	this.setOnChange	= ComboBox_setOnChange;
	//#

    this.make()
    this.txtview = this.view.childNodes[0]
    this.valcon  = this.view.childNodes[1]
    
    this.par.appendChild(this.view)

    Global_combo_array[Global_combo_array.length]=this;
    if(Global_run_event_hook){ComboBox_init()}
}

ComboBox.prototype.COMBOBOXZINDEX = 1000 //change this if you must

function ComboBox_init() 
{
	if (document.addEventListener) {
		document.addEventListener("keyup", ComboBox_handleKey, false );
		document.addEventListener("mousedown", ComboBox_mouseDown, false );
	}
	else if (document.attachEvent) {
		document.attachEvent("onkeyup", function () { ComboBox_handleKey(window.event); } );
		document.attachEvent("onmousedown", function () { ComboBox_mouseDown(window.event); } );
	}
	
    Global_run_event_hook = false;
}

function returnFalse(){return false}

function ComboBoxItem(text,value)
{
    this.text  = text;
    this.value = value;
}

/*** yann ducrocq pix-l.fr : pour remplacer à la volée tous les select d'1 form 
attention s'assurer que le form ait une action meme vide
les selects doivent etre chacune dans un div possédant un id
enlever tout espace vide entre <div> et <select>
***/
function replace_comboboxes(form) {	
var js_output='';

	for (var i=0; i<document.getElementById(form).getElementsByTagName('SELECT').length;i++) {
	var combobox = document.getElementById(form).getElementsByTagName('SELECT')[i];
	var parent = combobox.parentNode;
	var parentId = parent.getAttribute('id');
		
		if (parent.nodeName=='DIV') { 
		combobox.style.display='none';	
			
			if (!parentId) {
			parentId='replace_combobox_'+i;
			parent.setAttribute('id',parentId);
			}
	
		js_output 		+= 'document.combobox'+i+' = new ComboBox("document.combobox'+i+'"';
		js_output 		+= ', document.getElementById("'+ parentId+'"));\n';
		js_output		+= 'var combobox'+i+ ' = document.combobox'+i+';\n;'			
		js_output 		+= 'combobox'+i+'.add( \n';
		
			for (var j=0;j<=combobox.options.length;j++) {
			var opt = combobox.options[j];
				if (opt) js_output +=	'new ComboBoxItem("'
										+opt.text
										+'", "'
										+opt.value+'"),\n';
			}
										
		js_output=js_output.replace(new RegExp(/,\n$/),''); //enlever la dernière virgule				
		js_output += '\n);\n';	
		
		js_output	   += 'combobox'+i+'.setvalue("'+combobox.options[combobox.selectedIndex].text+'");\n';			
		js_output	   += 'combobox'+i+'.setFormSource("'+form+'");\n';	
		js_output	   += 'combobox'+i+'.setSelectName("'+combobox.name+'");\n';	
			
			if (combobox.getAttribute('onchange') && combobox.getAttribute('onchange')!='') {
			var event_onchange  = combobox.getAttribute('onchange').toString();
				if (event_onchange.indexOf('function anonymous')>=0) { //IE
				event_onchange=event_onchange.substring(23, event_onchange.length-2);				
				}	
			event_onchange=event_onchange.replace(new RegExp(/this/g),'document.'+form+'.'+combobox.name);	
			js_output	   += 'combobox'+i+'.setOnChange("'+event_onchange+'");\n';
			}
		}			
	}	
return js_output;
}
