#include "nsXPCOM.h"
#include "nsComponentManagerUtils.h"
#include "nsCOMPtr.h"
#include <stdio.h>
#include "nsString.h"
#include "nsCRT.h"
#include "nsIWebBrowser.h"
#include "nsIWebBrowserChrome.h"
#include "nsIEmbeddingSiteWindow.h"
#include "nsIBaseWindow.h"
#include "nsIWebNavigation.h"
#include "nsIWindowWatcher.h"
//#include <nsIInputStream.h"
#include "nsIGenericFactory.h"
#include "nsIDocShellTreeItem.h"
#include "nsIWindowCreator.h"
#include "nsEmbedAPI.h"

#include "WebBrowserChrome.h"

#define DEBUG_INFO true
#define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"

NS_IMPL_ADDREF(WebBrowserChrome)
NS_IMPL_RELEASE(WebBrowserChrome)

NS_INTERFACE_MAP_BEGIN(WebBrowserChrome)
 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowserChrome)
 NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome)
 NS_INTERFACE_MAP_ENTRY(nsIEmbeddingSiteWindow)
NS_INTERFACE_MAP_END
	
WebBrowserChrome::WebBrowserChrome()
{
	nsCOMPtr<nsILocalFile> binDir;
	char *pszBinDirPath = "/home/zbowling/mozilla/dist/bin";
	NS_NewLocalFile(pszBinDirPath, PR_TRUE, getter_AddRefs(binDir));
	
    	nsresult rv = NS_InitEmbedding(binDir, nsnull);
 	mWebBrowser = NULL;
}

WebBrowserChrome::~WebBrowserChrome()
{
//
}

NS_IMETHODIMP
WebBrowserChrome::GetSiteWindow(void * *aSiteWindow)
{
  *aSiteWindow = mNativeWindow;
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::GetTitle(PRUnichar * *aTitle)
{
  NS_ENSURE_ARG_POINTER(aTitle);
  *aTitle = nsnull;
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP
WebBrowserChrome::SetTitle(const PRUnichar * aTitle)
{
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP
WebBrowserChrome::GetVisibility(PRBool * aVisibility)
{
  NS_ENSURE_ARG_POINTER(aVisibility);
  *aVisibility = PR_TRUE;
  return NS_OK;
}


NS_IMETHODIMP
WebBrowserChrome::SetVisibility(PRBool aVisibility)
{
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::SetFocus()
{
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::SetDimensions(PRUint32 aFlags, PRInt32 x, PRInt32 y,
                                PRInt32 cx, PRInt32 cy)
{
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::GetDimensions(PRUint32 aFlags, PRInt32 *x, PRInt32 *y,
                                PRInt32 *cx, PRInt32 *cy)
{
  if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_POSITION)
  {
    *x = 0;
    *y = 0;
  }

  if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER ||
      aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_OUTER)
  {
    *cx = 0;
    *cy = 0;
  }

  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::ExitModalEventLoop(nsresult aStatus)
{
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::ShowAsModal(void)
{
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::IsWindowModal(PRBool *_retval)
{
  *_retval = PR_FALSE;
  return NS_ERROR_NOT_IMPLEMENTED;
}


NS_IMETHODIMP
WebBrowserChrome::SetStatus(PRUint32 aType, const PRUnichar* aStatus)
{
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::GetWebBrowser(nsIWebBrowser** aWebBrowser)
{
  NS_ENSURE_ARG_POINTER(aWebBrowser);
  *aWebBrowser = mWebBrowser;
  NS_IF_ADDREF(*aWebBrowser);
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::SetWebBrowser(nsIWebBrowser* aWebBrowser)
{
  mWebBrowser = aWebBrowser;
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::GetChromeFlags(PRUint32* aChromeMask)
{
  *aChromeMask = mChromeFlags;
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::SetChromeFlags(PRUint32 aChromeMask)
{
  mChromeFlags = aChromeMask;
  return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::DestroyBrowserWindow(void)
{
  return NS_OK;
}


NS_IMETHODIMP
WebBrowserChrome::SizeBrowserTo(PRInt32 aWidth, PRInt32 aHeight)
{
  //:MoveWindow((HWND)mNativeWindow, 0, 0, aWidth, aHeight, TRUE);
  return NS_OK;
}

nsresult
WebBrowserChrome::CreateBrowser(HWND hWnd, PRInt32 aX, PRInt32 aY, PRInt32 aCX,
                                PRInt32 aCY, nsIWebBrowser **aBrowser)
{
#if DEBUG_INFO
  printf("start\n");
#endif
  NS_ENSURE_ARG_POINTER(aBrowser);
#if DEBUG_INFO
  printf("NS_ENSURE_ARG_POINTER(aBrowser);\n");
#endif
  *aBrowser = nsnull;

  mWebBrowser = do_CreateInstance(NS_WEBBROWSER_CONTRACTID);
#if DEBUG_INFO
  printf("do_CreateInstance(NS_WEBBROWSER_CONTRACTID)\n");
#endif

  if (!mWebBrowser)
  {
#if DEBUG_INFO
  printf("NS_ERROR_FAILURE!!!!\n");
#endif
    return NS_ERROR_FAILURE;
  }
  mWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*, this));
#if DEBUG_INFO
  printf("SetContainerWindow(...)");
#endif

  nsCOMPtr<nsIDocShellTreeItem> dsti = do_QueryInterface(mWebBrowser);
#if DEBUG_INFO
  printf("do_QueryInterface(mWebBrowser);");
#endif

  dsti->SetItemType(nsIDocShellTreeItem::typeContentWrapper);
#if DEBUG_INFO
  printf("dsti->SetItemType(nsIDocShellTreeItem::typeContentWrapper);");
#endif

  nsCOMPtr<nsIBaseWindow> browserBaseWindow = do_QueryInterface(mWebBrowser);
#if DEBUG_INFO
  printf("do_QueryInterface(mWebBrowser);");
#endif

  mNativeWindow = hWnd;

  if (!mNativeWindow)
    return NS_ERROR_FAILURE;

  browserBaseWindow->InitWindow(mNativeWindow, nsnull, aX, aY, aCX, aCY);
#if DEBUG_INFO
  printf("->InitWindow(mNativeWindow, nsnull, aX, aY, aCX, aCY);");
#endif
  browserBaseWindow->Create();
#if DEBUG_INFO
  printf("->Create();");
#endif

  if (mWebBrowser)
  {
    *aBrowser = mWebBrowser;
    NS_ADDREF(*aBrowser);
    return NS_OK;
  }

  return NS_ERROR_FAILURE;
}

         

