<?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.
  
-->
<canvas height="400" debug="true">
	
<include href="lz/textlistitem.lzx" />
	
<script>
<![CDATA[
	
String.prototype.startsWith = function(prefix) {
    return (this.indexOf(prefix) === 0);
};	
	
]]>
</script>
	
<attribute name="statesInitValues" value="null" />
	
<handler name="oninit">
	<![CDATA[
		var tChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		var tCharsSmall = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
		
		this.statesInitValues = new Array();
		var m = 0;
		while (m<20){
			for (var i = 0;i<26;i++){
				for (var r=0;r<3;r++){
					var t = new Array();
					t["state_id"] = i*r;
					t["name"] = tChars.charAt(i)+tCharsSmall.charAt(( Math.random()*100))+tCharsSmall.charAt(( Math.random()*100))+tCharsSmall.charAt(( Math.random()*100))+tCharsSmall.charAt(( Math.random()*100))+tCharsSmall.charAt(( Math.random()*100));
					this.statesInitValues.push(t);
				}
			}
			m++;
		}
		//Debug.write(this.statesInitValues);
		
		this._validbox.addItem("Da","1");
		this._validbox.selectItem("1",true);
	]]>
</handler>
	
<method name="validateCountry" args="str">
	//Debug.write("validateCountry: ",str);
	<![CDATA[
		if (str.length!=0){
			var a = new Array();
			for (var i=0;i<canvas.statesInitValues.length;i++){
				if (canvas.statesInitValues[i].name.startsWith(str))a.push(canvas.statesInitValues[i]);
				//this.addItem(canvas.statesInitValues[i].name,canvas.statesInitValues[i].state_id);
			}
			return a;
		}
	]]>	
</method>	
	

    <include href="base/baseformitem.lzx" />
    <include href="lz/list.lzx" />
    <include href="lz/floatinglist.lzx" />
	
	<include href="lz/combobox.lzx" />

    <!--- A dropdown list of selectable items. -->
    <class name="baseValidCombobox" extends="baseformitem" focusable="false" width="100">
        <!--- @keywords private -->
        <attribute name="defaultplacement"  value="cblist" type="string"/>

        <!-- attributes -->
        <!--- The value of the combobox. -->
        <attribute name="value" value="${cblist.value}"/>

        <!--- Indicates whether or not the popup list is showing.  -->
        <attribute name="isopen"       value="false"  setter="this.setOpen(isopen)" />

        <!--- The border size ( in pixels ) of the popup list.  -->
        <attribute name="bordersize"   value="1" />

        <!--- The spacing size ( in pixels ) between items in the pop-up list.  -->
        <attribute name="spacing"   value="0" />

        <!--- The text that appears in the text field when no item is selected. -->
        <attribute name="defaulttext"  value="" type="string" />

        <!--- The number of the item that is initially selected. This overrides
              the value defined in the defaulttext attribute -->
        <attribute name="defaultselection"  value="null" type="number"  setter="this.setDefaultSelection( defaultselection )"/>

        <!--- This event is sent when the default selection is set.  -->
        <event name="ondefaultselection" />

        <!--- The class that is used to create an item in the list when
              itemdatapath is assigned. -->
        <attribute name="itemclassname" setter="this.setItemclassname(itemclassname)"  value="" type="string" />

        <!--- Sets the height of the combobox to show 'n' items. -->
        <attribute name="shownitems"   value="-1" />

        <!--- @keywords private  -->
        <attribute name="mousedownintext" value="false"/>

        <!--- @keywords private  -->
        <attribute name="initcomplete" value="0" />

        <!--- Whether a scrollbar should automatically show up when there are more
              items than shownitems. -->
        <attribute name="autoscrollbar" value="true"/>

        <!--- The initial selected item. -->
        <attribute name="selected" value="null"/>

        <!--- This event is triggered whenever the user makes a selection. It
              may be used as a script in the combobox tag or as an event method.
              -->
        <event name="onselect"/>

        <!--- One of "lazy", "resize", "pooling", "none". -->
        <attribute name="dataoption" value="none" type="string"/>

        <!--- The vertical offset of the floatinglist attached to this
              combobox. -->
        <attribute name="attachoffset" value="-1" type="number"/>

        <!--- the x position of the text. default: 2 -->
        <attribute name="text_x" value="2" type="number"/>

        <!--- the y position of the text. default: 2 -->
        <attribute name="text_y" value="2" type="number"/>

        <!--- the width the text. default: combowidth - 19 -->
        <attribute name="text_width" value="${this.width - 19}" type="number"/>

        <!--- The minimum width this component is allowed to be.
              Defaults to 50 pixels.
              @keywords defaultsetter -->
        <attribute name="min_width" value="50" type="number" />
        
        <!--- The method to be called for validating -->
        <attribute name="validate_method" value="null" />

        <!--- Since we are not focusable, defer to the inputtext's next selection,
              so that when floatinglist is tabbed out of, we can provide a next
              selection since we are it's owner
              @keywords private -->
        <method name="getNextSelection">
            // must ensure the floatinglist is closed so that if it is being tabbed from,
            // we can change the focus. (focus is normally not allowed to escape from
            // a modal view).
            this.setOpen(false);
            return lz.Focus.getNext(interior.cbtext);
        </method>

        <!--- since we are not focusable, this provides an api for asking what child to send focus
              to, as is the case when floatinglist is shift-tabbed back to us.
              @keywords private -->
        <method name="resolveSelection">
            // must ensure the floatinglist is closed so that if it is being tabbed from,
            // we can change the focus. (focus is normally not allowed to escape from
            // a modal view).
            this.setOpen(false);
            return interior.cbtext;
        </method>

        <view name="bkgnd" width="100%" focusable="false">
        <!--- subclasses defined the 'look' by placing views here -->
        </view>

        <view name="interior"
            x="$once{classroot.text_x}"
            y="$once{classroot.text_y}"
            width="${classroot.text_width}"
             height="${classroot.height - 2*classroot.bordersize - 2}"
             focusable="false">
            <!--- @keywords private -->
            <attribute name="_dsblfield" value="null"/>

            <method name="setupText" >
                var txt = classroot.cblist.getText();
                if ( !txt ) {
                    if ( classroot.defaultselection ) {
                        if ( classroot.cblist._contentview != null ) {
                            classroot.cblist.selectItemAt( classroot.defaultselection );
                            txt = classroot.cblist.getText();
                        }
                    } else {
                        txt = classroot.defaulttext;
                    }
                }
                if (this.cbtext) this.cbtext.setAttribute('text', txt );
                if (this._dsblfield) this._dsblfield.setAttribute('text', txt );
                parent._applystyle( parent.style );
            </method>

                <view name="editbkgnd" bgcolor="white" width="100%" height="100%" />
                <inputtext x="2" y="1" name="cbtext" width="$once{parent.width - 4}">
                    <attribute name="text" type="string" />
					
					<attribute name="initSelect" value="false" type="boolean" />
					
                    <attribute name="timerDelegate" value="null"/>
                    <attribute name="typetime" type="number" value="4000"/>
					<attribute name="timerIsInited" value="false" type="boolean"/>

                    <!-- arrow down and up both popup floatinglist, and pass the key event to it -->
                    <handler name="onkeydown" args="key">
                        <![CDATA[
						//Debug.write("onkeydown: ",key);
                        // 38 is up-arrow
                        // 40 is down-arrow
                        // 32 is space
                        // 13 is return
                            if ((key==38) || (key==40)) {
                                if (!classroot.isopen) {
                                    classroot.setOpen(true, true); // open, withKey
                                }
    
                                // pass the key event on to the floatinglist
                                classroot.cblist.onkeydown.sendEvent(key);
                            } else {
                                //Debug.write("onkeydown txt: ",this.getText());
                                if (!this.initSelect){
                                    ////Debug.write("onvalue: ",txt,this);
                                    if (!this.timerIsInited){
                                        this.timerIsInited = true;
                                        this.timerDelegate = new LzDelegate( this, "validatedText" );
                                        //Debug.write("+++++++++++++++++ addTimer");
                                        //Debug.write("+++++++++++++++++ removeTimer ",lz.Timer.countTimers());
                                        lz.Timer.addTimer( this.timerDelegate, this.typetime );
                                    } else {
                                        //Debug.write("############### resetTimer NO ADDING ");
                                        //Debug.write("############### removeTimer ",lz.Timer.countTimers());
                                        //lz.Timer.removeTimer( this.timerDelegate );
                                    }
                                } else {
                                    this.initSelect = false;
                                }
                            }
                        ]]>
                    </handler>

                    <!-- pass up to component level so focus rect will be visible, and subclassers can catch -->
                    <handler name="onfocus" args="v">
                        if ( classroot['onfocus'] ) classroot.onfocus.sendEvent(v);
                    </handler>
                    <!-- pass up to component level so subclassers can catch -->
                    <handler name="onblur" args="v">
                        this.initSelect=true;
                        classroot.setAttribute('text', this.getText() );
                        if ( classroot['onblur'] ) classroot.onblur.sendEvent(v);
                    </handler>
                    <!-- pass up to component level so subclassers can catch -->
                    <handler name="onkeyup" args="kc">
                        if ( classroot['onkeyup'] ) classroot.onkeyup.sendEvent(kc);
                    </handler>
                    <!-- pass up to component level so subclassers can catch -->
                    <handler name="onkeydown" args="kc">
                        if ( classroot['onkeydown'] ) classroot.onkeydown.sendEvent(kc);
                    </handler>

                    <method name="getFocusRect"  >
                        return classroot.getFocusRect();
                    </method>

					<method name="validatedText">
						<![CDATA[
                            //Debug.write("validatedText: ",this.getText());
                            //this.reset();
                            if (!this.initSelect){
                                var t = classroot.validate_method(this.getText());
                                //Debug.write('t: ',t.length);
                                //this.parent._cblist.setAttribute('visible',true);
                                classroot.cblist.removeAllItems();
                                for (var i=0;i<t.length;i++){
                                    classroot.cblist.addItem(t[i].name,t[i].state_id);
                                }
                                //Debug.write("############### removeTimer ",lz.Timer.countTimers());
                                for (var eg in lz.Timer){
                                    //Debug.write("############### lz.Timer ",eg,lz.Timer[eg]);
                                }
                                for (var eg in lz.Timer.timerList){
                                    //Debug.write("############### lz.Timer.timerList ",eg,lz.Timer.timerList[eg]);
                                }

                                ////Debug.write("validateText: ",this.getText());
                                //if (!classroot.isopen) {
                                //    classroot.setOpen(true, true); // open, withKey
                                //}
                                this.timerIsInited = false;
                            } else {
                                this.initSelect=false;
                                this.timerIsInited = false;
                            }
						]]>
					</method>					

                </inputtext>

        </view>

        <floatinglist name="cblist"
                      width="${owner.width - 1}"
                      bordersize="${this.owner.bordersize}"
                      spacing="${this.owner.spacing}"
                      visible="false"
                      shownitems="${this.owner.shownitems}"
                      attach="bottom"
                      attachoffset="${this.owner.attachoffset}"
                      multiselect="false"
                      autoscrollbar="${owner.autoscrollbar}"
                      defaultselection="${owner.defaultselection ?
                                          owner.defaultselection : (owner.defaulttext == '' ?
                                                                    0 : null) }">
            <!-- create a blank datapath so that it can be assigned a datapointer when combobox is assigned data -->
               <datapath>
                   <attribute name="datacontrolsvisibility" value="false" />
               </datapath>

            <handler name="onconstruct">
                this.dataoption = owner.dataoption;
            </handler>

            <method name="_dokeyup" args="kc"
                    event="onkeyup">
                if (kc == 27) {  // escape needs to close floating list
                    this.owner.setOpen(false);
                }
            </method>
            <method name="removeAllItems" args="index"> 
                for (var eg in _contentview.subviews){
                    _removeitem(_contentview.subviews[eg]); 
                } 
            </method>			
        </floatinglist>


        <!--- Sets the number of the item that is initially selected. This overrides
              the value defined in the defaulttext attribute.
              @param Number ds: the number of items to initally select. -->
        <method name="setDefaultSelection" args="ds" >
            this.defaultselection = ds;
            if ( ds == null ) return;
            if ( defaulttext != "" ) {
                this.defaulttext = "";
                //Debug.write("defaultselection overrides defaulttext",this);
            }
            if ( this.ondefaultselection ) this.ondefaultselection.sendEvent();
        </method>

        <!--- @keywords private -->
        <handler name="ondata" args="d">
            this.cblist.datapath.setPointer( d );
        </handler>

        <!--- @keywords private -->
        <event name="onitemclassname"/>

        <!--- Sets the type of list items which will be created in floatinglist
              when necessary.
              @param String icn: the class name to use to create items with. -->
        <method name="setItemclassname" args="icn" >
            this.itemclassname = icn; // before anything is inited capture value
            if ( this.isinited ) { // view is now inited so check classname with cblist

               if (icn != "") {
                  // then force this classname as the classname for cblist
                  cblist.setAttribute('itemclassname',this.itemclassname);
                } else {
                  //use the default subview as the classname
                  this.itemclassname = cblist.itemclassname;
                }
            }
            if (this.onitemclassname) this.onitemclassname.sendEvent();
        </method>

        <!--- @keywords private -->
        <event name="ontext"/>

        <!--- @keywords private -->
        <method name="determinePlacement" args="newsub, placement, iargs" >
            if (placement == 'cblist') 
                return this.cblist.determinePlacement(newsub, placement, iargs);
            else 
                return super.determinePlacement(newsub, placement, iargs);
        </method>

        <!--- @keywords private -->
        <method name="init" >
            this._initcomplete = true;
			
            super.init();

            // reassign classname now that the instance is inited
            this.setItemclassname(this.itemclassname);
            cblist.setVisible(false);
         </method>

        <!--- @keywords private -->
        <handler name="onblur" >
           if ( lz.Focus.getFocus() != this.interior.cbtext )
                this.setOpen(false);
        </handler>

        <!--- @keywords private -->
        <method name="getFocusRect"  >
           var fx = this.getAttributeRelative('x',canvas);
           var fy = this.getAttributeRelative('y',canvas);
           var fw = this.getAttributeRelative('width',canvas);
           var fh = this.getAttributeRelative('height',canvas);
           return [fx,fy,fw,fh];
        </method>

        <!--- Selects a specific item in the list.
              @param Object item: the item to select. -->
        <method name="select" args="item" >
           this.cblist.select(item);
        </method>

        <!--- @keywords private -->
        <attribute name="_fixseldel" value="$once{new LzDelegate(this, 'fixSelection')}"/>
        <!--- @keywords private -->
        <method name="fixSelection">
            this.interior.cbtext.setSelection(_fixseldel.start, _fixseldel.end);
        </method>

        <!--- this method listens for the onselect event from the floating list
              and then resends the onselect event to itself so that developers can easily
              reference that without knowing the internals of combobox
              @keywords private -->
        <handler name="onselect" reference="this.cblist"  args="v" > 
			<![CDATA[
				this.interior.cbtext.initSelect=true;
				this.setOpen(false);
	
				// anItem has been selected so update the input text field
				this.selected = v;
				if (v) this.setAttribute('text',v.text);
				if (lz.Focus.getFocus() == this.interior.cbtext) {
					_fixseldel.start = 0;
					_fixseldel.end = v.text.length;
					lz.Idle.callOnIdle( _fixseldel );
	
				}
	
				// resend the event so that developers can write thier own
				// onselect methods without having to know the internals of
				// this class.
				if ( this.onselect ) this.onselect.sendEvent(v);
            ]]>
        </handler>

        <!--- @keywords private -->
        <method name="passModeEvent" args="eventStr,view" > <![CDATA[
            // Once a view has been made modal, this method
            // gets called ONLY when a user clicks on a view 'outside'
            // the contents of this view, or clicks on a inputtext view anywhere
            // on the screen even for a subview within this view.
            if ( eventStr == "onmousedown"  ){
                // first, we only care about the mousedown event.
                // if the user has pressed the mouse down on a textfield
                // within the component, then we will not know this unless
                // we test it to see if it is a subview of this component.

                if ( view != null ) { // view is a clickable view
                    // view is not LITERALLY part of the class heirarchy but
                    // it maybe part of the floatingview of this component, and if so
                    // then treat it as if it were a child of the class.

                   if ( !view.childOf(this.cblist) ) {
                        // view is outside of combobox so close the combbobox
                        this.setOpen(false);

                   } else {
                        // view is a child of cblist, so don't do anything.
                   }

                } else {
                    this.setOpen(false);
                }
            }
            // if we're inside a modal dialog, need to propagate event manually
            // since floating list is a child of the canvas
            if (view && view.childOf(this.cblist)) {
                if (view[ eventStr ]) {
                    view[ eventStr ].sendEvent( view );
                }
                return false;
            }
           // since a combox is not strictly modal, always return
           // true to pass the event to the object (oustide combobox)
           // that was clicked on
           return true;
        ]]> </method>

        <!--- Toggles the open/close state of the popup list.
            @param Boolean withkey: (optional) if true this is triggered by
                  keyboard and focus indicators will be turned on;
                  if false, this is triggered by mouse action and focus
                  indicators will be turned off;
                  if parameter is ommitted no change in focus indicator
        -->
        <method name="toggle" args="withkey">
            this.setOpen(!this.isopen, withkey)
        </method>

        <!--- Sets the open/close state of the popup list.
              @param Boolean open: true to open the list, else false to
              close.
              @param Boolean withkey: (optional) if true this is triggered by
                    keyboard and focus indicators will be turned on;
                    if false, this is triggered by mouse action and focus
                    indicators will be turned off;
                    if parameter is ommitted no change in focus indicator
          -->
        <method name="setOpen" args="open, withkey" >
            if (!this.isinited) {
                this.isopen = open;
                return;
            }
            if (open) { // open combox
                if (this.isopen) return; // tends to get called more than once, esp when
                lz.ModeManager.makeModal( this );

                this.cblist.bringToFront();
                this.cblist.setVisible(true);
                lz.Focus.setFocus(this.cblist, withkey);

                this.isopen = true;
                if (this['onisopen']) this.onisopen.sendEvent(true);
            } else { // close combox
                if (!this['isopen']) return;
                this.isopen = false;

                lz.ModeManager.release( this );
                this.cblist.setVisible(false);
                if (this['onisopen']) this.onisopen.sendEvent(false);
                if ( lz.Focus.getFocus() == this.cblist ) {
                    lz.Focus.setFocus(interior.cbtext, withkey);
                }
            }
        </method>

        <!--- @keywords private -->
        <method name="applyData" args="d">
            this.setAttribute('text', d );
        </method>


        <!--- Get the value for the combobox.
              @return Object: the value selected or the value in the text
              field, if no value was found. -->
        <method name="getValue">
           var rv;
           var ra = this.cblist.getValue(); // an array of values
           if (ra==null) {
               rv  = this.interior.cbtext.getText();
           } else {
               rv = ra;
           }
           return rv;
        </method>

        <!--- Sets the displayed text.
              @param String t: the text to display. -->
        <method name="setText" args="t">
            this.text = t;
            this.interior.cbtext.setAttribute('text', t );
            if (!this._enabled) interior._dsblfield.setAttribute('text', t );
            if ( this.ontext ) this.ontext.sendEvent( t );
        </method>

        <!--- Get the displayed text.
              @return String: the displayed text. -->
        <method name="getText">
           return this.interior.cbtext.getText();
        </method>

        <!--- Returns current selection.
              @return Object: null if no selection, an item if single select
              (default), or an array of items if multiselect. -->
        <method name="getSelection">
            return this.cblist.getSelection();
        </method>

        <!--- Add the specified item to list to the end of the list.
              @param String txt: the text for the item.
              @param Object val: the value for the item. -->
        <method name="addItem" args="txt, val" >
            this.cblist.addItem(txt,val);
        </method>

        <!--- Find a particular item by value. This method is not available with
              dataoption="lazy" or dataoption="resize" (use data APIs instead).
              @param Object value: the value for the item to get.
              @return Object: the item found, or null, if not.
              -->
        <method name="getItem" args="value">
            return this.cblist.getItem(value);
        </method>

        <!--- Find a particular item by its index. This method not available
              with dataoption="lazy" or dataoption="resize"
              (use data APIs instead).
              @param Number index: the index for the item to get.
              @return Object: the item found, or null, if not. -->
        <method name="getItemAt" args="index">
            return this.cblist.getItemAt(index);
        </method>

        <!--- Find the first item with the specified value and remove it from
              the list.
              @param Object value: the value of the item to remove. -->
        <method name="removeItem" args="value" >
            this.cblist.removeItem(value);
        </method>

        <!--- Remove an item by index (0 based count). This method is not
            available with dataoption="lazy" or dataoption="resize"
            (use data APIs instead).
              @param Number index: the index of the item to remove. -->
        <method name="removeItemAt" args="index" >
            this.cblist.removeItemAt(index);
        </method>

        <!--- Select an item by value. This method is not available with
              dataoption="lazy" or dataoption="resize".
              @param Object value: the value of the item to select.
			  initSelect = true will NOT throw a validating event -->
        <method name="selectItem" args="value,initSelect">
			if (initSelect) this.interior.cbtext.initSelect=true;
            this.cblist.selectItem(value);
        </method>

        <!--- Select an item by index (0 based count).
              @param Number index: the index of the item to select. -->
        <method name="selectItemAt" args="index">
            this.cblist.selectItemAt(index);
        </method>

        <!--- Clear the current selection in the list and sets the displayed
            text to an empty string -->
        <method name="clearSelection" >
            this.cblist.clearSelection();
            this.setAttribute('text',"");
        </method>

        <!--- @keywords private -->
        <method name="_applystyle" args="s">
            if (this.style != null) {
                interior.editbkgnd.setAttribute("bgcolor", s.textfieldcolor);
                interior.cbtext.setAttribute('bgcolor',s.textfieldcolor);
                setTint(bkgnd, s.basecolor);
           }
        </method>

        <!--- @keywords private -->
        <method name="_showEnabled">
           interior.cbtext.setVisible(this._enabled);
            if (!this._enabled) {
                if (interior._dsblfield == null) {
                    var t = new LzText(interior,
                        { name: '_dsblfield', x: 2, y: 1,
                          width:interior.width, height:interior.height,
                            fgcolor:this['style'] ? this.style.textdisabledcolor : null});
                } else {
                   interior._dsblfield.setVisible(true);
                }
                interior._dsblfield.setAttribute('text',this.getText());
            } else {
                if (interior._dsblfield) interior._dsblfield.setVisible(false);
            }
        </method>

        <method name="setWidth" args="w">
            super.setWidth(Math.max(w,this.min_width));
        </method>
    </class>


    <!--- A dropdown list of selectable items. Can either be editable or
          not. -->
    <class name="validBox" extends="baseValidCombobox">
		
        <view name="lft" resource="lzcombobox_lft_rsc" placement="bkgnd"/>
        <view name="mid" resource="lzcombobox_mid_rsc" stretches="width" placement="bkgnd"/>
        <basebutton name="rgt" resource="lzcombobox_rgt_rsc" styleable="true"
                placement="bkgnd" onclick="classroot.toggle(false)" />
		
        <stableborderlayout axis="x" placement="bkgnd"/>
		
               <!--- @keywords private -->
        <method name="_showEnabled">
           super._showEnabled();
           if (_enabled) {
				this.bkgnd.lft.setAttribute('frame', 1 );
				this.bkgnd.mid.setAttribute('frame', 1 );
            } else {
				this.bkgnd.lft.setAttribute('frame', 3 );
				this.bkgnd.mid.setAttribute('frame', 3 );
            }
        </method>

    </class>		
 <!--
		<edittext name="state" width="270" y="20" x="120" fontsize="11">
			
			<attribute name="timerDelegate" value="null"/>
			<attribute name="typetime" type="number" value="500"/>
			<attribute name="timerIsInited" value="false" type="boolean"/>
			
			<attribute name="formervalue" value="" type="string"/>
			<attribute name="startValidate" value="false" type="boolean"/>
			
			<method name="getValue"> return this.id; </method>
			<method name="setValued" args="txt,id"> 
				//Debug.write("setValue:",txt,id); 
				this.id = id; this.setAttribute('text',txt); 
			</method>
			
			<handler name="onfocus"> //Debug.write("onfocus ",this.getText());
				this.startValidate = true; this.formervalue = this.getText();
				</handler>
			<handler name="onvalue" args="txt">
				<![CDATA[
				//Debug.write("onvalue: ",txt,this.startValidate);
				if (!this.timerIsInited && this.startValidate){
					this.timerIsInited = true;
					this.timerDelegate = new LzDelegate( this, "validatedText" );
					//Debug.write("############### addTimer");
					lz.Timer.addTimer( this.timerDelegate, this.typetime );
				} else {
					lz.Timer.resetTimer( this.timerDelegate, this.typetime );
				}
				]]>
			</handler>
			<method name="validatedText">
				<![CDATA[
					//Debug.write("validatedText: ",this.getText());
					//this.reset();
					var t = canvas.validateCountry(this.getText());
					//Debug.write('t: ',t.length);
					this._cblist.setAttribute('visible',true);
					this._cblist.removeAllItems();
					for (var i=0;i<t.length;i++){
						this._cblist.addItem(t[i].name,t[i].state_id);
					}
					lz.Timer.removeTimer(this.timerDelegate);
					this.timerIsInited = false;
					//Debug.write("validateText: ",this.getText());

				]]>
			</method>
			<handler name="onblur" args="b"> //Debug.write("onblur: ",b);
				<![CDATA[
					if (b!=this._cblist){
						var t = canvas.validateCountry(this.getText());
						//Debug.write('t: ',t.length);
						this._cblist.removeAllItems();
						for (var i=0;i<t.length;i++){
							this._cblist.addItem(t[i].name,t[i].state_id);
						}
						this.startValidate = false;
						//this._cblist.setAttribute('visible',false);
					} else {
						//Debug.write("is this._cblist");
					}
				]]>
				</handler>
			
			<floatinglist width="${ this.owner.width }" attach="bottom"
				name="_cblist" visible="false" autoscrollbar="true" shownitems="7"
				scrollbarclassname="scrollbarValidBox" >
				<method name="removeAllItems" args="index"> 
					for (var eg in _contentview.subviews){
						_removeitem(_contentview.subviews[eg]); 
					} 
				</method>
				<handler name="onselect" args="item"> 
					//Debug.write("onselect:",item); 
					//this.owner. 
					this.setAttribute('visible',false);
					lz.Focus.setFocus(this.owner); 
				</handler>
			</floatinglist>
			
		</edittext>
  -->
	
	<validBox y="20" width="270" name="_validbox" 
        shownitems="7" validate_method="$once{ canvas.validateCountry }" />
    
 </canvas>
