#include "SkTypes.h"

#if defined(SK_BUILD_FOR_MAC) && !defined(SK_USE_WXWIDGETS)
#include <Carbon/Carbon.h>
#include <unistd.h>
#include <cerrno>
#include "SkApplication.h"

extern void get_preferred_size(int*, int*, int*, int* );

int main(int argc, char* argv[])
{
    
#if 0
{
	FILE* f = ::fopen("/whereami.txt", "w");
	for (int i = 0; i < argc; i++)
		fprintf(f, "[%d] %s\n", i, argv[i]);
	::fclose(f);
}
#else
// argv[0] is set to the execution path of the application, e.g. 
// /Users/caryclark/android/device/build/ide/xcode/animatorTest/build/Debug/animatorTest.app/Contents/MacOS/animatorTest
// the desired directory path is :
// /Users/caryclark/android/device/jsapps
// the variable (client-specific) part is :
// /Users/caryclark/android/
// since different applications share this library, they only have in common:
// {client}/device/build/ide/xcode/{application}
{
	const char* applicationPath = argv[0];
	const char* common = strstr(applicationPath, "build/ide/xcode/");
	const char systemParent[] = "apps/"; 
	if (common != 0) {
		size_t prefixLength = common - applicationPath;
		char* workingDirectory = new char[prefixLength + sizeof(systemParent)];
		strncpy(workingDirectory, applicationPath, prefixLength);
		strcpy(&workingDirectory[prefixLength], systemParent);
		int error = chdir(workingDirectory);
		if (error != 0) {
			error = errno;
			SkASSERT(error != ENOENT);
			SkASSERT(error != ENOTDIR);
			SkASSERT(error != EACCES);
			SkASSERT(error != EIO);
			SkASSERT(0);
		}
		delete workingDirectory;
	}
}
#endif
	IBNibRef 		nibRef;
    WindowRef 		window;
    
    OSStatus		err;

    // Create a Nib reference passing the name of the nib file (without the .nib extension)
    // CreateNibReference only searches into the application bundle.
    err = CreateNibReference(CFSTR("main"), &nibRef);
    require_noerr( err, CantGetNibRef );
    
    // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
    // object. This name is set in InterfaceBuilder when the nib is created.
    err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar"));
    require_noerr( err, CantSetMenuBar );
    
    // Then create a window. "MainWindow" is the name of the window object. This name is set in 
    // InterfaceBuilder when the nib is created.
    err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window);
    require_noerr( err, CantCreateWindow );

    // We don't need the nib reference anymore.
    DisposeNibReference(nibRef);
    {
	// if we get here, we can start our normal Skia sequence
	application_init();
	(void)create_sk_window(window);
        int x =0, y =0, width =640, height=480;
        get_preferred_size(&x, &y, &width, &height);
        MoveWindow(window, x, y, false);
        SizeWindow(window, width, height, false);
    }
    // The window was created hidden so show it.
    ShowWindow( window );

    // Call the event loop
    RunApplicationEventLoop();
	
	application_term();

CantCreateWindow:
CantSetMenuBar:
CantGetNibRef:
	return err;
}

#endif