<?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="baseDrawSelect" extends="baseDrawTriangle" >
    
    <!--  
        for drawing rectangles the variable 
        with *Dis* indicates if the line/fil-color is active (+1/-1)
     -->
    <attribute name="currentSelectanglestroke" value="0x8e8986" />
    <attribute name="currentSelectanglestrokeDis" value="1" type="number" />
    <attribute name="currentSelectanglestrokeFill" value="0x8e8986" />
    <attribute name="currentSelectanglestrokeFillDis" value="1" type="number" />
    <attribute name="currentSelectangleineWidth" value="4" type="number" />
    <attribute name="currentSelectangleOpacity" value="0.2" type="number" />
    
    <method name="copyWhiteboardObjects">
        this.doCopyWhiteboardObjects();
    </method>
    
    <method name="cutWhiteboardObjects">
    	<![CDATA[
        	this.doCopyWhiteboardObjects();
        	for (var eg=0;eg<this.copyObject.length;eg++){                
                var itemToDelete = this.copyObject[eg][this.copyObject[eg].length-1];
                this.deleteItemByName(itemToDelete);
                
                if ($debug) Debug.write("cut name ", this.copyObject[eg][this.copyObject[eg].length-1]);
            }
            
            //if (this.boundingIsActive){
            //    this.boundingref._innerDrag.onmouseup.sendEvent();
            //}
        ]]>
    </method>
    
    <method name="doCopyWhiteboardObjects">
        <![CDATA[  
            if ($debug) Debug.write("tCopyObject :0: ",this.boundingIsActive);
        
            if (this.boundingIsActive) {
            	
            	this.copyObject = new Array();
            	
            	var tObject = new Array();
                var tCopyObject = this.getBaseObjectByName(this.boundingref.objRef.name);
                
                if ($debug) Debug.write("tCopyObject :1: ",this.boundingref.objRef.name);
                if ($debug) Debug.write("tCopyObject :2: ",tCopyObject);
                
                for (var i=0;i<tCopyObject.length;i++) {
                    var tItemObject = tCopyObject[i];
                    
                    if (tItemObject instanceof Array) {
                        
                        var storingItemObject = new Array();
                        
                        for (var k=0;k<tItemObject.length;k++) {
                            var kItemObject = tItemObject[k];
                            
                            if (kItemObject instanceof Array) {
                                
                                var subStoringItemObject = new Array();
                                
                                for (var l=0;l<kItemObject.length;l++) {
                                    var lItemObject = kItemObject[l];
                                    subStoringItemObject.push(lItemObject);
                                }
                                
                                storingItemObject.push(subStoringItemObject);
                            } else {
                                storingItemObject.push(kItemObject);
                            }
                            
                            
                        }
                        
                        tObject[i] = storingItemObject;
                        
                    } else {
                        tObject[i] = tItemObject;
                    }
                    
                }
                
                this.copyObject.push(tObject);
            	
            } else {
        
            	this.copyObject = this.selectedObjects;
            
            }
            
            if ($debug) Debug.write("to this.copyObject ", this.copyObject);
            
        ]]>
    </method>
    
    
    
    <method name="paste" args="paste_x, paste_y">
        <![CDATA[       
            //if ($debug) Debug.write("paste name ", this.copyObject[eg][this.copyObject[eg].length-1]);
            if ($debug) Debug.write("paste copyObject", this.copyObject);
            
            if(this.isSnapToGrid){ 
                paste_x = Math.round(paste_x/this.gridWidth)*this.gridWidth;
                paste_y = Math.round(paste_y/this.gridWidth)*this.gridWidth;
            }
            
            var shift_x = this.width+1;
            var shift_y = this.height+1;
            
            for (var eg=0;eg<this.copyObject.length;eg++){
            	
            	var tx = this.copyObject[eg][this.copyObject[eg].length-5];
            	var ty = this.copyObject[eg][this.copyObject[eg].length-4];  
            	
            	if (tx < shift_x) {
            		shift_x = tx;
            	}
            	
            	if (ty < shift_y) {
                    shift_y = ty;
                }
            	
            }
            
            if ($debug) Debug.write("paste_x,paste_y,shift_x,shift_y", paste_x,paste_y,shift_x,shift_y);
            
            for (var eg=0;eg<this.copyObject.length;eg++){
                
                //var itemToDelete = this.copyObject[eg][this.copyObject[eg].length-1];
                //this.deleteItemByName(itemToDelete);
                
                //this.baseactionobjectList[eg][10] = this.baseactionobjectList[eg][10] + paste_x;
                //this.baseactionobjectList[eg][11] = this.baseactionobjectList[eg][11] + paste_y;
                
                //this.copyObject[eg][10] = this.copyObject[eg][10] + paste_x -50;
                //this.copyObject[eg][11] = this.copyObject[eg][11] + paste_y-50;
                
                var tempArr = this.copyObject[eg].slice(0);
                
                tempArr[tempArr.length-1] += tempArr[0]+this.getCounter(); //Math.round(Math.random()*10000);
                
                tempArr[tempArr.length-5] =  paste_x - shift_x + tempArr[tempArr.length-5];
                tempArr[tempArr.length-4] = paste_y - shift_y + tempArr[tempArr.length-4];               
                
                //this.sendWatchObject("draw", this.copyObject[eg], false);
                
                if ($debug) Debug.write("paste tempArr :x,y: ", tempArr[tempArr.length-5],tempArr[tempArr.length-4]);
                
                this.sendWatchObject("draw", tempArr, false);
                //this.sendRemoteWatchObject(tempArr);
                
                this.onsharedMessage('draw',tempArr);
                
                if ($debug) Debug.write("paste name ", this.copyObject[eg]);
                
                //if ($debug) Debug.write("paste this.copyObject[eg][10]", this.copyObject[eg][10]);
                //if ($debug) Debug.write("paste this.copyObject[eg][11] ", this.copyObject[eg][11]);
                //if ($debug) Debug.write("paste paste_x ", paste_x);
                //if ($debug) Debug.write("paste paste_y ", paste_y);
                
            }
        ]]>
    </method>
    
      
    <!-- ###########################
        Select tool
     -->
    
    <method name="startSelect" args="oid_name">
        if (oid_name == null){
            oid_name = 'select'+this.getCounter();
        }
        //Debug.write("startselect");
        this.currentlayer = new lz.drawViewNew(this,{
            name:oid_name,width:this.width,height:this.height,
            opacity:this.currentSelectangleOpacity});
        this.currentlayer
        this.drawlineOnObject(this.currentlayer,-1,-1,0,0);
        this.drawlineOnObject(this.currentlayer,this.width,this.height,this.width+1,this.height+1);
    </method>  

    <method name="endSelect">
        <![CDATA[        
        
            ////Debug.write(" this.startx, this.starty , this.endx, this.endy ",this.startx, this.starty , this.endx, this.endy);
            var tmpName = this.currentlayer.name;
            this.currentlayer.destroy();
            var x = this.startx;
            var width = this.endx - this.startx;
            if (this.endx<this.startx){
                x = this.endx;
                width = Math.abs(width);
            }
            var y = this.starty;
            var height = this.endy - this.starty;
            if (this.endy<this.starty){
                y = this.endy;
                height = Math.abs(height);
            }
            
            if (width < 2 && height < 2) {
            	return;
            }
            
            //if(this.isSnapToGrid){        		
	    			        	   
	          //  x = Math.round(x/this.gridWidth)*this.gridWidth;
		    	//y = Math.round(y/this.gridWidth)*this.gridWidth;
            
            //} 
            
            if(this.selectedObjects != null && this.selectedObjects.length > 0){
                for (var eg=0;eg<this.selectedObjects.length;eg++){
                        
                    var  objectToUpdate = this.getObjectByName(this.selectedObjects[eg][this.selectedObjects[eg].length-1]);
                    objectToUpdate.setAttribute('opacity', 1);
                    
                }
            }
            
            this.selectedObjects = new Array();
            
            for (var eg=0;eg<this.baseactionobjectList.length;eg++){
                //Debug.write("this.baseactionobjectList[eg][0]==modi",this.baseactionobjectList[eg][0],modi);
                //if ($debug) Debug.write("############## baseactionobjectList select : ", this.baseactionobjectList[eg]);
                //if ($debug) Debug.write("############## baseactionobjectList select x: ", this.baseactionobjectList[eg][10]);
                //if ($debug) Debug.write("############## baseactionobjectList select y: ", this.baseactionobjectList[eg][11]);
                //if ($debug) Debug.write("############## baseactionobjectList select opacity: ", this.baseactionobjectList[eg][6]);
                //if ($debug) Debug.write("############## baseactionobjectList select name: ", this.baseactionobjectList[eg][14]);
                
                //if ($debug) Debug.write("############## baseactionobjectList select this x: ", x);
                //if ($debug) Debug.write("############## baseactionobjectList select this y: ", y);
                
                //if ($debug) Debug.write("############## baseactionobjectList select this x+width: ", x+width);
                //if ($debug) Debug.write("############## baseactionobjectList select this y+height: ", y+height);
                
                //if (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-1]==bName) {
                    //return this.baseactionobjectList[eg];
                //}
                
                if (
                    (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-5] > x && this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-4] > y) &&
                    (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-5] < x+width && this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-4] < y+height)
                   ) {
                    //return this.baseactionobjectList[eg];
                    //this.baseactionobjectList[eg][6] = 0.2;
                    
                   	var tObject = new Array();
                   	var tCopyObject = this.baseactionobjectList[eg];
                   	
                   	for (var i=0;i<tCopyObject.length;i++) {
                   		var tItemObject = tCopyObject[i];
                   		
                   		if (tItemObject instanceof Array) {
                   			
               			    var storingItemObject = new Array();
                   			
               			    for (var k=0;k<tItemObject.length;k++) {
           				        var kItemObject = tItemObject[k];
           				        
           				        if (kItemObject instanceof Array) {
           				        	
           				        	var subStoringItemObject = new Array();
           				        	
           				        	for (var l=0;l<kItemObject.length;l++) {
           				        		var lItemObject = kItemObject[l];
           				        		subStoringItemObject.push(lItemObject);
           				        	}
           				        	
           				        	storingItemObject.push(subStoringItemObject);
           				        } else {
           				        	storingItemObject.push(kItemObject);
           				        }
                   				
                   				
                   			}
                   			
                   			tObject[i] = storingItemObject;
                   			
                   		} else {
                   			tObject[i] = tItemObject;
                   		}
                   		
                   	}
                   	
                   	
                   	
                    this.selectedObjects.push(tObject);
                    
                    objectToUpdate = this.getObjectByName(this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-1]);
                    objectToUpdate.setAttribute('opacity', 0.7);
                    
                    //this.baseactionobjectList[eg][14] += '_copy';
                    //this.sendRemoteWatchObject(this.baseactionobjectList[eg]);
                    //this.sendRemoteWatchObject(this.baseactionobjectList[eg]);                  
                    
                    if ($debug) Debug.write("############## objectToUpdate: ", objectToUpdate);
                    if ($debug) Debug.write("############## baseactionobjectList select opacity if: ", this.baseactionobjectList[eg][6]);
                }
            }  
            
            /*
            if(whiteboardObjects.length > 0){
            	 = whiteboardObjects;
            }
            */
            
            if ($debug) Debug.write("############## endSelect this.selectedObjects: ",  this.selectedObjects);
            
            this.currentlayer = new lz.drawViewNew(this,{
                name:tmpName,x:x,y:y,width:width,height:height,
                opacity:this.currentSelectangleOpacity});
                
            new lz.drawViewInner(this.currentlayer,{
                name:'_innerSelect',x:0,y:0,width:width,height:height});
                
            //this.drawSelectangleHistory(this.currentlayer,0,0,width,height,
              //  this.currentSelectanglestroke,this.currentSelectangleineWidth,
                //this.currentSelectanglestrokeFill,this.currentSelectanglestrokeDis,
                //this.currentSelectanglestrokeFillDis);
           
            //this.drawSelectregisterFinal(this.currentlayer.name,this.currentSelectanglestroke,
              //  this.currentSelectangleineWidth,this.currentSelectanglestrokeFill,
                //this.currentSelectanglestrokeDis,this.currentSelectanglestrokeFillDis,
                //x,y,width,height,this.getSWFDocumentStatus(),
                //this.getZIndex());
            //this.layers.push(this.currentlayer);
            //this.checkStepLayers();
        ]]>
    </method> 
    
    <!--
        Terminate the usage of this function
     --> 
     <!--
    <method name="drawSelectangle" args="x1,y1,x2,y2">
        <![CDATA[
            
            currentlayer.lineWidth = this.currentSelectangleineWidth;
            currentlayer.beginPath();
            currentlayer.moveTo(x1,y1);
            currentlayer.lineTo(x1,y2);
            currentlayer.lineTo(x2,y2);
            currentlayer.lineTo(x2,y1);
            currentlayer.lineTo (x1,y1);
            this.closePath();
            
            if (this.currentSelectanglestrokeDis!=-1){
                currentlayer.strokeStyle = this.currentSelectanglestroke;
                currentlayer.stroke();
            }

            if (this.currentSelectanglestrokeFillDis!=-1){
                currentlayer.fillStyle = this.currentSelectanglestrokeFill;
                currentlayer.fill();
            }
            
        ]]>   
    </method>   
    -->
    <method name="redrawSelectItemByScaling" args="objRef">
        //if ($debug) Debug.write("redrawSelectItemByScaling: "+objRef);
        this.currentlayer = objRef;
        this.currentlayer._innerSelect.destroy();
        new lz.drawViewInner(this.currentlayer,{
            name:'_innerSelect',x:0,y:0,width:objRef.width,height:objRef.height});
        this.drawSelectangleHistory(this.currentlayer,0,0,
            objRef.width,objRef.height,
            this.currentSelectanglestroke,this.currentSelectangleineWidth,
            this.currentSelectanglestrokeFill,this.currentSelectanglestrokeDis,
            this.currentSelectanglestrokeFillDis);
    </method> 
    
    <method name="drawSelectangleToHistory" args="lastActionObject,parentView">
        var tmpCurrentlayer = new lz.drawViewNew(parentView,{
            name:lastActionObject[lastActionObject.length-1],
            x:lastActionObject[lastActionObject.length-5],
            y:lastActionObject[lastActionObject.length-4],
            width:lastActionObject[lastActionObject.length-3],
            height:lastActionObject[lastActionObject.length-2],
            opacity:lastActionObject[6]});
        new lz.drawViewInner(tmpCurrentlayer,{
                name:'_innerSelect',x:0,y:0,
                width:lastActionObject[lastActionObject.length-3],
                height:lastActionObject[lastActionObject.length-2]});
        this.drawSelectangleHistory(tmpCurrentlayer,0,0,
            lastActionObject[lastActionObject.length-3],lastActionObject[lastActionObject.length-2],
            lastActionObject[1],lastActionObject[2],lastActionObject[3],lastActionObject[4],lastActionObject[5]);
            
        this.doSWFDocumentStatus(tmpCurrentlayer,lastActionObject[lastActionObject.length-7]);
    </method>
    
    <method name="drawSelectangleHistory" args="parentObj,x1,y1,x2,y2,stroke,line,fill,strokeDis,fillDis">
        <![CDATA[
            //Debug.write("drawSelectangleHistory",parentObj,x1,y1,x2,y2,stroke,line,fill,strokeDis,fillDis);
            parentObj._innerSelect.lineWidth = line;
            parentObj._innerSelect.beginPath();
            parentObj._innerSelect.moveTo(x1,y1);
            parentObj._innerSelect.lineTo(x1,y2);
            parentObj._innerSelect.lineTo(x2,y2);
            parentObj._innerSelect.lineTo(x2,y1);
            parentObj._innerSelect.lineTo (x1,y1);
            
            if (strokeDis!=-1){
                parentObj._innerSelect.strokeStyle = stroke;
                parentObj._innerSelect.stroke();
            }
            
            if (fillDis!=-1){
                parentObj._innerSelect.fillStyle = fill;
                parentObj._innerSelect.fill();
            }
            
        ]]>   
    </method>  
    
    <method name="drawSelectregisterFinal" args="newName,stroke,line,fill,strokeDis,fillDis,x,y,width,height,swfObj,zIndex" >
        Debug.write("drawSelectregisterFinal",newName,stroke,line,fill,strokeDis,fillDis,x,y,width,height);
        var actionObject = new Array();
        actionObject[0] = 'Selectangle';
        actionObject[1] = stroke;
        actionObject[2] = line;
        actionObject[3] = fill;
        actionObject[4] = strokeDis;
        actionObject[5] = fillDis;
        actionObject[6] = this.currentSelectangleOpacity;
        actionObject[7] = zIndex;//-8
        actionObject[8] = swfObj;//-7
        actionObject[9] = this.counter;//-6
        actionObject[10] = x;//-5
        actionObject[11] = y;//-4
        actionObject[12] = width;//-3
        actionObject[13] = height;//-2  
        actionObject[14] = newName;//-1
        this.baseactionobjectList.push(actionObject);
        this.onsharedMessage('draw',actionObject);
    </method>
    
</class>

</library>
