<?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="confirmationSingle" extends="labelExplorerBox" labelid="832"
    docking="true" resizeable="false" closable="true" height="140" width="300">
    
    <attribute name="refObj" value="null" />
    
    <attribute name="refReturnMethod" value="null" />
    
    <attribute name="showCheckBox" value="true" type="boolean" />
    
    <attribute name="labeliderror" value="0" type="number" />
    
    <attribute name="doCalcPosition" value="true" type="number" />
    
	<attribute name="iconResource" value="warning_popup_icon_rsc" type="string" />

	<image x="4" src="$once{ canvas.getThemeImage(parent.iconResource) }" y="24" />

    <labelText labelid="$once{ parent.labeliderror }" y="24" 
    		   width="$once{ parent.width - 40 }"
    	multiline="true" resize="false" x="30" />
        
    <handler name="oninit">
        <![CDATA[
        
        	if (!this.doCalcPosition) {
        		return;
        	}
        
            //Set Position of Confirmation Box as Close as possible to the Mouse
            var x = parent.getMouse("x");
            var y = parent.getMouse("y");
            var newx = x - (this.width/2);
            var newy = y - (this.height/2);
            
            if ($debug) Debug.write("1",x,y,newx,newy);
            
            if (newx < 0) {
                newx = 20;
            }
            if (newy < 0) {
                newy = 20;
            }
            
            //if ($debug) Debug.write("1.1",(this.width + newx + 20),parent.width,this.width);
            
            var relativeWidth = parent.width;
            if (relativeWidth > canvas.width) {
            	relativeWidth = canvas.width;
            }
            
            if (this.width + newx + 20 > relativeWidth) {
            	newx = relativeWidth-this.width-20;
            }
            
            if (this.height + newy + 20 > parent.height) {
            	newy = parent.height-this.height-20;
            }
            
            if ($debug) Debug.write("2",newx,newy);
            
            this.setAttribute("x",newx);
            this.setAttribute("y",newy);
            
        ]]>
    </handler>
    
    <labelCheckbox name="holddatainSO" visibility="$once{ (parent.showCheckBox) ? 'visible' : 'hidden' }" 
                   labelid="64" x="10" y="$once{ parent.height - 46 }" />
    
    <simpleLabelButton labelid="61" width="100" x="$once{ parent.width - 105 }" y="$once{ parent.height - 26 }">
    	<handler name="onclick">
    		var t = parent.holddatainSO.getValue();
    		this.parent.close();
    		if (parent.refReturnMethod == null) {
    			if ($debug) Debug.write("refObj ",this.parent.refObj);
    		    this.parent.refObj.sendNoConfirmation();
    		} else {
    			this.parent.refObj[parent.refReturnMethod](false,t);
    		}
    	</handler>
    </simpleLabelButton>    
    <simpleLabelButton labelid="60" width="100" x="$once{ parent.width - 210 }" y="$once{ parent.height - 26 }">
    	<handler name="onclick">
    		var t = parent.holddatainSO.getValue();
    		this.parent.close();
    		if (parent.refReturnMethod == null) {
    		    this.parent.refObj.sendConfirmation(true,t);
    		} else {
                this.parent.refObj[parent.refReturnMethod](true,t);
            }
    	</handler>
    </simpleLabelButton>    
</class>

<class name="rememberMessage" extends="labelExplorerBox" labelid="832"
	   x="$once{ canvas.width/2 - this.width/2 }" y="100"
	   docking="true" resizeable="false" closable="true" height="140" width="300">
    
    <attribute name="refObj" value="null" />
    
    <attribute name="showCheckBox" value="true" type="boolean" />
    
    <attribute name="labeliderror" value="0" type="number" />
    
    <view x="4" resource="warning_icon_rsc" y="24" />

    <labelText labelid="$once{ parent.labeliderror }" y="24" 
               width="$once{ parent.width - 40 }"
        multiline="true" resize="false" x="30" />
        
    <labelCheckbox name="holddatainSO" visibility="$once{ (parent.showCheckBox) ? 'visible' : 'hidden' }" 
                   labelid="64" x="10" y="$once{ parent.height - 46 }" />
    
    <simpleLabelButton labelid="642" width="100" x="$once{ parent.width - 105 }" y="$once{ parent.height - 26 }">
        <handler name="onclick">
        	var t = parent.holddatainSO.getValue();
            this.parent.close();
            this.parent.refObj.sendConfirmation(t);
        </handler>
    </simpleLabelButton>    
     
</class>
	
</library>
