<?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="getLocalBaseUrl">
	<![CDATA[
		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>

	<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) {
			return protocol + "://" + host + ":" + port + "/" + context + "/public/";
		} else {
			return getLocalBaseUrl();
		}
	]]>
	</method>

<!-- get values from public/config.xml -->
<dataset type="http" name="myConfigSet" request="false" ondata="parent.mainTheme.loadTheme()" proxied="false">
    <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>

<method name="reloadConfig">
	
</method>

<!-- get values from public/config.xml -->
<dataset type="http" name="mainTheme" request="false" ondata="canvas.myinit()" proxied="false">
    <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>
