<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
				xmlns:s="library://ns.adobe.com/flex/spark"
				xmlns:mx="library://ns.adobe.com/flex/mx"
				autoDrawBackground="true"
				width="100%"
				implements="org.apache.flex.runtimelocale.view.IInjectableView"
				name="localeItemView">
	<s:layout>
		<s:HorizontalLayout verticalAlign="top"
							gap="20"/>
	</s:layout>
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.events.CloseEvent;
			import mx.events.FlexEvent;
			import org.apache.flex.runtimelocale.event.LocaleItemEvent;
			import org.apache.flex.runtimelocale.model.ApplicationModel;
			import org.apache.flex.runtimelocale.model.locale.LocaleItemDataVO;

			private var _applicationModel:ApplicationModel;

			private var _localeItem:LocaleItemDataVO;

			[Bindable(event="applicationModelChanged")]
			public function get applicationModel():ApplicationModel {
				return _applicationModel;
			}

			public function set applicationModel(value:ApplicationModel):void {
				if (_applicationModel !== value) {
					if (_applicationModel) {
						_applicationModel.removeEventListener("referenceLocaleChanged", handleReferenceLocaleChanged);
					}
					_applicationModel = value;
					if (_applicationModel) {
						_applicationModel.addEventListener("referenceLocaleChanged", handleReferenceLocaleChanged);
					}
					setRerenceLocale();
					dispatchEvent(new Event("applicationModelChanged"));
				}
			}

			override public function set data(value:Object):void {
				super.data = value;
				localeItem = value as LocaleItemDataVO;
			}

			public function get localeItem():LocaleItemDataVO {
				return _localeItem;
			}

			public function set localeItem(value:LocaleItemDataVO):void {
				if (_localeItem !== value) {
					_localeItem = value;
					if (_localeItem) {
						keyLabel.text = _localeItem.key;
						keyLabel.toolTip = _localeItem.key;
						itemValue.text = _localeItem.value;
						setRerenceLocale();
					}
				}
			}

			protected function deleteKeyButton_clearHandler(event:Event):void {
				Alert.show("Are you sure you want to remove " + localeItem.key + "?", "Please confirm", Alert.YES | Alert.NO, this, function(closeEvent:CloseEvent):void {
					if (closeEvent.detail == Alert.YES) {
						dispatchEvent(new LocaleItemEvent(LocaleItemEvent.REMOVE_LOCALE_ITEM_REQUEST, localeItem.key));
					}
				});
			}

			private function handleReferenceLocaleChanged(event:Event):void {
				setRerenceLocale();
			}

			private function setRerenceLocale():void {
				if ((applicationModel) && (applicationModel.referenceLocale) && (localeItem)) {
					var item:LocaleItemDataVO = applicationModel.referenceLocale.getItemByKey(localeItem.key);
					itemReference.text = (item) ? item.value : "";
				}
			}

			private function textarea1_valueCommitHandler(event:FlexEvent):void {
				if ((localeItem) && (itemValue)) {
					localeItem.value = itemValue.text;
				}
			}
		]]>
	</fx:Script>
	<s:VGroup width="225">
		<s:Button id="deleteKeyButton"
				  width="30"
				  height="30"
				  label="X"
				  toolTip="Remove this translation"
				  click="deleteKeyButton_clearHandler(event)"/>
		<s:Label id="keyLabel"
				 fontWeight="bold"/>
	</s:VGroup>
	<s:TextArea id="itemValue"
				width="400"
				valueCommit="textarea1_valueCommitHandler(event)"/>
	<s:TextArea id="itemReference"
				width="400"
				editable="false"
				selectable="true"/>
</s:ItemRenderer>
