<!--
  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>

	<!-- CLASS: rtlText ============================================ --> 
	<!-- use this on dynamic data text tags. -->
	<class name="rtlText" extends="text">
		
		<!-- ATTRIBUTES -->
		<!-- text alignment: default is right -->
    <attribute name="textAlign" value="right" type="string" /> 
    
    <method name="getTextAlign">    
    	return this.textAlign;
    </method>
    
    <method name="setTextAlign">
    	switch ( this.getTextAlign() ) {
				case "left" :
					this.setX( 0 );
				break;
				case "center" :
					this.setX( this.parent.width / 2 - this.getTextWidth() / 2 );
				break;
				case "right" :
					this.setX( this.parent.width - this.getTextWidth() );
				break;
			}
    </method>
    
    <method name="isLTR" args="c">
		<![CDATA[
			return ( c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 );
		]]>
	</method>
    
    <method name="isHEB" args="c">
		<![CDATA[
			return ( c >= 224 && c <= 250 );
		]]>
	</method>
    
    <method name="reverseWords" args="str">
		<![CDATA[
			if ( str == "" || str == null ) return ""; // undefined
			// first char indicates the main directive of str (rtl/ltr)
			if ( isLTR( str.charCodeAt( 0 ) ) ) return str; // english or number
			var words_arr = str.split( "" ); // an array of chars
			for ( var i = 0, str = ""; i < words_arr.length; i++ ) // reverse their order
				str += words_arr[ words_arr.length - i - 1 ];
			return str;
		]]>
	</method>
		
	<method name="applyData" args="rtl_str">
		this.setAttribute('text', reverseWords( rtl_str ) );
	</method>
	
	<handler name="ontext">
		setTextAlign();
	</handler>
		
	</class>

</library>
