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

<script>
<![CDATA[


	flash.external.ExternalInterface.addCallback("redirectToUrlCallback", null, redirectToUrlCallback);
	flash.external.ExternalInterface.addCallback("getTimeZoneOffsetCallback", null, getTimeZoneOffsetCallback);
    flash.external.ExternalInterface.addCallback("getBrowserInfoCallback", null, getBrowserInfoCallback);
    flash.external.ExternalInterface.addCallback("getBrowserLangCallback", null, getBrowserLangCallback);

	
	var redirectToUrlReturnObject = null;
	var timeZoneOffsetReturnObject = null;
	var browserInfoReturnObject = null;
	var browserLangReturnObject = null;
	
	function redirectToUrl(url, returnObject) {
		
		redirectToUrlReturnObject = returnObject;
		
		flash.external.ExternalInterface.call("redirectToUrl", url);
		
		//lz.Browser.callJS("redirectToUrl",callback,this.redirectURL);
	}
	
	function redirectToUrlCallback(returnValue) {
		if ($debug) Debug.write("redirectToUrlCallback ",returnValue);
		if (redirectToUrlReturnObject != null) {
			redirectToUrlReturnObject.callback(returnValue);
		}
	}

	
	function getTimeZoneOffset(returnObject) {
		
		timeZoneOffsetReturnObject = returnObject;
		
		flash.external.ExternalInterface.call("getTimeZoneOffset");
		
		//lz.Browser.callJS("getTimeZoneOffset",getTimeZoneOffsetCallback);
	}
	
	function getTimeZoneOffsetCallback(returnValue) {
		if ($debug) Debug.write("getTimeZoneOffsetCallback ",returnValue);
		if (timeZoneOffsetReturnObject != null) {
			timeZoneOffsetReturnObject.callback(returnValue);
		}
	}
	
	
	function getBrowserInfo(returnObject) {
        
        browserInfoReturnObject = returnObject;
        
        flash.external.ExternalInterface.call("getBrowserInfo");
        
        //lz.Browser.callJS("getBrowserInfo",callback);
    }
    
    function getBrowserInfoCallback(returnValue) {
        if ($debug) Debug.write("getBrowserInfoCallback ",returnValue);
        if (browserInfoReturnObject != null) {
            browserInfoReturnObject.callback(returnValue);
        }
    }
    
    
    function getBrowserLang(returnObject) {
        
        browserLangReturnObject = returnObject;
        
        flash.external.ExternalInterface.call("getBrowserLang");
        
        //lz.Browser.callJS("getBrowserLang",callback);
    }
    
    function getBrowserLangCallback(returnValue) {
        if ($debug) Debug.write("getBrowserLangCallback ",returnValue);
        if (browserLangReturnObject != null) {
            browserLangReturnObject.callback(returnValue);
        }
    }
	

]]>
</script>

</library>
