<?xml version="1.0" encoding="UTF-8"?>
<rmml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<!-- Абстрактная кнопка -->
	<composition name="CButtonBase">
		<script><![CDATA[  // public: Документированные переменные и методы
			// Константы состояния кнопки
			this.ST_DISABLED = 0;  // запрещенное
			this.ST_NORMAL = 1;   // нормальное
			this.ST_ACTIVE = 2;   // наведенное
			this.ST_PRESSED = 3;  // нажатое
			// Состояние кнопки
			this.state = this.ST_NORMAL;

			// Отключить генерацию событий
			this.silence = false;

			function press()
			{
				if (!this.enabled) return false;
				if (!this.silence) fireEvent( "onPress");
				this.state = this.ST_PRESSED;
				this.update();
				return true;
			}
			function release()
			{
				if (!this.enabled) return false;
				if (!this.silence) fireEvent( "onRelease");
				this.state = this.ST_ACTIVE;
				this.update();
				return true;
			}
			function activate()
			{
				if (!this.enabled) return false;
				if (!this.silence) fireEvent( "onRollOver");
				this.state = this.ST_ACTIVE;
				this.update();
				return true;
			}
			function deactivate()
			{
				if (!this.enabled) return false;
				if (!this.silence) fireEvent( "onRollOut");
				this.state = this.ST_NORMAL;
				this.update();
				return true;
			}
			function update()
			{
				trace( "Функция CButtonBase_update() должна быть релизована в классе наследнике");
			}
		]]></script>
		<script watch="enabled">
			if (this.enabled)
				this.state = this.ST_NORMAL;
			else
				this.state = this.ST_DISABLED;
			this.update();
		</script>
		<script><![CDATA[  // private: Внутренние переменные и методы (недокументированные)
			// Если нажали и убрали мышку
			this._wasPressedRollOut = false;
		]]></script>
		<script event="onPress">
			this.silence = true;
			this.press();
			this.silence = false;
		</script>
		<script event="onRelease">
			this.silence = true;
			this.release();
			this.silence = false;
		</script>
		<script event="onRollOver">
			this.silence = true;
			if (this._wasPressedRollOut)
				this.press();
			else
				this.activate();
			this.silence = false;
		</script>
		<script event="onRollOut">
			this._wasPressedRollOut = (this.state == this.ST_PRESSED);
			this.silence = true;
			this.deactivate();
			this.silence = false;
		</script>
		<script event="onReleaseOutside">
			this._wasPressedRollOut = false;
			this.state = this.ST_NORMAL;
			this.update();
		</script>
	</composition>

	<!-- Абстрактная кнопка -->
	<composition name="CCompoundButtonBase">
		<script><![CDATA[  // public: Документированные переменные и методы
			// Константы состояния кнопки
			this.ST_DISABLED = 0;  // запрещенное
			this.ST_NORMAL = 1;   // нормальное
			this.ST_ACTIVE = 2;   // наведенное
			this.ST_PRESSED = 3;  // нажатое
			// Состояние кнопки
			this.state = this.ST_NORMAL;

			// Отключить генерацию событий
			this.silence = false;

			function update()
			{
				for (var i = 0;  i < this._stateImages.length;  i++)
					if (this._stateImages[ i] != null && this._stateImages[ i].visible)
						_runCmd( this._stateImages[ i], this._stateHideCmds[ i]);
				if (this._stateImages[ this.state] != null)
					_runCmd( this._stateImages[ i], this._stateShowCmds[ i]);
			}
			function setStateImage( aState, aImage, aShowCmd, aHideCmd)
			{
				this._stateShowCmds[ aState] =
					(typeof( aShowCmd) != 'array' && typeof( aShowCmd) != 'string' ? ['show', 'play'] : aShowCmd);
				this._stateHideCmds[ aState] =
					(typeof( aHideCmd) != 'array' && typeof( aHideCmd) != 'string' ? ['hide', 'stop'] : aHideCmd);
				this._stateImages[ aState] = aImage;
			}
		]]></script>
		<script><![CDATA[  // private: Внутренние переменные и методы (недокументированные)
			// Образы состояний кнопки
			this._stateImages = new Array();
			this._stateShowCmds = new Array();
			this._stateHideCmds = new Array();

			function _runCmd( aObj, aCmd)
			{
				if (typeof( aCmd) == 'string' && typeof( aObj[ aCmd]) == 'function')
					aObj[ aCmd]();
				else if (typeof( aCmd) == 'array')
					for (var i = 0;  i < aCmd.length;  i++)
						if (typeof( aCmd[ i]) == 'string' && typeof( aObj[ aCmd[ i]]) == 'function')
							aObj[ aCms[ i]]();
			}
		]]></script>
	</composition>

	<composition name="CSkinedButtonBase" class="CButtonBase">
		<script><![CDATA[  // public: Документированные переменные и методы
			this.skinCount = 1;
			this.skinState = new Array( this.ST_NORMAL, this.ST_ACTIVE, this.ST_PRESSED, this.ST_DISABLED);
			function init( aSkinCount)
			{
				this.skinCount = aSkinCount;
				this.update();
			}
		]]></script>
	</composition>

	<composition name="CSkinedButton" class="CSkinedButtonBase">
		<image name="imSkin"/>
		<script><![CDATA[  // public: Документированные переменные и методы
			function update()
			{
				if (this._verticalSkin)
				{
					var cropHeight = this.imSkin.getMediaSize().height / this.skinCount;
					var cropY = 0;
					for (var i = 0;  i < this.skinState.length;  i++)
						if (this.state == this.skinState[ i] && this.skinCount > i)
							cropY = cropHeight * i;
					imSkin.crop( 0, cropY, imSkin.getMediaSize().width, cropHeight);
				}
				else
				{
					var cropWidth = this.imSkin.getMediaSize().width / skinCount;
					var cropX = 0;
					for (var i = 0;  i < this.skinState.length;  i++)
						if (this.state == this.skinState[ i] && this.skinCount > i)
							cropX = cropWidth * i;
					imSkin.crop( cropX, 0, cropWidth, imSkin.getMediaSize().height);
				}
			}
			function init( aSkinCount, aVertical)
			{
				this._verticalSkin = (typeof( aVertical) != 'undefined' && aVertical)
				this.skinCount = aSkinCount;
				this.update();
			}
		]]></script>
		<script><![CDATA[  // private: Недокументированные переменные и методы
			this._verticalSkin = false;

			if (typeof( this.skinN) != 'undefined')
				this.init( Math.abs( this.skinN), this.skinN < 0);
		]]></script>
	</composition>

	<composition name="COffsetSkinedButton" class="CSkinedButton">
		<script><![CDATA[  // public: Документированные переменные и методы
			this.bWidth = 0;
			this.bHeight = 0;
			function update()
			{
				var cropSize = 0;
				if (this.horizontal == true)
				{
					cropSize = this.imSkin.getMediaSize().height / skinCount;
				}
				else
				{
					cropSize = this.imSkin.getMediaSize().width / skinCount;
				}
				var crop = 0;
				for (var i = 0;  i < this.skinState.length;  i++)
					if (this.state == this.skinState[i] && this.skinCount > i)
						crop = cropSize * i;
				if (this.horizontal == true)
				{
					imSkin.crop( aOffsetX, crop + aOffsetY, aOffsetWidth, aOffsetHeight);
				}
				else
				{
					imSkin.crop( crop + aOffsetX, aOffsetY, aOffsetWidth, aOffsetHeight);
				}
				imSkin.width = this.bWidth;
				imSkin.height = this.bheight;
			}
			function init( aSkinCount, aOffsetX, aOffsetY, aOffsetWidth, aOffsetHeight, horizontal, src)
			{
				if (horizontal != undefined && horizontal != null)
					this.horizontal = horizontal;
				else
					this.horizontal = false;
				if (src != undefined)
					this.imSkin.src = src;
				this.aOffsetX = aOffsetX;
				this.aOffsetY = aOffsetY;
				this.aOffsetWidth = aOffsetWidth;
				this.aOffsetHeight = aOffsetHeight;
				this.bWidth = aOffsetWidth;
				this.bHeight = aOffsetHeight;
				this.CSkinedButton_init( aSkinCount);
			}

			function resize(w, h)
			{
				if (w != null)
					this.bWidth = w;
				if (h != null)
					this.bHeight = h;
				this.update();
			}
		]]></script>
	</composition>

	<composition name="CTextButton" class="CSkinedButton">
		<text name="txCaption"/>
		<script><![CDATA[  // public: Документированные переменные и методы
			// Стили названия
			this.captionStyles = new Array();

			// Выравнивание названия кнопки по вертикали относительно картинки
			this.CA_UPPER = -2;  // Выше картинки
			this.CA_TOP = -1;    // По верхнему краю картинки
			this.CA_MIDDLE = 0;  // По середине картинки
			this.CA_BOTTOM = 1;  // По нижнему краю картинки
			this.CA_UNDER = 2;   // Ниже картинкой
			this.captionAlignV=this.CA_TOP;

			// Выравнивание названия кнопки по горизонтали относительно картинки
			this.CA_LEFT_HAND = -2;  // Левее картинки
			this.CA_LEFT = -1;       // По левому краю картинки
			this.CA_CENTER = 0;      // По центру картинки
			this.CA_RIGHT = 1;       // По правому краю картинки
			this.CA_RIGHT_HAND = 2;  // Правее картинки
			this.captionAlignH=this.CA_LEFT;

			// Промежуток между краем текст и картики
			this.captionSpacingH=0;  // по горизонтали
			this.captionSpacingV=0;  // по вертикали

			this.captionShift = 1;

			function init( aSkinCount, aCaptionStyles, aAdjustText, aVertical)
			{
				if (aCaptionStyles instanceof Array)
				{
					this.captionStyles = new Array();
					for (var i = 0;  i < aCaptionStyles.length;  i++)
						this.captionStyles[ i] = aCaptionStyles[ i];
				}
				if (aAdjustText)
				{
					this.txCaption.width = this.imSkin.getMediaSize().width / skinCount;
					this.txCaption.x = 0;
					this.txCaption.y = (this.imSkin.getMediaSize().height - this.txCaption.getMediaSize().height) / 2;
				}

				this.CSkinedButton_init( aSkinCount, aVertical);
			}
			function update()
			{
				this.CSkinedButton_update();
				for (var i = 0;  i < this.skinState.length;  i++)
					if (this.state == this.skinState[ i] &&
						this.skinCount > i && typeof( this.captionStyles[ i]) != 'undefined')
					{
						this.txCaption.style = this.captionStyles[ i];
					}
				var capHeight = this.txCaption.getMediaSize().height;
				var capWidth = this.txCaption.getMediaSize().width;
				this.txCaption.width = capWidth;
				this.txCaption.height = capHeight;
				var imHeight = this.imSkin.height;
				var imWidth = this.imSkin.width;
				switch (this.captionAlignV)
				{
					case this.CA_UPPER:{
							this.imSkin.y = capHeight + this.captionSpacingV;
						}break;
					case this.CA_TOP:{
							this.txCaption.y = this.captionSpacingV;
						}break;
					case this.CA_MIDDLE:{
							this.txCaption.y = (imHeight - capHeight)/2 + this.captionSpacingV;
						}break;
					case this.CA_BOTTOM:{
							this.txCaption.y = imHeight - capHeight - this.captionSpacingV;
						}break;
					case this.CA_UNDER:{
							this.txCaption.y = imHeight + this.captionSpacingV;
						}break;
					default:{
							this.txCaption.y = this.captionSpacingV;
						}break;
				}
				switch (this.captionAlignH)
				{
					case this.CA_LEFT_HAND:{
							this.imSkin.x = capWidth + this.captionSpacingH;
						}break;
					case this.CA_LEFT:{
							this.txCaption.x =  this.captionSpacingH;
						}break;
					case this.CA_CENTER:{
							this.txCaption.x = (imWidth - capWidth) / 2 + this.captionSpacingH;
						}break;
					case this.CA_RIGHT:{
							this.txCaption.x = imWidth - capWidth - this.captionSpacingH;
						}break;
					case this.CA_RIGHT_HAND:{
							this.txCaption.x = imWidth + this.captionSpacingH;
						}break;
					default:{
							this.txCaption.x = this.captionSpacingH;
						}break;
				}
				if (this.state == this.ST_PRESSED)
				{
					this.txCaption.x += this.captionShift;
					this.txCaption.y += this.captionShift;
				}
// 				var bounds = this.getBounds();
// 				this.txCaption.x -= bounds.xMin;
// 				this.txCaption.y -= bounds.yMin;
// 				this.imSkin.x -= bounds.xMin;
// 				this.imSkin.y -= bounds.yMin;
 			}
		]]></script>
	</composition>

	<composition name="CHyperlink" class="CSkinedButtonBase">
		<text name="txCaption"/>
		<script><![CDATA[  // public: Документированные переменные и методы
			this.captionStyles = new Array();
			function init( aSkinCount, aCaptionStyles)
			{
				if (aCaptionStyles instanceof Array)
				{
					this.captionStyles = new Array();
					for (var i = 0;  i < aCaptionStyles.length;  i++)
						this.captionStyles[ i] = aCaptionStyles[ i];
				}
				this.CSkinedButtonBase_init( aSkinCount);
			}
			function update()
			{
				for (var i = 0;  i < this.skinState.length;  i++)
					if (this.state == this.skinState[ i] &&
						this.skinCount > i && typeof( this.captionStyles[ i]) == 'string')
						this.txCaption.style = this.captionStyles[ i];
			}
		]]></script>
	</composition>

	<composition name="CCompoundImageButton" class="CCompoundButtonBase">
		<image name="imDisabled" visible="false"/>
		<image name="imNormal" visible="true"/>
		<image name="imActive" visible="false"/>
		<image name="imPressed" visible="false"/>
		<script><![CDATA[  // public: Документированные переменные и методы
			this.setStateImage( this.ST_DISABLED, imDisabled, 'show', 'hide');
			this.setStateImage( this.ST_NORMAL, imNormal, 'show', 'hide');
			this.setStateImage( this.ST_ACTIVE, imActive, 'show', 'hide');
			this.setStateImage( this.ST_PRESSED, imPressed, 'show', 'hide');
		]]></script>
	</composition>

	<!-- Базвая обработка событий кнопок UI -->
	<composition name="CUIButtonBase">
		<script>
			this.eventOwner = null;
			this.eventName = '';
		</script>
		<script event="onRelease"><![CDATA[
			trace( "==============-------------onRelease ow="+this.eventOwner.name+'  ev='+this.eventName);
			if (this.eventOwner != null && this.eventName.length > 0)
			{
				trace( "==============-------------onRelease in 'if'  ow="+this.eventOwner.name+'  ev='+this.eventName);
				this.eventOwner.fireEvent( this.eventName);
			}
		]]></script>
	</composition>

</rmml>
