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

<!--- private class for turnOverList only. -->
<class name="innerList" layout="axis:y;spacing:1" />
	
<!--- common TurnOverList view class. -->
<class name="turnOverList" extends="view" >

	<attribute name="start" value="0" type="number" />
	<attribute name="step" value="100" type="number" />
	<attribute name="orderby" value="firstname" type="string" />
	<attribute name="asc" value="true" type="boolean" />
	<attribute name="records" value="0" type="number" />
	
	<attribute name="_selected" value="null"/>
    <attribute name="currentSelectedOrder" value="null" />
    <attribute name="mainBgColor" value="0xEEF0EB" />
	
	<event name="oncallnext" />
	<event name="oncallpre" />
	<event name="ondblclickedItem" />
    <event name="onUpdateOrder" />
	
	<method name="callfirst">
		this.start = 0;
		this.oncallnext.sendEvent();
	</method>
    
    <method name="clearSelection">
        if (this._selected != null) {
            this._selected.deselect();
        }
    </method>
	
	<handler name="onclickedItem" args="itemObj">
		if (this._selected != null) {
			this._selected.deselect();
		}
		this._selected = itemObj;
		this._selected.select();
	</handler>
	
	<method name="calllast">
		var newMaxPages = Math.floor(this.records/this.step);
        if ($debug) Debug.write("calllast 1 ",newMaxPages);
        this.start = newMaxPages*this.step;
        if ($debug) Debug.write("calllast 2 ",this.start);
        if (this.start == this.records) {
            this.start = this.records-this.step;
        }
        if ($debug) Debug.write("calllast 3 ",this.start);
        if ($debug) Debug.write("calllast 4 ",this.records);
        this.oncallnext.sendEvent();
        this.onload.sendEvent();
        
		//this.start = this.records-this.step;
		//this.oncallnext.sendEvent();
	</method>
	
	<method name="callnext">
		this._next1.setAttribute('enabled',false);
		this._pre2.setAttribute('enabled',false);
		if (this.records>(this.start+this.step)){
			this.start+=this.step;
		}
		this.oncallnext.sendEvent();
	</method>
	
	<method name="callpre">
		this._next1.setAttribute('enabled',false);
		this._pre2.setAttribute('enabled',false);
		if (this.start>0){
			this.start-=this.step;
		}
		this.oncallpre.sendEvent();
	</method>
	
	<method name="initValues" args="rec">
		<![CDATA[
            this.records = rec;
            if (this.records>(this.start+this.step)){
                this._next1.setAttribute('enabled',true);
            } else {
                this._next1.setAttribute('enabled',false);
            }
            if (this.start>0){
                this._pre2.setAttribute('enabled',true);
            } else {
                this._pre2.setAttribute('enabled',false);
            }
            this._records.setAttribute('text',this.start + ' - ' +(this.start+this.step) + ' ' + canvas.getLabelName(272) + ' ' + this.records);
		]]>
	</method>
	
	<method name="addHeaderItem" args="labelid,width" >
		new lz.turnOverListHeaderItem(this._innerlisthead._inn,{labelid:labelid,width:width,subviewsid:this._innerlisthead._inn.subviews.length});
	</method>
	
	<method name="addHeaderItemOrdered" args="labelid,width,orderBy,asc,isSelected" >
        new lz.turnOverListHeaderItemOrdered(this._innerlisthead._inn,{
                labelid:labelid,width:width,
                orderBy:orderBy,asc:asc,isSelected:isSelected,
                subviewsid:this._innerlisthead._inn.subviews.length
            });
    </method> 
    
    <method name="updateOrder" args="itemRef">
        <![CDATA[
            //only do that if the previous orderBy != new orderby
            //if (this.currentSelectedOrder == null || 
            //        this.currentSelectedOrder.orderBy != itemRef.orderBy){
            if (itemRef.isSelected) {
                itemRef.asc = !itemRef.asc;
            } else {
                itemRef.isSelected = true;
            }
            if (itemRef.asc) {
                itemRef._sortUp.setAttribute('visibility','hidden');
                itemRef._sortDown.setAttribute('visibility','visible');
            } else {
                itemRef._sortUp.setAttribute('visibility','visible');
                itemRef._sortDown.setAttribute('visibility','hidden'); 
            }
            
            //do not perform search on initial Selection
            var isInitSelect = false;
            if (this.currentSelectedOrder != null) {
                if (this.currentSelectedOrder.orderBy != itemRef.orderBy) {
                    this.currentSelectedOrder.isSelected = false;
                    this.currentSelectedOrder._sortUp.setAttribute('visibility','hidden');
                    this.currentSelectedOrder._sortDown.setAttribute('visibility','hidden'); 
                }
            } else {
                isInitSelect = true;
            }
            this.currentSelectedOrder = itemRef;
            
            if ($debug) Debug.write("updateOrder: ",itemRef,itemRef.orderBy,itemRef.asc,isInitSelect);
            this.setAttribute('orderby',itemRef.orderBy);
            this.setAttribute('asc',itemRef.asc);
            
            if (!isInitSelect){
                this.onUpdateOrder.sendEvent(itemRef);
            }
            //}
        ]]>
    </method>
    
    <method name="sendInitialWidthUpdate">
        for (var eg in this._innerlisthead._inn.subviews) {
            this._innerlisthead._inn.subviews[eg].onwidth.sendEvent(this._innerlisthead._inn.subviews[eg].width);
        }
    </method> 
	
	<method name="sendWidthUpdate" args="w,subviewsid" >
		<![CDATA[
		////Debug.write(w,subviewsid,this._innerlist._inn);
		for (var i=0;i<this._innerlist._inn._inn.subviews.length;i++){
			this._innerlist._inn._inn.subviews[i].subviews[subviewsid].setAttribute('width',w);
		}
		]]>
	</method>
	
	<method name="clearList">
		this._selected = null;
		this._innerlist._inn._inn.destroy();
		new lz.innerList(this._innerlist._inn,{name:'_inn'});
	</method>
    


	<!-- =========  Control area  =========-->

    <labelText name="_records" x="2" resize="true" />
    
    <!-- 368:goto first -->
    <blueButton name="_pre1" y="0" x="$once{ parent.width-188 }" resourceItem="step_back_two_arrow" 
					x_insetResource="2" y_insetResource="2" width="20" height="20"
					width_insetResource="16" height_insetResource="16" >
        <handler name="onclick">
            parent.callfirst();
        </handler>
        <labelTooltip labelid="368" />
    </blueButton>

    <!-- 369:goto previous -->
    <blueButton name="_pre2" y="0" x="$once{ parent.width-166 }" resourceItem="step_back_arrow" 
					x_insetResource="2" y_insetResource="2" width="20" height="20"
					width_insetResource="16" height_insetResource="16">
        <handler name="onclick">
            parent.callpre();
        </handler>
        <labelTooltip labelid="369" />
    </blueButton>

    <!-- combobox to decide the step number -->
    <resetCombobox name="languages" width="96" x="$once{ parent.width-144 }" 
			  editable="false" height="20" >
		<attribute name="sendEventToReload" value="false" type="boolean" />
        <textlistitem value="10" text="10" />
        <textlistitem value="25" text="25" />
        <textlistitem value="50" text="50" />
        <textlistitem value="75" text="75" />
        <textlistitem value="100" text="100" />
        <textlistitem value="200" text="200" />
        <handler name="onselect">
        	if (this.sendEventToReload){ 
        		parent.setAttribute('step',Number(this.getValue()));
        	}
        </handler>
        <handler name="oninit">
        	this.selectItem(String(parent.step));
        	this.sendEventToReload = true;
        </handler>
	</resetCombobox>
	
	<!-- 370:goto next -->
	<blueButton name="_next1" y="0" x="$once{ parent.width-44 }" resourceItem="step_fwd_arrow" 
                x_insetResource="2" y_insetResource="2" width="20" height="20"
				width_insetResource="16" height_insetResource="16">
        <handler name="onclick">
            parent.callnext();
        </handler>
        <labelTooltip labelid="370" />
    </blueButton>

    <!-- 371:goto last -->
    <blueButton name="_next2" y="0" x="$once{ parent.width-21 }" resourceItem="step_fwd_two_arrow" 
				x_insetResource="2" y_insetResource="2" width="20" height="20"
				width_insetResource="16" height_insetResource="16">
        <handler name="onclick">
            parent.calllast();
        </handler>
        <labelTooltip labelid="371" />
    </blueButton>
	
    <!-- =========  BgArea area  =========-->
    <view width="$once{ parent.width }" bgcolor="$once{ canvas.getThemeColor('mainBorderColor') }"
          height="${ parent.height-20 }" x="0" y="20">
        <view width="$once{ parent.width-2 }" bgcolor="$once{ parent.parent.mainBgColor }"
          height="${ parent.height-2 }" x="1" y="1"></view>
    </view>
          
	<!-- =========  List Header area  =========-->

	<view name="_innerlisthead" height="20" x="1" width="$once{ parent.width-2 }" 
		 y="22" clip="true">
		<view name="_inn" x="${ parent.parent._innerlist._inn.x }" layout="axis:x;spacing:0" />
	</view>	
	
	<!-- =========  List Contents area  =========-->
	<view name="_innerlist" height="${ parent.height-43 }" x="1" width="$once{ parent.width-2 }"
		y="42" clip="true" bgcolor="$once{ parent.mainBgColor }">
		<view name="_inn" >
			<innerList name="_inn" />
		</view>
		<om_vscrollbar />
		<om_hscrollbar />
	</view>

</class>

</library>
