<?xml version="1.0"?>
<?xml-stylesheet href="chrome://browser/content/places/places.css"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/places/places.css"?>
<?xml-stylesheet href="browseList.css"?>
<!DOCTYPE page SYSTEM "chrome://bonjour4firefox/locale/bonjour4firefox.dtd">
	<page
		orient="vertical"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        style="background-color: transparent !important; -moz-appearance: none !important;"
		onload="BonjourBrowser.init()"
		onunload="BonjourBrowser.cleanup()">
		

	<menupopup id="targetmenu">
        <menuitem label="&bonjour4firefoxSidebarOpenDefault.label;" value="current"/>
        <menuitem label="&bonjour4firefoxSidebarOpenTab.label;" value="tab"/>
        <menuitem label="&bonjour4firefoxSidebarOpenWindow.label;" value="window"/>
	</menupopup>

	<tree id="treeBrowseList" flex="1" class="sidebar-placesTree" hidecolumnpicker="true">
		<treecols hide="true">
			<treecol id="title" flex="1" primary="true" hideheader="true"/>
        </treecols>

        <treechildren class="sidebar-placesTreechildren" context="targetmenu" flex="1" id="treeChildrenBrowseList">
			<treeitem>
				<treerow>
					<treecell src="chrome://bonjour4firefox/content/_internal_bonjour4firefox.png" label="About Bonjour"/>
				</treerow>
			</treeitem>
		</treechildren>
	</tree>

	<script><![CDATA[

		var BonjourBrowser =
		{
			Service: null,
			Browse: null,
			BrowseListener: null,
			Resolve: null,
			ResolveListener: null,

			init: function()
			{
				document.getElementById("treeChildrenBrowseList").addEventListener( "click", this.listListener, false );

				try
				{
        			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
					const cid = "@apple.com/DNSSDService;1";
        			Service = Components.classes[cid].createInstance();
					Service = Service.QueryInterface(Components.interfaces.IDNSSDService);
				}
				catch (err)
				{
        			alert(err);
        			return;
    			}

				BrowseListener = this.browseListener;
				ResolveListener = this.resolveListener;

				try
				{
					Browse = Service.browse(0, "_http._tcp", "", BrowseListener );
				}
				catch ( err )
				{
					alert( err );
					return;
				}
			},

			cleanup: function()
			{
				if ( Browse != null )
				{
					Browse.stop();
					Browse = null;
				}
			},


			browseListener: function( service, add, interfaceIndex, error, serviceName, regtype, domain )
			{
				if ( error == 0 )
				{
					// First see if we can look this guy up

					var treeView = document.getElementById( 'treeChildrenBrowseList' );
					var treeItem = null;

					for ( i = 1; i < treeView.childNodes.length; i++ )
					{
						var ti = treeView.childNodes[ i ];
						var tr = ti.childNodes[ 0 ];
						var tc = tr.childNodes[ 0 ];

						if ( tc.getAttribute( 'label' ) == serviceName )
						{
							treeItem = ti;
							break;
						}
					}
	
					if ( add )
					{
						// If we've already seen this guy, then bump up his reference count

						if ( treeItem )
						{
							var refcnt = treeItem.getUserData( 'refcnt' );
							refcnt++;
						}
						else
						{
							var newTreeItem = document.createElement('treeitem');
							var newTreeRow = document.createElement('treerow');
							newTreeRow.setAttribute( 'properties', 'bonjourRow' );
							var newTreeCell = document.createElement('treecell');
                			newTreeCell.setAttribute( 'label', serviceName );
							newTreeCell.setAttribute( 'src', 'chrome://bonjour4firefox/content/_internal_bonjour4firefox.png' );
				
							newTreeItem.appendChild( newTreeRow );
							newTreeRow.appendChild( newTreeCell );
							newTreeItem.setUserData( 'interfaceIndex', interfaceIndex, null );
                			newTreeItem.setUserData( 'serviceName', serviceName, null );
							newTreeItem.setUserData( 'regtype', regtype, null );
							newTreeItem.setUserData( 'domain', domain, null );
							newTreeItem.setUserData( 'refcnt', 1, null );

							// Insert in alphabetical order

							var insertBefore = null;

							for ( i = 1; i < treeView.childNodes.length; i++ )
							{
								var ti = treeView.childNodes[ i ];
								var tr = ti.childNodes[ 0 ];
								var tc = tr.childNodes[ 0 ];
		
								if ( serviceName.toLowerCase() < tc.getAttribute( 'label' ).toLowerCase() )
								{
									insertBefore = ti;
									break;
								}
        					}
	
							if ( insertBefore != null )
							{
								treeView.insertBefore( newTreeItem, insertBefore );
							}
							else
							{
								treeView.appendChild( newTreeItem );
							}
						}
					}
					else if ( treeItem )
					{
						var refcnt = treeItem.getUserData( 'refcnt' );
						
						if ( --refcnt == 0 )
						{
							treeView.removeChild( treeItem );
						}
					}
				}
				else
				{
					alert( 'There was an error browsing for websites: ' + error );
				}
			},

			listListener: function( event )
			{
				var treeBrowseList = document.getElementById( 'treeBrowseList' );

				if ( treeBrowseList.currentIndex == 0 )
				{
					window._content.location="http://www.apple.com/macosx/features/bonjour";
				}
				else
				{
 					var item = treeBrowseList.view.getItemAtIndex(treeBrowseList.currentIndex);

					var interfaceIndex = item.getUserData("interfaceIndex");
					var serviceName = item.getUserData("serviceName");
					var regtype = item.getUserData("regtype");
					var domain = item.getUserData("domain");

					try
					{
						Resolve = Service.resolve( interfaceIndex, serviceName, regtype, domain, ResolveListener );
					}
					catch ( err )
					{
						alert( err );
						return;
					}
				}
			},

			resolveListener: function( service, interfaceIndex, error, fullname, host, port, path )
			{
				if ( error == 0 )
				{
					window._content.location='http://' + host + ':' + port + path;
				}
				else
				{
					alert( 'There was an error resolving ' + fullname );
				}

				Resolve.stop();
			},
		};

	]]></script>
</page>
