<?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="baseDrawPointer" extends="baseDrawEllipse" >
      
    <!-- Pointers -->
    
    <method name="endPointerWhiteBoard">
        this.drawPointerWhiteBoardFinal(
                "pointer"+this.getCounter(),
                this.getMouse('x'),this.getMouse('y'),
                0,0
            )
    </method>

    <method name="drawPointerToHistory" args="actionObject,parentObj">
        new lz.whiteBoardPointer(parentObj,{
            x:actionObject[actionObject.length-5],
            y:actionObject[actionObject.length-4],
            userName:actionObject[1]
        })
    </method>

    <method name="drawPointerWhiteBoardFinal" args="newName,x,y,width,height" >
    	var displayedName = canvas.currentuser;
    	if (canvas.firstName.length() > 0) {
    		displayedName = canvas.firstName;
    	}
    	if (canvas.lastName.length > 0) {
    		if (canvas.firstName.length > 0) {
    			displayedName += " " + canvas.lastName;
    		} else {
    			displayedName = canvas.lastName;
    		}
    	}
    	
        var actionObject = new Array();
        actionObject[0] = 'pointerWhiteBoard';
        actionObject[1] = displayedName;
        actionObject[2] = this.counter;//-6
        actionObject[3] = x;//-5
        actionObject[4] = y;//-4
        actionObject[5] = width;//-3
        actionObject[6] = height;//-2
        actionObject[7] = newName;//-1
        this.baseactionobjectList.push(actionObject);
        this.onsharedMessage('draw',actionObject);
        this.drawPointerToHistory(actionObject,this);
    </method>
    
</class>

</library>
