/** 
 * javascript zum qualifizieren über specs tree
 * SpecialPreorderedElementsXML -> spex :)
 */

/* global {{{*/
    var myGlobalHandlers = {
        onCreate: function( ){
            $( 'systemWorking' ).style.display = 'block';
        },

        onComplete: function() {
            if(Ajax.activeRequestCount == 0 ){
                $( 'systemWorking' ).style.display = 'none';
            }
        }
    };
    Ajax.Responders.register(myGlobalHandlers);
/*}}}*/

/**
 * recursive funktion zum einlesen des baums
 * sTree.childNodes werden eingelesen, geprüft und zu sBaseGroup hinzugefügt
 * enhalten sie nicht "leaf" elemente werden deren childnodes ebenfalls gechcket
 */
        function createOpts( sBaseGroup, sTree, sType, sEdit  ) {/*{{{*/
            var xmlRows = sTree.childNodes;

            for( var i=0; i < xmlRows.length; i++ ) { 

                var xmlRow = xmlRows[i]; 


                if( xmlRow.nodeName == 'optgroup' || xmlRow.nodeName == 'option' ) {

                    linkId      = xmlRow.getElementsByTagName( 'id' )[0].firstChild.data; 
                    sId         = sType+'-'+sEdit+'-'+linkId;
                    linkId      = sId;

                    sClass      = xmlRow.getElementsByTagName( 'class' )[0].firstChild.data; 
                    sText       = xmlRow.getElementsByTagName( 'text' )[0].firstChild.data; 


                    //sLft        = xmlRow.getElementsByTagName( 'lft' )[0].firstChild.data; 
                    //sRght       = xmlRow.getElementsByTagName( 'rght' )[0].firstChild.data; 
                    //sHits       = xmlRow.getElementsByTagName( 'hits' )[0].firstChild.data; 
                    //if( sHits ) { sText = sText+' ('+sHits+')'; }

                    sSelected   = '';
                    sSelected   = xmlRow.getElementsByTagName( 'selected' )[0].firstChild.data; 


                    var sOpt       = document.createElement( 'li' ); 
                    sOpt.id        = sId;
                    sOpt.className = sClass;

                    if( sClass != 'level0' ) {

                        sTextNode   = document.createTextNode( sText );
                        sLink       = document.createElement( 'a' );
                        sLink.appendChild( sTextNode );
                        var selHandler = new selectHandler( sLink, linkId, sType );

                        if( sSelected == 'selected' ) {
                            sOpt.active = true;
                            sLink.className = 'selected';
                        }

                     } else {

                        sLink = document.createTextNode( sText ); // hierher ausklapp link legen 
                        
                     }

//if( sText == 'kein Eintrag' ) {
//alert( 't '+sClass );
////alert( 'sText: '+xmlRow.nodeName+' '+sText+' '+sBaseGroup );
//}
//
//
//if( sText == 'kein Eintrag' ) {
//alert( 'rt' );
////alert( 'sText: '+xmlRow.nodeName+' '+sText+' '+sBaseGroup );
//}

                    //Opt.rght      = sRght;
                    //Opt.lft       = sLft;
                    sOpt.appendChild( sLink );


                    if( xmlRow.nodeName == 'optgroup' ) {

                        var sGroup          = document.createElement( 'ul' ); 
                        sGroup.className    = sClass;

                        sGroup = createOpts( sGroup, xmlRow, sType, sEdit );
                        sOpt.appendChild( sGroup );
                    }

                    sBaseGroup.appendChild( sOpt );
                }
            }

            return sBaseGroup;

        }/*}}}*/


/**
 * eventhandler für tree elemente 
 */
        var selectHandler = Class.create( );/*{{{*/
        selectHandler.prototype = {
            initialize: function( target, id, sType ) {
                this.sId = id;
                this.sType = sType;
                target.onclick = this.selectionToggle.bindAsEventListener( this );
            },

            selectionToggle: function( ) {
                var check = false;
                var tElem = $( this.sId )

                if( this.sType == 't_tree_byid' ) {
                    sId2 = this.sId.replace( 't_tree_byid', 't_tree_byname' );
                    var tElem2 = document.getElementById( sId2 )
                } else if( this.sType == 't_tree_byname' ) {
                    sId2 = this.sId.replace( 't_tree_byname', 't_tree_byid' );
                    var tElem2 = document.getElementById( sId2 )
                }

                if( tElem ) {
                    if( tElem.active ) { 
                        check = this.selectionOff( tElem, 1 ); 
                        if( tElem2 ) {
//alert( 'off2' );
                            this.selectionOff( tElem2, 1 );
                        }
                    } else if( tElem ) { 
                        check = this.selectionOn( tElem ); 
                        if( tElem2 ) {
//alert( 'on2' );
                            this.selectionOn( tElem2 );
                        }
                    }
                }

                return true;
            },

            selectionOn: function( elem ) {
//alert( 'updateSelection: activating '+elem );
                elem.active = true;

                $A( elem.getElementsByTagName( 'LI' )).each(
                    function( elem ) {
                        elem.active = true;
                    }
                );
                $A( elem.getElementsByTagName( 'A' )).each(
                    function( elem ) {
                        elem.className = 'selected';
                    }
                );

                if( elem.parentNode.parentNode.nodeName == 'LI' ) {
                    parentActive = true;
                    $A( elem.parentNode.parentNode.getElementsByTagName( 'LI' )).each(
                        function( childNode ) {
                            if( childNode.nodeName == 'LI' && !childNode.active ) {
                                parentActive = false;
                            }
                        }
                    );
                    if( parentActive ) {
                        return this.selectionOn( elem.parentNode.parentNode );
                    }
                }
                return false;
            },
            selectionOff: function( elem, deep ) {
                elem.active = false;
                if( elem.parentNode.parentNode.nodeName == 'LI' && elem.parentNode.parentNode.active ) {
                   this.selectionOff( elem.parentNode.parentNode, 0 );
                }
                if( deep ) {
                    $A( elem.getElementsByTagName( 'LI' )).each(
                        function( elem ) {
                            elem.active = false;
                        }
                    );
                    $A( elem.getElementsByTagName( 'A' )).each(
                        function( elem ) {
                            elem.className = '';
                        }
                    );
                } else {
                    $A(elem.childNodes).each(
                        function( childNode ) {
                            if( childNode.className ) {
                                childNode.className = '';
                            }
                        }
                    );
                }
                return false;
            }
        }/*}}}*/


/**
 * submit funktion
 * einsammeln und senden der daten via form
 */
        function spexSubmit( form, nodes, errMsg ) {/*{{{*/
            spexForm = $( form );
            for( var k=0; k < nodes.length ;k++ ) {
                elements =  $( nodes[k] ).getElementsByTagName( 'LI' );
                tElem   = false;
                for( var i=0; i < elements.length ;i++ ) {
                    elem    = elements[i];
                    elemId  = elem.getAttribute( 'id' );

                    if( elem.active ) {
                        tElem = true;
                        var sFormElem   = document.createElement( 'input' );
                        var sType       = document.createAttribute( 'type' );
                        var sName       = document.createAttribute( 'name' );
                        var sValue      = document.createAttribute( 'value' );
                        sType.nodeValue = 'hidden';
                        //sName.nodeValue = 'spex[]';
                        sName.nodeValue = 'spex['+nodes[k]+'][]';
                        sValue.nodeValue = elemId;
                        sFormElem.setAttributeNode( sType );
                        sFormElem.setAttributeNode( sName );
                        sFormElem.setAttributeNode( sValue );
                        spexForm.appendChild( sFormElem );
                    }
                }
                if( errMsg[k] && !tElem ) { 
                    alert( errMsg[k] );
                    return false;
                }
            }
            return true;
        }/*}}}*/

        function spexSubmitOr( form, nodes, errMsg ) {/*{{{*/
            spexForm = $( form );
            for( var k=0; k < nodes.length ;k++ ) {
                elements =  $( nodes[k] ).getElementsByTagName( 'LI' );
                tElem   = false;
                for( var i=0; i < elements.length ;i++ ) {
                    elem    = elements[i];
                    elemId  = elem.getAttribute( 'id' );

                    if( elem.active ) {
                        tElem = true;
                        var sFormElem   = document.createElement( 'input' );
                        var sType       = document.createAttribute( 'type' );
                        var sName       = document.createAttribute( 'name' );
                        var sValue      = document.createAttribute( 'value' );
                        sType.nodeValue = 'hidden';
                        sName.nodeValue = 'spex['+nodes[k]+']['+i+']';
                        sValue.nodeValue = elemId;
                        sFormElem.setAttributeNode( sType );
                        sFormElem.setAttributeNode( sName );
                        sFormElem.setAttributeNode( sValue );
                        spexForm.appendChild( sFormElem );
                    }
                }
//                if( errMsg[k] && !tElem ) { 
//                    alert( errMsg[k] );
//                    return false;
//                }
            }
            return true;
        }/*}}}*/


        function spexSend( sNodes, tNodes ) {/*{{{*/
            sReturn = 'ss=';
            sText   = '';

            for( var k=0; k < sNodes.length ;k++ ) {

                var sourceDiv = $( sNodes[k][1] );
                var sourceNode = $( sNodes[k][0] );
                var replaceDiv = $( sNodes[k][2] );
                var replaceList = replaceDiv.getElementsByTagName( 'UL' )[0];

                elements =  sourceNode.getElementsByTagName( 'LI' );
                replaceList.innerHTML = '';
                tElem   = false;

                var j=0;
                for( var i=0; i < elements.length ;i++ ) {
                    elem        = elements[i];
                    elemId      = elem.getAttribute( 'id' );
                    elemLft     = elem.lft;
                    elemRght    = elem.rght;

                    if( elem.active ) {
                        tElem = true;
                        sReturn = sReturn+'&ss['+k+']['+j+']='+elemId;
                        sText = document.createElement( 'li' );
                        //sText. = elem.getElementsByTagName( 'a' )[0].innerHTML;
                        sText.appendChild( document.createTextNode( elem.getElementsByTagName( 'a' )[0].innerHTML ));
                        replaceList.appendChild( sText );
                        j ++;
                    }
                }
                sourceDiv.style.display = 'none';
                replaceDiv.style.display = 'blocK';
            }

            if( tNodes ) {
                for( var k=0; k < tNodes.length ;k++ ) {
                    if( tNodes[k][3] ) {
                        var tArgs = sReturn+tNodes[k][3];
                    } else {
                        var tArgs = sReturn;
                    }
                    var spexSel = new spexSelect( tNodes[k][0], tNodes[k][1], tArgs );
                    containerDiv = $( tNodes[k][2] );
                    if( containerDiv ) {
                        containerDiv.style.display = 'block';
                    }
                }
            }
            return false;
        }/*}}}*/

/**
 * neues select element anlegen 
 */
    var spexSelect = Class.create();/*{{{*/
    spexSelect.prototype = {

       initialize: function( sIndex, sType, sParams ) {
            this.sIndex = sIndex;
            this.sType  = sType;
            this.sParams = sParams;
            this.loadValues( );
//            if( sType != 'undefined' ) { this.sType = sType; }
//            else { this.sType = 't_tree_byid'; }
//alert( sType );
            return true;
       },

       loadValues: function( ) {
        var url     = '/xml/spex/' + this.sType + '/' + this.sIndex;

        debugUrl = $( 'url_out' );
        if( debugUrl ) {
            debugUrl.innerHTML = debugUrl.innerHTML+'<br><a href="'+url+'?'+this.sParams+'">'+url+'?'+this.sParams+'</a>';
        }
        spexServer = new Ajax.Request( 
                            url, 
                              { 
                                method: 'get', 
                                parameters: this.sParams,
                                onComplete: this.updateContent
                               });
            return true;
        },

        updateContent: function( serverResponse ) {
            var xmlDoc  = serverResponse.responseXML;
            var sTree   = xmlDoc.getElementsByTagName( 'tree' ); 
            sTree       = sTree[0];

            var sType   = sTree.getAttributeNode( 'type' ).value;
            var sEdit   = sTree.getAttributeNode( 'edit' ).value;

            var sSelect     = $( 'spex-'+sType+'-'+sEdit );

            sSelect.innerHTML = '';
            sSelect         = createOpts( sSelect, sTree, sType, sEdit );
//alert( 'sEdit'+sEdit );
            sSelect.name    = sEdit;
            return true;
        }
    };/*}}}*/


