<?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.
-->
<assembler>
    <scripts>
        <!--
            Assembly for our javascripts
            if you want to include them manually use:

            
            <script type="text/javascript" src="./myfaces/_impl/core/_Runtime.js"></script>
            <script type = "text/javascript" src = "myfaces/_impl/_util/_Lang.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/_util/_Queue.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/_util/_ListenerQueue.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/_util/_Dom.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/_util/_HtmlStripper.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/xhrCore/_AjaxUtils.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/xhrCore/_AjaxRequestQueue.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/xhrCore/_AjaxRequest.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/xhrCore/_AjaxResponse.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/xhrCore/_Transport.js"></script>
            <script type = "text/javascript" src = "./myfaces/_impl/core/Impl.js"></script>
            <script type = "text/javascript" src = "./myfaces/api/jsf.js"></script>
        -->


        <script>
            <fileName>jsf-uncompressed-full.js</fileName>
            <includes>
                <include>**/_impl/core/_EvalHandlers.js</include>
                <include>**/_impl/core/_Runtime.js</include>
                <include>**/_impl/core/_RuntimeQuirks.js</include>
                <include>**/_impl/core/_StartImpl.js</include>
                <include>**/_impl/i18n/Messages.js</include>

                <include>**/_impl/i18n/Messages_de.js</include>
                <include>**/_impl/i18n/Messages_nl.js</include>
                <include>**/_impl/i18n/Messages_es.js</include>
                <include>**/_impl/i18n/Messages_fr.js</include>
                <include>**/_impl/i18n/Messages_it.js</include>
                <include>**/_impl/i18n/Messages_ru.js</include>
                <include>**/_impl/i18n/Messages_zh_CN.js</include>
                <include>**/_impl/i18n/Messages_zh_HK.js</include>
                <include>**/_impl/i18n/Messages_zh_TW.js</include>
                <include>**/_impl/_util/_Lang.js</include>
                <include>**/_impl/_util/_LangQuirks.js</include>
                <include>**/_impl/core/Object.js</include>

                <include>**/_impl/_util/_Queue.js</include>
                <include>**/_impl/_util/_ListenerQueue.js</include>
                <include>**/_impl/_util/_Dom.js</include>
                <include>**/_impl/_util/_DomExperimental.js</include>
                <include>**/_impl/_util/_DomQuirks.js</include>
                <include>**/_impl/_util/_HtmlStripper.js</include>

                <include>**/_impl/_util/_OamSubmit.js</include>

                <include>**/_impl/xhrCore/_AjaxUtils.js</include>
                <include>**/_impl/xhrCore/_AjaxRequestQueue.js</include>

                <!-- the jsf.js independend xhr core engine -->
                <include>**/_impl/xhrCore/engine/XhrConst.js</include>
                <include>**/_impl/xhrCore/engine/FormData.js</include>
                <include>**/_impl/xhrCore/engine/BaseRequest.js</include>
                <include>**/_impl/xhrCore/engine/Xhr1.js</include>
                <include>**/_impl/xhrCore/engine/IFrame.js</include>

                <include>**/_impl/xhrCore/_AjaxRequest.js</include>
                <include>**/_impl/xhrCore/_AjaxRequestLevel2.js</include>
                <!-- not yet used in 2.0 but for development purposes it makes sense to include it here -->
                <include>**/_impl/xhrCore/_IFrameRequest.js</include>
                <include>**/_impl/xhrCore/_AjaxResponse.js</include>
                <include>**/_impl/xhrCore/_Transports.js</include>
                <include>**/_impl/xhrCore/_ExtTransport.js</include>
                <include>**/_impl/core/Impl.js</include>

                <!-- optimization helper -->
                <include>**/_impl/core/_EndImpl.js</include>
                <!-- api -->
                <include>**/api/jsf.js</include>
            </includes>
        </script>
    </scripts>
</assembler>
