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

<class name="customEdittext" extends="inputtext" bgcolor="0xFFFFFF" fontsize="11" height="20" >
	
	<view name="v_border" height="1"       bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }" width="$once{parent.width}" />
    <view name="h_border" width="1"  y="1" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }" height="$once{parent.height -1}" />
	
	<attribute name="labelid" type="number" setter="setLabelId(labelid)" />
	
	<attribute name="isvalidInput" value="true" type="boolean" />
	<attribute name="regexpType" value="none" type="string" />
	<attribute name="regexpLabelid" type="number" />
	<attribute name="preText" value="" type="string" />
    <attribute name="emailRegEx" type="string" value=""/>
	
	<event name="onafterCheck" />

	<handler name="onfocus" args="f">
    	this.preText = this.getText();
    </handler>
    
    <handler name="oninit">
    <![CDATA[
    	emailRegEx = "^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{1,3})$";
    	//this.field.setAttribute("bgcolor",0xFFFFFF);
    ]]>
    </handler>
    
    <handler name="ontext" args="txt">
    	<![CDATA[
            
    	    //
    	   
    	    if (System.capabilities.os.indexOf('Linux')==-1) { 
                return; 
	        }
	        
	        //if ($debug) Debug.write("System.capabilities.os -- START ",System.capabilities.os,txt);
	        
	        if (txt == null || txt.length == 0) {
	        	return;
	        }
	        
	        
	        //UTF8 character remappings
            var cp1252 = new Object();
            cp1252[0x20ac]=0x80;
            cp1252[0x201a]=0x82;
            cp1252[0x0192]=0x83;
            cp1252[0x201e]=0x84;
            cp1252[0x2026]=0x85;
            cp1252[0x2020]=0x86;
            cp1252[0x2021]=0x87;
            cp1252[0x02c6]=0x88;
            cp1252[0x2030]=0x89;
            cp1252[0x0160]=0x8a;
            cp1252[0x2039]=0x8b;
            cp1252[0x0152]=0x8c;
            cp1252[0x017d]=0x8e;
            cp1252[0x2018]=0x91;
            cp1252[0x2019]=0x92;
            cp1252[0x201c]=0x93;
            cp1252[0x201d]=0x94;
            cp1252[0x2022]=0x95;
            cp1252[0x2013]=0x96;
            cp1252[0x2014]=0x97;
            cp1252[0x02dc]=0x98;
            cp1252[0x2122]=0x99;
            cp1252[0x0161]=0x9a;
            cp1252[0x203a]=0x9b;
            cp1252[0x0153]=0x9c;
            cp1252[0x017e]=0x9e;
            cp1252[0x0178]=0x9f;
    	
            
            var s=eval(Selection.getFocus()); 
            var t=txt;
                    
            var i=Selection.getCaretIndex()-1; 
            
            //if ($debug) Debug.write("i",i,Selection.getCaretIndex());
            
            var d=i;
            
            //if ($debug) Debug.write("DO WHILE -1- ",t.charCodeAt(i),cp1252[t.charCodeAt(i)],i,0x80,0xBF);
            
            while (((t.charCodeAt(i)>=0x80 && t.charCodeAt(i)<=0xBF) || (cp1252[t.charCodeAt(i)])) && i>0) {
            	
            	//if ($debug) Debug.write("DO WHILE -2- ",t.charCodeAt(i),cp1252[t.charCodeAt(i)],i);
            	
                if (cp1252[t.charCodeAt(i)]) {
                    t=t.substr(0,i)+String.fromCharCode(cp1252[t.charCodeAt(i)])+t.substr(i+1);
                }
                i--;
            }
            if (i==d) { 
            	//if ($debug) Debug.write("i == d NOTHING TO REPLACE!");
                return; 
            }
        
            var u=0;
            
            if (t.charCodeAt(i)>=0xC2 && t.charCodeAt(i)<=0xDF && d-i==1) {
                 // two-byte sequence
                u= (t.charCodeAt(i+1) & 0x3F)       +
                  ((t.charCodeAt(i  ) & 3   ) << 6) +
                  ((t.charCodeAt(i  ) & 0x1C) << 6);
            } else if (t.charCodeAt(i)>=0xE0 && t.charCodeAt(i)<=0xEF && d-i==2) {
                // three-byte sequence
                // (Flash Player doesn't cope with any more obscure Unicode)
                u= (t.charCodeAt(i+2) & 0x3F)        +
                  ((t.charCodeAt(i+1) & 3   ) << 6 ) +
                  ((t.charCodeAt(i+1) & 0x3C) << 6 ) +
                  ((t.charCodeAt(i  ) & 0x0F) << 12);
            }
        
            if (u!=0) {
            	//if ($debug) Debug.write("Replace String -1- ",txt,u,"Replace With ",String.fromCharCode(u));
            	
                this.setAttribute("text",t.slice(0,i)+String.fromCharCode(u)+t.slice(d+1));
                
                //if ($debug) Debug.write("Replace String -2- ",txt,u);
                
                this.setAttribute("text",this.text.split(String.fromCharCode(0x03)).join(''));
            }
            
            //if ($debug) Debug.write("-- END ",this.text);
            
    	]]>
    </handler>
    
    <attribute name="callDelegate" value="null" />
    <attribute name="regExpCheckId" value="-1" />
	
	<handler name="onblur">
		<![CDATA[
			if (this.regexpType!="none"){
			
				//if ($debug) Debug.write("onblur");
				//if ($debug) Debug.write("onblur check ",this.regexpType);		
				var fieldValue = this.getText();
				if (this.regexpType=="email") {
					//var regExpV = ".+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)";
					var regExpV = this.emailRegEx;
					//var regExpV = "^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
					this.regexpLabelid = 519;
				} else if (this.regexpType=="date"){
					var regExpV = "(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d";
					this.regexpLabelid = 518;
				} else if (this.regexpType=="float"){
					var regExpV = "[0-9]*\\.[0-9]*";
					this.regexpLabelid = 520;
				} else if (this.regexpType=="phone"){
					var regExpV = "\\+[0-9]+ [0-9]+ [0-9\\-]+";
					this.regexpLabelid = 522;
				} else if (this.regexpType=="number"){
					var regExpV = "[0-9]*";
					this.regexpLabelid = 521;
				} else if (this.regexpType=="time"){
					var regExpV = "([01][0-9]|2[0-3]):[0-5][0-9]";
					this.regexpLabelid = 523;
				} else {
					if ($debug) Debug.warn("Unkown Regexp Type: ",this.regexpType);
				}
				//if ($debug) Debug.write("regExpV: ",regExpV);
		  	    var fieldValue = this.getText();
		  	    
		  	    this.regExpCheckId = canvas.doRegExpCheck(this.getText(),regExpV);
		  	    
		  	    if(this.callDelegate == null) {
		  	    	this.callDelegate = new LzDelegate( this, "checkRegExpResult" );
		  	    }
		
				lz.Timer.resetTimer( this.callDelegate, 50 );
			}
		]]>
	</handler>
	
	<method name="checkRegExpResult" args="item">
		var tResult = canvas.checkRegExpResult(this.regExpCheckId);
     	if ($debug) Debug.write("callback",tResult);
     
		if(tResult == undefined || tResult == null) {
			lz.Timer.resetTimer( this.callDelegate, 50 );
		} else {
			if(!tResult){
                if ($debug) Debug.warn("FALSE: regexperror");
              	disablesTooltips(new lz.regexptip(canvas,{x:this.getAttributeRelative('x',canvas)+12,
              					y:this.getAttributeRelative('y',canvas)+26,
              					regexptext:canvas.getLabelName(this.regexpLabelid)}));
              	this.usePreContent();
              	this.setAttribute('isvalidInput',false);
            } else {
              	if(!this.isvalidInput){
                	disablesTooltips(null);
              	}
              	this.setAttribute('isvalidInput',true);
            }
            if ($debug) Debug.write("-- Complete --");
            this.onafterCheck.sendEvent();
		}
     </method>
	
    
    <method name="setLabelId" args="_labelid" >
        this.labelid = _labelid;
        this.setAttribute('text',canvas.getLabelName(this.labelid));
    </method>
    
  	<method name="usePreContent">
  		this.setAttribute('text',this.preText);
  	</method>    
    
</class>

</library>
