// 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_

