﻿// ---------------------------------------------------------------------
// Description:		KeyNumberSearch.js
//					ClientSide Script for KeyNumberSearch.cs Control
// 
// Autor:			Herbert Granofszky
// Date:			12.10.2007
// 
// (c) by team ModulAcht. All rights reserved
// ---------------------------------------------------------------------

var KeyNumberSearch =
{
    DROPDOWN_CASC_DELAY: 50,

    hsnCtrlId: null,
    tsnCtrlId: null,
    compGroupCtrlId: null,
    componentCtrlId: null,
    colorCtrlId: null,
    cyldrCtrlId: null,
    fuelCtrlId: null,
    milgFCtrlId: null,
    milgTCtrlId: null,
    yocFCtrlId: null,
    yocTCtrlId: null,
    ccmFCtrlId: null,
    ccmTCtrlId: null,
    powerFCtrlId: null,
    powerTCtrlId: null,
    countryCtrlId: null,
    plzCtrlId: null,
    costCtrlId: null,
    stateCtrlId: null,
    taxCtrlId: null,
    topSubmitButtonCtrlId: null,
    bottomSubmitButtonCtrlId: null,
    topAbortButtonCtrlId: null,
    bottomAbortButtonCtrlId: null,
    ajaxLoaderUrl: null,
    resourcePath: null,
    returnedKeyNumbers: null,
    currentKeyNumberInfoIndex: -1,
    commInterfaceId: null,

    // --------------------------------------------------------------------    
    // Constructor (needs to be called manually)
    // --------------------------------------------------------------------
    initialize: function()
    {
        this._oldHsn = $(this.hsnCtrlId).value;
        this._oldTsn = $(this.tsnCtrlId).value;

        this.com = eval("window." + this.commInterfaceId);

        this._infoCleared = true;

        // define bound event handler
        this._bOnKeyNrInfoLeftArrowMouseDown = this._onKeyNrInfoLeftArrowMouseUp.bindAsEventListener(this);
        this._bOnKeyNrInfoLeftArrowMouseUp = this._onKeyNrInfoLeftArrowMouseUp.bindAsEventListener(this);
        this._bOnKeyNrInfoLeftArrowClick = this._onKeyNrInfoLeftArrowClick.bindAsEventListener(this);
        this._bOnKeyNrInfoRightArrowMouseDown = this._onKeyNrInfoRightArrowMouseDown.bindAsEventListener(this);
        this._bOnKeyNrInfoRightArrowMouseUp = this._onKeyNrInfoRightArrowMouseUp.bindAsEventListener(this);
        this._bOnKeyNrInfoRightArrowClick = this._onKeyNrInfoRightArrowClick.bindAsEventListener(this);

        Event.observe('keysearch_panel', 'keyup', this._onPanelKeyUp.bindAsEventListener(this));
        Event.observe('keysearch_panel', 'keydown', this._onPanelKeyDown.bindAsEventListener(this));

        // hook into hsn/tsn keydown events
        Event.observe($(this.hsnCtrlId), 'keydown', this._onKeyFieldKeyDown.bindAsEventListener(this));
        //Event.observe($(this.tsnCtrlId), 'keydown', this._onKeyFieldKeyDown.bindAsEventListener(this));
        Event.observe($(this.hsnCtrlId), 'keyup', this._onHsnKeyUp.bindAsEventListener(this));
        Event.observe($(this.tsnCtrlId), 'keyup', this._onTsnKeyUp.bindAsEventListener(this));

        // hook into additional search arguments - textbox controls event handler (for synchronizing with extended search)
        Event.observe($(this.ccmFCtrlId), 'keyup', this._onExtArgTextBoxKeyUp.bindAsEventListener(this));
        Event.observe($(this.ccmTCtrlId), 'keyup', this._onExtArgTextBoxKeyUp.bindAsEventListener(this));
        Event.observe($(this.powerFCtrlId), 'keyup', this._onExtArgTextBoxKeyUp.bindAsEventListener(this));
        Event.observe($(this.powerTCtrlId), 'keyup', this._onExtArgTextBoxKeyUp.bindAsEventListener(this));
        Event.observe($(this.plzCtrlId), 'keyup', this._onExtArgTextBoxKeyUp.bindAsEventListener(this));
        Event.observe($(this.costCtrlId), 'keyup', this._onExtArgTextBoxKeyUp.bindAsEventListener(this));
        // hook into text box search arguments for hits counter update
// TODO: uncommented because hits count is requested on keyup events -----^             
//        Event.observe($(this.ccmFCtrlId), 'change', this._requestNumberOfHits.bindAsEventListener(this));
//        Event.observe($(this.ccmTCtrlId), 'change', this._requestNumberOfHits.bindAsEventListener(this));
//        Event.observe($(this.powerFCtrlId), 'change', this._requestNumberOfHits.bindAsEventListener(this));
//        Event.observe($(this.powerTCtrlId), 'change', this._requestNumberOfHits.bindAsEventListener(this));
//        Event.observe($(this.plzCtrlId), 'change', this._requestNumberOfHits.bindAsEventListener(this));
//        Event.observe($(this.costCtrlId), 'change', this._requestNumberOfHits.bindAsEventListener(this));

        // hook into tax and state controls event handler (for synchronizing with extended search)
        Event.observe($(this.taxCtrlId), 'keyup', this._onTaxChange.bindAsEventListener(this));
        Event.observe($(this.taxCtrlId), 'click', this._onTaxChange.bindAsEventListener(this));
        Event.observe($(this.stateCtrlId + '_0'), 'keyup', this._onStateChange.bindAsEventListener(this));
        Event.observe($(this.stateCtrlId + '_0'), 'click', this._onStateChange.bindAsEventListener(this));
        Event.observe($(this.stateCtrlId + '_1'), 'keyup', this._onStateChange.bindAsEventListener(this));
        Event.observe($(this.stateCtrlId + '_1'), 'click', this._onStateChange.bindAsEventListener(this));
        Event.observe($(this.stateCtrlId + '_2'), 'keyup', this._onStateChange.bindAsEventListener(this));
        Event.observe($(this.stateCtrlId + '_2'), 'click', this._onStateChange.bindAsEventListener(this));

        // hook into tax label and cost label elements select start events in order to suppress text selection in ie
        Event.observe('keysearch_taxbox', 'selectstart', this._suppressTextSelect.bindAsEventListener(this));
        Event.observe('keysearch_statebox', 'selectstart', this._suppressTextSelect.bindAsEventListener(this));

        var helpHtml = '';
        helpHtml += '<div class="keysearch_tooltip_title">Bestimmen von Schlüsselnummern</div>';
        helpHtml += '<div class="keysearch_tooltip_content"><table><tr><td class="keysearch_tt_imgcell">';
        helpHtml += '<img src="' + this.resourcePath + '/system/images/alter_fahrzeugschein.jpg" /></td>';
        helpHtml += '<td class="keysearch_tt_imgcell">';
        helpHtml += '<img alt="Beispiel: Neuer Fahrzeugschein" src="' + this.resourcePath + '/system/images/neuer_fahrzeugschein.jpg" /></td>';
        helpHtml += '</tr>';
        helpHtml += '<tr><td class="keysearch_tt_labelcell">Alter Fahrzeugschein</td><td class="keysearch_tt_labelcell">Neuer Fahrzeugschein</td></tr>';
        helpHtml += '</table></div>';

        new Tip($('keysearch_helpbutton'), helpHtml, { className: 'dvtvtooltip', effect: 'appear', hook: { target: 'topRight', tip: 'bottomLeft'} });

        // hook into hits counter click event in order to perform search when clicked on the hits counter
        Event.observe('keysearch_hits', 'click', this._onHitsCounterClick.bindAsEventListener(this));

    },

    _onHitsCounterClick: function(e)
    {
        if (BrowserDetect.browser == "Explorer")
        {
            $('keysearch_hits').style.cursor = 'wait';
        }
        $(this.bottomSubmitButtonCtrlId).click();
    },

    _onPanelKeyDown: function(e)
    {
        if (e.keyCode == Event.KEY_RETURN)
        {
            $(this.topSubmitButtonCtrlId).click();
            Event.stop(e);
            return false;
        }
        return true;
    },

    _onPanelKeyUp: function(e)
    {
        if (e.keyCode == Event.KEY_RETURN)
        {
            $(this.topSubmitButtonCtrlId).click();
            Event.stop(e);
            return false;
        }
        return true;
    },

    focusDefaultElement: function()
    {
        $(this.hsnCtrlId).focus();
    },

    initFromKeyNumberInfo: function(argKeyNumberInfo, keyNrId)
    {
        // sanity check
        if (argKeyNumberInfo == null || argKeyNumberInfo.length < 1)
        {
            return;
        }

        // fill the info fields
        this.returnedKeyNumbers = argKeyNumberInfo;
        if (keyNrId != -1)
        {
            for (var i = 0; i < argKeyNumberInfo.length; i++)
            {
                if (argKeyNumberInfo[i].ID == keyNrId)
                {
                    this.currentKeyNumberInfoIndex = i;
                }
            }
        }
        else
        {
            this.currentKeyNumberInfoIndex = 0;
        }

        var currentKeyNr = this.returnedKeyNumbers[this.currentKeyNumberInfoIndex];

        // fill key number fields
        $(this.hsnCtrlId).value = currentKeyNr.Number2;
        $(this.tsnCtrlId).value = currentKeyNr.Number3;
        this._oldHsn = currentKeyNr.Number2;
        this._oldTsn = currentKeyNr.Number3;

        // create the key number info panel
        this.com.add('keyNrId', currentKeyNr.ID);
        this._updateKeyNumberInfoPanel();

        // set demand argument on component group
        eval(this.compGroupCtrlId + ".addDemandArg('type', '" + currentKeyNr.TypeId + "');");
        this._infoCleared = false;
    },

    initCompGrp: function(argCompGrpInfo)
    {
        var componentCtrl = document["cb_" + this.componentCtrlId];
        var compGroupCtrl = document["cb_" + this.compGroupCtrlId];

        // unselect component
        componentCtrl.setNoSelectionText();
        componentCtrl.setSelectedItemValue('');

        var compGrpChanged = false;
        if (argCompGrpInfo != null)
        {
            var currentItmVal = compGroupCtrl.getSelectedItemValue();
            var currentItmTxt = compGroupCtrl.getCaption();

            // check if the item to be selected is already selected to prevent deadlocks
            if (currentItmTxt != argCompGrpInfo.text)
            {
                compGroupCtrl.setCaption(argCompGrpInfo.text);
                compGrpChanged = true;
            }
            if (currentItmVal != argCompGrpInfo.value)
            {
                compGroupCtrl.setSelectedItemValue(argCompGrpInfo.value);
                compGrpChanged = true;
            }
            componentCtrl.addDemandArg('compgrp', argCompGrpInfo.value);
            setTimeout(componentCtrl.loadItems.bind(componentCtrl, true, true), this.DROPDOWN_CASC_DELAY);
        }
        else
        {
            compGroupCtrl.setNoSelectionText();
            compGroupCtrl.setSelectedItemValue('');
            componentCtrl.addDemandArg('compgrp', '');
            setTimeout(componentCtrl.unloadItems.bind(componentCtrl, true), this.DROPDOWN_CASC_DELAY);
        }
    },

    initComponent: function(argComponentInfo)
    {
        var componentCtrl = document["cb_" + this.componentCtrlId];

        if (argComponentInfo != null)
        {
            var currentItmVal = componentCtrl.getSelectedItemValue();

            // check if the item to be selected is already selected to prevent deadlocks
            if (currentItmVal == argComponentInfo.value)
            {
                return;
            }

            componentCtrl.setSelectedItemValue(argComponentInfo.value);
            componentCtrl.setCaption(argComponentInfo.text);

            // do ajax request to get extended properties
            var ajaxRequest = new SmartAjax();
            ajaxRequest.serviceId = "SmabusService";
            ajaxRequest.url = this.ajaxLoaderUrl;
            ajaxRequest.appendRequest("command", "GetComponentSmabus");
            ajaxRequest.appendRequest("componentId", argComponentInfo.value);
            ajaxRequest.onResponse = this._onGetExPropertiesResponse.bind(this);
            ajaxRequest.sendRequest();
        }
        else
        {
            componentCtrl.setNoSelectionText();
            componentCtrl.setSelectedItemValue('');
            this._disableExFields();
            this._clearExFields();
        }
    },

    initColor: function(argColorInfo)
    {
        if (argColorInfo != null)
        {
            eval(this.colorCtrlId + ".setSelectedIndex(" + argColorInfo.index + ");");
            eval(this.colorCtrlId + ".setCaption('" + argColorInfo.text + "');");
        }
    },

    initCylinder: function(argCylinderInfo)
    {
        if (argCylinderInfo != null)
        {
            eval(this.cyldrCtrlId + ".setSelectedIndex(" + argCylinderInfo.index + ");");
            eval(this.cyldrCtrlId + ".setCaption('" + argCylinderInfo.text + "');");
        }
    },

    initFuel: function(argFuelInfo)
    {
        if (argFuelInfo != null)
        {
            eval(this.fuelCtrlId + ".setSelectedIndex(" + argFuelInfo.index + ");");
            eval(this.fuelCtrlId + ".setCaption('" + argFuelInfo.text + "');");
        }
    },

    initMilageFrom: function(argMilageInfo)
    {
        if (argMilageInfo != null)
        {
            eval(this.milgFCtrlId + ".setSelectedIndex(" + argMilageInfo.index + ");");
            eval(this.milgFCtrlId + ".setCaption('" + argMilageInfo.text + "');");
        }
    },

    initMilageTill: function(argMilageInfo)
    {
        if (argMilageInfo != null)
        {
            eval(this.milgTCtrlId + ".setSelectedIndex(" + argMilageInfo.index + ");");
            eval(this.milgTCtrlId + ".setCaption('" + argMilageInfo.text + "');");
        }
    },

    initYocFrom: function(argYocInfo)
    {
        if (argYocInfo != null)
        {
            eval(this.yocFCtrlId + ".setSelectedIndex(" + argYocInfo.index + ");");
            eval(this.yocFCtrlId + ".setCaption('" + argYocInfo.text + "');");
        }
    },

    initYocTill: function(argYocInfo)
    {
        if (argYocInfo != null)
        {
            eval(this.yocTCtrlId + ".setSelectedIndex(" + argYocInfo.index + ");");
            eval(this.yocTCtrlId + ".setCaption('" + argYocInfo.text + "');");
        }
    },

    initCubicFrom: function(argCubic)
    {
        if (argCubic != null)
        {
            $(this.ccmFCtrlId).value = argCubic;
        }
    },

    initCubicTill: function(argCubic)
    {
        if (argCubic != null)
        {
            $(this.ccmTCtrlId).value = argCubic;
        }
    },

    initPowerFrom: function(argPower)
    {
        if (argPower != null)
        {
            $(this.powerFCtrlId).value = argPower;
        }
    },

    initPowerTill: function(argPower)
    {
        if (argPower != null)
        {
            $(this.powerTCtrlId).value = argPower;
        }
    },

    initCountry: function(argCountryInfo)
    {
        if (argCountryInfo != null)
        {
            eval(this.countryCtrlId + ".setSelectedIndex(" + argCountryInfo.index + ");");
            eval(this.countryCtrlId + ".setCaption('" + argCountryInfo.text + "');");
        }
    },

    initPlz: function(argPlz)
    {
        if (argPlz != null)
        {
            $(this.plzCtrlId).value = argPlz;
        }
    },

    initCost: function(argCost)
    {
        if (argCost != null)
        {
            $(this.costCtrlId).value = argCost;
        }
    },

    initTax: function(argTax)
    {
        if (argTax != null)
        {
            $(this.taxCtrlId).checked = argTax;
        }
    },

    initState: function(argStateInfo)
    {
        if (argStateInfo != null)
        {
            $(this.stateCtrlId + "_0").checked = argStateInfo.all;
            $(this.stateCtrlId + "_1").checked = argStateInfo.used;
            $(this.stateCtrlId + "_2").checked = argStateInfo._new;
        }
    },

    resetAll: function()
    {
        this.resetTSN();
        $('key_producer').innerHTML = "";
        this._infoCleared = true;
        $(this.hsnCtrlId).clear();
        this._oldHsn = "";
    },

    resetTSN: function()
    {
        /// clear info fields
        $('key_category').innerHTML = "";
        $('key_type').innerHTML = "";
        $('key_model').innerHTML = "";

        // clear tsn and hsn fields
        $(this.tsnCtrlId).clear();
        this._oldTsn = "";

        // reset key number infos
        this.currentKeyNumberInfoIndex = -1;
        this.returnedKeyNumbers = null;
        this.com.add('keyNrId', '');

        eval(this.componentCtrlId + ".unloadItems();");
        eval(this.componentCtrlId + ".addDemandArg('compgrp', '');");
        eval(this.compGroupCtrlId + ".unloadItems();");
        eval(this.compGroupCtrlId + ".addDemandArg('type', '');");
    },

    onCompGrpSelChngd: function()
    {
        eval("var selectedItemValue = " + this.compGroupCtrlId + ".getSelectedItemValue();");
        eval("var selectedItemText = " + this.compGroupCtrlId + ".getCaption();");
        if (selectedItemValue == null || selectedItemValue == "all")
        {
            // unload components
            eval(this.componentCtrlId + ".unloadItems()");
            eval(this.componentCtrlId + ".addDemandArg('compgrp', '');");
            // synchronize with exteded search
            if (SearchPanel != null)
            {
                SearchPanel.compGrp = null;
            }
        }
        else
        {
            // load components
            eval(this.componentCtrlId + ".addDemandArg('compgrp', '" + selectedItemValue + "');");
            eval(this.componentCtrlId + ".loadItems(true);");
            // synchronize with exteded search
            if (SearchPanel != null)
            {
                SearchPanel.compGrp = { text: selectedItemText, value: selectedItemValue };
            }
        }
        if (SearchPanel != null)
        {
            SearchPanel.notifyExtSearch("compGrp");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onCompSelChngd: function()
    {
        eval("var selectedItemValue = " + this.componentCtrlId + ".getSelectedItemValue();");
        eval("var selectedItemText = " + this.componentCtrlId + ".getCaption();");

        // synchronize with exteded search
        if (selectedItemValue == null || selectedItemValue == "all")
        {
            if (SearchPanel != null)
            {
                SearchPanel.component = null;
            }
        }
        else
        {
            if (SearchPanel != null)
            {
                SearchPanel.component = { text: selectedItemText, value: selectedItemValue };
            }

        }
        if (SearchPanel != null)
        {
            SearchPanel.notifyExtSearch("component");
        }

        if (selectedItemValue != null && selectedItemValue != "all")
        {
            // do ajax request to get extended properties
            var ajaxRequest = new SmartAjax();
            ajaxRequest.serviceId = "SmabusService";
            ajaxRequest.url = this.ajaxLoaderUrl;
            ajaxRequest.appendRequest("command", "GetComponentSmabus");
            ajaxRequest.appendRequest("componentId", selectedItemValue);
            ajaxRequest.onResponse = this._onGetExPropertiesResponse.bind(this);
            ajaxRequest.sendRequest();

            // display the ajaxloader-icon
            if (Master != null)
            {
                Master.setAjaxLoaderIconVisible(true);
            }
        }
        else
        {
            this._disableExFields();
            this._clearExFields();
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onColorSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.colorCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.colorCtrlId + ".getCaption();");

            SearchPanel.color = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("color");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onCylinderSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.cyldrCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.cyldrCtrlId + ".getCaption();");

            SearchPanel.cylinder = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("cylinder");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onFuelSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.fuelCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.fuelCtrlId + ".getCaption();");

            SearchPanel.fuel = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("fuel");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onMilageFromSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.milgFCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.milgFCtrlId + ".getCaption();");

            SearchPanel.milageFrom = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("milageFrom");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onMilageTillSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.milgTCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.milgTCtrlId + ".getCaption();");

            SearchPanel.milageTill = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("milageTill");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onYocFromSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.yocFCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.yocFCtrlId + ".getCaption();");

            SearchPanel.yocFrom = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("yocFrom");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onYocTillSelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.yocTCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.yocTCtrlId + ".getCaption();");

            SearchPanel.yocTill = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("yocTill");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    onCountrySelChngd: function()
    {
        // synchronize with exteded search
        if (SearchPanel != null)
        {
            eval("var selectedItemIndex = " + this.countryCtrlId + ".getSelectedIndex();");
            eval("var selectedItemText = " + this.countryCtrlId + ".getCaption();");

            SearchPanel.country = { index: selectedItemIndex, text: selectedItemText };
            SearchPanel.notifyExtSearch("country");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    // --------------------------------------------------------------------    
    // KeyUp eventhandler for extended search arguments - text boxes
    //
    // Used for synchronizing with the extended search tab
    // 
    //  e                     :   event object
    // --------------------------------------------------------------------    
    _onExtArgTextBoxKeyUp: function(e)
    {
        // check if we are inside a search panel
        if (SearchPanel == null)
        {
            return true;
        }
        var element = Event.element(e);
        var id = element.id;
        var value = element.value;

        // notify search panel for change
        switch (id)
        {
            case this.ccmFCtrlId:
                SearchPanel.cubicFrom = value;
                SearchPanel.notifyExtSearch("cubicFrom");
                break;
            case this.ccmTCtrlId:
                SearchPanel.cubicTill = value;
                SearchPanel.notifyExtSearch("cubicTill");
                break;
            case this.powerFCtrlId:
                SearchPanel.powerFrom = value;
                SearchPanel.notifyExtSearch("powerFrom");
                break;
            case this.powerTCtrlId:
                SearchPanel.powerTill = value;
                SearchPanel.notifyExtSearch("powerTill");
                break;
            case this.plzCtrlId:
                SearchPanel.plz = value;
                SearchPanel.notifyExtSearch("plz");
                break;
            case this.costCtrlId:
                SearchPanel.cost = value;
                SearchPanel.notifyExtSearch("cost");
                break;
        }

        // update hits count
        this._requestNumberOfHits();

        return true;
    },

    _onKeyNrInfoLeftArrowMouseDown: function(e)
    {
        $('infobox_heading_leftarrow').className = 'infobox_heading_left_mdown';
    },

    _onKeyNrInfoLeftArrowMouseUp: function(e)
    {
        $('infobox_heading_leftarrow').className = 'infobox_heading_left_enabled';
    },

    _onKeyNrInfoLeftArrowClick: function(e)
    {
        // sanity check
        if (this.currentKeyNumberInfoIndex == 0) return;

        this.currentKeyNumberInfoIndex--;
        this.com.add('keyNrId', this.returnedKeyNumbers[this.currentKeyNumberInfoIndex].ID);
        this._updateKeyNumberInfoPanel();
    },

    _onKeyNrInfoRightArrowMouseDown: function(e)
    {
        $('infobox_heading_rightarrow').className = 'infobox_heading_right_mdown';
    },

    _onKeyNrInfoRightArrowMouseUp: function(e)
    {
        $('infobox_heading_rightarrow').className = 'infobox_heading_right_enabled';
    },

    _onKeyNrInfoRightArrowClick: function(e)
    {
        // sanity check
        if (this.currentKeyNumberInfoIndex >= this.returnedKeyNumbers.length - 1) return;

        this.currentKeyNumberInfoIndex++;
        this.com.add('keyNrId', this.returnedKeyNumbers[this.currentKeyNumberInfoIndex].ID);
        this._updateKeyNumberInfoPanel();
    },

    _onTaxChange: function(e)
    {
        // check if we are inside a search panel
        if (SearchPanel == null)
        {
            return true;
        }
        SearchPanel.tax = Event.element(e).checked;
        SearchPanel.notifyExtSearch("tax");

        // update hits count
        this._requestNumberOfHits();
    },

    _onStateChange: function(e)
    {
        // check if we are inside a search panel
        if (SearchPanel == null)
        {
            return true;
        }
        // determine checked-states of all state radio buttons
        var stateInfo = { all: $(this.stateCtrlId + '_0').checked,
            used: $(this.stateCtrlId + '_1').checked,
            _new: $(this.stateCtrlId + '_2').checked
        };
        SearchPanel.state = stateInfo;
        SearchPanel.notifyExtSearch("state");

        // update hits count
        this._requestNumberOfHits();
    },

    _suppressTextSelect: function(e)
    {
        Event.stop(e);
    },

    // --------------------------------------------------------------------    
    // KeyDown eventhandler used for both keysearch textfields in order
    // to prevent handling of non-numeric keys
    // 
    //  e                     :   event object
    // --------------------------------------------------------------------
    _onKeyFieldKeyDown: function(e)
    {
        if (!this._isNumericKeyOrControlKey(e.keyCode))
        {
            Event.stop(e);
            return false;
        }
        return true;
    },

    _onHsnKeyUp: function(e)
    {
        // check if entered key changed the text in the field
        var currentValue = $(this.hsnCtrlId).value;
        if (currentValue == this._oldHsn)
        {
            // nothing relevant happened (cursor could just be moved)
            return true;
        }

        // check if the text is a number (backup mechanism if keydownhandler doesn't work)
        if (!this._isNumeric(currentValue))
        {
            // reverse textfield content to old value
            $(this.hsnCtrlId).value = this._oldHsn;
        }

        this._oldHsn = $(this.hsnCtrlId).value;

        if (this._oldHsn.length == 4)
        {
            // check if we can also get the complete model info
            if (this._oldTsn.length == 3)
            {
                this._requestKeyNumber();
            }
            else
            {
                //  only request the producer associated with the entered hsn
                this._requestProducer();
            }

            // automatically jump to the tsn field
            $(this.tsnCtrlId).focus();
        }
        else
        {
            // clear the info fields
            //
            if ($('key_producer') != null)
            {
                $('key_producer').innerHTML = "";
            }
            if (!this._infoCleared)
            {
                if ($('key_category') != null)
                {
                    $('key_category').innerHTML = "";
                }
                if ($('key_type') != null)
                {
                    $('key_type').innerHTML = "";
                }
                if ($('key_model') != null)
                {
                    $('key_model').innerHTML = "";
                }

                // clear tsn field too
                $(this.tsnCtrlId).clear();
                this._oldTsn = "";

                // clear drop down boxes
                eval(this.compGroupCtrlId + ".unloadItems()");
                eval(this.compGroupCtrlId + ".addDemandArg('type', '');");
                eval(this.componentCtrlId + ".unloadItems()");
                eval(this.componentCtrlId + ".addDemandArg('compgrp', '');");

                if (SearchPanel != null)
                {
                    SearchPanel.keyNumber = null;
                    SearchPanel.notifyExtSearch("keyNumber");
                }
                this._infoCleared = true;
            }

            // reset key number infos
            this.returnedKeyNumbers = null;
            this.currentKeyNumberInfoIndex = -1;
            this.com.add('keyNrId', '');
            this._updateKeyNumberSelector();
        }
        return true;

    },

    _onTsnKeyUp: function(e)
    {
        // check if entered key changed the text in the field
        var currentValue = $(this.tsnCtrlId).value;
        if (currentValue == this._oldTsn)
        {
            // nothing relevant happened (cursor could just be moved)
            return true;
        }

        this._oldTsn = $(this.tsnCtrlId).value;

        if (this._oldTsn.length == 3 && this._oldHsn.length == 4)
        {
            this._requestKeyNumber();
        }
        else
        {
            // clear the info fields
            if (!this._infoCleared)
            {
                $('key_category').innerHTML = "";
                $('key_type').innerHTML = "";
                $('key_model').innerHTML = "";

                eval(this.compGroupCtrlId + ".unloadItems()");
                eval(this.compGroupCtrlId + ".addDemandArg('type', '');");
                eval(this.componentCtrlId + ".unloadItems()");
                eval(this.componentCtrlId + ".addDemandArg('compgrp', '');");

                if (SearchPanel != null)
                {
                    SearchPanel.keyNumber = null;
                    SearchPanel.notifyExtSearch("keyNumber");
                }
                this._infoCleared = true;
            }

            // reset key number info
            this.returnedKeyNumbers = null;
            this.currentKeyNumberInfoIndex = -1;
            this.com.add('keyNrId', '');
            this._updateKeyNumberSelector();
        }
        return true;
    },

    _requestProducer: function()
    {
        // do ajax request to get the producer
        var hsn = $(this.hsnCtrlId).value;
        var ajaxRequest = new SmartAjax();
        ajaxRequest.serviceId = "SmabusService";
        ajaxRequest.url = this.ajaxLoaderUrl;
        ajaxRequest.appendRequest("command", "GetProducerSmabusByHSN");
        ajaxRequest.appendRequest("hsn", hsn);
        ajaxRequest.onResponse = this._onRequestProducerResponse.bind(this, hsn);
        ajaxRequest.sendRequest();

        // display the ajaxloader-icon
        if (Master != null)
        {
            Master.setAjaxLoaderIconVisible(true);
        }
    },

    _onRequestProducerResponse: function(argHsn, argAjaxObj)
    {
        // hide the ajaxloader-icon
        if (Master != null)
        {
            Master.setAjaxLoaderIconVisible(false);
        }

        if (argAjaxObj.error == null)
        {
            eval("var producer = " + argAjaxObj.response + ";");
            $('key_producer').update(producer.name);
        }
    },

    _requestKeyNumber: function()
    {
        // do ajax request to get producer / model / category and type associated to the 
        // hsn and tsn keys in the respective fields
        var hsn = $(this.hsnCtrlId).value;
        var tsn = $(this.tsnCtrlId).value;
        var ajaxRequest = new SmartAjax();
        ajaxRequest.serviceId = "SmabusService";
        ajaxRequest.url = this.ajaxLoaderUrl;
        ajaxRequest.appendRequest("command", "GetKeyNumberSmabus");
        ajaxRequest.appendRequest("hsn", hsn);
        ajaxRequest.appendRequest("tsn", tsn);
        ajaxRequest.onResponse = this._onRequestKeyNumberResponse.bind(this, hsn, tsn);
        ajaxRequest.sendRequest();

        // display the ajaxloader-icon
        if (Master != null)
        {
            Master.setAjaxLoaderIconVisible(true);
        }
    },

    _onRequestKeyNumberResponse: function(argHsn, argTsn, argAjaxObj)
    {
        // hide the ajaxloader-icon
        if (Master != null)
        {
            Master.setAjaxLoaderIconVisible(false);
        }

        if (argAjaxObj.error == null)
        {
            // fill the info fields
            eval("var keyNumberInfo = " + argAjaxObj.response + ";");

            this.returnedKeyNumbers = keyNumberInfo;
            this.currentKeyNumberInfoIndex = 0;
            this.com.add('keyNrId', this.returnedKeyNumbers[this.currentKeyNumberInfoIndex].ID);
            this._updateKeyNumberInfoPanel();
            if (this.returnedKeyNumbers.length > 1)
            {
                $('infobox_heading_panelcount').className = 'infobox_heading_middle_highlight';
                Effect.Pulsate('infobox_heading_panelcount', { pulses: 3, duration: 0.8, afterFinish: this._onInfoboxHeadingPulsateFinish.bind(this) });
                $('keynumber_infopanel_infobutton').title = "Es wurden mehrere Modelle zu der eingegebenen Schlüsselnummer gefunden.\nBitte wählen Sie das gewünschte Modell über die links/rechts - Pfeile aus.";
            }
            else
            {
                $('keynumber_infopanel_infobutton').title = "Die eingegeben Schlüsselnummer ist eindeutig";
            }
        }
        else
        {
            alert("Unbekannte Typschlüsselnummer: " + argTsn);
            $('key_category').innerHTML = "";
            $('key_type').innerHTML = "";
            $('key_model').innerHTML = "";
            this._infoCleared = true;
            $(this.tsnCtrlId).clear();
            this._oldTsn = "";
            $(this.tsnCtrlId).focus();

            // reset key number info
            this.returnedKeyNumbers = null;
            this.currentKeyNumberInfoIndex = -1;
            this.com.add('keyNrId', '');
            this._updateKeyNumberSelector();
        }
    },

    _onInfoboxHeadingPulsateFinish: function()
    {
        $('infobox_heading_panelcount').className = 'infobox_heading_middle_enabled';
    },

    _createKeyNumberInfoPanel: function(keyNumberInfo)
    {
        var panel = Builder.node('table', { id: 'keyNumberInfo', className: 'info_table', border: '0', cellspacing: '0', cellpadding: '0' },
        [
            Builder.node('tbody',
            [
                Builder.node('tr',
                [
                    Builder.node('td',
                    [
                        Builder.node('ul', { className: 'infobox_labellist' },
                        [
                            Builder.node('li',
                            [
                                Builder.node('div', { className: 'infobox_listlabel' }, 'Hersteller:')
                            ]),
                            Builder.node('li',
                            [
                                Builder.node('div', { className: 'infobox_listlabel' }, 'Kategorie:')
                            ]),
                            Builder.node('li',
                            [
                                Builder.node('div', { className: 'infobox_listlabel' }, 'Fahrzeugtyp:')
                            ]),
                            Builder.node('li',
                            [
                                Builder.node('div', { className: 'infobox_listlabel' }, 'Modell:')
                            ])
                        ])
                    ]),
                    Builder.node('td',
                    [
                        Builder.node('ul', { className: 'infobox_infolist' },
                        [
                            Builder.node('li',
                            [
                                Builder.node('div', { id: 'key_producer', className: 'infobox_info' }, (keyNumberInfo != null ? keyNumberInfo.ProducerName : ''))
                            ]),
                            Builder.node('li',
                            [
                                Builder.node('div', { id: 'key_category', className: 'infobox_info' }, (keyNumberInfo != null ? keyNumberInfo.CategoryDesc : ''))
                            ]),
                            Builder.node('li',
                            [
                                Builder.node('div', { id: 'key_type', className: 'infobox_info' }, (keyNumberInfo != null ? keyNumberInfo.TypeDesc : ''))
                            ]),
                            Builder.node('li',
                            [
                                Builder.node('div', { id: 'key_model', className: 'infobox_info' }, (keyNumberInfo != null ? keyNumberInfo.ModelDesc + ' ' + keyNumberInfo.ModelEx : ''))
                            ])
                        ])

                    ])

                ])
            ])
        ]);

        return panel;
    },

    _updateKeyNumberSelector: function()
    {
        if (this.returnedKeyNumbers != null)
        {
            $('infobox_heading_panelcount').innerHTML = (this.currentKeyNumberInfoIndex + 1) + ' / ' + this.returnedKeyNumbers.length;
        }
        else
        {
            $('infobox_heading_panelcount').innerHTML = '- / -';
        }

        if (this.returnedKeyNumbers != null && this.returnedKeyNumbers.length > 1)
        {
            $('infobox_heading_panelcount').className = 'infobox_heading_middle_enabled';

        }
        else
        {
            $('infobox_heading_panelcount').className = 'infobox_heading_middle_disabled';
        }

        // leftarrow
        if (this.returnedKeyNumbers == null || this.currentKeyNumberInfoIndex == 0)
        {
            $('infobox_heading_leftarrow').className = 'infobox_heading_left_disabled';
            $('infobox_heading_leftarrow').title = '';
            Event.stopObserving('infobox_heading_leftarrow', 'mousedown', this._bOnKeyNrInfoLeftArrowMouseDown);
            Event.stopObserving('infobox_heading_leftarrow', 'mouseup', this._bOnKeyNrInfoLeftArrowMouseUp);
            Event.stopObserving('infobox_heading_leftarrow', 'click', this._bOnKeyNrInfoLeftArrowClick);
        }
        else
        {
            $('infobox_heading_leftarrow').className = 'infobox_heading_left_enabled';
            $('infobox_heading_leftarrow').title = 'Vorheriges Modell';
            Event.observe('infobox_heading_leftarrow', 'mousedown', this._bOnKeyNrInfoLeftArrowMouseDown);
            Event.observe('infobox_heading_leftarrow', 'mouseup', this._bOnKeyNrInfoLeftArrowMouseUp);
            Event.observe('infobox_heading_leftarrow', 'click', this._bOnKeyNrInfoLeftArrowClick);
        }

        // right arrow
        if (this.returnedKeyNumbers == null || this.currentKeyNumberInfoIndex >= this.returnedKeyNumbers.length - 1)
        {
            $('infobox_heading_rightarrow').className = 'infobox_heading_right_disabled';
            $('infobox_heading_rightarrow').title = '';
            Event.stopObserving('infobox_heading_rightarrow', 'mousedown', this._bOnKeyNrInfoRightArrowMouseDown);
            Event.stopObserving('infobox_heading_rightarrow', 'mouseup', this._bOnKeyNrInfoRightArrowMouseUp);
            Event.stopObserving('infobox_heading_rightarrow', 'click', this._bOnKeyNrInfoRightArrowClick);
        }
        else
        {
            $('infobox_heading_rightarrow').className = 'infobox_heading_right_enabled';
            $('infobox_heading_rightarrow').title = 'Nächstes Modell';
            Event.observe('infobox_heading_rightarrow', 'mousedown', this._bOnKeyNrInfoRightArrowMouseDown);
            Event.observe('infobox_heading_rightarrow', 'mouseup', this._bOnKeyNrInfoRightArrowMouseUp);
            Event.observe('infobox_heading_rightarrow', 'click', this._bOnKeyNrInfoRightArrowClick);
        }
    },

    _updateKeyNumberInfoPanel: function()
    {
        // update keynumber selector display
        this._updateKeyNumberSelector();

        var keyInfoContainer = $('keynumber_infopanel');
        var keyNumberInfoPanel = $('keyNumberInfo');

        // evtl. remove old info panel
        if (keyNumberInfoPanel != null)
        {
            keyInfoContainer.removeChild(keyNumberInfoPanel);
        }

        // create new panel
        if (this.returnedKeyNumbers != null && this.currentKeyNumberInfoIndex > -1 && this.currentKeyNumberInfoIndex < this.returnedKeyNumbers.length)
        {
            keyNumberInfoPanel = this._createKeyNumberInfoPanel(this.returnedKeyNumbers[this.currentKeyNumberInfoIndex]);
        }
        else
        {
            keyNumberInfoPanel = this._createKeyNumberInfoPanel(null);
        }

        // add it to the container
        $('keynumber_infopanel').appendChild(keyNumberInfoPanel);

        // unset info cleared flag
        this._infoCleared = false;

        if (SearchPanel != null)
        {
            if (this.returnedKeyNumbers != null && this.currentKeyNumberInfoIndex > -1 && this.currentKeyNumberInfoIndex < this.returnedKeyNumbers.length)
            {
                SearchPanel.keyNumber = this.returnedKeyNumbers[this.currentKeyNumberInfoIndex];
            }
            else
            {
                SearchtPanel.keyNumber = null;
            }
            SearchPanel.notifyExtSearch("keyNumber");
        }

        // load component groups
        if (this.returnedKeyNumbers != null && this.currentKeyNumberInfoIndex > -1 && this.currentKeyNumberInfoIndex < this.returnedKeyNumbers.length)
        {
            eval(this.compGroupCtrlId + ".addDemandArg('type', '" + this.returnedKeyNumbers[this.currentKeyNumberInfoIndex].TypeId + "');");
            eval(this.componentCtrlId + ".addDemandArg('type', '" + this.returnedKeyNumbers[this.currentKeyNumberInfoIndex].TypeId + "');");
            eval(this.compGroupCtrlId + ".loadItems(true);");
        }

        // update hits count
        this._requestNumberOfHits();
    },

    _onGetExPropertiesResponse: function(argAjaxObj)
    {
        // hide the ajaxloader-icon
        if (Master != null)
        {
            Master.setAjaxLoaderIconVisible(false);
        }

        if (argAjaxObj.error == null)
        {
            var component = null;
            eval("var component = " + argAjaxObj.response + ";");

            // enable/disable other boxes according to response

            // cubic from
            if (this.ccmFCtrlId != null)
            {
                if (component.ccmEx)
                {
                    $(this.ccmFCtrlId).disabled = false;
                    $(this.ccmFCtrlId).className = "txt";
                }
                else
                {
                    $(this.ccmFCtrlId).disabled = true;
                    $(this.ccmFCtrlId).className = "txt_disabled";
                }
            }

            // cubic till
            if (this.ccmTCtrlId != null)
            {
                if (component.ccmEx)
                {
                    $(this.ccmTCtrlId).disabled = false;
                    $(this.ccmTCtrlId).className = "txt";
                }
                else
                {
                    $(this.ccmTCtrlId).disabled = true;
                    $(this.ccmTCtrlId).className = "txt_disabled";
                }
            }

            // color
            if (this.colorCtrlId != null)
            {
                if (component.colorEx)
                {
                    eval(this.colorCtrlId + ".setEnabled(true);");
                }
                else
                {
                    eval(this.colorCtrlId + ".setEnabled(false);");
                }
            }

            // cylinder count
            if (this.cyldrCtrlId != null)
            {
                if (component.cylinderCountEx)
                {
                    eval(this.cyldrCtrlId + ".setEnabled(true);");
                }
                else
                {
                    eval(this.cyldrCtrlId + ".setEnabled(false);");
                }
            }

            // fuel
            if (this.fuelCtrlId != null)
            {
                if (component.fuelEx)
                {
                    eval(this.fuelCtrlId + ".setEnabled(true);");
                }
                else
                {
                    eval(this.fuelCtrlId + ".setEnabled(false);");
                }
            }

            // milage
            if (this.milgFCtrlId != null)
            {
                if (component.milageEx)
                {
                    eval(this.milgFCtrlId + ".setEnabled(true);");
                    eval(this.milgTCtrlId + ".setEnabled(true);");
                }
                else
                {
                    eval(this.milgFCtrlId + ".setEnabled(false);");
                    eval(this.milgTCtrlId + ".setEnabled(false);");
                }
            }

            // power from
            if (this.powerFCtrlId != null)
            {
                if (component.powerEx)
                {
                    $(this.powerFCtrlId).disabled = false;
                    $(this.powerFCtrlId).className = "txt";
                }
                else
                {
                    $(this.powerFCtrlId).disabled = true;
                    $(this.powerFCtrlId).className = "txt_disabled";
                }
            }

            // power till
            if (this.powerTCtrlId != null)
            {
                if (component.powerEx)
                {
                    $(this.powerTCtrlId).disabled = false;
                    $(this.powerTCtrlId).className = "txt";
                }
                else
                {
                    $(this.powerTCtrlId).disabled = true;
                    $(this.powerTCtrlId).className = "txt_disabled";
                }
            }
        }
    },

    _requestNumberOfHits: function()
    {
        eval("var color = " + this.colorCtrlId + ".getSelectedItemValue();");
        eval("var fuelType = " + this.fuelCtrlId + ".getSelectedItemValue();");
        eval("var cylinder = " + this.cyldrCtrlId + ".getSelectedItemValue();");
        eval("var milgf = " + this.milgFCtrlId + ".getSelectedItemValue();");
        eval("var milgt = " + this.milgTCtrlId + ".getSelectedItemValue();");
        eval("var yocf = " + this.yocFCtrlId + ".getSelectedItemValue();");
        eval("var yoct = " + this.yocTCtrlId + ".getSelectedItemValue();");
        eval("var component = " + this.componentCtrlId + ".getSelectedItemValue();");
        eval("var compGroup = " + this.compGroupCtrlId + ".getSelectedItemValue();");
        eval("var country = " + this.countryCtrlId + ".getSelectedItemValue();");

        var number2 = $(this.hsnCtrlId).value;
        var number3 = $(this.tsnCtrlId).value;
        var ccmFrom = $(this.ccmFCtrlId).value;
        var ccmTill = $(this.ccmTCtrlId).value;
        var powerFrom = $(this.powerFCtrlId).value;
        var powerTill = $(this.powerTCtrlId).value;
        var plz = $(this.plzCtrlId).value;
        var cost = $(this.costCtrlId).value;
        var tax = ($(this.taxCtrlId).checked ? "1" : "0");

        if ($(this.stateCtrlId + '_2').checked)
        {
            var state = "_new";
        }
        else if ($(this.stateCtrlId + '_1').checked)
        {
            var state = "used";
        }
        else
        {
            var state = "all";
        }


        var ajaxRequest = new SmartAjax();
        ajaxRequest.serviceId = "SmabusService";
        ajaxRequest.url = this.ajaxLoaderUrl;
        ajaxRequest.appendRequest("command", "GetOfferCountByKeyNr");
        if (this.returnedKeyNumbers != null && this.currentKeyNumberInfoIndex > -1 && this.currentKeyNumberInfoIndex < this.returnedKeyNumbers.length)
        {
            ajaxRequest.appendRequest("keynrid", this.returnedKeyNumbers[this.currentKeyNumberInfoIndex].ID);
        }
        else
        {
            ajaxRequest.appendRequest("keynrid", "");
        }
        ajaxRequest.appendRequest("number2", number2);
        ajaxRequest.appendRequest("number3", number3);
        ajaxRequest.appendRequest("component", component);
        ajaxRequest.appendRequest("compGroup", compGroup);
        ajaxRequest.appendRequest("cylinder", cylinder);
        ajaxRequest.appendRequest("color", color);
        ajaxRequest.appendRequest("fuelType", fuelType);
        ajaxRequest.appendRequest("milgf", milgf);
        ajaxRequest.appendRequest("milgt", milgt);
        ajaxRequest.appendRequest("yocf", yocf);
        ajaxRequest.appendRequest("yoct", yoct);
        ajaxRequest.appendRequest("ccmf", ccmFrom);
        ajaxRequest.appendRequest("ccmt", ccmTill);
        ajaxRequest.appendRequest("powerf", powerFrom);
        ajaxRequest.appendRequest("powert", powerTill);
        ajaxRequest.appendRequest("country", country);
        ajaxRequest.appendRequest("plz", plz);
        ajaxRequest.appendRequest("cost", cost);
        ajaxRequest.appendRequest("tax", tax);
        ajaxRequest.appendRequest("usedState", state);
        ajaxRequest.onResponse = this._onRequestNumberOfHitsResponse.bind(this);
        ajaxRequest.sendRequest();
    },

    _onRequestNumberOfHitsResponse: function(argAjaxObj)
    {
        if (argAjaxObj.error == null && argAjaxObj.response != null && argAjaxObj.response != "")
        {
            eval("var numOfHits = " + argAjaxObj.response + ";");
            $("keysearch_hits").update("Treffer: " + numOfHits);
        }
        else
        {
            $("keysearch_hits").update("Treffer: 0");
        }
    },

    _disableExFields: function()
    {
        // color
        if (this.colorCtrlId != null)
        {
            var colorCtrl = document["cb_" + this.colorCtrlId];
            colorCtrl.setEnabled(false);
        }

        // cylinder count
        if (this.cyldrCtrlId != null)
        {
            var cyldrCtrl = document["cb_" + this.cyldrCtrlId];
            cyldrCtrl.setEnabled(false);
        }

        // fuel
        if (this.fuelCtrlId != null)
        {
            var fuelCtrl = document["cb_" + this.fuelCtrlId];
            fuelCtrl.setEnabled(false);
        }

        // milage
        var milgFCtrl = document["cb_" + this.milgFCtrlId];
        var milgTCtrl = document["cb_" + this.milgTCtrlId];
        milgFCtrl.setEnabled(false);
        milgTCtrl.setEnabled(false);

        // power from
        if (this.powerFCtrlId != null)
        {
            $(this.powerFCtrlId).disabled = true;
            $(this.powerFCtrlId).className = "txt_disabled";
        }

        // power till
        if (this.powerTCtrlId != null)
        {
            $(this.powerTCtrlId).disabled = true;
            $(this.powerTCtrlId).className = "txt_disabled";
        }

        // cubic from
        if (this.ccmFCtrlId != null)
        {
            $(this.ccmFCtrlId).disabled = true;
            $(this.ccmFCtrlId).className = "txt_disabled";
        }

        // cubic till
        if (this.ccmTCtrlId != null)
        {
            $(this.ccmTCtrlId).disabled = true;
            $(this.ccmTCtrlId).className = "txt_disabled";
        }
    },

    _clearExFields: function()
    {
        // color
        if (this.colorCtrlId != null)
        {
            var colorCtrl = document["cb_" + this.colorCtrlId];
            colorCtrl.changeSelection(-1, true);
        }

        // cylinder count
        if (this.cyldrCtrlId != null)
        {
            var cyldrCtrl = document["cb_" + this.cyldrCtrlId];
            cyldrCtrl.changeSelection(-1, true);
        }

        // fuel
        if (this.fuelCtrlId != null)
        {
            var fuelCtrl = document["cb_" + this.fuelCtrlId];
            fuelCtrl.changeSelection(-1, true);
        }

        // milage
        var milgFCtrl = document["cb_" + this.milgFCtrlId];
        var milgTCtrl = document["cb_" + this.milgTCtrlId];
        milgFCtrl.changeSelection(-1, true);
        milgTCtrl.changeSelection(-1, true);

        // power from
        if (this.powerFCtrlId != null)
        {
            $(this.powerFCtrlId).value = "";
        }

        // power till
        if (this.powerTCtrlId != null)
        {
            $(this.powerTCtrlId).value = "";
        }

        // cubic from
        if (this.ccmFCtrlId != null)
        {
            $(this.ccmFCtrlId).value = "";
        }

        // cubic till
        if (this.ccmTCtrlId != null)
        {
            $(this.ccmTCtrlId).value = "";
        }
    },

    _isNumeric: function(sText)
    {
        var ValidChars = "0123456789";
        var IsNumber = true;
        var Char;

        for (i = 0; i < sText.length && IsNumber == true; i++)
        {
            Char = sText.charAt(i);
            if (ValidChars.indexOf(Char) == -1)
            {
                IsNumber = false;
            }
        }
        return IsNumber;
    },

    _isNumericKeyOrControlKey: function(argKeyCode)
    {
        // correct for NumPad digits
        var charCode = -1;
        if (argKeyCode >= 96 && argKeyCode <= 105)
        {
            var charCode = argKeyCode - 48;
        }
        else
        {
            charCode = argKeyCode;
        }
        switch (charCode)
        {
            case Event.KEY_LEFT:
            case Event.KEY_RIGHT:
            case Event.KEY_DELETE:
            case Event.KEY_HOME:
            case Event.KEY_END:
            case Event.KEY_PAGEUP:
            case Event.KEY_PAGEDOWN:
            case Event.KEY_BACKSPACE:
            case Event.KEY_ESC:
            case Event.KEY_TAB:
            case Event.KEY_RETURN:
            case Event.KEY_UP:
            case Event.KEY_DOWN:
                return true;
                break;
        }

        var keyString = String.fromCharCode(charCode);
        if (!this._isNumeric(keyString))
        {
            return false;
        }
        return true;
    }
};
