/**
*	Menu handler.
*	Responsible for menu operations like current status.
*
*   NOTES: 
*   Alle referenties naar GeoMenu_counter_container eruit gehaald.
**/
function cMenu(){
	var aState;				// Stores open elements in menu. Reference by menuitem.id
	var aTree;
	var oMenuElement;		// The menu element
    var iPortal;
    var iRubriek;
	
	/**
	*	Initialize menu class
	**/
	this.init = function(oMenuElement){
		this.oMenuElement = oMenuElement;
		this.oStateMenu = new Object();
		this.oStateCB = new Object();
		this.oStateCategory = new Object();
		this.oTree = new Object();
        this.iPortal = 0;
        this.iRubriek = 0;
	}	

	/**
	*	Call all load state functions
	**/
	this.loadState = function(){
		oMenu.loadDisplayState();
		oMenu.loadCbState();
	}

	/**
	*	Update menu
	**/
	this.update = function(oMenuData){
        
        document.getElementById('GeoMenu_items').innerHTML = oMenuData.sMenuHtml;
        //document.getElementById('GeoMenu_counter_container').innerHTML = oMenuData.sCounterHtml;
        if ( !this.oMenuElement ) {
            this.oMenuElement = $('GeoMenu_items_ul');
        }

        
		oMenu.loadState();
        oMenu.oTree = oMenuData.aMenu;
		oMenu.oCounter = oMenuData.aCounter;
        oMenu._iVisible = oMenuData.iVisible;
        
        if ( this.iPortal > 0 ) {
            oMenu.setPortal();
        }
	}
	
	/**
	*	Return category states, restructured object to array for quicker loops
	**/
	this.getCatStates = function(){
		var aReturn = new Array(); // Redo object to array for speed.
		for ( var k in this.oStateCategory ) {
			if ( this.oStateCategory[k] == false ) {
				aReturn.push(k);
			}
		}
		return aReturn;	
	}

	/************************************************
	*												*
	*	Menu display/hide functions					*
	*												*
	************************************************/
		/**
		*	Toggle referenced id item.
		**/
		this.toggleDisplay = function(sId){
            var oItem = document.getElementById(sId);
            var aClasses = oItem.className.split(' ');
            
            if ( typeof(aClasses[1]) == 'undefined' ) { aClasses[1] = ' '; }
            
            if ( aClasses[0] == 'GeoMenu_closed' ) {
                oItem.className = 'GeoMenu_open ' + aClasses[1];
                oMenu.oStateMenu[sId] = aClasses[1];                
            } else {
                oItem.className = 'GeoMenu_closed ' + aClasses[1]
                delete(oMenu.oStateMenu[sId]);
            }           
		}	
		
        /**
        *   Close all root categories.
        **/
        this.closeRoot = function(iClickedId){
            for ( var k in this.oTree ){
                if ( this.oStateMenu['GeoMenu_hg_' + k] != undefined && k != iClickedId) {
                    this.toggleDisplay('GeoMenu_hg_' + k, this.oStateMenu['GeoMenu_hg_' + k]);
                }
            }
        }
        
        /**
        *   Close all subcategories within given root.
        **/
        this.closeSubs = function(iHg, iSg){
            for ( var k in this.oTree[iHg] ) {
                if ( this.oStateMenu['GeoMenu_sg_' + k] != undefined && k != iSg ) {
                    this.toggleDisplay('GeoMenu_sg_' + k, this.oStateMenu['GeoMenu_sg_' + k ]);
                }
            }
        }
        
        
		/**
		*	Load menu state
		**/
		this.loadDisplayState = function(){
			for ( k in oMenu.oStateMenu ){
				oMenu.toggleDisplay(k, oMenu.oStateMenu[k] );
			}
		}
        
        
        /**
        *   Count current "visible" items whose 
        *   checkboxes arn't checked.
        *   @param string Element which contains the counter.
        **/
        this.countOffItems = function(sElement){
            var iInvisible = 0;
            
            for ( var k in oMenu.oStateCategory ) {
                if ( oMenu.oStateCategory[k] == false ) {
                    if ( oMenu.oCounter[k] > 0 ) {
                        iInvisible += oMenu.oCounter[k];                    
                    }
                }
            }
            $(sElement).innerHTML = oMenu._iVisible - iInvisible;
        }
        

	/************************************************
	*												*
	*	Menu checkbox functions						*
	*												*
	************************************************/
		/**
		*	Toggle a category. Send appropiate commands to cMapObjects
		**/
		this.toggleCategory = function(iId, bDisplay){
			this.setCbState('sg', iId, bDisplay);
			if ( bDisplay ) { oMapObjects.showCategory(iId);
			} else {		  oMapObjects.hideCategory(iId);	}
            
            //oMapObjects.syncCategories();
		}
		
		/**
		*	Toggle parent category.
		**/
		this.toggleParent = function(iId, bDisplay){
            
			var aInfo = new Array();
			this.setCbState('hg', iId, bDisplay);
			
			for ( var k in this.oTree[iId] ) {
				this.setCbState('sg', k, bDisplay);
				aInfo.push(k);
			}
			
			this.setChildCheckboxes('GeoMenu_hg_' + iId, bDisplay);
			
			if ( bDisplay ){
				oMapObjects.showCategoryGroup(aInfo);				
			} else {
				oMapObjects.hideCategoryGroup(aInfo);
			}
            
            //oMapObjects.syncCategories();
		}
		
		/**
		*	Handle checkboxes
		**/
		this.setChildCheckboxes = function(iId, bState){
            var aChildren = document.getElementById(iId).getElementsByTagName('input');
			var i = aChildren.length;
			while ( i-- ){
				aChildren[i].checked = bState;
                oMenu.oStateCB[aChildren[i].id] = bState;
			}
		}
		
		/**
		*	Save checkbox state
		**/
		this.setCbState = function(sG, iId, bChecked){
			oMenu.oStateCB['GeoMenu_' + sG + '_cb_' + iId] = bChecked;			
			if ( sG == 'sg' ) { oMenu.oStateCategory[iId] = bChecked; }
		}
		
		/**
		*   Load checkboxes state into menu.
		**/
		this.loadCbState = function(){
			var aChildren = $('GeoMenu').getElementsByTagName('input');
			var i = aChildren.length;
			while ( i-- ){
				if ( oMenu.oStateCB[aChildren[i].id] == false ) {
					aChildren[i].checked = false;
				} else {
					aChildren[i].checked = true;	
				}
			}           
		}
        
        /**
        *   Toggle all items.
        **/
        this.toggleAll = function(bState){
            /** Geen checkbox!
            var sClick = sClick || '';
        
            var eCb = document.getElementById('toggleAll');
            if ( sClick != 'input' ) {
                eCb.checked = !eCb.checked;
            }
            bState = eCb.checked;
            **/
            if ( bState ) {
                $('toggleOff').className = 'off';
                $('toggleOn').className = 'on';
            } else {
                $('toggleOff').className = 'on';
                $('toggleOn').className = 'off';
            }
                        
            
            this.oStateCB['toggleAll'] = bState;
            this.setChildCheckboxes(this.oMenuElement.id, bState);
            
            for ( var k in this.oTree ) {
                for ( var i in this.oTree[k] ) {
                    this.oStateCategory[i] = bState;
                }
            }
            oMapObjects.setAll( bState );
        }
        
        
        
    /*************************************************
    *                                                *
    *    Filter funtions                             *
    *                                                *
    *************************************************/
        /**
        *   Deprecated function. new optimized code used.
        **/        
        this.updateFilter = function(sFiltername){
            var aCB = $(sFiltername).getElementsByTagName('input');
            var i = aCB.length;
            while ( i-- ) {
                if ( aCB[i].checked ) {
                    oMapObjects.removeFilterItem(sFiltername, aCB[i].id);
                } else {
                    oMenu.oStateCB[aCB[i].id] = aCB[i].checked;
                    oMapObjects.addFilterItem(sFiltername, aCB[i].id);
                }
            }
            oMapObjects.syncCategories();
        }
        
        
        /**
        *  Handle menu clicks for filter.
        **/
        this.filterHandler = function(sFiltername, iId){
            this.toggleAll(true)
            var oCB = $(iId);
            this.oStateCB[iId] = oCB.checked;
            if ( oCB.checked ) {
                oMapObjects.addFilterItem(sFiltername, iId);
            } else {
                oMapObjects.removeFilterItem(sFiltername, iId);
            }
            oMapObjects.syncCategories();            
        }
    
    
        
    /*************************************************
    *                                                *
    *    List items functions                        *
    *                                                *
    *************************************************/
        /**
        *   Get list of all 
        *   @param int iCategory Category to get the list from
        *   @param int iPage Page of the list, defaults to 1.
        **/
        this.getItemList = function(iCategory, iPage){
            var iPage = iPage || 1;
            GDownloadUrl("GeoStart/ajax/getCategoryItems.php?category="+iCategory+"&iPage="+iPage, oMenu.showItemList);
        }
        
        
        /**
        *   Show category item list
        **/
        this.showItemList = function(aData){
            
            aJSON = eval("("+aData+")");
            aInfo = aJSON.oItems;
            iTotal = aJSON.iTotal;
            iPages = aJSON.iPages;
            iPage = aJSON.iPage;
            
            if ( iPage == 1 ) {
                pageHit(sBaseUrl + 'portaal/' + aInfo[0]['hg_titel_key'] + '/' + aInfo[0]['sg_titel_key']);
            }
            
            /** GENERIC MAKE PAGES FUNCTION **/
            makePages(iPage, iPages, "oMenu.getItemList('"+ aInfo[0].sg_id +"',__PAGENR__);", 'liTop', 'liBottom');
            
            var sContent = '';
            
            sContent += '<div style="float: right;"><a href="#" onclick="swap(\'tab\', false);return false;" class="funky left">' + _sTerug + '</a></div>';
                        
            sContent += '<h2>' + aInfo[0]['sg_titel'] +'</h2>';
            sContent += _sCategorielijst_intro + '<br /><br />';
            
            
            sContent += _sCategorielijst_aantal.replace(/__AANTAL__/g, iTotal);
            
            if ( iPages > 20 ) {
                sContent += _sCategorielijst_paginas_max.replace(/__PAGINAS__/g,  iPages);
            } else if ( iPages > 0 ){
                sContent += _sCategorielijst_paginas.replace(/__PAGINAS__/g, iPages);
            }
            
            var iCat = aInfo[0].sg_id;
            
            var sResults = '';
            
            var iLength = aInfo.length;
            
            for (i=0; i<iLength; i++) {
                var lange_omschrijving = aInfo[i]['lange_omschrijving'];
                var id = aInfo[i].id;
                var titel = aInfo[i]['titel'];
                
                if ( titel.length > 40 ) {
                    titel = titel.substring(0, 38) + '...';
                }

                
                var website = aInfo[i].website;
                website = website.replace('http://','');
                var adres = aInfo[i].adres;
                var plaats = aInfo[i].plaats;
                var postcode = aInfo[i].postcode;
                var telefoonnummer = aInfo[i].telefoonnummer;
            
                if ( lange_omschrijving != '' ){
                    var link = '<a class="clean" href="#" onclick="showInfo(' + id + ');return false;" class="funky right">' + _sMeerInfo + '</a>';
                    var linkTitel = '<a class="title" href="#" onclick="swap(\'tab\', false);oMapObjects.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky">' + titel + '</a>';
                    var linkMap = '<a class="clean" href="#" onclick="swap(\'tab\', false);oMapObjects.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky left">' + _sToonopkaart + '</a> | ';
                } else if ( website == '' ) {
                    var link = '';
                    var linkTitel = '<a class="title" href="#" onclick="swap(\'tab\', false);oMapObjects.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky">' + titel + '</a>';
                    var linkMap = '<a class="clean" href="#" onclick="swap(\'tab\', false);oMapObjects.gotoHiddenId('+ parseFloat(id) +');return false;" class="funky left">' + _sToonopkaart + '</a>';
                } else {
                    var link = '<a class="clean" href="http://' + website + '" target="_blank" class="funky up">' + _sBezoekSite + '</a>';
                    var linkTitel = '<a class="title" onclick="swap(\'tab\', false);oMapObjects.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky">' + titel + '</a>';
                    var linkMap = '<a class="clean" href="#" onclick="swap(\'tab\', false);oMapObjects.gotoHiddenId('+ parseFloat(id) +');" class="funky left">' + _sToonopkaart + '</a> | ';
                }
                
                
                
                sResults += '<div class="searchResult"><p class="links">';
                
                sResults += linkTitel;
                
                sResults += linkMap;
                sResults += link;
                sResults += '</p>';
                
                var sAdres = '';
                if ( adres != '' ) { 
                    sAdres += adres;
                    if ( telefoonnummer != '' ) {
                        if ( plaats != '' ) {
                            sAdres += ', ' + plaats;
                        }
                        sAdres += '<br/>';
                    } else {
                        if ( postcode != '' ) {
                            sAdres += '<br>' + postcode + ' ';
                            if ( plaats != '' ) {
                                sAdres += plaats;
                            }
                        } else {
                            sAdres += '<br>' + plaats;
                        }
                    }
                }
                if ( telefoonnummer != '' ) {
                    sAdres += telefoonnummer;
                }
                
                sResults += '<p class="adress">' + sAdres + '</p></div>';
            }  
            sResults += "";
            
            sResults += '<div style="float: right;"><a href="#" onclick="swap(\'tab\', false);return false;" class="funky left">' + _sTerug + '</a></div>';
            
            setTabContent('list');
            
            document.getElementById('listOverview').innerHTML = sContent;
            document.getElementById('listContent').innerHTML = sResults;
            
            swap('tab', true);
            document.getElementById('tabTitleText').innerHTML = 'Alle ' + iTotal + ' uit de rubriek ' + aInfo[i-1]['sg_titel'];
            document.getElementById('iMarkerId').value = '';
            document.getElementById('iCatId').value = aInfo[i-1].sg_id;
            activate('tabTitle');            
        }
        
        
    this.setPortal = function(){
        pageHit();

        this.toggleAll(); 
        if ( this.iRubriek > 0 ) {
            this.toggleDisplay("GeoMenu_hg_" + this.iPortal );
            this.toggleDisplay("GeoMenu_sg_" + this.iRubriek );
            $('GeoMenu_sg_cb_'+ this.iRubriek).checked=true;            
            this.toggleCategory(this.iRubriek, true);
        } else {
            this.toggleParent(this.iPortal, true);
            this.toggleDisplay("GeoMenu_hg_" + this.iPortal );
        }
        this.iPortal = 0;
        this.iRubriek = 0;
    }        
}