// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../include/javascript/JavaScript.h"
#include "../../include/javascript/IJavaScript.h"
#include "../../include/javascript/JS_Define.h"
#include "../../include/javascript/JS_Object.h"
#include "../../include/javascript/JS_Value.h"
#include "../../include/javascript/console.h"
//#include "../../include/javascript/JS_Module.h"
#include "../../include/javascript/JS_EventHandler.h"
//#include "../../include/javascript/JS_ResMgr.h"
#include "../../include/javascript/JS_Context.h"

/* ------------------------ console ------------------------ */

BEGIN_JS_STATIC_CONST(CJS_Console)
END_JS_STATIC_CONST()

BEGIN_JS_STATIC_PROP(CJS_Console)
END_JS_STATIC_PROP()

BEGIN_JS_STATIC_METHOD(CJS_Console)
	JS_STATIC_METHOD_ENTRY(clear, 0)
	JS_STATIC_METHOD_ENTRY(hide, 0)
	JS_STATIC_METHOD_ENTRY(println, 1)
	JS_STATIC_METHOD_ENTRY(show, 0)
END_JS_STATIC_METHOD()

IMPLEMENT_JS_CLASS(CJS_Console,console)

#define MAXCONSOLECONTENTS			10000

console::console(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject)
{
}

console::~console()
{
}

FX_BOOL console::clear(OBJ_METHOD_PARAMS)
{



	return TRUE;
}

FX_BOOL console::hide(OBJ_METHOD_PARAMS)
{


	

	return TRUE;
}

FX_BOOL console::println(OBJ_METHOD_PARAMS)
{
	if (params.size() < 1)
	{
		return FALSE;
	}
  
	return TRUE;
}

FX_BOOL console::show(OBJ_METHOD_PARAMS)
{
	return TRUE;
}



