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

<!-- all datasets for main.lzx -->

<library>

	<method name="getServerBaseUrl">
	<![CDATA[
		var protocol = lz.Browser.getInitArg('protocol');
		var host = lz.Browser.getInitArg('host');
		var port = lz.Browser.getInitArg('port');
		var context = lz.Browser.getInitArg('context');
		if (protocol != undefined && host != undefined && port != undefined && !isNaN(port) && context != undefined) {
			canvas.setAttribute('isCluster', true);
			canvas.setAttribute('rtmphostlocal', host);
			return protocol + "://" + host + ":" + port + "/" + context + "/public/";
		} else {
			var urlObject = lz.Browser.getBaseURL();
			//If Port is Null or undefinied use port 80
			var port = (urlObject.port != null && urlObject.port != undefined) ? urlObject.port : 80;
			//if($debug) Debug.write("getBaseUrl:: [urlObject, port]", urlObject, port);
			var url = "" + urlObject.protocol + "://" + urlObject.host + (port != 80 ? ":" + port : "") + urlObject.path;
			//if($debug) Debug.write("!!!!!!! getBaseUrl:: [urlObject, port, url]", urlObject, port, url);
			url = url + (url.slice(-1) == '/' ? '' : '/');
			//if($debug) Debug.write("!!!!!!! getBaseUrl:: [last, url]", url.slice(-1), url);
			return url;
		}
	]]>
	</method>

<!-- get values from public/config.xml -->
<dataset type="http" name="myConfigSet" request="false" ondata="parent.mainTheme.loadTheme()">
    <handler name="oninit">
        var d = new Date();
        this.setAttribute("src", canvas.getServerBaseUrl() + "config.xml?random=" + d.getTime());
        this.doRequest();
    </handler>
    <handler name="ondata">
        if ($debug) Debug.write("ondata");
    </handler>
    <handler name="onerror" args="e">
        if ($debug) Debug.write("onerror",e);
    </handler>
    <handler name="ontimeout" args="e">
        if ($debug) Debug.write("ontimeout",e);
    </handler>
</dataset>

<!-- get values from public/config.xml -->
<dataset type="http" name="mainTheme" request="false" ondata="canvas.myinit()">
    <method name="loadTheme">
        var d = new Date();
        this.setAttribute("src", canvas.getServerBaseUrl() + "theme.xml?random=" + d.getTime());
        this.doRequest();
    </method>
    <handler name="ondata">
        if ($debug) Debug.write("ondata");
    </handler>
    <handler name="onerror" args="e">
        if ($debug) Debug.write("onerror",e);
    </handler>
    <handler name="ontimeout" args="e">
        if ($debug) Debug.write("ontimeout",e);
    </handler>
</dataset>

</library>
