<?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="interviewUserListItem" extends="view" showhandcursor="false" 
	   bgcolor="$once{ canvas.getThemeColor('mainBorderColor') }" width="252" height="42">
	
	<attribute name="connectedSince" value="" type="string" />
    <attribute name="isMod" value="" type="string" />
    <attribute name="streamid" value="" type="string" />
    <attribute name="username" value="" type="string" />
    <attribute name="userroom" value="" type="string" />
    <attribute name="formatedDate" value="" type="string" />
    <attribute name="firstname" value="" type="string" />
    <attribute name="lastname" value="" type="string" />
    <attribute name="user_id" value="0" type="number" />
    <attribute name="refObj" value="null" />
    
    <attribute name="isSuperModerator" value="false" type="boolean"/>
    
    <attribute name="isSelected" value="false" type="boolean" />
    
	<handler name="oninit">
        <![CDATA[
            //This is a workaround cause in LPS-4.2.x immediatelly loading does not work
            lz.Timer.addTimer( new LzDelegate( this, "fadeText" ), 1000 );

            if (this.isMod) {
            	this.userStatus.setAttribute("frame",3);
            }
               
            if (canvas.publicSID == this.refObj.publicSID) {
                //this._userName.setAttribute("fontstyle","bold");
                this.setAttribute("bgcolor",0x00FF00);
            }
            
            this.updateIconByMod();
        ]]>
    </handler>
    
    <method name="update" args="obj">
    	setAttribute('firstname', obj.firstname);
    	setAttribute('lastname', obj.lastname);
    	refObj = obj;
    </method>
     
    <method name="updateIconByMod">
    	this.isMod = canvas.getIsModeratorByPublicSID(this.refObj.publicSID);
    	if (this.isMod) {
            this.userStatus.setAttribute("frame",3);
        } else if (this.refObj.canDraw) {
        	this.userStatus.setAttribute("frame",2);
        } else {
        	this.userStatus.setAttribute("frame",1);
        }
        
        if (this.isSelected) {
        	this._miniIcons.oninit.sendEvent();
        }
    </method>
    
    <method name="fadeText" args="ignore=null"> 
        <![CDATA[
            this._userpic.setAttribute('src', canvas.getPictureUrl(this.refObj.picture_uri, '&moduleName=chat&remoteUserid='+this.user_id)); 
        ]]>          
    </method>
     
    <handler name="onclick">
    	parent.parent.parent.selectItem(this);
    </handler>
     
    <method name="select">
    	if (!this.isSelected) {
	    	new lz.interviewModerationMiniIcons(this,{name:'_miniIcons',align:'right',
                isMod:this.isMod,
                isSuperModerator:this.isSuperModerator});
	    	this.isSelected = true;
	    	this._userName.text = "";
	    	this.showItem.setAttribute('started', true);
    	}
    </method>
    
    <method name="deselect">
    	if (this.isSelected) {
	    	this._miniIcons.destroy();
	    	this.isSelected = false;
	    	this._userName.text = this.firstname+' '+this.lastname;
	    	this.closeItem.setAttribute('started', true);
    	}
    </method>
     
    <image name="_userpic" stretches="both" x="1" y="1">
        <handler name="onload">
            <![CDATA[
                if (this.height > 38) {
                    //If bigger then containter then scale it
                    var width = this.width/(this.height/38);
                    this.setAttribute('height',38);
                    this.setAttribute('width',width);
                }
            ]]>
        </handler>
    </image>
    
	<method name="userTyping" args="v">
	</method>
    <view name="userStatus" align="right" frame="1" 
    	  resource="userstatus_multiframe_rsc" />
    
    <labelText name="_userName" x="41" y="2"
    		   text="$once{ (parent.firstname == null ? '' : parent.firstname) + ' ' + (parent.lastname == null ? '' : parent.lastname) }" />
     
    <animatorgroup name="showItem" started="false" process="simultaneous">
    	<animator attribute="height" to="62" duration="750" />
    	<animator attribute="width" to="252" duration="750" />
    </animatorgroup>
    
    <animatorgroup name="closeItem" started="false" process="simultaneous">
        <animator attribute="height" to="42" duration="750" />
        <animator attribute="width" to="252" duration="750" />
    </animatorgroup>
                 
</class>

</library>
