/**
*	Menu handler.
*	Responsible for menu operations like current status.
**/
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(sMenuElement, sMenuItemsElement, sMenuCounterElement ){
        this.oMenuElement = document.getElementById(sMenuElement);
        this.oMenuItemsElement = document.getElementById(sMenuItemsElement);
		this.oMenuCounterElement = document.getElementById(sMenuCounterElement);
		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){
        
        if ( oSettings._bMenu !== false ) {
            this.oMenuItemsElement.innerHTML = oMenuData.sMenuHtml;
            this.oMenuCounterElement.innerHTML = oMenuData.sCounterHtml;
        }
        
        oMenu.loadState();
        oMenu.oTree = oMenuData.aTree;
		oMenu.oCounter = oMenuData.aMenu;
        oMenu._iVisible = oMenuData.iVisible;
        oMenu.oCatOf = oMenuData.oPointToCat;
        oMenu.iHidden = oMenuData.iHidden;
        
        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.oStateMenu ) {
                if ( this.oStateMenu[k] == " " && k != "GeoMenu_sg_"+iSg ) {
                    this.toggleDisplay(k, this.oStateMenu[k]);
                }
            }
        }
        
        
		/**
		*	Load menu state
		**/
		this.loadDisplayState = function(){
			for ( k in oMenu.oStateMenu ){
                if ( k.indexOf('_route') == -1 ) {
				    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){
            if ( $(sElement) ) {
                $(sElement).innerHTML = oGeoStart.getVisiblityCounters().iVisible;                
            }
        }
        

        this.openMenuGroup = function(sId){
            if ( !this.oHeaders ) { this.initMenuGroup(); }        
            for ( var k in this.oHeaders ) {
                if ( k == sId ) {
                    this.oHeaders[k]['menu'].style.display = "";
                    //this.oHeaders[k]['header'].getElementsByTagName('a')[0].innerHTML = "";
                    this.oHeaders[k].action();
                } else {
                    this.oHeaders[k]['menu'].style.display = "none";
                    //this.oHeaders[k]['header'].getElementsByTagName('a')[0].innerHTML = "<img src='images/help_plus.gif'>";
                    this.oHeaders[k]['header'].style.borderTop = "1px solid #D9D9D9";
                    //this.oHeaders[k].action();
                }
            }
        }
        
        this.initMenuGroup = function(){
            this.oHeaders = new Object();
            this.oHeaders = { 'rubrieken': {'menu':    document.getElementById('menu_rubrieken'),
                                            'header':  document.getElementById('header_rubrieken'),
                                            'action':  function(){ oMenu.toggleAll(true); oGeoStart.oRoutes.hide(); }},
                              'routes':    {'menu':    document.getElementById('menu_routes'),
                                            'header':  document.getElementById('header_routes'),
                                            'action':  function(){ oMenu.toggleAll(false); oGeoStart.oRoutes.show(); }}
                                            };
        }
        
	/************************************************
	*												*
	*	Menu checkbox functions						*
	*												*
	************************************************/
		/**
		*	Toggle a category. Send appropiate commands to cMapObjects
		**/
		this.toggleCategory = function(iId, bDisplay){
			this.setCbState('sg', iId, bDisplay);
			if ( bDisplay ) { oGeoStart.showCategory(iId);
			} else {		  oGeoStart.hideCategory(iId);	}
		}
		
        /**
        *   Handle click of open HG. If currently closed, make sure the markers become visible.
        **/
        this.handleOpenHg = function(iId){        
            var sResult = $('GeoMenu_hg_'+iId).className.indexOf('closed');
            if ( sResult != -1 ) {
                this.toggleParent(iId, true);
            }            
        }
        
		/**
		*	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 ){
				oGeoStart.showCategoryGroup(aInfo);
			} else {
				oGeoStart.hideCategoryGroup(aInfo);
			}
		}
		
		/**
		*	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 = this.oMenuElement.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(sClick){
            var sClick = sClick || '';        
        
            var eCb = document.getElementById('toggleAll');
            
            if ( eCb.type == 'checkbox' ) {                
                if ( sClick != 'input' ) {
                    eCb.checked = !eCb.checked;
                }
                bState = eCb.checked;
            } else {            
                bState = sClick;
                if ( sClick ) {
                    $('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;
                }
            }
            
            oGeoStart.setAll( bState );
        }
        
    /*************************************************
    *                                                *
    *    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_key + '/' + aInfo[0].sg_key );
            }
            
            /** GENERIC MAKE PAGES FUNCTION **/
            makePages(iPage, iPages, "oMenu.getItemList('"+ aInfo[0].sg_id +"',__PAGENR__);", 'liTop', 'liBottom');
            
            var sContent = '';
            
            sContent = '<h2>' + aInfo[0].sg_titel +'</h2>';
            sContent += 'Hieronder vind u de lijst van de gekozen rubriek. Klik op de items voor de locatie of om meer informatie te bekijken.<br /><br />';
            
            
            sContent += 'De huidige categorie bevat ' + iTotal + ' locaties';
            
            if ( iPages > 20 ) {
                sContent += '. De eerste 20 van totaal ' + iPages + ' pagina\'s kunnen worden getoond.';
            } else if ( iPages > 0 ){
                sContent += ' verdeeld over ' + iPages + ' pagina\'s';
            } else {
                sContent += '.';
            }
            
            var iCat = aInfo[0].sg_id;
            
            var sResults = '';
            
            var iLength = aInfo.length;
            
            for (i=0; i<iLength; i++) {
                var omschrijving = aInfo[i].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 ( omschrijving != '' ){
                    var link = '<a class="clean" href="#" onclick="showInfo(' + id + ');" class="funky right">Meer informatie</a>';
                    var linkTitel = '<a class="title" href="#" onclick="swap(\'tab\', false);oGeoStart.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky">' + titel + '</a>';
                    var linkMap = '<a class="clean" href="#" onclick="swap(\'tab\', false);oGeoStart.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky left">Toon op kaart</a> | ';
                } else if ( website == '' ) {
                    var link = '';
                    var linkTitel = '<a class="title" href="#" onclick="swap(\'tab\', false);oGeoStart.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky">' + titel + '</a>';
                    var linkMap = '<a class="clean" href="#" onclick="swap(\'tab\', false);oGeoStart.gotoHiddenId('+ parseFloat(id) +');return false;" class="funky left">Toon op kaart</a>';
                } else {
                    var link = '<a class="clean" href="http://' + website + '" target="_blank" class="funky up">Bekijk website</a>';
                    var linkTitel = '<a class="title" href="#" onclick="swap(\'tab\', false);oGeoStart.gotoHiddenId('+  parseFloat(id) +');return false;" class="funky">' + titel + '</a>';
                    var linkMap = '<a class="clean" href="#" onclick="swap(\'tab\', false);oGeoStart.gotoHiddenId('+ parseFloat(id) +');" class="funky left">Toon op kaart</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 += "";
            
            
            
            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;
    }        
}
