//
//  iWeb - navbar.js
//  Copyright (c) 2007 Apple Inc. All rights reserved.
//

function NavBar(instanceID){
	if(instanceID){
		Widget.apply(this,arguments);
		if(!this.preferenceForKey("useStaticFeed")&&this.preferenceForKey("dotMacAccount")){
			var depthPrefix=this.preferenceForKey("path-to-root");
			if(!depthPrefix||depthPrefix=="")depthPrefix="./";
			this.xml_feed=depthPrefix+"?webdav-method=truthget&depth=infinity&ns=iweb&filterby=in-navbar";
			}
		else{
			this.xml_feed="feed.xml";
			if(this.sitePath){
				this.xml_feed=this.sitePath+"/"+this.xml_feed;
				}
			}
		this.changedPreferenceForKey("navbar-css");
		this.regenerate();
		}
	}

NavBar.prototype=new 
Widget();
NavBar.prototype.constructor=NavBar;
NavBar.prototype.widgetIdentifier="com-apple-iweb-widget-NavBar";
NavBar.prototype.regenerate=function(){
	var xml_handler=this.PopulateNavItems.bind(this);
	ajaxRequest(this.xml_feed,xml_handler);
	return true;
	}
	
NavBar.prototype.getStyleElement=function(key){
	if(!this.styleElement){
		var head=document.getElementsByTagName("head")[0];
		if(head){
			var newElement=document.createElement("style");
			newElement.type="text/css";
			head.appendChild(newElement);
			this.styleElement=newElement;
			}
		}
	return this.styleElement;
	}
	
NavBar.prototype.substWidgetPath=function(text){
	var result=text.replace(/\$WIDGET_PATH/gm,this.widgetPath);
	return result;
	}
	
NavBar.prototype.addCSSSelectorPrefix=function(text){
	var prefix="div#"+this.instanceID+" ";
	text=text.replace(/\/\*[^*]*\*+([^/][^*]*\*+)*\//gm,"");
	text=text.replace(/(^\s*|\}\s*)([^{]+)({[^}]*})/gm,function(match,beforeSelectorList,selectorList,propertyList){
															var result=beforeSelectorList;
															var selectors=selectorList.split(",");
															for(var i=0;i<selectors.length;i++){
																result+=prefix+selectors[i];
																if(i+1<selectors.length)result+=",";
																}
															result+=propertyList;
															return result;
															}
					);
	return text;
	}
	
NavBar.prototype.changedPreferenceForKey=function(key){
	if(key=="navbar-css"){
		var text=this.preferenceForKey(key);if(!text){text="";}
		text=this.substWidgetPath(text);
		text=this.addCSSSelectorPrefix(text);
		var styleElement=this.getStyleElement();
		if(styleElement){
			detectBrowser();
			if(!windowsInternetExplorer){
				var node=document.createTextNode(text);
				if(node){
					while(styleElement.hasChildNodes()){
						styleElement.removeChild(styleElement.firstChild);
						}
					styleElement.appendChild(node);
					}
				}
			else{
				styleElement.styleSheet.cssText=text;
				}
			}
		}
	}
	
NavBar.prototype.PopulateNavItems=function(req){
	var items;
	var feedRoot;
	if(isAjaxRequestReady(req)&&(feedRoot=ajaxGetDocumentElement(req))){
		var parsedFeed=this.getAtomFeedItems(feedRoot);
		var items=parsedFeed.resultArray;
		var currentPageGUID=null;
		var isCollectionPage="NO";
		var curPagePat=null;
		if(this.runningInApp)curPagePat=/\.#current#.$/;
		else{
			currentPageGUID=this.preferenceForKey("current-page-GUID");
			isCollectionPage=this.preferenceForKey("isCollectionPage");
			}
		var navDiv=this.div("navbar-list");
		var navBgDiv=navDiv.parentNode;
		$(navBgDiv).ensureHasLayoutForIE();
		while(navDiv.firstChild){
			navDiv.removeChild(navDiv.firstChild);
			}
		var depthPrefix=this.preferenceForKey("path-to-root");
		if(!depthPrefix||depthPrefix=="")depthPrefix="./";
		for(var x=0;x<items.length;x++){
			var navItem=document.createElement("li");
			var anchor=document.createElement("a");
			var title=items[x].title;
			var pageGUID=items[x].GUID;
			title=title.replace(/ /g,"\u00a0")+" ";
			var url=items[x].url;
			if(!this.runningInApp&&!url.match(/^http:/i))url=depthPrefix+url;
			var inAppCurPage=this.runningInApp&&curPagePat.exec(unescape(new String(url)));
			if(inAppCurPage){
				url=url.replace(curPagePat,"");
				}
			if(pageGUID==currentPageGUID||inAppCurPage){
				navItem.className='current-page';
				if(!this.runningInApp&&isCollectionPage!="YES"){url="";}
			}
			else
			navItem.className='noncurrent-page';
			anchor.setAttribute("href",url);
			anchor.appendChild(document.createTextNode(title));
			navItem.appendChild(anchor);
			navDiv.appendChild(navItem);
		}
		if(this.preferences&&this.preferences.postNotification){
			this.preferences.postNotification("BLWidgetIsSafeToDrawNotification",1);
			}
		}
	}
	
NavBar.prototype.getAtomFeedItems=function(feedNode){
	var results=new Array;
	var pageOrder=new Array;
	if(feedNode){
		var generator="";
		var generatorElt=getFirstElementByTagName(feedNode,"generator");
		if(generatorElt&&generatorElt.firstChild){generator=allData(generatorElt);}
		var pageGUIDs,pageGUIDsElt;
		for(var entryElt=feedNode.firstChild;entryElt;entryElt=entryElt.nextSibling){
			var isInNavbarElt=null;
			if(!pageGUIDs&&(pageGUIDsElt=findChild(entryElt,"site-navbar","urn:iweb:"))){
				pageGUIDs=allData(pageGUIDsElt).split(",");
				for(var x=0;x<pageGUIDs.length;x++){
					var pageGUID=pageGUIDs[x];pageOrder[""+pageGUID]=x;
					}
				}
			if(entryElt.nodeName=="entry"&&(isInNavbarElt=findChild(entryElt,"in-navbar","urn:iweb:"))){
				if(!isInNavbarElt)continue;
				var pageGUID="";
				if(isInNavbarElt.firstChild){
					pageGUID=""+allData(isInNavbarElt);
					}
				else{
					iWLog("no navBarElt child");
					}
				if(pageGUID=="navbar-sort")continue;
				var title="";
				var titleElt=findChild(entryElt,"title","urn:iweb:");
				if(!titleElt){
					iWLog("No iWeb title");
					titleElt=findChild(entryElt,"title");
					}
				if(titleElt&&titleElt.firstChild){title=allData(titleElt);}
				var linkElt=getFirstElementByTagName(entryElt,'link');
				url=linkElt.getAttribute("href");
				if(!url&&linkElement.firstChild){url=allData(linkElement);}
				results[results.length]={title:title,url:url,GUID:pageGUID};
				}
			}
		}
	if(pageGUIDs){
		results=$(results).reject(function(result){return(pageOrder[result.GUID]===undefined);});
		results.sort(function(lhs,rhs){return pageOrder[lhs.GUID]-pageOrder[rhs.GUID];});
		}
	return{resultArray:results};
	}
	
function findChild(element,nodeName,namespace){
	var child;
	for(child=element.firstChild;child;child=child.nextSibling){
		if(child.localName==nodeName||child.baseName==nodeName){
			if(!namespace){return child;}
			var childNameSpace=child.namespaceURI;
			if(childNameSpace==namespace){return child;}
			}
		}
	return null;
	}
	
function getFirstElementByTagName(node,tag_name){
	var elements=node.getElementsByTagName(tag_name);
	if(elements.length){return elements[0];}
	else{return findChild(node,tag_name);}
	}
	
function allData(node){
	node=node.firstChild;
	var data=node.data;
	while((node=node.nextSibling)){data+=node.data;}
	return data;
	}
	
NavBar.prototype.onload=function(){}
NavBar.prototype.onunload=function(){}


