<?xml version="1.0" encoding="utf-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<!-- Christophe Coenraets, http://coenraets.org -->
<charts:PortfolioChart xmlns:fx="http://ns.adobe.com/mxml/2009" 
	xmlns:s="library://ns.adobe.com/flex/spark" xmlns:charts="charts.*" xmlns:ns="http://ns.adobe.com/rtc">
	
	<fx:Script>
		<![CDATA[
			import com.adobe.rtc.events.CollectionNodeEvent;
			import com.adobe.rtc.messaging.MessageItem;
			import com.adobe.rtc.session.ConnectSession;
			
			import mx.binding.utils.ChangeWatcher;
			import mx.events.PropertyChangeEvent;
			import mx.utils.UIDUtil;
			
			protected var _uid:String = UIDUtil.createUID();
			
			protected var changeWatcher:ChangeWatcher;
			
			public function set session(session:ConnectSession):void
			{
				broker.connectSession = session;
				broker.subscribe();
			 	changeWatcher = ChangeWatcher.watch(scroller.viewport, "horizontalScrollPosition", scrollHandler);
			}
			
			override protected function zoom(scaleX:Number):void
			{
				super.zoom(scaleX);
				var message:MessageItem = new MessageItem("gesture");
				message.body = {uid: _uid, action: "zoom", scaleX: scaleX};
				broker.publishItem(message);
			}

			protected function scrollHandler(e:Event):void
			{
				var message:MessageItem = new MessageItem("gesture");
				message.body = {uid: _uid, action: "scroll", horizontalScrollPosition: scroller.viewport.horizontalScrollPosition};
				broker.publishItem(message);
			}
			
			protected function onItemReceive(event:CollectionNodeEvent):void 
			{
				if (event.item.body.uid == _uid)
				{
					// Ignoring own message
					return; 
				}
				var messageBody:Object = event.item.body;
				switch (messageBody.action)
				{
					case "zoom":
						super.zoom(messageBody.scaleX);
						break;
					case "scroll":
						changeWatcher.unwatch();
						scroller.viewport.horizontalScrollPosition = messageBody.horizontalScrollPosition;
						changeWatcher = ChangeWatcher.watch(scroller.viewport, "horizontalScrollPosition", scrollHandler);
						break;
				}
			}
			
			
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<ns:CollectionNode id="broker" sharedID="gesture" itemReceive="onItemReceive(event)"/> 
	</fx:Declarations>

</charts:PortfolioChart>
