<?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="baseturnOverListPaged" 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="renderList" value="null"/>
    
    <attribute name="_selected" value="null" />
    
    <attribute name="_selectedRefObj" value="null" />
    
    <attribute name="multiselect" value="true" type="boolean" />
    <attribute name="selected" value="null" />
    
    <attribute name="showTopBar" value="true" type="boolean" />
    
    <event name="oncallnext" />
    <event name="oncallpre" />
    
    <!--- @keywords private -->
    <event name="onload" />
    
    <event name="rerender" />
    
    <event name="onMoveList" />
    
    <event name="onScrollItem" />
    <event name="onNextScrollItem" />
    
    <attribute name="listItemName" value="basePagingListItem" type="string" />
    
    <attribute name="itemHeight" value="20" type="number"/>
    
    <attribute name="menuBarXIndent" value="0" type="number"/>
    
    <attribute name="headerHeight" value="20" type="number" />
    
    <attribute name="listLabelId" value="0" type="number" />
    
    <attribute name="showHScrollbar" value="visible" type="string"/>
     
    <handler name="oninit">
    	<![CDATA[
            //this inits the items
            this._innerlist._inn.initItems(this.listItemName);
            
            if (this["_menu"] && this["_menu"]["_pre1"]) {
                this._menu._pre1.setAttribute('isEnabled',false);
                this._menu._next2.setAttribute('isEnabled',false);
                this._menu._next1.setAttribute('isEnabled',false);
                this._menu._pre2.setAttribute('isEnabled',false);
            }
        ]]>
    </handler>  
    
    <handler name="onclickedItem" args="obj" >
        <![CDATA[
            this.addToSelection(obj,false); 
        ]]>
    </handler>
    
    <method name="selectAll">
        <![CDATA[
        
            if (!this.multiselect){
                if ($debug) Debug.warn("Cannot selectAll when multiselect is FALSE");
                return;
            }
            
            this._selectedRefObj = new Array();
            this._selected = new Array();
            
            for (var i=0;i<this.renderList.length;i++) {
            	this.renderList[i].itemSelected = true;
                this.renderList[i].isselected = true;
                this._selectedRefObj.push(i);
            }
            
            if ($debug) Debug.write("this._selectedRefObj LENGTH ",this._selectedRefObj.length);
        
            for (var i=0;i<this._innerlist._inn._inn.subviews.length;i++){
            	if (this._innerlist._inn._inn.subviews[i].clickable) {
	            	this._innerlist._inn._inn.subviews[i].setAttribute("itemSelected",true);
		            this._innerlist._inn._inn.subviews[i].isselected = true;
	                this._innerlist._inn._inn.subviews[i].onmouseout.sendEvent();
	                this._selected.push(this._innerlist._inn._inn.subviews[i]);
            	}
	        }
        
        ]]>
    </method>
    
    <method name="deleteSelected">
        <![CDATA[
        
	        function sortTablePoints(a,b){
	            var a1 = a;
	            var b1 = b;
	            //_root.//Debug.write("natcompare: ",a1,b1,natcompare(a1,b1));
	            if(a1==b1){
	                return 0;
	            } else if(a1>b1){
	                return 1;
	            } else {
	                return -1;
	            }
	        }
            
            this._selectedRefObj.sort(sortTablePoints);
            
            if ($debug) Debug.write("deleteSelected",this._selectedRefObj);
            
            if ($debug) Debug.write("-1- this.renderList ",this.renderList.length);
        
            for (var i=0;i<this._selectedRefObj.length;i++) {
                this.renderList.splice(this._selectedRefObj[i],1);
            }
            
            if ($debug) Debug.write("-2- this.renderList ",this.renderList.length);
            
            this.deselectAll();
            
            this.rerender.sendEvent(this);
        ]]>
    </method>
    
    <method name="deselectAll">
        <![CDATA[
        
            if (!this.multiselect){
                if ($debug) Debug.warn("Cannot deselectAll when multiselect is FALSE");
                return;
            }
        
            this._selectedRefObj = new Array();
            this._selected = new Array();
            
            for (var i=0;i<this.renderList.length;i++) {
            	this.renderList[i].itemSelected = false;
                this.renderList[i].isselected = false;
            }
            
            for (var i=0;i<this._innerlist._inn._inn.subviews.length;i++){
            	this._innerlist._inn._inn.subviews[i].setAttribute("itemSelected",false);
                this._innerlist._inn._inn.subviews[i].isselected = false;
                this._innerlist._inn._inn.subviews[i].onmouseout.sendEvent();
            }
        
        ]]>
    </method>    
    
    <method name="addToSelection" args="obj,forceMultiAdd">
        <![CDATA[
        
            if (this._selected!=null ||this._selectedRefObj!=null){
                if (this.multiselect){
                    if (lz.Keys.downKeysArray.length==0 || 
                        (lz.Keys.downKeysArray[0]!=17 && lz.Keys.downKeysArray[0]!=16)){
                        if (!forceMultiAdd) {

                            if ($debug) Debug.write("onclickedItem Deselect ALL -1- ",this._selected.length);    
                            if ($debug) Debug.write("onclickedItem Deselect ALL -2- ",this._selectedRefObj.length);    
                            
                            for (var i=0;i<this._selected.length;i++){
                            	this._selected[i].setAttribute("itemSelected",false);
                                this._selected[i].isselected = false;
                                this._selected[i].doDeselect();
                            }
                            
                            for (var i=0;i<this._selectedRefObj.length;i++){
                                if ($debug) Debug.write("DESELECT ITEM ID ",this._selectedRefObj[i]);
                                this.renderList[this._selectedRefObj[i]].itemSelected = false;
                                this.renderList[this._selectedRefObj[i]].isselected = false;
                            }
                            
                        }
                    } else {
                        //////if ($debug) //Debug.write("onclickedItem Key Hold IT");
                        for (var i=0;i<this._selected.length;i++){
                            if (this._selected[i] == obj) {
                                //////if ($debug) //Debug.write("Found Object: ",obj);
                                obj.isselected = false;
                                if ($debug) Debug.write("DESELECT ITEM ID 2 ",this._selectedRefObj[i]);
                                this.renderList[this._selectedRefObj[i]].isselected = false;
                                ////if ($debug) //Debug.write("send onmouseout TO: ",obj);
                                obj.doDeselect();
                                this._selected.splice(i,1);
                                this._selectedRefObj.splice(i,1);
                                return;
                            }
                        }
                    }
                } else {
                    this.renderList[this._selected.itemId].isselected = false;
                    this._selected.isselected = false;
                    this._selected.doDeselect();
                }
            }

            //////if ($debug) //Debug.write("onclickedItem Set IT");
            if ($debug) Debug.write("SELECT ITEM ID ",obj.itemId);
            this.renderList[obj.itemId].isselected = true;
            obj.isselected = true;
            obj.onmouseout.sendEvent();
            if (this.multiselect){
                if (this._selected==null){
                    this._selected = new Array();
                    this._selectedRefObj = new Array();
                }
                if ((lz.Keys.downKeysArray.length==1 && 
                    (lz.Keys.downKeysArray[0]==17 || lz.Keys.downKeysArray[0]==16))
                    || forceMultiAdd){
                    this._selected.push(obj);
                    this._selectedRefObj.push(obj.itemId);
                } else {
                    this._selected = new Array();
                    this._selectedRefObj = new Array();
                    this._selected.push(obj);
                    this._selectedRefObj.push(obj.itemId);
                }
            } else {
                this._selected = obj;
            }
            
        ]]>
    </method>    
    
    <!--
    <handler name="onclickedItem" args="obj" >
        if (this.selected != null) {
            this.selected.deselect();
        }
        this.selected = obj;
        this.selected.select();
    </handler>
     -->
    
    <method name="callfirst">
        this.start = 0;
        this.oncallnext.sendEvent();
        this.onload.sendEvent();
    </method>
    
    <method name="reload">
    	this.oncallnext.sendEvent();
        this.onload.sendEvent();
    </method>
    
    <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();
        //this.onload.sendEvent();
    </method>
    
    <method name="callnext">
        if (this.records>(this.start+this.step)){
            this.start+=this.step;
        }
        this.oncallnext.sendEvent();
        this.onload.sendEvent();
    </method>
    
    <method name="callpre">
        if (this.start>0){
            this.start-=this.step;
        }
        this.oncallpre.sendEvent();
        this.onload.sendEvent();
    </method>
    
    <method name="initValues" args="rec">
        <![CDATA[
            this.records = rec;
            
            if (this.start == 0) {
                this._menu._pre1.setAttribute('isEnabled',false);
            } else {
                this._menu._pre1.setAttribute('isEnabled',true);
            }
            
            if ((this.start+this.step) >= this.records) {
                this._menu._next2.setAttribute('isEnabled',false);
            } else {
                this._menu._next2.setAttribute('isEnabled',true);
            }
            
            if (this.records>(this.start+this.step)){
                if (this["_menu"]) this._menu._next1.setAttribute('isEnabled',true);
            } else {
                if (this["_menu"]) this._menu._next1.setAttribute('isEnabled',false);
            }
            if (this.start>0){
                if (this["_menu"]) this._menu._pre2.setAttribute('isEnabled',true);
            } else {
                if (this["_menu"]) this._menu._pre2.setAttribute('isEnabled',false);
            }
            
            if (this.showTopBar) {
                
                var maxRecord = this.start+this.step;
                if ((this.start+this.step) > this.records) {
                    maxRecord = this.records;
                }
                
                this._records.setAttribute("text",(this.start+1) + ' - ' + maxRecord + ' von ' + this.records);
                
            } else {
                
                this._records.setAttribute("text",rec);
            }
        ]]>
    </method>
    
    <method name="addHeaderItem" args="labelid,width" >
        new lz.turnoverlistheaderitemResize(this._innerlisthead._inn,{
                labelid:labelid,width:width,
                subviewsid:this._innerlisthead._inn.subviews.length
            });
    </method>
    
    <method name="clearHead">
        for (var eg in this._innerlisthead._inn.subviews) {
            this._innerlisthead._inn.subviews[eg].destroy();
        }
    </method>
    
    <method name="addHeaderItemByText" args="zText,width" >
        new lz.turnoverlistheaderitemResize(this._innerlisthead._inn,{
                text:zText,width:width,
                subviewsid:this._innerlisthead._inn.subviews.length
            });
    </method>
    
    <method name="addHeaderItemOrdered" args="labelid,width,orderBy,asc,isSelected" >
    	if ($debug) Debug.write("turnOverListHeaderItemOrdered ",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="setSelectionOrder" args="orderBy,asc">
    	<![CDATA[
    		
    		for (var i=0;i<this._innerlisthead._inn.subviews.length;i++) {
    			
    			if (this._innerlisthead._inn.subviews[i]["orderBy"] && 
    					this._innerlisthead._inn.subviews[i].orderBy == orderBy) {
    				
    				if (this.currentSelectedOrder != null) {
    					this.currentSelectedOrder.isSelected = false;
    				}
    				
					this._innerlisthead._inn.subviews[i].isSelected = true;
    				this._innerlisthead._inn.subviews[i].asc = !asc;
    				
    				this._innerlisthead._inn.subviews[i].onclick.sendEvent();
    				
    				return;
    				
    			}
    			
    		}
    	
    	]]>
    </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+1);
        }
        ]]>
    </method>
    
    <method name="getListItemNumber">
        return this._innerlist._inn._inn.subviews.length;
    </method>
    
    <method name="getItemByNumber" args="itemNo">
        <![CDATA[
	        if ($debug) Debug.write("getItemByNumber",itemNo);
	        for (var i=0;i<this._innerlist._inn._inn.subviews.length;i++){
                if ($debug) Debug.write("getItemByNumber :: ",this._innerlist._inn._inn.subviews[i].itemId);
	            if (this._innerlist._inn._inn.subviews[i].itemId == itemNo) {
                    return this._innerlist._inn._inn.subviews[i];
                }
	        }
        ]]>
        return this._innerlist._inn._inn.subviews[itemNo];
    </method>
    
    <method name="clearList">
        this._innerlist._inn._inn.destroy();
        new lz.innerListPagingContent(this._innerlist._inn,{name:'_inn'});
    </method>
    
    <method name="initItemsBySubItemNo" args="itemName,noSubItems,subItemClassName">
        this._innerlist.initItemsBySubItemNo(itemName,noSubItems,subItemClassName);
    </method>

    <labelText labelid="${ parent.listLabelId }" visibility="$once{ (parent.showTopBar) ? 'visible' : 'hidden' }"
                       y="4" fontsize="10" x="2" />
                       
    <text fontsize="10" y="4" x="$once{ (!parent.showTopBar) ? 64+parent.menuBarXIndent : 2+parent.menuBarXIndent }"
          name="_records" resize="true" visibility="$once{ (parent.showTopBar) ? 'visible' : 'hidden' }" />
    
    <!-- =========  List Header area  =========-->
    <view name="_innerlisthead" height="${ parent.headerHeight }" width="${ parent.width }" y="$once{ parent.headerHeight + 2 }" clip="true">
        <view name="_inn" x="${ parent.parent._innerlist._inn.x }" layout="axis:x;spacing:0" />
    </view> 
    
    <!-- =========  List Contents area  =========-->   
    <listPagedContent name="_innerlist" height="${ parent.height-22-parent.headerHeight }" bgcolor="0xFFFFFF"
          width="${ parent.width }" y="$once{ parent.headerHeight + 22 }" showHScrollbar="$once{ parent.showHScrollbar }"
          itemHeight="$once{ parent.itemHeight }" />
</class>
	
<!--- common TurnOverList view class. -->
<class name="turnOverListPaged" extends="baseturnOverListPaged">

    <!-- =========  Control area  =========-->
    <view name="_menu" align="right" y="2" width="180"
          visibility="$once{ (parent.showTopBar) ? 'visible' : 'hidden' }">
    	
	    <!-- 368:goto first -->
	    <blueButton name="_pre1" y="0" x="0" 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.parent.callfirst();
	        </handler>
	        <labelTooltip labelid="368" />
	    </blueButton>
	
	    <!-- 369:goto previous -->
	    <blueButton name="_pre2" y="0" x="20" resourceItem="step_back_arrow" 
					x_insetResource="2" y_insetResource="2" width="20" height="20"
				width_insetResource="16" height_insetResource="16">
			<handler name="onclick">
				parent.parent.callpre();
	        </handler>
	        <labelTooltip labelid="369" />
	    </blueButton>
    	<resetCombobox name="_step" width="100" x="40" editable="false" fontsize="10" 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" />
            <textlistitem value="500" text="500" />
            <textlistitem value="1000" text="1000" />
            <textlistitem value="2500" text="2500" />
            <textlistitem value="5000" text="5000" />
            <handler name="onselect">
                if (this.sendEventToReload){ 
                	parent.parent.start = 0;
                    parent.parent.setAttribute('step',Number(this.getValue()));
                    parent.parent.onload.sendEvent();
                }
            </handler>
            <handler name="oninit">
                this.selectItem(String(parent.parent.step));
                this.sendEventToReload = true;
            </handler>
        </resetCombobox>
        
        <!-- 370:goto next -->
        <blueButton name="_next1" y="0" x="140" resourceItem="step_fwd_arrow" 
					x_insetResource="2" y_insetResource="2" width="20" height="20"
				width_insetResource="16" height_insetResource="16">
			<handler name="onclick">
				parent.parent.callnext();
	        </handler>
	        <labelTooltip labelid="370" />
	    </blueButton>
		
	    <!-- 371:goto last -->
	    <blueButton name="_next2" y="0" x="160" 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.parent.calllast();
	        </handler>
	        <labelTooltip labelid="371" />
	    </blueButton>
		
		<view width="2" />
    </view>
    
</class>

</library>
