<?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.

-->
<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   xmlns:local="*" xmlns:layouts="layouts.*"
			   initialize="init()">
	
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.rpc.xml.SimpleXMLDecoder;
			import mx.rpc.xml.SimpleXMLEncoder;
			import mx.utils.ArrayUtil;
			
			[Bindable]
			private var items:ArrayCollection;
			
			[Bindable]
			private var filteredItems:ArrayCollection;
			
			[Bindable]
			private var _maxPrice:Number = 1000;
			
			[Bindable]
			private var _camera:Boolean = false;
			
			[Bindable]
			private var _video:Boolean = false;
			
			[Bindable]
			private var _triband:Boolean = false;
			
			[Embed(source="data/catalog.xml", mimeType="application/octet-stream")]
			private var XMLData:Class;
			
			private function init():void
			{
				var data:XML = XML(new XMLData());
				var xmlDoc:XMLDocument = new XMLDocument(data);
                var decoder:SimpleXMLDecoder = new SimpleXMLDecoder(true);
                var object:Object = decoder.decodeXML(xmlDoc);
				
				items = object.catalog.product;
				filteredItems = new ArrayCollection(items.source);
				filteredItems.filterFunction = filter;
			}
			
			private function selectionChange():void
			{
				filteredItems.refresh();
				filterLayout.filter();
			}
			
			private function filter(item:Object):Boolean
			{
				return	(item.price <= _maxPrice) &&
					(!_camera || item.camera) &&
					(!_video || item.video) &&
					(!_triband || item.triband);
			}			
			
		]]>
	</fx:Script>

	<s:Panel title="Custom Layout Sample" width="100%" height="100%">
		
		<s:layout>
			<s:VerticalLayout paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10"/>
		</s:layout>
		
		<s:HGroup>
			<s:Label text="Max Price:"/>
			<s:HSlider id="priceSlider" minimum="0" maximum="1000" snapInterval="100" value="@{_maxPrice}" change="selectionChange()"/>
			<mx:Spacer width="20"/>
			<s:CheckBox label="Camera" selected="@{_camera}" change="selectionChange()"/>
			<s:CheckBox label="Video" selected="@{_video}" change="selectionChange()"/>
			<s:CheckBox label="Triband" selected="@{_triband}" change="selectionChange()"/>
		</s:HGroup>
		
		<s:DataGroup dataProvider="{items}" itemRenderer="renderers.PhoneRenderer" width="100%" height="100%">
			<s:layout>
				<layouts:FilteredTileLayout id="filterLayout" filteredItems="{filteredItems}" />
			</s:layout>
		</s:DataGroup>
		
	</s:Panel>
</s:Module>
