// 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

#ifndef _CONSTS_H_
#define _CONSTS_H_

/* ------------------------------ border ------------------------------ */

class CJS_Border : public CJS_Object
{
public:
	CJS_Border(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Border(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ display ------------------------------ */

class CJS_Display : public CJS_Object
{
public:
	CJS_Display(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Display(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ font ------------------------------ */

class CJS_Font : public CJS_Object
{
public:
	CJS_Font(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Font(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ highlight ------------------------------ */

class CJS_Highlight : public CJS_Object
{
public:
	CJS_Highlight(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Highlight(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ position ------------------------------ */

class CJS_Position : public CJS_Object
{
public:
	CJS_Position(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Position(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ scaleHow ------------------------------ */

class CJS_ScaleHow : public CJS_Object
{
public:
	CJS_ScaleHow(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_ScaleHow(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ scaleWhen ------------------------------ */

class CJS_ScaleWhen : public CJS_Object
{
public:
	CJS_ScaleWhen(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_ScaleWhen(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ style ------------------------------ */

class CJS_Style : public CJS_Object
{
public:
	CJS_Style(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Style(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ zoomtype ------------------------------ */

class CJS_Zoomtype : public CJS_Object
{
public:
	CJS_Zoomtype(JSFXObject  pObject) : CJS_Object(pObject) {};
	virtual ~CJS_Zoomtype(void){};

	DECLARE_JS_CLASS_CONST();
};

/* ------------------------------ CJS_GlobalConsts ------------------------------ */

class CJS_GlobalConsts : public CJS_Object
{
public:
	static int				Init(IJS_Runtime* pRuntime);
};

/* ------------------------------ CJS_GlobalArrays ------------------------------ */

class CJS_GlobalArrays : public CJS_Object
{
public:
	static int				Init(IJS_Runtime* pRuntime);
};

#endif //_CONSTS_H_

