RegionaleinheitenPanel = function(config)
{
    this.onlykrsdat = false;
    //-----< apply config >-----------------------------------------------------
    Ext.apply(this, config);
    //-----< create source and destination trees >------------------------------
    this.src_tree = this.createSourceTree();
    this.dst_tree = this.createDestinationTree();
    //-----< create panels for left and right header >--------------------------
    this.leftheader = new Ext.Panel({
        region: 'north',
        height: 60,
        border: false,
        cls : 'drz-regauswahl-head',
        html: '<b>Verfügbare Regionen:</b><br>Navigieren Sie in diesem Baum zu den gewünschten Regionaleinheiten und fügen Sie diese dann durch einen <i>Doppelklick</i> der Liste der augewählten Regionaleinheiten hinzu.'
    });
    this.rightheader = new Ext.Panel({
        region: 'north',
        height: 60,
        border: false,
        cls : 'drz-regauswahl-head',
        html: '<b>Ausgewählte Regionen:</b><br>Diese Regionaleinheiten sind momentan ausgewählt.<br>Sie können einzelne <i>entfernen</i> oder die gesamte Liste <i>leeren</i>.'
    });
    //-----< create panels of left and right side >-----------------------------
    this.leftpanel = new Ext.Panel({
        region: 'west',
        layout: 'border',
        split:true,
        width: 400,
        minSize: 400,
        border: false,
        items: [ this.leftheader, this.src_tree ]
    });
    this.rightpanel = new Ext.Panel({
        region: 'center',
        layout: 'border',
        border: false,
        items: [ this.rightheader, this.dst_tree ]
    });
    //-----< call parent constructor >------------------------------------------
    RegionaleinheitenPanel.superclass.constructor.call(this, {
        layout:'border',
        border:false,
        items: [ this.leftpanel, this.rightpanel ]
    });
    //-----< additional tasks after parents constructor has run >---------------
    this.on('show', this.onShowMe, this);
};

//-----< define new class MerkmalePanel >---------------------------------------
Ext.extend(RegionaleinheitenPanel, Ext.Panel,
{

    // private
    createSourceTree : function()
    {
        //-----< create search combo >------------------------------------------
        var searchstore = new Ext.data.Store({
            proxy: new Ext.data.HttpProxy({
                url: 'services/RegionenSearch.php?source=bayern'
            }),
            reader: new Ext.data.JsonReader({
                root: 'regionen',
                totalProperty: 'count',
                id: 'reg_nr'
            }, [
                {name: 'name', mapping: 'reg_name'},
                {name: 'regnr', mapping: 'reg_nr'}
            ])
        });
        var searchcombo = new Ext.form.ComboBox({
            store: searchstore,
            displayField:'name',
            typeAhead: true,
            mode: 'remote',
            minChars: 2,
            triggerAction: 'all',
            emptyText: 'Suche...',
            loadingText: 'Suche läuft...',
            forceSelection: true,
            selectOnFocus:true,
            width:150
        });
        //-----< create root node >---------------------------------------------
        var rootnode = new Ext.tree.AsyncTreeNode({
            text: 'Bayern',
            draggable:false,
            id:'00'
        });
        //-----< create source tree >-------------------------------------------
        var result = new Ext.tree.TreePanel({
            region:'center',
            animate:true,
            loader: new Ext.tree.TreeLoader({dataUrl:'services/RegionenTree.php?source=bayern',baseAttrs:{uiProvider:Ext.tree.NoDoubleclickExpandTreeNodeUI}}),
            enableDD:false,
            rootVisible:true,
            lines:false,
            autoScroll:true,
            root: rootnode,
            collapseFirst:false,
            singleExpand:false,
            border:false,
            tbar: searchcombo
        });
        //-----< add all listeners >--------------------------------------------
        rootnode.addListener('expand',function(node){node.expandChildNodes(false);});
        result.addListener('dblclick',this.onSourceTreeDblClick,this);
        result.addListener('expandnode',this.iterativeCollapseNeighbours,this);
        result.addListener('resize',function(panel,adjWidth,adjHeight,rawWidth,rawHeight){searchcombo.setWidth(adjWidth)});
        searchcombo.addListener('select',this.onSearchComboSelect,this);
        //-----< return source tree >-------------------------------------------
        return(result);
    },

    // private
    onSourceTreeDblClick : function(node,event)
    {
        //-----< stop event handling >------------------------------------------
        event.stopEvent();
        //-----< check if destination tree is valid >---------------------------
        if(! (this.dst_tree || this.dst_tree.root) )
        {
            return;
        }
        //-----< get type and regnr from node >---------------------------------
        var id = node.id;
        var node_type = id.substr(0,2);
        var node_param = id.substr(2);
        //-----< add to selected list if this is a valid region >---------------
        if( (node_param.length > 0) && ((node_type < 25) || (node_type > 36)) )
        {
            // check for krsdat
            if(this.onlykrsdat)
            {
                if( (node_param.length == 8) && (node_param.substr(5,3) != '000') )
                {
                    Ext.MessageBox.alert('Hinweis','In den Kreisdaten werden nur Regionaleinheiten bis herunter zu Landkreisen<br>und kreisfreien Städten erfasst, nicht jedoch Gemeinden.<br>Wenn Sie eine Tabelle auf Basis der Kreisdaten erzeugen, können Sie keine<br>Gemeinden auswählen.<br>&nbsp;<br>Mit der Schaltfläche <b>Neue Tabelle</b> können Sie eine Tabelle auf Grundlage der<br><b>Gemeindedaten</b> erstellen, in die Sie dann auch Gemeinden aufnehmen können.');
                    return;
                }
            }
            // check if already in list
            var allchilds = this.dst_tree.root.childNodes;
            var i = 0;
            var found = false
            while( (!found) && (i < allchilds.length) )
            {
                if( allchilds[i].regnr == node_param )
                    found = true;
                i++;
            }
            // add new regnr to list
            if(!found)
            {
                var desttreenode = new Ext.tree.TreeNode({
                    text:node.text,
                    draggable:false
                });
                desttreenode.regnr = node_param;
                this.dst_tree.root.appendChild(desttreenode);
                if(!this.dst_tree.root.isExpanded())
                    this.dst_tree.root.expand();
            }
        }
        else
        {
            Ext.MessageBox.alert('Hinweis','Sie können nur Regionaleinheiten auswählen.');
        }
    },

    // private
    onSearchComboSelect : function(combo,record,index)
    {
        //-----< check if destination tree is valid >---------------------------
        if(! (this.dst_tree || this.dst_tree.root) )
        {
            return;
        }
        //-----< check if already in list >-------------------------------------
        var allchilds = this.dst_tree.root.childNodes;
        var i = 0;
        var found = false
        while( (!found) && (i < allchilds.length) )
        {
            if( allchilds[i].regnr == record.get('regnr') )
                found = true;
            i++;
        }
        if(!found)
        {
            var desttreenode = new Ext.tree.TreeNode({
                text:record.get('name'),
                draggable:false
            });
            desttreenode.regnr = record.get('regnr');
            this.dst_tree.root.appendChild(desttreenode);
            if(!this.dst_tree.root.isExpanded())
                this.dst_tree.root.expand();
        }
        //-----< clear combobox >-----------------------------------------------
        combo.reset();
        //combo.clearValue();
        //-----< set focus back to source tree >--------------------------------
        //this.src_tree.focus();
    },

    // private
    createDestinationTree : function()
    {
        //-----< create root node >---------------------------------------------
        var rootnode = new Ext.tree.TreeNode({
            text: 'Ausgewählte Regionen',
            draggable:false
        });
        //-----< create destination tree >--------------------------------------
        var result = new Ext.tree.TreePanel({
            region:'center',
            collapsible: false,
            animate:true,
            enableDD:false,
            rootVisible:false,
            lines:false,
            autoScroll:true,
            root: rootnode,
            collapseFirst:false,
            singleExpand:false,
            border:false,
            tbar: [{
                id:'tabbtn1',
                text: 'Entfernen',
                disabled:false,
                handler:function()
                {
                    var selnode = result.getSelectionModel().getSelectedNode();
                    if(selnode && (selnode != rootnode))
                    {
                        rootnode.removeChild(selnode);
                    }
                },
                scope:this
            },
            {
                id:'tabbtn2',
                text: 'Leeren',
                disabled:false,
                handler:function()
                {
                    while(rootnode.firstChild)
                    {
                        rootnode.removeChild(rootnode.firstChild);
                    }
                },
                scope:this
            }]
        });
        //-----< return destination tree >--------------------------------------
        return(result);
    },

    // private
    iterativeCollapseNeighbours : function(node)
    {
        //-----< we stop at the root node >-------------------------------------
        if(node.isRoot)
            return;
        //-----< get my parent >------------------------------------------------
        var parent = node.parentNode;
        //-----< collapse all childNodes of my parent except me >---------------
        var i;
        for(i = 0; i < parent.childNodes.length; i++)
        {
            var bro = parent.childNodes[i];
            if(bro != node)
            {
                if( parent.isRoot )
                {
                    bro.collapseChildNodes(true);
                }
                else
                {
                    bro.collapse(true,true);
                }
            }
        }
        //-----< continue with parent node >------------------------------------
        this.iterativeCollapseNeighbours(parent);
    },

    // private
    onShowMe : function(me)
    {
        //-----< expand this root node when wizard tab gets activated >---------
        if(!this.src_tree.root.isExpanded())
        {
            this.src_tree.root.expand();
        }
    },

    reset : function()
    {
        //-----< remove all selected regionaleinheiten >------------------------
        if(this.dst_tree && this.dst_tree.root)
        {
            while(this.dst_tree.root.firstChild)
            {
                this.dst_tree.root.removeChild(this.dst_tree.root.firstChild);
            }
        }
        //-----< reset (=collapse) source tree >--------------------------------
        if(this.src_tree && this.src_tree.root )
        {
            var topnodes = this.src_tree.root.childNodes;
            for(var i = 0; i < topnodes.length; i++)
            {
                var topnode = topnodes[i];
                var allchilds = topnode.childNodes;
                for(var ii = 0; ii < allchilds.length; ii++)
                {
                    allchilds[ii].collapse(true,false);
                }
            }
        }
    },

    getRegionaleinheiten : function()
    {
        //-----< create empty array for results >-------------------------------
        var result = Array();
        //-----< check if destination tree is valid >---------------------------
        if(! (this.dst_tree || this.dst_tree.root) )
        {
            return(result);
        }
        //-----< check if destination tree is valid >---------------------------
        var allchilds = this.dst_tree.root.childNodes;
        for(var i = 0; i < allchilds.length; i++)
        {
            result[i] = { name : allchilds[i].text, regnr : allchilds[i].regnr };
        }
        //-----< return the results >-------------------------------------------
        return(result);
    },

    addRegionaleinheiten : function(regnrs)
    {
        //-----< append all regnrs >--------------------------------------------
        for(var i = 0; i < regnrs.length; i++)
        {
            var desttreenode = new Ext.tree.TreeNode({
                text : regnrs[i].name,
                draggable:false
            });
            desttreenode.regnr = regnrs[i].regnr;
            this.dst_tree.root.appendChild(desttreenode);
        }
    }

});
