<?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="commonVideoViewContent" extends="view">

    <!--
		This method returns a free position for a new video object
		@param horizontal offset between two video objects
	 -->
    <method name="getVideoObjectFreePos" args="offsetLength,videoWidth,videoHeight">
        <![CDATA[
            var newx = 20;
            var newy = 0;
            var posFound = false;
            while (!posFound) {
                posFound = true;
                for (var i=0;i<this.subviews.length;i++){
                    var subview = this.subviews[i];
                    var left = subview.x;
                    var right = subview.x + subview.width;
                    var top = subview.y;
                    var bottom = subview.y + subview.height;

                    if( !(newx > right
                        || (newx + videoWidth) < left
                        || newy > bottom
                        || (newy + videoHeight) < top ))
                    {
                        newx = right + offsetLength;
                        posFound = false;
                    }
                    if ((newx + videoWidth) >= canvas.width) {
                        newx = 20;
                        newy += 10;
                        posFound = false;
                    }
                }
            }

            if ((newy + videoHeight) >= canvas.height) {
                newy = 0;
            }

            var result = [newx, newy];
            return result;
        ]]>
    </method>

</class>

<class name="commonVideoViewContentHideWhiteboard" extends="view">

    <!--
		This method returns a free position for a new video object
		@param horizontal offset between two video objects
	 -->
    <method name="getVideoObjectFreePos" args="offsetLength,videoWidth,videoHeight">
        <![CDATA[
            var newx = 20;
            var newy = 0;
            var posFound = false;
            while (!posFound) {
                posFound = true;
                for (var i=0;i<this.subviews.length;i++){
                    var subview = this.subviews[i];
                    var left = subview.x;
                    var right = subview.x + subview.width;
                    var top = subview.y;
                    var bottom = subview.y + subview.height;

                    if( !(newx > right
                        || (newx + videoWidth) < left
                        || newy > bottom
                        || (newy + videoHeight) < top ))
                    {
                        newx = right + offsetLength;
                        posFound = false;
                    }
                    if ((newx + videoWidth) >= this.width) {
                        newx = 20;
                        newy += 10;
                        posFound = false;
                    }
                }
            }

            if ((newy + videoHeight) >= parent.height) {
                newy = 0;
            }

            var result = [newx, newy];
            return result;
        ]]>
    </method>

</class>

</library>
