<?xml version="1.0"?>
<!--

  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.

-->

<!-- Note:
    If you modify this file you may have to make the same change in build_framework.xml.
    build_framework.xml is renamed to build.xml when it is packaged.
    It is used to build the frameworks directory from the zip file. 
-->
<project name="examples" default="main" basedir=".">

    <property name="FLEXJS_HOME" location=".."/>

    <!-- Required for OSX 10.6 / Snow Leopard Performance. -->
    <!-- Java 7 on Mac requires OSX 10.7.3 or higher and is 64-bit only -->
    <!-- local.d32 is set/used in build.properties so this needs to be done first. -->
    <condition property="local.d32" value="-d32">
        <and>
            <os family="mac"/>
            <matches pattern="1.6.*" string="${java.version}"/>
            <equals arg1="${sun.arch.data.model}" arg2="64"/>
            <equals arg1="${os.arch}" arg2="x86_64"/>
        </and>
    </condition>

    <!-- Property for the platform.  -->
    <condition property="isMac">
        <os family="mac"/>
    </condition>
    <condition property="isWindows">
        <os family="windows" />
    </condition>   
    <condition property="isLinux">
        <and>
          <os family="unix"/>    
          <not>
            <os family="mac"/>    
          </not>
        </and>
    </condition>  

    <property file="${FLEXJS_HOME}/env.properties"/>
    <property environment="env"/>
    <property file="${FLEXJS_HOME}/build.properties"/>
 
    <target name="main" depends="check-compile-env,clean,prepare,compile" 
        description="Clean build of all examples"/>

    <target name="check-compile-env" description="Check for the required environment variables">
        <ant antfile="${FLEXJS_HOME}/build.xml" target="check-compile-env" dir="${FLEXJS_HOME}"/>
    </target>

    
    <target name="prepare" depends="thirdparty-downloads"/>
            
    <target name="thirdparty-downloads" unless="no.thirdparty-downloads" description="Downloads all the required thirdparty code.">
        <!--<ant antfile="${basedir}/downloads.xml" dir="${basedir}"/>-->
    </target>
    
    <target name="compile" description="Compile Examples" >
        <ant dir="${basedir}/ContainerTest"/>
		<ant dir="${basedir}/DateChooserExample"/>
        <ant dir="${basedir}/EffectsExample"/>
        <ant dir="${basedir}/FlexJSTest_basic"/>
        <ant dir="${basedir}/FlexJSTest_createjs"/>
        <ant dir="${basedir}/FlexJSTest_HTML5"/>
        <ant dir="${basedir}/FlexJSTest_jquery"/>
        <ant dir="${basedir}/FlexJSTest_Panel"/>
        <ant dir="${basedir}/FlexJSTest_SVG"/>
        <ant dir="${basedir}/FormExample"/>
        <ant dir="${basedir}/ImageTest"/>
        <ant dir="${basedir}/LanguageTests"/>
        <ant dir="${basedir}/ListsTest"/>
        <ant dir="${basedir}/RollEventsTest"/>
        <ant dir="${basedir}/ReflectionTest"/>
        <ant dir="${basedir}/XMLTest"/>
    </target>
	   
    <!--
		Cleanup
	-->

    <target name="super-clean" depends="thirdparty-clean,clean" description="Cleans everything including thirdparty downloads."/>
	
    <target name="thirdparty-clean" unless="no.thirdparty-clean" description="Removes all thirdparty downloads.">
        <!--<ant antfile="${basedir}/downloads.xml" target="clean" dir="${basedir}"/>-->
    </target>
    
    <target name="clean" description="Cleans all SWCs and their resource bundles">
        <ant dir="${basedir}/ContainerTest" target="clean"/>
        <ant dir="${basedir}/DataBindingTestbed" target="clean"/>
        <ant dir="${basedir}/DateChooserExample" target="clean"/>
        <ant dir="${basedir}/EffectsExample" target="clean"/>
        <ant dir="${basedir}/FlexJSTest_basic" target="clean"/>
        <ant dir="${basedir}/FlexJSTest_createjs" target="clean"/>
        <ant dir="${basedir}/FlexJSTest_HTML5" target="clean"/>
        <ant dir="${basedir}/FlexJSTest_jquery" target="clean"/>
        <ant dir="${basedir}/FlexJSTest_Panel" target="clean"/>
        <ant dir="${basedir}/FlexJSTest_SVG" target="clean"/>
        <ant dir="${basedir}/FormExample" target="clean"/>
        <ant dir="${basedir}/FormatExample" target="clean"/>
        <ant dir="${basedir}/ImageTest" target="clean"/>
        <ant dir="${basedir}/LanguageTests" target="clean"/>
        <ant dir="${basedir}/ListsTest" target="clean"/>
        <ant dir="${basedir}/RollEventsTest" target="clean"/>
        <ant dir="${basedir}/ReflectionTest" target="clean"/>
        <ant dir="${basedir}/XMLTest" target="clean"/>
    </target>
    
</project>
