/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 */

var pref = null;

// in case we fail to get the start page, load this
var startPageDefault = "about:blank";

// in case we fail to get the home page, load this
var homePageDefault = "http://www.mozilla.org/";

try {
	pref = Components.classes['component://netscape/preferences'];
	pref = pref.getService();
	pref = pref.QueryInterface(Components.interfaces.nsIPref);
}
catch (ex) {
	dump("failed to get prefs service!\n");
	pref = null;
}

  var appCore = null;
  var defaultStatus = "default status text";
  var explicitURL = false;


  function GeneralDrag ( event )
  {
    dump("****** GENERAL DRAG ********\n");
  }
  
  function BeginDragPersonalToolbar ( event )
  {
    //XXX we rely on a capturer to already have determined which item the mouse was over
    //XXX and have set an attribute.
    
    // if the click is on the toolbar proper, ignore it. We only care about clicks on
    // items.
    var toolbar = document.getElementById("PersonalToolbar");
    if ( event.target == toolbar )
      return true;  // continue propagating the event
    
    // since the database is not on the toolbar, but on the innermost box, we need to 
    // make sure we can find it before we go any further. If we can't find it, we're
    // up the creek, but don't keep propagating the event.
    var childWithDatabase = document.getElementById("innermostBox");
    if ( ! childWithDatabase ) {
      event.preventBubble();
      return;
    }

    // pinkerton
    // right now, the issue of d&d and these popup menus is really wacky, so i'm punting
    // until I have time to fix it and we can come up with a good UI gesture (bug 19588). In
    // the meantime, if the target is a container, don't initiate the drag.
    var container = event.target.getAttribute("container");
    if ( container == "true" )
      return;
    
    var dragStarted = false;
    var dragService = Components.classes["component://netscape/widget/dragservice"].getService();
    if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
    if ( dragService ) {
      var trans = Components.classes["component://netscape/widget/transferable"].createInstance();
      if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
      if ( trans ) {
        trans.addDataFlavor("moz/toolbaritem");
        var genData = Components.classes["component://netscape/supports-wstring"].createInstance();
        if ( genData ) genData = genData.QueryInterface(Components.interfaces.nsISupportsWString);
        trans.addDataFlavor("text/plain");
        var genTextData = Components.classes["component://netscape/supports-string"].createInstance();
        if ( genTextData ) genTextData = genTextData.QueryInterface(Components.interfaces.nsISupportsString);
        
        if ( genData && genTextData ) {
        
		var id = event.target.getAttribute("id");
		genData.data = id;
        genTextData.data = id;
        
		dump("ID: " + id + "\n");

		var database = childWithDatabase.database;
		var rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
		if (rdf)   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
		if ((!rdf) || (!database))	return(false);

		// make sure its a bookmark, bookmark separator, or bookmark folder
		var src = rdf.GetResource(id, true);
		var prop = rdf.GetResource("http://www.w3.org/1999/02/22-rdf-syntax-ns#type", true);
		var target = database.GetTarget(src, prop, true);
/*
pinkerton
this doesn't work anymore (target is null), not sure why.
		if (target)	target = target.QueryInterface(Components.interfaces.nsIRDFResource);
		if (target)	target = target.Value;
		if ((!target) || (target == "")) {dump("BAD\n"); return(false);}

		dump("Type: '" + target + "'\n");

		if ((target != "http://home.netscape.com/NC-rdf#BookmarkSeparator") &&
		   (target != "http://home.netscape.com/NC-rdf#Bookmark") &&
		   (target != "http://home.netscape.com/NC-rdf#Folder"))	return(false);
*/

          trans.setTransferData ( "moz/toolbaritem", genData, id.length*2 );  // double byte data (len*2)
          trans.setTransferData ( "text/plain", genTextData, id.length );  // single byte data
          var transArray = Components.classes["component://netscape/supports-array"].createInstance();
          if ( transArray ) transArray = transArray.QueryInterface(Components.interfaces.nsISupportsArray);
          if ( transArray ) {
            // put it into the transferable as an |nsISupports|
            var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
            transArray.AppendElement(genTrans);
            var nsIDragService = Components.interfaces.nsIDragService;
            dragService.invokeDragSession ( transArray, null, nsIDragService.DRAGDROP_ACTION_COPY + 
                                                nsIDragService.DRAGDROP_ACTION_MOVE );
            dragStarted = true;
          }
        } // if data object
      } // if transferable
    } // if drag service

    if ( dragStarted )               // don't propagate the event if a drag has begun
      event.preventBubble();
    
    return true;
    
  } // BeginDragPersonalToolbar
  
  
  function DropPersonalToolbar ( event )
  { 
    var dropAccepted = false;
    
    var dragService = Components.classes["component://netscape/widget/dragservice"].getService();
    if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
    if ( dragService ) {
      var dragSession = dragService.getCurrentSession();
      if ( dragSession ) {
        var trans = Components.classes["component://netscape/widget/transferable"].createInstance();
        if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
        if ( trans ) {

		// get references to various services/resources once up-front
		var personalToolbarRes = null;
		
		var rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
		if (rdf)   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
		if (rdf)
		{
			personalToolbarRes = rdf.GetResource("NC:PersonalToolbarFolder");
		}
		var rdfc = Components.classes["component://netscape/rdf/container"].getService();
		if (rdfc)  rdfc = rdfc.QueryInterface(Components.interfaces.nsIRDFContainer);

          trans.addDataFlavor("moz/toolbaritem");
          for ( var i = 0; i < dragSession.numDropItems; ++i ) {
            dragSession.getData ( trans, i );
            var dataObj = new Object();
            var bestFlavor = new Object();
            var len = new Object();
            trans.getAnyTransferData ( bestFlavor, dataObj, len );
            if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
            if ( dataObj ) {
            
              // remember len is in bytes, not chars
              var id = dataObj.data.substring(0, len.value / 2);
              dump("ID: '" + id + "'\n");
              
		var objectRes = rdf.GetResource(id, true);

              dragSession.canDrop = true;
              dropAccepted = true;
              
		var boxWithDatabase = document.getElementById("innermostBox");
		var database = boxWithDatabase.database;
		if (database && rdf && rdfc && personalToolbarRes && objectRes)
		{
			
			rdfc.Init(database, personalToolbarRes);

			// Note: RDF Sequences are one-based, not zero-based

			// XXX figure out the REAL index to insert at;
			// for the moment, insert it as the first element (pos=1)
			var newIndex = 1;
	
			var currentIndex = rdfc.IndexOf(objectRes);
			if (currentIndex > 0)
			{
				dump("Element '" + id + "' was at position # " + currentIndex + "\n");
				rdfc.RemoveElement(objectRes, true);
				dump("Element '" + id + "' removed from position # " + currentIndex + "\n");
			}
			rdfc.InsertElementAt(objectRes, newIndex, true);
			dump("Element '" + id + "' re-inserted at new position # " + newIndex + ".\n");
		}

            } 
          
          } // foreach drag item
      
        } // if transferable
      } // if dragsession
    } // if dragservice
    
    if ( dropAccepted )               // don't propagate the event if we did the drop
      event.preventBubble();

  } // DropPersonalToolbar
  
  
  function DragOverPersonalToolbar ( event )
  {
    var validFlavor = false;
    var dragSession = null;

    var dragService = Components.classes["component://netscape/widget/dragservice"].getService();
    if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
    if ( dragService ) {
      dragSession = dragService.getCurrentSession();
      if ( dragSession ) {
        if ( dragSession.isDataFlavorSupported("moz/toolbaritem") )
          validFlavor = true;
        else if ( dragSession.isDataFlavorSupported("text/plain") )
          validFlavor = true;
        //XXX other flavors here...

        // touch the attribute to trigger the repaint with the drop feedback.
        if ( validFlavor ) {
          //XXX this is really slow and likes to refresh N times per second.
          var toolbar = document.getElementById("PersonalToolbar");
          toolbar.setAttribute ( "dd-triggerrepaint", 0 );
          dragSession.canDrop = true;
          event.preventBubble();
        }
      }
    }

  } // DragOverPersonalToolbar


  //
  // DragOverContentArea
  //
  // An example of how to handle drag-over. Looks for any of a handful of flavors and
  // if it finds them it marks the dragSession that the drop is allowed.
  //
  function DragOverContentArea ( event )
  {
    var validFlavor = false;
    var dragSession = null;

    var dragService = Components.classes["component://netscape/widget/dragservice"].getService();
    if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
    if ( dragService ) {
      dragSession = dragService.getCurrentSession();
      if ( dragSession ) {
        if ( dragSession.isDataFlavorSupported("moz/toolbaritem") )
          validFlavor = true;
        else if ( dragSession.isDataFlavorSupported("text/plain") )
          validFlavor = true;
        else if ( dragSession.isDataFlavorSupported("text/unicode") )
          validFlavor = true;
        //XXX other flavors here...such as files from the desktop?
        
        if ( validFlavor ) {
          // XXX do some drag feedback here, set a style maybe???
          
          dragSession.canDrop = true;
          event.preventBubble();
        }
      }
    }
  } // DragOverContentArea


  //
  // DropOnContentArea
  //
  // An example of how to handle a drop. Basically looks for the text flavor, extracts it,
  // shoves it into the url bar, and loads the given URL. No checking is done to make sure
  // this is a url ;)
  //
  function DropOnContentArea ( event )
  { 
    var dropAccepted = false;
    
    var dragService = Components.classes["component://netscape/widget/dragservice"].getService();
    if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
    if ( dragService ) {
      var dragSession = dragService.getCurrentSession();
      if ( dragSession ) {
        var trans = Components.classes["component://netscape/widget/transferable"].createInstance();
        if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
        if ( trans ) {
          trans.addDataFlavor("text/unicode");
          trans.addDataFlavor("text/plain");
          for ( var i = 0; i < dragSession.numDropItems; ++i ) {
            var id = "";
            dragSession.getData ( trans, i );
            var dataObj = new Object();
            var bestFlavor = new Object();
            var len = new Object();
            trans.getAnyTransferData ( bestFlavor, dataObj, len );
            if ( bestFlavor.value == "text/unicode" ) {
              if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
              if ( dataObj ) {            
                // pull the URL out of the data object, two byte data
                var id = dataObj.data.substring(0, len.value / 2);
                dump("ID: '" + id + "'\n");
              }
            }
            else {
              if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsString);
              if ( dataObj ) {            
                // pull the URL out of the data object
                var id = dataObj.data.substring(0, len.value);
                dump("ID: '" + id + "'\n");
              }
            }
            
            // stuff it into the url field and go, baby, go!
            var urlBar = document.getElementById ( "urlbar" );
            urlBar.value = id;
            BrowserLoadURL();
              
            event.preventBubble();
          } // foreach drag item
        }
      }
    }
  } // DropOnContentArea


  //
  // DragProxyIcon
  //
  // Called when the user is starting a drag from the proxy icon next to the URL bar. Basically
  // just gets the url from the url bar and places the data (as plain text) in the drag service.
  //
  // This is by no means the final implementation, just another example of what you can do with
  // JS. Much still left to do here.
  // 
  function DragProxyIcon ( event )
  {
    var dragStarted = false;
    var dragService = Components.classes["component://netscape/widget/dragservice"].getService();
    if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
    if ( dragService ) {
      var trans = Components.classes["component://netscape/widget/transferable"].createInstance();
      if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
      if ( trans ) {
        trans.addDataFlavor("text/plain");
        var genTextData = Components.classes["component://netscape/supports-string"].createInstance();
        if ( genTextData ) genTextData = genTextData.QueryInterface(Components.interfaces.nsISupportsString);
        
        if ( genTextData ) {
        
          // pull the url out of the url bar
          var urlBar = document.getElementById ( "urlbar" );
          if ( !urlBar )
            return;            
		  var id = urlBar.value
          genTextData.data = id;
        
		  dump("ID: " + id + "\n");

          trans.setTransferData ( "text/plain", genTextData, id.length );  // single byte data
          var transArray = Components.classes["component://netscape/supports-array"].createInstance();
          if ( transArray ) transArray = transArray.QueryInterface(Components.interfaces.nsISupportsArray);
          if ( transArray ) {
            // put it into the transferable as an |nsISupports|
            var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
            transArray.AppendElement(genTrans);
            var nsIDragService = Components.interfaces.nsIDragService;
            dragService.invokeDragSession ( transArray, null, nsIDragService.DRAGDROP_ACTION_COPY + 
                                                nsIDragService.DRAGDROP_ACTION_MOVE );
            dragStarted = true;
          }
        } // if data object
      } // if transferable
    } // if drag service

    if ( dragStarted )               // don't propagate the event if a drag has begun
      event.preventBubble();
    
  } // DragProxyIcon


function UpdateHistory(event)
{
    // This is registered as a capturing "load" event handler. When a
    // document load completes in the content window, we'll be
    // notified here. This allows us to update the global history and
    // set the document's title information.

   //  dump("UpdateHistory: content's location is '" + window.content.location.href + "',\n");
    //dump("                         title is '" + window.content.document.title + "'\n");

	if (window.content.location.href && window.content.location.href != "")
	{
		try
		{
			var history = Components.classes["component://netscape/browser/global-history"].getService();
			if (history) history = history.QueryInterface(Components.interfaces.nsIGlobalHistory);
			if (history) history.SetPageTitle(window.content.location.href, window.content.document.title);
		}
		catch (ex)
		{
			dump("failed to set the page title.\n");
		}
	}
}


function savePage( url ) {
        // Default is to save current page.
        if ( !url ) {
            url = window.content.location.href;
        }
        // Use stream xfer component to prompt for destination and save.
        var xfer = Components
                     .classes[ "component://netscape/appshell/component/xfer" ]
                       .getService( Components.interfaces.nsIStreamTransfer );
        try {
            // When Necko lands, we need to receive the real nsIChannel and
            // do SelectFileAndTransferLocation!

            // Use this for now...
            xfer.SelectFileAndTransferLocationSpec( url, window );
        } catch( exception ) {
            // Failed (or cancelled), give them another chance.
            dump( "SelectFileAndTransferLocationSpec failed, rv=" + exception + "\n" );
        }
        return;
    }


function UpdateBookmarksLastVisitedDate(event)
{

	if (window.content.location.href && window.content.location.href != "")
	{
		try
		{
			// if the URL is bookmarked, update its "Last Visited" date
			var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
			if (bmks)	bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
			if (bmks)	bmks.UpdateBookmarkLastVisitedDate(window.content.location.href);
		}
		catch(ex)
		{
			dump("failed to update bookmark last visited date.\n");
		}
	}
}

  function createBrowserInstance() {
    appCore = Components
                .classes[ "component://netscape/appshell/component/browser/instance" ]
                  .createInstance( Components.interfaces.nsIBrowserInstance );
    if ( !appCore ) {
        alert( "Error creating browser instance\n" );
    }
  }

  function Startup()
  {
    // Position window.
    var win = document.getElementById( "main-window" );
    if (win) {
      var x = win.getAttribute( "x" );
      var y = win.getAttribute( "y" );
      // dump(" move to "+x+" "+y+"\n");
      window.moveTo( x, y );
    }

    //  TileWindow();
    // Make sure window fits on screen initially
   // FitToScreen();
	
    // Create the browser instance component.
    createBrowserInstance();
    if (appCore == null) {
        // Give up.
        window.close();
    }

    // Initialize browser instance..
    appCore.setWebShellWindow(window);
    
    tryToSetContentWindow();
	
    // Add a capturing event listener to the content window so we'll
    // be notified when onloads complete.
    window.addEventListener("load", UpdateHistory, true);
    window.addEventListener("load", UpdateBookmarksLastVisitedDate, true);
	 // Check for window.arguments[0].  If present, go to that url.
    if ( window.arguments && window.arguments[0] ) {
        // Load it using yet another psuedo-onload handler.
        onLoadViaOpenDialog();
    }
  }

  function Shutdown() {
    // Get the current window position/size.
    var x = window.screenX;
    var y = window.screenY;
    var h = window.outerHeight;
    var w = window.outerWidth;
	
    // Store these into the window attributes (for persistence).
    var win = document.getElementById( "main-window" );
    win.setAttribute( "x", x );
    win.setAttribute( "y", y );
    win.setAttribute( "height", h );
    win.setAttribute( "width", w );

    // Close the app core.
    if ( appCore ) {
        appCore.close();
    }
  }

  function onLoadWithArgs() {
    // See if Startup has been run.
    if ( appCore ) {
        // See if load in progress (loading default page).
        if ( document.getElementById("Browser:Throbber").getAttribute("busy") == "true" ) {
            dump( "Stopping load of default initial page\n" );
            appCore.stop();
        }
        dump( "Loading page specified on ShowWindowWithArgs\n" );
        appCore.loadInitialPage();
    } else {
        // onLoad handler timing is not correct yet.
        dump( "onLoadWithArgs not needed yet\n" );
        // Remember that we want this url.
        explicitURL = true;
    }
  }

  function onLoadViaOpenDialog() {
    // See if load in progress (loading default page).
    if ( document.getElementById("Browser:Throbber").getAttribute("busy") == "true" ) {
        dump( "Stopping load of default initial page\n" );
        appCore.stop();
    }
    dump( "Loading page specified via openDialog\n" );
    dump("Check if a view source window \n");
    if( window.arguments[1]=="view-source" )
    {
    	dump(" A view source window \n");
    	var element = document.getElementById("main-window");
    	
    	var preface = element.getAttribute("viewsourcetitlepreface");
    	element.setAttribute( "titlepreface", preface );
    	appCore.isViewSource = true;
    	element.setAttribute("windowtype","Browser:view-source");
    }
    appCore.loadUrl( window.arguments[0] );
  }

  function tryToSetContentWindow() {
    var startpage = startPageDefault;
    if ( window.content ) {
        dump("Setting content window\n");
        appCore.setContentWindow( window.content );
        // Have browser app core load appropriate initial page.

        if ( !explicitURL ) {
            // if all else fails, use trusty "about:blank" as the start page
            if (pref) {
              // from mozilla/modules/libpref/src/init/all.js
              // 0 = blank 
              // 1 = home (browser.startup.homepage)
              // 2 = last 
		choice = 1;
		try {
              		choice = pref.GetIntPref("browser.startup.page");
		}
		catch (ex) {
			dump("failed to get the browser.startup.page pref\n");
		}
		dump("browser.startup.page = " + choice + "\n");
    	  switch (choice) {
    		case 0:
                		startpage = "about:blank";
          			break;
    		case 1:
				try {
                			startpage = pref.CopyCharPref("browser.startup.homepage");
				}
				catch (ex) {
					dump("failed to get the homepage!\n");
					startpage = startPageDefault;
				}
          			break;
    		case 2:
                		var history = Components.classes['component://netscape/browser/global-history'];
    			if (history) {
                   			history = history.getService();
    	    		}
    	    		if (history) {
                  			history = history.QueryInterface(Components.interfaces.nsIGlobalHistory);
    	    		}
    	    		if (history) {
    				startpage = history.GetLastPageVisted();
    	    		}
          			break;
       		default:
                		startpage = startPageDefault;
    	  }
            }
            else {
		dump("failed to QI pref service\n");
	    }
	    dump("startpage = " + startpage + "\n");
          var args = document.getElementById("args")
            if (args) args.setAttribute("value", startpage);
        }
        appCore.loadInitialPage();
    } else {
        // Try again.
        dump("Scheduling later attempt to set content window\n");
        window.setTimeout( "tryToSetContentWindow()", 100 );
    }
  }

  function Translate(src, dest, engine)
  {
	var service = "http://levis.alis.com:8080";
	service += "?AlisSourceLang=" + src;
	service += "&AlisTargetLang=" + dest;
	service += "&AlisMTEngine=" + engine;

	// if we're already viewing a translated page, the just get the
	// last argument (which we expect to always be "AlisMTEngine")
	var targetURI = window.content.location.href;
	var targetURIIndex = targetURI.indexOf("AlisTargetURI=");
	if (targetURIIndex >= 0)
	{
		targetURI = targetURI.substring(targetURIIndex + 14);
	}
	service += "&AlisTargetURI=" + targetURI;

	window.content.location.href = service;
  }

  function RefreshUrlbar()
  {
   //Refresh the urlbar bar
    document.getElementById('urlbar').value = window.content.location.href;
  }

  function gotoHistoryIndex(index)
  {
     appCore.gotoHistoryIndex(index);
  }

  function BrowserBack()
  {
     // Get a handle to the back-button
     var bb = document.getElementById("canGoBack");
     // If the button is disabled, don't bother calling in to Appcore
     if ( (bb.getAttribute("disabled")) == "true" ) 
        return;

    if (appCore != null) {
      dump("Going Back\n");
      appCore.back();
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }


  function BrowserForward()
  {
     // Get a handle to the back-button
     var fb = document.getElementById("canGoForward");
     // If the button is disabled, don't bother calling in to Appcore
     if ( (fb.getAttribute("disabled")) == "true" ) 
        return;

    if (appCore != null) {
      dump("Going Forward\n");
      appCore.forward();
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }



  function BrowserCanStop() {
    var stop = document.getElementById("canStop");
    if ( stop ) {
        var stopDisabled = stop.getAttribute("disabled");
        var stopButton   = document.getElementById( "stop-button" );
        if ( stopButton ) {
            if ( stopDisabled == "true") {
                stopButton.setAttribute( "disabled", "true" );
            } else {
                stopButton.setAttribute( "disabled", "" );
            }
        }
        //Enable/disable the stop menu item
        var stopMenu   = document.getElementById( "menuitem-stop" );
        if ( stopMenu ) {
            if ( stopDisabled == "true") {
                stopMenu.setAttribute( "disabled", "true" );
            } else {
                stopMenu.setAttribute( "disabled", "" );
            }
        }
    }
  }

  function BrowserStop() {
     // Get a handle to the "canStop" broadcast id
     var stopBElem = document.getElementById("canStop");
     if (!stopBElem) {
        dump("Couldn't obtain handle to stop Broadcast element\n");
        return;
	   }

     var canStop = stopBElem.getAttribute("disabled");
     var sb = document.getElementById("stop-button");
     
     if (!sb) {
     	 dump("Could not obtain handle to stop button\n");
	     return;
     }

     // If the stop button is currently disabled, just return
     if ((sb.getAttribute("disabled")) == "true") {
	    return;
     }
	
     //Stop button has just been pressed. Disable it. 
     sb.setAttribute("disabled", "true");

     // Get a handle to the stop menu item.
     var sm = document.getElementById("menuitem-stop");
     if (!sm) {
       dump("Couldn't obtain menu item Stop\n");
     } else {
       // Disable the stop menu-item.
       sm.setAttribute("disabled", "true");
     }
  
     //Call in to BrowserAppcore to stop the current loading
     if (appCore != null) {
        dump("Going to Stop\n");
        appCore.stop();
     } else {
        dump("BrowserAppCore has not been created!\n");
     }
  }
 

  function BrowserReallyReload(reloadType) {
     // Get a handle to the "canReload" broadcast id
     var reloadBElem = document.getElementById("canReload");
     if (!reloadBElem) {
        dump("Couldn't obtain handle to reload Broadcast element\n");
        return;
	   }

     var canreload = reloadBElem.getAttribute("disabled");
     

     // If the reload button is currently disabled, just return
     if ( canreload) {
	     return;
     }
	
     //Call in to BrowserAppcore to reload the current loading
     if (appCore != null) {
        dump("Going to reload\n");
        appCore.reload(reloadType);
     } else {
        dump("BrowserAppCore has not been created!\n");
     }
  }

  function BrowserHome()
  {
   // this eventual calls nsGlobalWIndow::Home()
   window.content.home();
   RefreshUrlbar();
  }

  function OpenBookmarkURL(node, root)
  {
    if (node.getAttribute('container') == "true") {
      return false;
    }

	var url = node.getAttribute('id');
	try
	{
		var rootNode = document.getElementById(root);
		var ds = null;
		if (rootNode)
		{
			ds = rootNode.database;
		}
		// add support for IE favorites under Win32, and NetPositive URLs under BeOS
		var rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
		if (rdf)   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
		if (rdf)
		{
			if (ds)
			{
				var src = rdf.GetResource(url, true);
				var prop = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true);
				var target = ds.GetTarget(src, prop, true);
				if (target)	target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
				if (target)	target = target.Value;
				if (target)	url = target;
				
			}
		}
	}
	catch(ex)
	{
	}

    // Ignore "NC:" urls.
    if (url.substring(0, 3) == "NC:") {
      return false;
    }
	// Check if we have a browser window
	if ( window.content == null )
	{
		window.openDialog( "chrome://navigator/content/navigator.xul", "_blank", "chrome,all,dialog=no", url ); 
	}
	else
	{
  	  window.content.location.href = url;
    	RefreshUrlbar();
  	}
  }

function OpenSearch(tabName, searchStr)
{
	dump("OpenSearch searchStr: '" + searchStr + "'\n\n");

	window.openDialog("chrome://search/content/search.xul", "SearchWindow", "dialog=no,close,chrome,resizable", tabName, searchStr);
}

  function BrowserNewWindow()
  {
    OpenBrowserWindow();
  }

  function BrowserEditPage(url)
  {
    window.openDialog( "chrome://editor/content", "_blank", "chrome,all,dialog=no", url );
  }

//Note: BrowserNewEditorWindow() was moved to globalOverlay.xul and renamed to NewEditorWindow()
  
  function BrowserOpenWindow()
  {
    //opens a window where users can select a web location to open
    window.openDialog( "chrome://navigator/content/openLocation.xul", "_blank", "chrome,modal", appCore );
  }
  
  function createInstance( progid, iidName ) {
      var iid = eval( "Components.interfaces." + iidName );
      return Components.classes[ progid ].createInstance( iid );
  }

  function createInstanceById( cid, iidName ) {
      var iid = eval( "Components.interfaces." + iidName );
      return Components.classesByID[ cid ].createInstance( iid );
  }

  function getService( progid, iidName ) {
      var iid = eval( "Components.interfaces." + iidName );
      return Components.classes[ progid ].getService( iid );
  }

  function getServiceById( cid, iidName ) {
      var iid = eval( "Components.interfaces." + iidName );
      return Components.classesByID[ cid ].getService( iid );
  }

  function openNewWindowWith( url ) {
    var newWin = window.openDialog( "chrome://navigator/content/navigator.xul", "_blank", "chrome,all,dialog=no", url );

    // Fix new window.    
    newWin.saveFileAndPos = true;
  }
  
  function BrowserOpenFileWindow()
  {
    // Get filespecwithui component.            
    var fileSpec = createInstance( "component://netscape/filespecwithui", "nsIFileSpecWithUI" );
    var url = fileSpec.chooseFile( "Open File" );
    if ( url != "" ) {
        openNewWindowWith( url );
    }
  }

  function OpenFile(url) {
    // Obsolete (called from C++ code that is no longer called).
    dump( "OpenFile called?\n" );
    openNewWindowWith( url );
  }

  function BrowserCopy()
  {
    if (appCore != null) {
	    dump("Copying\n");
      appCore.copy();
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }


  function BrowserAddBookmark(url,title)
  {
    var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
    bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
    if ((title == null) || (title == ""))
    {
    	title = url;
    }
    bmks.AddBookmark(url, title);
  }

  function BrowserEditBookmarks()
  { 
    window.open("chrome://bookmarks/content/", "BookmarksWindow", "chrome,menubar,resizable,scrollbars");
  }

  function BrowserPrintPreview()
  {
    // Borrowing this method to show how to 
    // dynamically change icons
    dump("BrowserPrintPreview\n");
    if (appCore != null) {
	    dump("Changing Icons\n");
      appCore.printPreview();
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }

  function BrowserPrint()
  {
    // Borrowing this method to show how to 
    // dynamically change icons
    if (appCore != null) {
      appCore.print();
    }
  }

  function BrowserSetDefaultCharacterSet(aCharset)
  {
    if (appCore != null) {
      appCore.SetDocumentCharset(aCharset);
      window.content.location.reload();
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }

  function BrowserClose()
  {
    // This code replicates stuff in Shutdown().  It is here because
    // window.screenX and window.screenY have real values.  We need
    // to fix this eventually but by replicating the code here, we
    // provide a means of saving position (it just requires that the
    // user close the window via File->Close (vs. close box).

    // Get the current window position/size.
    var x = window.screenX;
    var y = window.screenY;
    var h = window.outerHeight;
    var w = window.outerWidth;

    // Store these into the window attributes (for persistence).
    var win = document.getElementById( "main-window" );
    win.setAttribute( "x", x );
    win.setAttribute( "y", y );
    win.setAttribute( "height", h );
    win.setAttribute( "width", w );

  	 window.close();
  }



  function BrowserSelectAll() {
    if (appCore != null) {
        appCore.selectAll();
    } else {
        dump("BrowserAppCore has not been created!\n");
    }
  }

  function BrowserFind() {
    if (appCore != null) {
        appCore.find();      
    } else {
        dump("BrowserAppCore has not been created!\n");
    }
  }

  function BrowserFindAgain() {
    if (appCore != null) {
        appCore.findNext();      
    } else {
        dump("BrowserAppCore has not been created!\n");
    }
  }

  function BrowserLoadURL()
  {
	if (appCore == null)
	{
		dump("BrowserAppCore has not been initialized\n");
		return;
	}

    // rjc: added support for URL shortcuts (3/30/1999)
    try {
      var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
      bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);

      var shortcutURL = bmks.FindShortcut(document.getElementById('urlbar').value);

      dump("FindShortcut: in='" + document.getElementById('urlbar').value + "'  out='" + shortcutURL + "'\n");

      if ((shortcutURL != null) && (shortcutURL != "")) {
        document.getElementById('urlbar').value = shortcutURL;
      }
    }
    catch (ex) {
      // stifle any exceptions so we're sure to load the URL.
    }

	appCore.loadUrl(document.getElementById('urlbar').value);
      
  }

  function WalletEditor()
  {
  	window.openDialog("chrome://wallet/content/WalletEditor.xul","walletEditor","modal,chrome,height=504,width=436"); 
    
  }

  function WalletSafeFillin()
  {
    if (appCore != null) {
      dump("Wallet Safe Fillin\n");
      appCore.walletPreview(window, window.content);
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }

  function WalletChangePassword()
  {
    if (appCore != null) {
      dump("Wallet Change Password\n");
      appCore.walletChangePassword();
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }


  function WalletQuickFillin()
  {
    if (appCore != null) {
      dump("Wallet Quick Fillin\n");
      appCore.walletQuickFillin(window.content);
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }

  function WalletRequestToCapture()
  {
    if (appCore != null) {
      dump("Wallet Request To Capture\n");
      appCore.walletRequestToCapture(window.content);
    } else {
      dump("BrowserAppCore has not been created!\n");
    }
  }

  function WalletSamples()
  {
    window.content.location.href= 'http://people.netscape.com/morse/wallet/samples/';
  }

  function SignonViewer()
  {
      window.openDialog("chrome://wallet/content/SignonViewer.xul","SSViewer","modal,chrome,height=504,width=436"); 
  }

  function CookieViewer()
  {
   window.openDialog("chrome://wallet/content/CookieViewer.xul","CookieViewer","modal,chrome,height=504,width=436"); 
  }

  function OpenMessenger()
  {
	window.open("chrome://messenger/content/", "_blank", "chrome,menubar,toolbar,resizable");
  }

  function OpenAddressbook()
  {
	window.open("chrome://addressbook/content/", "_blank", "chrome,menubar,toolbar,resizable");
  }

  function BrowserSendPage(pageUrl, pageTitle)
  {
    window.openDialog( "chrome://messengercompose/content/", "_blank", "chrome,all,dialog=no",
    	"attachment=" + pageUrl + ",body=" + pageUrl + ",subject='" + pageTitle + "'");
  }

  function BrowserViewSource()
  {
	dump("BrowserViewSource(); \n ");
    // Use a browser window to view source
    window.openDialog( "chrome://navigator/content/",
                       "_blank",
                       "chrome,menubar,status,dialog=no,resizable",
                       window.content.location,
                       "view-source" );
  }


        var bindCount = 0;
        function onStatus() {
            var status = document.getElementById("Browser:Status");
            if ( status ) {
                var text = status.getAttribute("value");
                if ( text == "" ) {
//dump( "Setting default status text\n" );                    
                    text = defaultStatus;
                }
                var statusText = document.getElementById("statusText");
                if ( statusText ) {
//dump( "Setting status text: " + text + "\n" );
                    statusText.setAttribute( "value", text );
                } else {
//dump( "Missing statusText when setting status text: " + text + "\n" );
                }
            } else {
                dump("Can't find status broadcaster!\n");
            }
        }

        function doTests() {
        }

		var startTime = 0;
        function onProgress() {
            var throbber = document.getElementById("Browser:Throbber");
            var meter    = document.getElementById("Browser:LoadingProgress");
            if ( throbber && meter ) {
                var busy = throbber.getAttribute("busy");
                var wasBusy = meter.getAttribute("mode") == "undetermined" ? "true" : "false";
                if ( busy == "true" ) {
                    if ( wasBusy == "false" ) {
                        // Remember when loading commenced.
    				    startTime = (new Date()).getTime();
                        // Turn progress meter on.
                        meter.setAttribute("mode","undetermined");
                    }
                    // Update status bar.
                } else if ( busy == "false" && wasBusy == "true" ) {
                    // Record page loading time.
                    var status = document.getElementById("Browser:Status");
                    if ( status ) {
						var elapsed = ( (new Date()).getTime() - startTime ) / 1000;
						var msg = "Document: Done (" + elapsed + " secs)";
						dump( msg + "\n" );
                        status.setAttribute("value",msg);
                        defaultStatus = msg;
                    }
                    // Turn progress meter off.
                    meter.setAttribute("mode","normal");
                }
            }
        }
        function dumpProgress() {
            var broadcaster = document.getElementById("Browser:LoadingProgress");
            var meter       = document.getElementById("meter");
            dump( "bindCount=" + bindCount + "\n" );
            dump( "broadcaster mode=" + broadcaster.getAttribute("mode") + "\n" );
            dump( "broadcaster value=" + broadcaster.getAttribute("value") + "\n" );
            dump( "meter mode=" + meter.getAttribute("mode") + "\n" );
            dump( "meter value=" + meter.getAttribute("value") + "\n" );
        }

function BrowserReload() {
    dump( "Sorry, command not implemented.\n" );
}

function hiddenWindowStartup()
{
	// Disable menus which are not appropriate
	var disabledItems = ['cmd_close', 'Browser:SendPage', 'Browser:EditPage', 'Browser:PrintSetup', 'Browser:PrintPreview',
						 'Browser:Print', 'canGoBack', 'canGoForward', 'Browser:Home', 'Browser:AddBookmark', 'cmd_undo', 
						 'cmd_redo', 'cmd_cut', 'cmd_copy','cmd_paste', 'cmd_delete', 'cmd_selectAll'];
	for ( id in disabledItems )
	{
         // dump("disabling "+disabledItems[id]+"\n");
		 var broadcaster = document.getElementById( disabledItems[id]);
		 if (broadcaster)
           broadcaster.setAttribute("disabled","true");
	}
}

// Tile
function TileWindow()
{
	var xShift = 25;
	var yShift = 50;
	var done = false;
	var windowManager = Components.classes['component://netscape/rdf/datasource?name=window-mediator'].getService();
	dump("got window Manager \n");
	var	windowManagerInterface = windowManager.QueryInterface( Components.interfaces.nsIWindowMediator);
	
	var enumerator = windowManagerInterface.GetEnumerator( null );
	
	var xOffset = screen.availLeft;
	var yOffset = screen.availRight;
	do
	{
		var currentWindow = windowManagerInterface.ConvertISupportsToDOMWindow ( enumerator.GetNext() );
		if ( currentWindow.screenX == screenX && currentWindow.screenY == screenY )
		{
			alreadyThere = true;
			break;
		}	
	} while ( enumerator.HasMoreElements() )
	
	if ( alreadyThere )
	{
		enumerator = windowManagerInterface.GetEnumerator( null );
		do
		{
			var currentWindow = windowManagerInterface.ConvertISupportsToDOMWindow ( enumerator.GetNext() );
			if ( currentWindow.screenX == screenX+xOffset*xShift+yOffset*xShift   && currentWindow.screenY == screenY+yShift*xOffset && window != currentWindow )
			{
				xOffset++;
				if ( (screenY+outerHeight  < screen.availHeight) && (screenY+outerHeight+yShift*xOffset > screen.availHeight ) )
				{
					dump(" increment yOffset");
					yOffset++;
					xOffset = 0;
				}
				enumerator = windowManagerInterface.GetEnumerator( null );
			}	
		} while ( enumerator.HasMoreElements() )
	}
	
	if ( xOffset > 0 || yOffset >0 )
	{
		dump( "offsets:"+xOffset+" "+yOffset+"\n");
		dump("Move by ("+ xOffset*xShift + yOffset*xShift +","+ yShift*xOffset +")\n");
		moveBy( xOffset*xShift + yOffset*xShift, yShift*xOffset );
	}
}
// Make sure that a window fits fully on the screen. Will move to preserve size, and then shrink to fit
function FitToScreen()
{
	var moveX = screenX;
	var sizeX = outerWidth;
	var moveY = screenY;
	var sizeY = outerHeight;
	
	dump( " move to ("+moveX+","+moveY+") size to ("+sizeX+","+sizeY+") \n");
	var totalWidth = screenX+outerWidth;
	if ( totalWidth > screen.availWidth )
	{	
		if( outerWidth > screen.availWidth )
		{
			sizeX = screen.availWidth;
			moveX = screen.availLeft;
		}
		else
		{
			moveX = screen.availWidth- outerWidth;
		}
	}
	
	var totalHeight = screenY+outerHeight;
	if ( totalHeight > screen.availHeight )
	{	
		if( outerWidth > screen.availHeight )
		{
			sizeY = screen.availHeight;
			moveY = screen.availTop;
		}
		else
		{
			moveY = screen.availHeight- outerHeight;
		}
	}
	
	
	dump( " move to ("+moveX+","+moveY+") size to ("+sizeX+","+sizeY+") \n");
	if ( (moveY- screenY != 0 ) ||	(moveX-screenX != 0 ) )
		moveTo( moveX,moveY );
	
	// Maintain a minimum size
	if ( sizeY< 100 )
		sizeY = 100;
	if ( sizeX < 100 )
		sizeX = 100; 
	if ( (sizeY- outerHeight != 0 ) ||	(sizeX-outerWidth != 0 ) )
	{
		//outerHeight = sizeY;
		//outerWidth = sizeX;
		resizeTo( sizeX,sizeY );	
	}
}

// Dumps all properties of anObject.
function dumpObject( anObject, prefix ) {
    if ( prefix == null ) {
        prefix = anObject;
    }
    for ( prop in anObject ) {
        dump( prefix + "." + prop + " = " + anObject[prop] + "\n" );
    }
}

// Takes JS expression and dumps "expr="+expr+"\n"
function dumpExpr( expr ) {
    dump( expr+"="+eval(expr)+"\n" );
}

var leakDetector = null;

// Dumps current set of memory leaks.
function dumpMemoryLeaks() {
	if (leakDetector == null)
		leakDetector = createInstance("component://netscape/xpcom/leakdetector", "nsILeakDetector");
	if (leakDetector != null)
		leakDetector.dumpLeaks();
}

function enableUriLoading() {
	var pref = Components.classes['component://netscape/preferences'];
     if (pref)
     {
     	pref = pref.getService();   	
     	pref = pref.QueryInterface(Components.interfaces.nsIPref);
		pref.SetDefaultBoolPref("browser.uriloader", true);
	 }
}

function disableUriLoading() {
	var pref = Components.classes['component://netscape/preferences'];
     if (pref)
     {
     	pref = pref.getService();   	
     	pref = pref.QueryInterface(Components.interfaces.nsIPref);
		pref.SetDefaultBoolPref("browser.uriloader", false);
	 }
}
