/*
    Copyright (C) 2001-2003 KSVG Team
    This file is part of the KDE project

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#ifndef SVGAnimationElementImpl_H
#define SVGAnimationElementImpl_H

#include "SVGElementImpl.h"
#include "SVGTestsImpl.h"
#include "SVGExternalResourcesRequiredImpl.h"

#include "ksvg_lookup.h"

namespace KSVG
{

enum EFillMode
{
	REMOVE,
	FREEZE
};

enum EAdditiveMode
{
	REPLACE,
	SUM
};

enum EAccumulateMode
{
	ACCUMULATE_NONE,
	ACCUMULATE_SUM
};

enum ECalcMode
{
	DISCRETE,
	LINEAR,
	PACED,
	SPLINE
};

enum ERestart
{
	ALWAYS,
	WHENNOTACTIVE,
	NEVER
};

enum EAttributeType
{
	CSS,
	XML,
	AUTO
};

class SVGAnimationElementImpl : public SVGElementImpl,
								public SVGTestsImpl,
								public SVGExternalResourcesRequiredImpl
{
public:
	SVGAnimationElementImpl(DOM::ElementImpl *);
	virtual ~SVGAnimationElementImpl();

	SVGElementImpl *targetElement() const;
	void setTargetElement(SVGElementImpl *target);

	void applyAttribute(const TQString &name, const TQString &value);

	virtual void handleTimerEvent() { } //= 0;
	virtual void setAttributes();

	double getStartTime() const;
	double getCurrentTime() const;
	double getSimpleDuration() const;

	TQString getRepeatCount() const { return m_repeatCount; }
	TQString getRepeatDuration() const { return m_repeatDur; }

	TQString getAttributeName() const { return m_attributeName; }
	TQString getFrom() const { return m_from; }
	TQString getTo() const { return m_to; }
	TQString getBy() const { return m_by; }

protected:
	double parseClockValue(const TQString &data) const;

	bool m_connected;
	EFillMode m_fill : 1;
	EAdditiveMode m_additive : 1;
	EAccumulateMode m_accumulate : 1;
	ECalcMode m_calcMode : 2;
	ERestart m_restart : 2;
	EAttributeType m_attributeType : 2;
	SVGElementImpl *m_targetElement;

	TQString m_href;
	TQString m_attributeName;
	TQString m_from, m_to, m_by;

	double m_begin, m_end, m_duration;

	TQString m_repeatCount, m_repeatDur;

	SVGStringListImpl *m_values, *m_keyTimes, *m_keySplines;

public:
	KSVG_GET
	KSVG_PUT

	enum
	{
		// Properties
		TargetElement,
		Href, Additive, Accumulate, AttributeName, AttributeType,
		CalcMode, Values, KeyTimes, KeySplines, From, To, By,
		Begin, Dur, End, Min, Max, Restart, RepeatCount, RepeatDur, Fill,
		// Functions
		GetStartTime, GetCurrentTime, GetSimpleDuration
	};

	KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
	void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
};

}

KSVG_DEFINE_PROTOTYPE(SVGAnimationElementImplProto)
KSVG_IMPLEMENT_PROTOFUNC(SVGAnimationElementImplProtoFunc, SVGAnimationElementImpl)

#endif
