/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

var VilleSearch = function(departementFieldId, villeFieldId, iframeId, selectFunction) {
    var departementField = document.getElementById(departementFieldId);
    var villeField = document.getElementById(villeFieldId);
    var iframe = document.getElementById(iframeId);
    var cache = new Array();
    var lastSearch = "";

    var initRequest = function() {
        var req;
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        return req;
    }

    var getContent = function(node, name) {
        var childs = node.getElementsByTagName(name);
        if (childs.length > 0) {
            var child = childs.item(0);
            if (child.childNodes.length > 0) {
                return child.childNodes.item(0).nodeValue;
            }
        }
        return "";
    }

    var getAbsoluteOffset = function(element) {
        if (element == null) {
            return new Point(0, 0);
        } else {
            var point = getAbsoluteOffset(element.offsetParent);
            point.x += element.offsetLeft;
            point.y += element.offsetTop;
            return point;
        }
    }
    
    var Ville = function(departement, nom) {
        this.departement = departement;
        this.nom = nom;
    }

    var Point = function(x, y) {
        this.x = x;
        this.y = y;
    }

    villeField.style.backgroundImage = "url('image/icons/completion.png')";
    villeField.style.backgroundRepeat = "no-repeat";
    villeField.style.backgroundPosition = "center right";
    villeField.style.paddingRight = "16px";

    villeField.onkeydown = function(e) {
        var key = (window.event ? window.event.keyCode : e.which);
        if (key == 38) {
            if (iframe.style.visibility == "visible")
                iframe.contentWindow.highlightVille(villeField.id, -1, lastSearch);
            return false;
        } else if (key == 40) {
            if (iframe.style.visibility == "visible")
                iframe.contentWindow.highlightVille(villeField.id, 1, lastSearch);
            return false;
        } else if (key == 27) {
            if (iframe.style.visibility == "visible")
                iframe.style.visibility = "hidden";
            return false;
        }
        return true;
    }

    villeField.onkeyup = function(e) {
        var key = (window.event ? window.event.keyCode : e.which);
        var departementField = document.getElementById(departementFieldId);
        var nom = this.value;
        if (key == 8 || key >= 48 && key <= 57 || key >= 65 && key <= 90 || key >= 97 && key <= 122) {
            if (nom != lastSearch) {
                iframe.style.visibility = "hidden";
                var villeList = cache[departementField.value + "-" + nom];
                if (villeList != null) {
                    if (villeList.length > 0) {
                        iframe.contentWindow.updateVilleList(villeList, selectFunction, iframe);
                        iframe.style.height = iframe.contentWindow.document.getElementById("villeTable").offsetHeight + "px";
                        iframe.style.visibility = "visible";
                    }
                } else {
                    if (nom.length >= 1) {
                        villeField.style.backgroundImage = "url('image/icons/xmag.png')";

                        var url = "/lug2/ws/VilleSearchWS?cp=" + escape(departementField.value) + "&v=" + escape(nom) + "&r=" + new Date().getTime();
                        var req = initRequest();

                        req.onreadystatechange = function() {
                            if (req.readyState == 4) {
                                var doc = req.responseXML;
                                var villes = doc.documentElement.getElementsByTagName("v");

                                if (villes.length == 0) {
                                    iframe.style.visibility = "hidden";
                                } else {
                                    var villeList = new Array();

                                    for (var i = 0; i < villes.length; i++) {
                                        var ville = villes.item(i);
                                        var newVille = new Ville(getContent(ville, "d"),
                                                                 getContent(ville, "n")
                                        );
                                        villeList[i] = newVille;
                                    }

                                    var point = getAbsoluteOffset(villeField);
                                    iframe.style.top = point.y + villeField.offsetHeight + "px";
                                    iframe.style.left = point.x + "px";
                                    iframe.contentWindow.updateVilleList(villeList, selectFunction, iframe);
                                    iframe.style.height = iframe.contentWindow.document.getElementById("villeTable").offsetHeight + 8 + "px";

                                    cache[departementField.value + "-" + nom] = villeList;

                                    if (villeField.value == nom && villeList.length > 0) {
                                        iframe.style.visibility = "visible";
                                    }
                                }

                                villeField.style.backgroundImage = "url('image/icons/completion.png')";
                            }
                        }
                        req.open("GET", url, true);
                        req.send(null);
                    } else {
                        iframe.style.visibility = "hidden";
                    }
                }
                lastSearch = nom;
            }
        }
        return true;
    }

    villeField.onkeypress = function(e) {
        var key = (window.event ? window.event.keyCode : e.which);
        if (key == 13) {
            var index = iframe.contentWindow.selectedIndex;
            if (index != -1) {
                var ville = iframe.contentWindow.villeList[index];
                selectFunction(ville);
            }
            iframe.style.visibility = "hidden";

            return false;
        }
        return true;
    }

    villeField.onblur = function() {
        if (iframe.style.visibility == "visible") {
            setTimeout(function() { iframe.style.visibility = "hidden"; }, 250);
        }
    }
}

