var cc_ACs = new Array();
var cc_AC_Forms = new Array();
var cc_AC_Count = 0;
var _xmlHttp=null;

function cc_AC()
{
    // variable de l'objet
    this.name           = cc_AC.arguments[0];
    this.xmlUrl         = cc_AC.arguments[1];
    this.xmlParams      = cc_AC.arguments[2];
    if( typeof this.xmlParams != 'object' ) this.xmlParams = new Array();
    this.xmlVar         = cc_AC.arguments[3];
    this.useHidden      = cc_AC.arguments[4] == 1 ? 0 : 1;
    this.id             = cc_AC_Count;
    this.input          = $(this.name+'_input');
    this.form           = this.input.form;
    this.formName       = this.form.name;
    if( !this.formName ) this.formName = 'cc_ac_form_' + this.id;
    
    var formExist = 0;
    for (var i=0; i < cc_AC_Forms.length; i++)
    {
        if( cc_AC_Forms[i][0] == this.formName ) // formulaire existant
        {
            this.onsubmit = cc_AC_Forms[i][1];
            formExist = 1;
            break;
        }
    }
    if( formExist == 0 )
    {
        this.onsubmit       = this.form.onsubmit;
        if( typeof this.onsubmit == 'undefined' ) this.onsubmit = function() {return true;}
        cc_AC_Forms[cc_AC_Forms.length] = new Array(this.formName,this.onsubmit);
    }

    //this.form.onsubmit  = function() {return false;}
    this.div            = new cc_AC_createAcDiv(this);
    this.inputVal       = this.input.value;
    this.resultats      = new Array();
    this.submitIfNotVal = 0;
    cc_AC_Count++;
    
    // le champ hidden est-il present ?
    if( this.useHidden )
        {
        var formInputs = this.form.getElementsByTagName('input');
        var isHidden = 0;
        for (var i=0; i < formInputs.length; i++)
        {
            if( formInputs[i].type == 'hidden' && formInputs[i].id == this.name+'_hidden' )
                isHidden = 1;
        }
        if( isHidden ) this.hidden        = $(this.name+'_hidden');
        else
        {
            // création du champ hidden
            var inpHidden   = document.createElement('input');
            inpHidden.id    = this.name+'_hidden';
            inpHidden.name  = this.name+'_hidden';
            inpHidden.type  = 'hidden';
            inpHidden.value = 0;
            this.form.appendChild(inpHidden);
            this.hidden = inpHidden;
        }
    }
                
    // mise en mémoire au niveau global
    cc_ACs[this.id] = this;
    
    // définition des fonctions de l'objet
    this.getInput         = function()  { return this.input.value; }
    this.setInput         = function(v) { this.input.value = v; if(this.useHidden && v && this.hidden.onchange) this.hidden.onchange(); }
    this.setHidden        = function(v) { if( this.useHidden ) this.hidden.value = v; }
    this.getOldInput      = function()  { return this.inputVal; }
    this.setOldInput      = function(v) { this.inputVal = v; }
    this.acGetDiv         = function()  { this.div.get(); }
    this.acReset          = function()  { this.div.reset(); }
    this.acShow           = function()  { this.div.show(); }
    this.acHide           = function()  { if( this.div.hide() ) this.input.focus(); }
    this.acAppend         = function(d) { this.div.append(d); }
    this.acHighlightNext  = function()  { this.div.highlightNext(); }
    this.acHighlightPrev  = function()  { this.div.highlightPrev(); }
    this.acResetSelected  = function()  { this.div.resetSelected(); }
    this.acGetCurrent     = function()  { return this.div.getCurrent(); }
    this.acUnstyleCurrent = function()  { return this.div.unstyleCurrent(); }
    this.acSetRapport     = function(v) { this.div.setRapport(v); }
    this.input.onkeyup    = cc_AC_onKeyUpHandler;
    this.input.onblur     = cc_AC_onBlurHandler;
    this.input.onfocus    = function()  { this.form.onsubmit = function() {return false;} };
    this.setOnchange      = function(v) { if(this.useHidden) { this.hidden.onchange=function() {eval(v);} } }
    this.addXmlParam      = function(v) { this.xmlParams[this.xmlParams.length] = v; }
    this.submitIfNotVal   = function()  { this.submitIfNotVal = 1; }
    this.submit           = function()  { this.form.submit(); }
    
    // obtention des résultats en format XML
    this.getResults      = function()
    {
        if(_xmlHttp&&_xmlHttp.readyState!=0)
            _xmlHttp.xhr.abort()
        _xmlHttp=cc_AC_getXMLHTTP(this);
        if(_xmlHttp)
        {
            //appel à l'url distante
            var url = this.xmlUrl+'?';
            for(var i=0; i<this.xmlParams.length; i++)
            {
                url += this.xmlParams[i]+'&';
            }
            url += this.xmlVar+'='+this.inputVal;
            _xmlHttp.xhr.open("GET",url,true);
            _xmlHttp.xhr.onreadystatechange=function() 
            {
                if(_xmlHttp.xhr.readyState==4&&_xmlHttp.xhr.responseXML)
                    _xmlHttp.ac.traiteXmlSuggestions(_xmlHttp.xhr.responseXML);
            }
        }
        _xmlHttp.xhr.send(null);
    }
    
    // traitement des résultats XML => tableau
    this.traiteXmlSuggestions = function(xmlDoc)
    {
        var options = xmlDoc.getElementsByTagName('option');
        this.resultats = new Array();
        for (var i=0; i < options.length; i++)
        {
            var elemVal  = options[i].getAttribute('val');
            var elemComp = options[i].getAttribute('compose');
            var elemData = options[i].firstChild.data;
            this.resultats.push( [elemVal,elemComp,elemData] );
        }
        this.setResults();
    }

    // affectation et affichage des résultats    
    this.setResults = function()
    {
        this.acReset();
        for(var i=0; i < this.resultats.length; i++)
        {
            var r = this.resultats[i];
            var d = document.createElement("DIV");
            setStylePourElement(d,'cc_AC_Div_'+this.id);
            if( r[1] == 1 )
                d.id = 'cc_AC_Div_Compose_'+this.id+'_'+r[0];
            else
                d.id = 'cc_AC_Div_'+this.id+'_'+r[0];
            d.onmousedown = cc_Div_OnMouseDown;
            d.onmouseover = cc_Div_OnMouseOver;
            d.onmouseout  = cc_Div_OnMouseOut;

            var d_content = '';
            if( r[1] == 1 ) d_content += '<img src="' + JS_ABS_IMG_URL + '/icone_compose.gif" alt="" style="float:left;" />&nbsp;';
            d_content += '<span>' + r[2] + '</span>';
            d.innerHTML = d_content;
            this.acAppend(d);
        }
        if( this.resultats.length > 0 )
            this.acShow();
        else
            this.acHide();
    }
    
    // appel de la fonction de traitement    
    setTimeout("cc_AC_Handle("+this.id+")",200)
}

// récupération de l'id de l'AC à partir de l'id de l'input
function cc_AC_GetAcIdFromInputId(id)
{
    for(var i=0; i < cc_ACs.length; i++)
    {
        if( cc_ACs[i].input.id == id ) return i;
    }
    return -1;
}

// récupération de l'id de l'AC à partir de l'id de la div
function cc_AC_GetAcIdFromDivId(id)
{
    if(id.indexOf('Compose') != -1)
        id = id.substring(18);
    else
        id = id.substring(10);
    id = id.substring(0,id.indexOf('_'));
    id = id.replace(/[^0-9]/,'');
    return id;
}

// récupération de l'id de l'element à partir de l'id de la div
function cc_AC_GetElemIdFromDivId(id)
{
    var estCompose = (id.indexOf('Compose') != -1);
    id = id.substring(id.lastIndexOf('_'));
    id = id.replace(/[^0-9]/,'');
    if( estCompose ) id = 'c' + id;
    return id;
}

// récupération du texte de l'element à partir de la div
function cc_AC_GetElemTxtFromDiv(d)
{
    return d.getElementsByTagName('span')[0].firstChild.data;
}

var cc_AC_KeyWasPress = 0;

var cc_AC_onKeyUpHandler=function(event)
{
    var acId = cc_AC_GetAcIdFromInputId(this.id);
    if( acId < 0 ) return;
    var ac = cc_ACs[acId];
    
    if(!event&&window.event) event=window.event;
    var kcode =event.keyCode;
    
    // haut = 38 | bas = 40
    if( kcode==40 || kcode==38 )
    {
        if( kcode==40 ) ac.acHighlightNext();
        else            ac.acHighlightPrev();
    }

    // entree = 13 | ? = 3
    if(kcode==13||kcode==3)
    {
        var sel = ac.acGetCurrent();
        ac.acHide();
        if( ac.submitIfNotVal && !sel[1] )
        {
            ac.submit();
            return;
        }
        ac.setHidden(sel[0]);
        ac.setInput(sel[1]);
        ac.setOldInput(sel[1]);
    }
    
    if( kcode != 40 && kcode != 39 && kcode != 13 && kcode != 3 )
    {
        cc_AC_KeyWasPress = 1;
        setTimeout('cc_AC_KeyWasPress=0', 1500);
    }
}

// traitement du blur de l'input
var cc_AC_onBlurHandler=function(event)
{
    var acId = cc_AC_GetAcIdFromInputId(this.id);
    if( acId < 0 ) return;
    var ac = cc_ACs[acId];
    
    var sel = ac.acGetCurrent();
    if( sel[0] )
    {
        ac.setHidden(sel[0]);
        ac.setInput(sel[1]);
        ac.setOldInput(sel[1]);
    }
    else
        ac.setOldInput(ac.getInput());
    ac.acHide();
    ac.form.onsubmit = ac.onsubmit;
};

// traitement du click sur une div
var cc_Div_OnMouseDown=function()
{
    var acId = cc_AC_GetAcIdFromDivId(this.id);
    if( acId < 0 ) return;
    var elemId = cc_AC_GetElemIdFromDivId(this.id);
    var ac = cc_ACs[acId];
    if( elemId != 0 )
        var val = cc_AC_getSuggestion(this);
    else
        var val = new Array(0,'');
    ac.setHidden(val[0]);
    ac.setInput(val[1]);
    ac.setOldInput(val[1]);
    ac.acHide();
};

// traitement du passage (arrivée) sur une div
var cc_Div_OnMouseOver=function()
{
    var acId = cc_AC_GetAcIdFromDivId(this.id);
    if( acId < 0 ) return;
    var ac = cc_ACs[acId];
    ac.acUnstyleCurrent();
    setStylePourElement(this,'cc_AC_Div_Act_'+acId)
};

// traitement du passage (départ) sur une div
var cc_Div_OnMouseOut = function()
{
    var acId = cc_AC_GetAcIdFromDivId(this.id);
    if( acId < 0 ) return;
    setStylePourElement(this,'cc_AC_Div_'+acId);
};


// récupérer la valeur (texte) d'une div
function cc_AC_getSuggestion(d){
  if(!d) return new Array(0,'');
  return new Array(
    cc_AC_GetElemIdFromDivId(d.id),
    cc_AC_GetElemTxtFromDiv(d)
  );
}

// retourne un objet xmlHttpRequest.
// méthode compatible entre tous les navigateurs (IE/Firefox/Opera)
function cc_AC_getXMLHTTP(ac)
{
    var xhr = new Object;
    if( window.XMLHttpRequest )     // Firefox et autres
        xhr.xhr = new XMLHttpRequest();
    else if(window.ActiveXObject)   // Internet Explorer
    { 
        try
        {
            xhr.xhr = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            try
            {
                xhr.xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e1)
            {
                xhr = null;
            }
        }
    }
    else                            // XMLHttpRequest non supporté par le navigateur
    { 
        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
        xhr = null;
    }
    if( xhr != null ) xhr.ac=ac;
    return xhr;
}

function cc_AC_Handle(id)
{
    var ac = cc_ACs[id];
    if( typeof ac == 'undefined' ) return;
    var inputVal = ac.getInput();
    var oldinputVal = ac.getOldInput();
    if( !cc_AC_KeyWasPress && inputVal != oldinputVal ) // nouvelle valeur
    {        
        ac.acResetSelected();
        ac.setOldInput(inputVal);
        ac.getResults();
    }
    
    setTimeout("cc_AC_Handle("+id+")",200)
}

function cc_AC_createAcDiv(ac)
{
    cc_AC_initStyle(ac.id);
  
    this.selectedChild = -1;
    this.acId = ac.id;
    this.rapport = 1;
    this.d = document.createElement("DIV");
    this.d.id='cc_AC_Div_Main_'+ac.id;
    
    var borderLeftRight=1;
    var borderTopBottom=1;
  
    // style
    this.d.style.borderRight   = 'black '+borderLeftRight+'px solid';
    this.d.style.borderLeft    = 'black '+borderLeftRight+'px solid';
    this.d.style.borderTop     = 'black '+borderTopBottom+'px solid';
    this.d.style.borderBottom  = 'black '+borderTopBottom+'px solid';
    this.d.style.textAlign     = 'left';
    this.d.style.zIndex        = '999';
    this.d.style.paddingRight  = '0';
    this.d.style.paddingLeft   = '0';
    this.d.style.paddingTop    = '0';
    this.d.style.paddingBottom = '0';
    
    this.setSize = function()
    {
        try{
        this.d.style.left  = cc_getOffsetLeft(ac.input) + 'px';
        this.d.style.top   = cc_getOffsetTop(ac.input)+ac.input.offsetHeight-1 + 'px';
        this.d.style.width = (ac.input.offsetWidth-2*1)*this.rapport + 'px';
        } catch(e) {}
    }
    
    this.show = function()
    {
        this.d.style.visibility='visible';
        this.setSize();
    }
    
    this.hide = function()
    {
        if( this.d.style.visibility != 'hidden' )
        {
            this.d.style.visibility='hidden';
            return 1;
        }
        return 0;
    }
    
    this.append = function(d)
    {
        this.d.appendChild(d);
    }

    this.get = function()
    {
        return this.d;
    }
        
    this.reset = function()
    {
        while( this.d.childNodes.length > 0 )
            this.d.removeChild(this.d.childNodes[0]);
    }
    
    this.highlightNext = function()
    {
        if( this.selectedChild >= this.d.childNodes.length ) return;
        if( this.selectedChild >=0 ) setStylePourElement(this.d.childNodes[this.selectedChild],'cc_AC_Div_'+this.acId);
        this.selectedChild++;
        setStylePourElement(this.d.childNodes[this.selectedChild],'cc_AC_Div_Act_'+this.acId);
    }
    
    this.highlightPrev = function()
    {
        if( this.selectedChild <= 0 ) return;
        setStylePourElement(this.d.childNodes[this.selectedChild],'cc_AC_Div_'+this.acId);
        this.selectedChild--;
        setStylePourElement(this.d.childNodes[this.selectedChild],'cc_AC_Div_Act_'+this.acId);
    }
    
    this.resetSelected = function()
    {
        this.selectedChild = -1;
    }
    
    this.getCurrent = function()
    {
        if( this.selectedChild < 0 ) return new Array(0,''); 
        return cc_AC_getSuggestion(this.d.childNodes[this.selectedChild]);
    }
    
    this.unstyleCurrent = function()
    {
        if( this.selectedChild < 0 ) return; 
        setStylePourElement(this.d.childNodes[this.selectedChild],'cc_AC_Div_'+this.acId);
    }
    
    this.setRapport = function(v)
    {
        this.rapport = v;
        this.setSize();
    }
    
    this.setSize();
    this.d.style.visibility="hidden";
    this.d.style.position="absolute";
    this.d.style.backgroundColor="white";
    document.body.appendChild(this.d);
    cc_setStyleElement(this.d,'cc_AC_Div_ListeStyle_'+ac.id);
    return this;
}

var cc_AC_DivListeStyle_Skin = '';
var cc_AC_DivStyle_Skin      = '';
var cc_AC_DivActStyle_Skin   = '';

function cc_AC_initStyle(id)
{
  /*
  var cc_AC_DivListeStyle="font-size: 13px; font-family: arial,sans-serif; word-wrap:break-word; ";
  */
  var cc_AC_DivListeStyle = cc_AC_DivListeStyle_Skin ? cc_AC_DivListeStyle_Skin : "font-size: 10px; font-family: arial,sans-serif;";
  var cc_AC_DivStyle      = cc_AC_DivStyle_Skin      ? cc_AC_DivStyle_Skin      : "display: block; padding-left: 3px; padding-right: 3px; height: 18px; overflow: hidden; background-color: white;";
  var cc_AC_DivActStyle   = cc_AC_DivActStyle_Skin   ? cc_AC_DivActStyle_Skin   : "cursor:pointer;background-color: #3366cc; color: white ! important; height: 18px;";
    
  cc_insereCSS('.cc_AC_Div_ListeStyle_'+id,cc_AC_DivListeStyle);
  cc_insereCSS('.cc_AC_Div_'+id,cc_AC_DivStyle);
  cc_insereCSS('.cc_AC_Div_Act_'+id,cc_AC_DivActStyle);
}