﻿<?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.

-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" applicationComplete="init()">
<mx:Script>
	<![CDATA[
		import com.adobe.linguistics.spelling.*;
		
		private var _newdict:HunspellDictionary = new HunspellDictionary();
		private var sp:SpellChecker;
		private function init():void {
				_newdict.addEventListener(Event.COMPLETE, handleLoadComplete);
				_newdict.load("dictionaries/en_US/en_US.aff", "dictionaries/en_US/en_US.dic");
		}
		private function handleLoadComplete(evt:Event):void
		{
			sp = new SpellChecker(_newdict);
		}

		private function checkWord():void {
			if( sp.checkWord( inputWord.text ) )
				result.text = "Result:correct";
			else
				result.text = "Result:wrong";
		}
		
	]]>
</mx:Script>
	<mx:TextInput id="inputWord" text ="test" keyUp="checkWord()"/>
	<mx:Label id ="result" text="Result:"/>
</mx:Application>
