////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
  
package com.adobe.linguistics.spelling.framework
{
	import flash.utils.IDataInput;
	import flash.utils.IDataOutput;
	import flash.utils.IExternalizable;

	[RemoteClass(alias='com.adobe.linguistics.spelling.framework.ResourceConfig')]
		
	/**
	 * The ResourceTable class contains a table mapping language to the spelling resources. Resources here imply the URL of rule file and dict file to be used for the language.
	 * 
	 * @includeExample ../Examples/Flex/ConfigExample/src/ConfigExample.mxml -noswf
	 * @playerversion Flash 10
	 * @langversion 3.0
	 */
	public class ResourceTable implements IExternalizable
	{
		private var _resources:Object;
		
		/**
		 * Constructs a new ResourceTable object that performs language to resource mapping. 
		 */
		public function ResourceTable()
		{
			_resources = {};
		}

		/**
		 * A list of languages supported in this ResourceTable
		 */
		public function get availableLanguages():Vector.<String>
		{
			var result:Vector.<String> = new Vector.<String>();
			for (var i:String in _resources)
			{
				result.push(i);
			}
			return result;
		}
		
		/**
		 * Set the resource for the specified language.
		 * 
		 * @param language The language that you want to assign spelling resources to.
		 * @param resource A <code>Object</code> that behave as an associated array, it 
		 * contains the path(s) to the resource file(s). For the time being, the only 
		 * supported resource is hunspell dictionary, which contains a rule file (.aff) and a 
		 * dictionary file (.dic). 
		 * 
		 * @example The following code sets the resource for American English language.
		 * <listing version="3.0">
		 * var resourceTable:ResourceTable = new ResourceTable();
		 * resourceTable.setResource("en_US", {rule:"en_US.aff", dict:"en_US.dic"});
		 * </listing>
		 */
		public function setResource(language:String, resource:Object):void
		{
			_resources[language] = resource;
		}
		
		/**
		 * Get the resource for the specified language.
		 * 
		 * @param language The language associated with the resource you are looking for.
		 * @return An <code>Object</code> that stores the resource file URL(s).
		 * @example The following code gets and uses the resource for American English language.
		 * <listing version="3.0">
		 * var resource_en_US:Object = SpellingConfiguration.resourceTable.getResource("en_US");
		 * trace("rule file:" + resource_en_US["rule"] + ", dictionary file:" + resource_en_US.dict);
		 * </listing>
		 */
		public function getResource(language:String):Object
		{
			return _resources[language];
		}
		
		/**
		 * Overwrite toString() for debug purpose.
		 * @private
		 */
		public function toString():String
		{
			var result:String = new String();
			for (var i:String in _resources)
			{
				result += i;
				result += ": ";
				result += "[";
				for (var j:String in getResource(i))
				{
					result += j + ":" + getResource(i)[j] + " "
				}
				result += "]";
				result += "; ";
			}
			return result;
		}
		
		/**
		 * Implement this IExternalizable API so that it can be serialized to an ByteArray.
		 * @private
		 */
		public function readExternal(input:IDataInput):void {
			_resources = input.readObject();
		}
		
		/**
		 * Implement this IExternalizable API so that it can be serialized to an ByteArray.
		 * @private
		 */
		public function writeExternal(output:IDataOutput):void {
			output.writeObject(_resources);
		}
	}
}