﻿OpenLayers.Control.ModifiedKeyboard = OpenLayers.Class(OpenLayers.Control.KeyboardDefaults, {

    lastEventCode: -1,

    /*
    Property: altKeyPressed
    {bool}
    */
    altKeyPressed: false,

    usefilters: false,

    /*
    Property: tabindex
    {int} index of currenttab
    */
    select_layer_index: 0,

    select_filter_index: 0,


    initialize: function() {
        OpenLayers.Control.prototype.initialize.apply(this, arguments);
    },

    defaultKeyPress: function(e) {
        try {
            e = e || window.event;
            if (e.keyCode)
                code = e.keyCode;
            else if (e.which)
                code = e.which;

            var element;
            if (e.target) {
                element = e.target;
            }
            else if (e.srcElement) {
                element = e.srcElement;
            }
            if (element.nodeType == 3) {
                element = element.parentNode;
            }
            if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA' || element.tagName == 'OPTION') {
                return;
            }

            switch (code) {

                // MapEvents                                                                
                case OpenLayers.Event.KEY_LEFT:
                    this.map.pan(-this.slideFactor, 0);
                    break;
                case OpenLayers.Event.KEY_RIGHT:
                    this.map.pan(this.slideFactor, 0);
                    break;
                case OpenLayers.Event.KEY_UP:
                    this.map.pan(0, -this.slideFactor);
                    break;
                case OpenLayers.Event.KEY_DOWN:
                    this.map.pan(0, this.slideFactor);
                    break;
                case 33: // Page Up. Same in all browsers.
                    var size = this.map.getSize();
                    this.map.pan(0, -0.75 * size.h);
                    break;
                case 34: // Page Down. Same in all browsers.
                    var size = this.map.getSize();
                    this.map.pan(0, 0.75 * size.h);
                    break;
                case 35: // End. Same in all browsers.
                    var size = this.map.getSize();
                    this.map.pan(0.75 * size.w, 0);
                    break;
                case 36: // Home. Same in all browsers.
                    var size = this.map.getSize();
                    this.map.pan(-0.75 * size.w, 0);
                    break;
                case 43:  // +/= (ASCII), keypad + (ASCII, Opera)
                case 61:  // +/= (Mozilla, Opera, some ASCII)
                case 187: // +/= (IE)
                case 107: // keypad + (IE, Mozilla)
                    this.map.zoomIn();
                    break;
                case 45:  // -/_ (ASCII, Opera), keypad - (ASCII, Opera)
                case 109: // -/_ (Mozilla), keypad - (Mozilla, IE)
                case 189: // -/_ (IE)
                case 95:  // -/_ (some ASCII)
                    this.map.zoomOut();
                    break;
                case 18: // Alt code
                    this.altKeyPressed = true;
                    break;
                /*
                case 65: // a
                ChangeTab(clientId_AddressTabPanel);
                AddressClick();
                break;
                case 83: //82 r
                ChangeTab(clientId_RouteTabPanel);
                RouteClick();
                break;
                case 75: // k
                ChangeTab(clientId_MunicipalityTabPanel);
                MunicipalityClick();
                break;
                case 68: // d
                ChangeTab(clientId_DigitizeTabPanel);
                DigitizeClick();
                break;
                case 74: // j
                changeTab(clientId_JurisdictionTabPanel);
                JurisdictionClick();
                break;
                case 83: // s
                changeTab(clientId_SearchResultTabPanel);
                SearchResultClick();
                break;
                case 80: // p
                changeTab(clientId_ParishTabPanel);
                ParishClick();
                break;
                */ 
                case 49: // Switch menu Alt+
                    if (this.altKeyPressed) {
                        var container = $find(tabcontainer);
                        if (container) {
                            var length = container._tabs.length;
                            var index = container.get_activeTabIndex();

                            if (index >= length - 1) {
                                container.set_activeTabIndex(0);
                            }
                            else {
                                container.set_activeTabIndex(index + 1);
                            }
                            var tab = container.get_activeTab();
                            tabname = tab.get_headerText().toLowerCase();
                            tabname
                            switch (tabname) {
                                case "adresse":
                                    AddressClick();
                                    break;
                                case "rute":
                                    RouteClick();
                                    break;
                                case "kommune":
                                    MunicipalityClick();
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                    break;
                case 77: // m scroll down layers
                    var closedLayerswitcher = document.getElementById("OpenLayers_Control_MaximizeDiv");
                    if (closedLayerswitcher.style.display == "none") {
                        var layer_div = document.getElementById("layersDiv");
                        if (layer_div) {
                            var fields = layer_div.getElementsByTagName("input");
                            if (fields) {
                                var control = this.map.getControlsByClass("OpenLayers.Control.StyledLayerSwitcher");
                                var fieldsLength = 0;
                                var filtersUsed = false;
                                if (control) {
                                    if (control[0].filters) {
                                        var filtersElement = document.getElementById("filtersDiv");
                                        if (filtersElement) {
                                            hfields = filtersElement.getElementsByTagName("input");
                                            if (hfields) {
                                                fieldsLength = hfields.length;
                                                filtersUsed = true;
                                            }
                                        }
                                    }
                                }
                                this.select_layer_index++;
                                if (this.select_layer_index >= (fields.length + fieldsLength)) {
                                    this.select_layer_index = 0;
                                }
                                for (var i = 0; i < fields.length; i++) {
                                    fields[i].style.borderStyle = "none";
                                    fields[i].style.opacity = "1";
                                }
                                if (filtersUsed) {
                                    for (var i = 0; i < hfields.length; i++) {
                                        hfields[i].style.borderStyle = "none";
                                        hfields[i].style.opacity = "1";
                                    }

                                }
                                if (this.select_layer_index >= fields.length) {
                                    hfields[this.select_layer_index - fields.length].style.borderStyle = "dotted";
                                    hfields[this.select_layer_index - fields.length].style.opacity = "0.5";
                                } else {
                                    // Not working in firefox
                                    fields[this.select_layer_index].style.borderStyle = "dotted";
                                    // for use in firefox
                                    fields[this.select_layer_index].style.opacity = "0.5";
                                }
                            }
                        }
                    }
                    break;
                case 78: // n scroll up layers
                    var closedLayerswitcher = document.getElementById("OpenLayers_Control_MaximizeDiv");
                    if (closedLayerswitcher.style.display == "none") {
                        var layer_div = document.getElementById("layersDiv");
                        if (layer_div) {
                            var fields = layer_div.getElementsByTagName("input");
                            if (fields) {
                                var control = this.map.getControlsByClass("OpenLayers.Control.StyledLayerSwitcher");
                                var fieldsLength = 0;
                                var filtersUsed = false;
                                if (control) {
                                    if (control[0].filters) {
                                        var filtersElement = document.getElementById("filtersDiv");
                                        if (filtersElement) {
                                            hfields = filtersElement.getElementsByTagName("input");
                                            if (hfields) {
                                                fieldsLength = hfields.length;
                                                filtersUsed = true;
                                            }
                                        }
                                    }
                                }

                                this.select_layer_index--;
                                if (this.select_layer_index < 0) {
                                    if (filtersUsed) {
                                        this.select_layer_index = (fields.length + hfields.length) - 1;
                                    } else {
                                        this.select_layer_index = fields.length - 1;
                                    }
                                }
                                for (var i = 0; i < fields.length; i++) {
                                    fields[i].style.borderStyle = "none";
                                    fields[i].style.opacity = "1";
                                }
                                if (filtersUsed) {
                                    for (var i = 0; i < hfields.length; i++) {
                                        hfields[i].style.borderStyle = "none";
                                        hfields[i].style.opacity = "1";
                                    }
                                }

                                if (this.select_layer_index >= fields.length) {
                                    hfields[this.select_layer_index - fields.length].style.borderStyle = "dotted";
                                    hfields[this.select_layer_index - fields.length].style.opacity = "0.5";
                                } else {
                                    // Not working in firefox
                                    fields[this.select_layer_index].style.borderStyle = "dotted";
                                    // for use in firefox
                                    fields[this.select_layer_index].style.opacity = "0.5";
                                }
                            }
                        }
                    }
                    break;
                case 48: // Switch layer on/off Alt+0
                    if (this.altKeyPressed) {
                        var closedLayerswitcher = document.getElementById("OpenLayers_Control_MaximizeDiv");
                        if (closedLayerswitcher.style.display == "none") {
                            var layer_div = document.getElementById("layersDiv");
                            if (layer_div) {
                                var fields = layer_div.getElementsByTagName("input");
                                if (fields) {
                                    var control = this.map.getControlsByClass("OpenLayers.Control.StyledLayerSwitcher");
                                    if (control) {
                                        if (control[0].filters) {
                                            var filtersElement = document.getElementById("filtersDiv");
                                            if (filtersElement) {
                                                hfields = filtersElement.getElementsByTagName("input");
                                            }
                                        }
                                        if (this.select_layer_index >= fields.length) {
                                            var field = hfields[this.select_layer_index - fields.length];
                                            if (field) {
                                                var layer = this.map.getLayersByName(field.value);
                                                control[0].onInputKeyEvent(layer[0], field, control[0]);
                                            }
                                        } else {
                                            var field = fields[this.select_layer_index];
                                            if (field) {
                                                var layer = this.map.getLayersByName(field.value);
                                                control[0].onInputKeyEvent(layer[0], field, control[0]);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case 57: // Open/Close styledLayerSwitcher Alt+8
                    if (this.altKeyPressed) {
                        var closedLayerswitcher = document.getElementById("OpenLayers_Control_MaximizeDiv");
                        if (closedLayerswitcher.style.display != "none") {
                            var control = this.map.getControlsByClass("OpenLayers.Control.StyledLayerSwitcher");
                            if (control) {
                                control[0].maximizeControl();
                                closedLayerswitcher.style.display = "none";
                                this.select_layer_index = 0;
                            }
                        }
                        else {
                            var openlayerswitcher = document.getElementById("OpenLayers_Control_MinimizeDiv");
                            if (openlayerswitcher) {

                                var control = this.map.getControlsByClass("OpenLayers.Control.StyledLayerSwitcher");
                                if (control) {
                                    control[0].minimizeControl();
                                    openlayerswitcher.style.display
                                }
                            }
                        }
                    }
                    break;
                case 56: // Open/Close overviewmap Alt+9
                    if (this.altKeyPressed) {
                        var closedOverviewMap = document.getElementById("olControlStyledOverviewMapMaximizeButton");
                        if (closedOverviewMap.style.display != "none") {
                            var control = this.map.getControlsByClass("OpenLayers.Control.StyledOverviewMap");
                            if (control) {
                                control[0].maximizeControl();
                                closedOverviewMap.style.display = "none";
                            }
                        }
                        else {
                            var openOverviewMap = document.getElementById("olControlStyledOverviewMapMinimizeButton");
                            if (openOverviewMap) {
                                var control = this.map.getControlsByClass("OpenLayers.Control.StyledOverviewMap")
                                if (control) {
                                    control[0].minimizeControl();
                                    closedOverviewMap.style.display = "";
                                }
                            }
                        }
                    }

                    break;
                default:
                    break;
            }
            if (code != 18) {
                this.altKeyPressed = false;
            }
        } catch (e) {

        }
    },

    CLASS_NAME: "OpenLayers.Control.ModifiedKeyboard"
});
