function NaviGen(iFather, sDivName, sNaviName)
{
    this.iStartFather  = (!iFather) ? 0 : iFather;
		this.aCatsFathers  = new Array();
		this.aPages	 	     = new Array();
		this.aPageCalls	 = new Array();
		this.aCatCalls	 = new Array();
		this.aPagesCats	 	 = new Array();
		this.aCats	 	     = new Array();
		this.aTemplates	 	 = new Array();
		sNaviName = (!sNaviName) ? 'default' : sNaviName;
		sDivName = (!sDivName) ? 'NaviDiv' : sDivName;
		this.aNaviData			   = new Array();
		this.aNaviData['sNaviObject'] = sNaviName;
		this.aNaviData['sDivObject'] = sDivName;  
		this.aNaviData['iStartFather'] = iFather;  
		this.aNaviUrlData			   = new Array();
		
}

NaviGen.prototype.addToCommonUri = function(sVar, sValue)
{
    if(sVar != "") {
		    this.aNaviUrlData[sVar] = sValue;
		}
}

NaviGen.prototype.addCat = function(iFather, iCat, iPage, sCall, sTitle, sDesc)
{
    this.aCatsFathers[iCat] = iFather;
		if(!this.aCats[iFather]) {
		    this.aCats[iFather] = new Array();
		}
		this.aCats[iFather][iCat] 		= new Array();
		this.aCats[iFather][iCat]['sTitle'] = sTitle;
		this.aCats[iFather][iCat]['sDesc'] = sDesc;
		this.aCats[iFather][iCat]['iCat'] = iCat;
		this.aCats[iFather][iCat]['iPage'] = iPage;
		this.aCatCalls[iCat] = (!sCall || sCall == 'nocall') ? 'nocall' : 'call';
}

NaviGen.prototype.addPage = function(iCat, iPage, sCall, sTitle, sDesc)
{
    this.aPagesCats[iPage] = iCat;
		if(!this.aPages[iCat]) {
		    this.aPages[iCat] = new Array();
		}
		this.aPages[iCat][iPage] = new Array();
		this.aPages[iCat][iPage]['sTitle'] = sTitle;
		this.aPages[iCat][iPage]['sDesc'] = sDesc;
		this.aPages[iCat][iPage]['iPage'] = iPage;
		this.aPages[iCat][iPage]['iCat'] = iCat;
		this.aPageCalls[iPage] = (!sCall || sCall == 'nocall') ? 'nocall' : 'call';
}

NaviGen.prototype.trackBack = function(iCat, iPage)
{
    this.aOpenedFathers = new Array();
		this.aOpenedPages   = new Array();
		iCat = (!iCat) ? this.aPagesCats[iPage] : iCat;
		if(iPage > 0) {
		   this.aOpenedPages[iPage] = true;
		}
		this.aOpenedFathers[this.iStartFather] = true;
		while(this.aCatsFathers[iCat] >= 0) {
		    this.aOpenedFathers[iCat] = true;
				iCat = this.aCatsFathers[iCat];
		}
}

NaviGen.prototype.setTemplate = function(sName, iLevel, sItem, sFeature, sCall, sContent)
{
    sCall = (!sCall || sCall == 'nocall') ? 'nocall' : 'call';
		if(!this.aTemplates[sName]) {
		    this.aTemplates[sName] = new Array();
		}
		if(!this.aTemplates[sName][iLevel]) {
		    this.aTemplates[sName][iLevel] = new Array();
		}
		if(!this.aTemplates[sName][iLevel][sItem]) {
		    this.aTemplates[sName][iLevel][sItem] = new Array();
		}
		if(!this.aTemplates[sName][iLevel][sItem][sCall]) {
		    this.aTemplates[sName][iLevel][sItem][sCall] = new Array();
		}
		this.aTemplates[sName][iLevel][sItem][sCall][sFeature] = sContent;
}

NaviGen.prototype.getTemplate = function(sName, iLevel, sItem, sFeature, sCall)
{
    sCall = (!sCall || sCall == 'nocall') ? 'nocall' : 'call';
		iLevel = (!this.aTemplates[sName] || !this.aTemplates[sName][iLevel]) ? 0 : iLevel;
		sDebug = '<!-- ' + sName + '|' + iLevel + '|' + sItem + '|' + sCall + '|' + sFeature + ' //-->\n';
		//alert(sDebug);
		if(this.aTemplates[sName] && this.aTemplates[sName][iLevel][sItem][sCall][sFeature]) {
		return '\n' + sDebug + this.aTemplates[sName][iLevel][sItem][sCall][sFeature] + '\n';
		}
}

NaviGen.prototype.getTemplateParsed = function(sName, iLevel, sItem, sFeature, sCall, aData, aNaviData)
{
		sCall = (!sCall || sCall == 'nocall') ? 'nocall' : 'call';
		iLevel = (!this.aTemplates[sName] || !this.aTemplates[sName][iLevel]) ? 0 : iLevel;
		sContent = this.getTemplate(sName, iLevel, sItem, sFeature, sCall);
		for(var sContentName in aData) {
		    sRegExp = new RegExp('{NAV:' + sContentName + '}');
				sContent = sContent.replace(sRegExp, aData[sContentName]);
		}
		for(var sNaviContentName in aNaviData) {
				sRegExp = new RegExp('{NAV:' + sNaviContentName + '}');
				sContent = sContent.replace(sRegExp, aNaviData[sNaviContentName]);
		}
		aTempCommonUriData = new Array();
		iTempCount = 0;
		for(var sUrlData in this.aNaviUrlData) {
		    sTempUriData = sUrlData + '=' + this.aNaviUrlData[sUrlData];
				aTempCommonUriData[iTempCount++] = sTempUriData;
		}
		sRegExp = new RegExp('{NAV:URIDATA}');
		sContent = sContent.replace(sRegExp, aTempCommonUriData.join('&'));
		sRegExp = new RegExp('{NAV:.*}');
		sContent = sContent.replace(sRegExp, '');
		return sContent;
}

NaviGen.prototype.changeNavi = function(iCat, iPage)
{
    sMenu = this.getNavi(iCat, iPage);
		document.getElementById(this.aNaviData['sDivObject']).innerHTML = sMenu;
		if(document.getElementById('naviDebugger')) {
		     document.getElementById('naviDebugger').value = sMenu;
		}
}

NaviGen.prototype.getNavi = function(iCat, iPage)
{
    this.trackBack(iCat, iPage);
		sMenu = this.buildCats(this.iStartFather);
		return sMenu;
}

NaviGen.prototype.buildNavi = function(iCat, iPage, sTemplate)
{
    //alert('drin');
		this.sTemplate = sTemplate;
		sMenu = this.getNavi(iCat, iPage);
		//alert(sMenu);
		document.write(sMenu);
		if(document.getElementById('naviDebugger')) {
		     document.getElementById('naviDebugger').value = sMenu;
		}
}

NaviGen.prototype.buildCats = function(iFather, iLevel)
{
    //alert('fuck');
		var sMenu = '';
		iLevel = (!iLevel) ? 0 : iLevel;
		if(iFather >= 0&& this.aOpenedFathers[iFather]) {
		//alert(this.sTemplate);
		    sMenu = sMenu + this.getTemplateParsed(this.sTemplate, iLevel, 'cats_start', ((!this.aOpenedFathers[iFather]) ? 'closed' : 'opened'), this.aCatCalls[iFather], this.aNaviData);
		    if(this.aCats[iFather] && this.aCats[iFather].length > 0) {
				    //this.aCats[iFather]['sTemplate'] = this.sTemplate;
    				for(var iCat in this.aCats[iFather]) {
  		          sMenu = sMenu + this.getTemplateParsed(this.sTemplate, iLevel, 'cat_item', ((!this.aOpenedFathers[iCat]) ? 'closed' : 'opened'), this.aCatCalls[iCat], this.aCats[iFather][iCat], this.aNaviData);
						    sMenu = sMenu + this.buildCats(iCat, iLevel + 1);																			
    				}
				} 
				if(this.aPages[iFather] && this.aPages[iFather].length > 0) {
				    sMenu = sMenu + this.buildPages(iFather, iLevel);
    		}			
				sMenu = sMenu + this.getTemplateParsed(this.sTemplate, iLevel, 'cats_end', ((!this.aOpenedFathers[iFather]) ? 'closed' : 'opened'), this.aCatCalls[iFather], this.aNaviData);
		}
		return sMenu;
		
}

NaviGen.prototype.buildPages = function(iCat, iLevel)
{
    var sMenu = '';;
		if(iCat >= 0 && this.aPages[iCat]) {
		     sMenu = sMenu + this.getTemplateParsed(this.sTemplate, iLevel, 'pages_start', ((!this.aOpenedFathers[iCat]) ? 'closed' : 'opened'), this.aCatCalls[iCat], this.aNaviData);
				for(var iPage in this.aPages[iCat]) {
				    sMenu = sMenu + this.getTemplateParsed(this.sTemplate, iLevel, 'page_item', ((!this.aOpenedPages[iPage]) ? 'closed' : 'opened'), this.aPageCalls[iPage], this.aPages[iCat][iPage], this.aNaviData);
				}
				sMenu = sMenu + this.getTemplateParsed(this.sTemplate, iLevel, 'pages_end', ((!this.aOpenedFathers[iCat]) ? 'closed' : 'opened'), this.aCatCalls[iCat], this.aNaviData);
		}
		return sMenu;
}	
		
