//--------------------------------
//********************************
//******** Class layer************
//********************************
//--------------------------------


//********************************
//********* Constructors *********
//********************************
function layer()
{
   this.m_parent = 0;
   this.m_have_parent = false;
   
}


function owk_layer_background()
{ 
   return m_background; 
}

function owk_layer_set_background(i_background)
{ 
   this.m_background = i_background;
   if(i_background.a==255)
   {
      this.m_div.style.backgroundColor = 'transparent';
   }
        
   this.m_div.style.backgroundColor = "#" + i_background.rgb_to_hex();      
}

function owk_layer_rend_bitmap ()
{ 
   return bitmap.prototype; 
}

function owk_layer_load_image(i_URL)
{
   this.m_div.style.backgroundImage		= "url("+i_URL+")";
   if(isIE())
   {     
      if(navigator.appVersion.split(";")[1] == " MSIE 6.0")
      {         
         this.m_div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+ i_URL + "', sizingMethod='scale', enabled=true)";
   	   this.m_div.style.backgroundImage = "none";
      }
   }
}

function owk_layer_create(i_rect, i_visible, i_resizable, i_dragable)
{   
   this.m_region = new rectangle();
   this.m_rotation_angle = 0;
   this.m_pivot_point = new point(0,0);
   this.m_background = new color(255,255,255,255);
   this.m_on;
   this.m_resizable;
   this.m_dragable;
   this.m_draging = false;
   this.m_rotatable;
   this.m_scaleable;
   this.m_visible;
   this.m_opacity;
   this.m_resizing = false;
   this.m_scale_factor = 1;
   this.m_disable = false;
   this.m_selectable = false;
  
   this.minimum_height = 25;
   this.minimum_width = 25;
   this.m_rotation_angle = 0;

   this.m_div = document.createElement('div');
   this.m_div.style.position = 'absolute';
  //this.m_div.style.background="yellow";
   this.m_div.style.backgroundRepeat = 'no-repeat';
   //this.m_div.style.border = 'solid 1px red';
   this.m_div.style.overflow = 'hidden';
   
   //this.m_divResizeImg = document.createElement('div');
   //this.m_divResizeImg.style.position = 'absolute';   
   //this.m_divResizeImg.style.background="red"; 
   
   this.set_region(i_rect);
   this.set_resizable(i_resizable);
   this.set_dragable(i_dragable);
   this.set_visible(i_visible);

   //this.set_opacity(100);
     
 //  if(i_resizable==false)
//   {
//      this.m_divResizeImg.style.display='none'
 //  }
   
 //  this.m_div.appendChild(this.m_divResizeImg);
   
   
   //drop_shadow().on(false);
   //disable().on(false);

   this.set_draging(false);

 //  rend_bitmap().create(region().width(), region().height());

  // this.pivot_point().xy(this.region().center_x(), this.region().center_y()); // by default the center of region
      
   var add_in_parent;
   
   if(this.m_have_parent!=true)
   { 
      add_in_parent  = document.getElementsByTagName("body").item(0);
   }
   else
   {
      add_in_parent = this.m_parent.m_div;
   }
    
   add_in_parent.appendChild(this.m_div);	
}

function owk_layer_pivot_point()
{
   return this.m_pivot_point;
}

function owk_layer_set_pivot_point(i_point)
{
    this.m_pivot_point = i_point;
}

function owk_layer_region()
{
   return this.m_region;
}

function owk_layer_set_region(i_rect)
{
   this.m_region = i_rect;    
   this.m_div.style.left = this.m_region.origin.x;
   this.m_div.style.top = this.m_region.origin.y;
   this.m_div.style.width = this.m_region.size.width;
   this.m_div.style.height = this.m_region.size.height;   
  
}

/*
function owk_layer_set_region_resize()
{
   
   this.m_regionresize.size.width = 10;
   this.m_regionresize.size.height = 10;
   
   this.m_regionresize.origin.x = this.m_region.origin.x + this.m_region.size.width - this.m_regionresize.size.width;
   this.m_regionresize.origin.y = this.m_region.origin.y + this.m_region.size.height - this.m_regionresize.size.height;
   
   this.m_divResizeImg.style.top = this.m_region.size.height - this.m_regionresize.size.height;
   this.m_divResizeImg.style.left = this.m_region.size.width - this.m_regionresize.size.width;
   this.m_divResizeImg.style.width  = this.m_regionresize.size.width;
   this.m_divResizeImg.style.height = this.m_regionresize.size.height;
   
}*/


function owk_layer_rotation_angle()
{
   return this.m_rotation_angle;
}

function owk_layer_set_rotation_angle(i_angle)
{
    this.m_rotation_angle = i_angle;
}

function owk_layer_scale_factor()
{
   return this.m_scale_factor;
}

function owk_layer_set_scale_factor(i_scale)
{
    this.m_scale_factor = i_scale;
}

function owk_layer_on()
{
   return this.m_on;
}

function owk_layer_set_on(i_value)
{
    this.m_on = i_value;
}

function owk_layer_draging()
{
   return this.m_draging;
}

function owk_layer_set_draging(i_value)
{
    this.m_draging = i_value;
}

function owk_layer_resizing()
{
    return this.m_resizing;
}

function owk_layer_set_resizing(i_value)
{
    this.m_resizing = i_value;
}

function owk_layer_resizable()
{
    return this.m_resizable;
}

function owk_layer_set_resizable(i_value)
{
    this.m_resizable = i_value;
}

function owk_layer_dragable()
{
    return this.m_dragable;
}

function owk_layer_set_dragable(i_value)
{
    this.m_dragable = i_value;
}

function owk_layer_rotatable()
{
   return this.m_rotatable;
}

function owk_layer_set_rotatable(i_value)
{
    this.m_rotatable = i_value;
}

function owk_layer_scaleable()
{
   return this.m_scaleable;
}

function owk_layer_set_scaleable(i_value)
{
    this.m_scaleable = i_value;
}

function owk_layer_visible()
{
   return this.m_visible;
}

function owk_layer_set_visible(i_value)
{
    this.m_visible = i_value;
    
    if(i_value == true)
    {
      this.m_div.style.display = '';
    }
    else
    { 
      this.m_div.style.display = 'none';
    }
}

function owk_layer_opacity()
{
   return this.m_opacity;
}

function owk_layer_set_opacity(i_value)
{
    this.m_opacity = i_value;
    this.m_div.style.opacity = i_value/100;
    this.m_div.style.filter = "alpha(opacity='"+i_value+"')"; 
}

function owk_layer_scale_factor()
{
   return this.m_scale_factor;
}

function owk_layer_set_scale_factor(i_value)
{
    this.m_scale_factor = i_value;
}

function owk_layer_invalidate()
{
   this.set_region(this.region());
}

function owk_layer_invalidate_region(i_region)
{

}

function owk_layer_on_draw(i_surface, i_region)
{

}

function owk_layer_destroy()
{
   var body  = document.getElementsByTagName("body").item(0);
   body.removeChild(this.m_div);	
}

function owk_layer_resize(i_new_region, i_invalidate)
{
   /*
   if (i_new_region.not_equal(this.region()))
   {
      // backup previous region before change
      var previous_region = this.bounds_region();
      
      // resize the new region
       this.set_region(i_new_region);
      this.pivot_point().xy(this.region().center_x(), this.region().center_y()); // by default the center of region

      // combine together before and new region
      var combined_region = new rectangle();
      previous_region.combine(this.bounds_region(), combined_region);

      // resize the bitmap
      //rend_bitmap().resize(region().width(), region().height());

     // this.on_resizing();

      if (i_invalidate)
      {
		   // convert region to surface coordinate for invalidate
		   var surface_region = new rectangle();
		   surface_region = combined_region;
		   if (this.has_parent())
			   this.parent().local_to_global_coordinates(surface_region );

		   result = this.invalidate_region(surface_region);
      }
   }*/
}


function owk_layer_drag(i_new_region, i_invalidate)
{
   //if (i_new_region.is_diff(this.region()))
   {
      // backup previous region before change
      var previous_region = new rectangle(0,0,0,0);
      previous_region.copy(this.bounds_region());//region();

      // assign to the new region.
      this.region().copy(i_new_region);
      //this.pivot_point().xy(this.region().center_x(), this.region().center_y()); // by default the center of region

      // combine together before and new region
      //var combined_region = new rectangle(0,0,0,0);;
      //previous_region.combine(this.bounds_region(), combined_region);

      this.on_draging();
this.set_region(this.region());
      /*if (i_invalidate)
      {
		   // convert region to surface coordinate for invalidate
		   var surface_region = new rectangle(0,0,0,0);
		   surface_region.copy(combined_region);
		   if (this.has_parent())
			   this.parent().local_to_global_rect(surface_region );

         surface_region.inset(5, 5); // actually a patch need more time to solve this bug

         this.invalidate();
		   //var result = this.invalidate_region(surface_region);
      }*/
      this.on_dragged();
   }
} 

function owk_layer_is_inside(i_pt)
{	
   if (this.rotation_angle() != 0)
   {
      var pt = new point(i_pt);
      pt.rotate(-this.rotation_angle(), this.pivot_point());
      var is_inside = this.region().is_point_inside(pt);
      
      return is_inside;
   }
   else if (this.scale_factor() != 1)
   {
	   var pt = new point(i_pt);
	   pt.set_scale_factor(1 / this.scale_factor(), this.region().center_x(), this.region().center_y());
	   
	   return this.region().is_point_inside(pt);	   
   }
   else
   {
      return this.m_region.is_point_inside(i_pt);
   }
	 
}

function owk_layer_quad_region()
{
   var qd = new quad(region());
   qd.rotate(this.rotation_angle(), this.pivot_point());

   return qd;
}

function owk_layer_bounds_region() 
{
   if (this.rotation_angle() != 0)
   {
      // create a quad
      var qd = new quad(region());
      qd.rotate(this.rotation_angle(), this.pivot_point());
      var rect = new rectangle();
      qd.bounding_box(rect);

      return rect;
   }
   else if (this.scale_factor() != 1.0)
   {
	   var rect = new rectangle(region());
	   rect.scale(this.scale_factor());
	   return rect;
   }
   else 
   {
      return this.region();
   }
}
 
function owk_layer_set_parent(i_parent)
{
  this.m_have_parent = true;
  this.m_parent = i_parent;    

}

function owk_layer_has_parent()
{
   return this.m_have_parent;
}

function owk_layer_parent()
{
   try
   {
      return this.m_parent;
   }
   catch(e){return 0;}
}

function owk_layer_release_parent()
{
   this.m_have_parent = false;
   this.m_parent = 0;
}

function owk_layer_destroy()
{

}

// mouse listener events are send only if the mouse is inside the widget
function owk_layer_on_mouse_move_enter(i_mouse) 
{    
   return false;
}

function owk_layer_on_mouse_move_leave(i_mouse) 
{ 
    return false;
}

function owk_layer_on_mouse_move(i_mouse) 
{
   var taken = false;
   var mouse_position;
   
   var  mouse_position = new point(i_mouse.position().x, i_mouse.position().y);
 /*  this.global_to_local_point(mouse_position);
   if(this.m_have_parent ==true)
   {
      mouse_position.x  = mouse_position.x + this.m_parent.m_region.origin.x;
      mouse_position.y  = mouse_position.y + this.m_parent.m_region.origin.y;
   }*/
   
   if(this.m_have_parent == true)
   {
      this.m_parent.global_to_local_point(mouse_position);
   }
   
   if(this.m_draging == true||this.m_resizing == true)
   {
      taken = true;
   }    
   
   if(this.m_resizing == true)
   {      
      var new_width = mouse_position.x - this.m_region.origin.x;
      var new_height = mouse_position.y - this.m_region.origin.y;
      
      if(new_width < this.minimum_width)
      {
         new_width = this.minimum_width;
      }
      
      if(new_height < this.minimum_height)
      {
         new_height = this.minimum_height;
      }
         
      this.m_region.size.width = new_width;
      this.m_region.size.height = new_height;    
      
      this.m_div.style.width  = this.m_region.size.width;
      this.m_div.style.height = this.m_region.size.height;    
      
      this.on_resizing();
   }  
   else if(this.m_draging == true)
   {    
         this.m_region.origin.x = mouse_position.x + this.distancebetweendivandmouseleft;
         this.m_region.origin.y = mouse_position.y + this.distancebetweendivandmousetop;   
         
         this.m_div.style.left  = this.m_region.origin.x
         this.m_div.style.top = this.m_region.origin.y;
   }  
   
   return taken; 
}

function owk_layer_is_inside_resizing_box()
{
   return false;
}

function owk_layer_on_mouse_button_down(i_mouse) 
{     
   var taken = false;
   try
   {    
      i_mouse.capture(this); 
         
      var mouse_position = new point(i_mouse.position().x, i_mouse.position().y);

      if(this.m_have_parent == true)
      {      
         this.m_parent.global_to_local_point(mouse_position);
      }   
       
      var mouse_position2 = new point( mouse_position.x-this.m_region.origin.x,  mouse_position.y-this.m_region.origin.y);
      
      if(this.m_resizable==true && this.is_inside_resizing_box(mouse_position2))
      {  
         this.m_resizing = true;    
      }
      else if(this.m_dragable==true && this.m_region.is_point_inside(mouse_position))
      {  
         taken = true;     
         //this.m_div.style.opacity= 0.6;
         //this.m_div.style.filter = "alpha(opacity='60')"; 
         this.m_draging = true;    
      }      
      
      if(this.m_draging == true||this.m_resizing == true)
      {              
         this.distancebetweendivandmouseleft = this.m_region.origin.x - mouse_position.x;
         this.distancebetweendivandmousetop = this.m_region.origin.y - mouse_position.y;          
      }
    }
    catch(e){}
      
   return taken;
}

function owk_layer_on_mouse_button_up(i_mouse) 
{     
   var taken = false;
  
   if(this.m_draging == true||this.m_resizing)
   {
     // this.m_div.style.opacity= 1;
     // this.m_div.style.filter = "alpha(opacity='100')"; 
      i_mouse.release_capture();
      taken = false;
   }
   this.m_draging = false;
   this.m_resizing = false;
   
   return taken;
}


function owk_layer_on_key_up(i_keyboard) 
{       
   //alert('owk_layeron_key_up');
}

function owk_layer_on_key_down(i_keyboard) 
{       
   //alert('owk_layeron_key_down');
}

function owk_layer_on_key_press(i_keyboard) 
{       
   //alert('owk_layeron_key_press');
}

function owk_layer_on_begin_draging() 
{       
  // alert('owk_layer_on_begin_draging');
}

function owk_layer_on_draging() 
{       
  // alert('on_draging');
}

function owk_layer_on_dragged() 
{       
  // alert('on_draging');
}

function owk_layer_on_end_draging() 
{       
  // alert('on_end_draging');
}

function owk_layer_local_to_global_coordinates_point(io_pt) 
{       
   // add translation
   io_pt.x = (io_pt.x() + this.region().left()); 
   io_pt.y = (io_pt.y() + this.region().top()); 
   
	// add scale
	if (this.scale_factor() != 1)
	{
		io_pt.scale(this.scale_factor(), this.region().center_x(), this.region().center_y());
	}
		
   // add rotation
   if (this.rotation_angle() != 0)
   {
      io_pt.rotate(this.rotation_angle(), this.pivot_point());
   }

   // recursive call to parent
   if (this.has_parent())
   {
      this.parent().local_to_global_coordinates_point(io_pt);
   }
}

function owk_layer_local_to_global_coordinates_rect(io_rect) 
{       
  // recursive call to parent
   if (this.has_parent())
      this.parent().global_to_local_rect(io_rect);

   // remove rotation
   if (this.rotation_angle() != 0)
   {      
      var qd = new quad(io_rect);
      qd.rotate(-this.rotation_angle(), this.pivot_point()); // temporary
      qd.bounding_box(io_rect);
   }

	// remove scale
	if (this.scale_factor() != 1)
		io_rect.scale(1 / this.scale_factor());
	
   // remove translation
   io_rect.left(io_rect.left() - this.region().left()); 
   io_rect.top(io_rect.top() - this.region().top()); 
   io_rect.right(io_rect.right() - this.region().left()); 
   io_rect.bottom(io_rect.bottom() - this.region().top()); 
}

function owk_layer_global_to_local_point(io_pt) 
{       
   // recursive call to parent
   if (this.m_have_parent == true)
   {
      this.m_parent.global_to_local_point(io_pt);
   }
     
   // remove rotation
   if (this.rotation_angle() != 0)
   {   
      //io_pt.rotate(-this.rotation_angle(), this.pivot_point()); // temporary
   }	
   // remove scale
   if (this.scale_factor() != 1)
   {
	   io_pt.set_scale_factor(1 / this.scale_factor(), this.region().center_x(), this.region().center_y());
	}
   

   // remove translation
   io_pt.x = io_pt.x - this.m_region.left(); 
   io_pt.y = io_pt.y - this.m_region.top();
}


function owk_layer_global_to_local_rect(io_rect) 
{ 
   // add translation
   io_rect.left(io_rect.left() + this.region().left()); 
   io_rect.top(io_rect.top() + this.region().top()); 
   io_rect.right(io_rect.right() + this.region().left()); 
   io_rect.bottom(io_rect.bottom() + this.region().top()); 

	// add scale
	if (this.scale_factor() != 1.0)
	{
		io_rect.scale(this.scale_factor());
   }
   
   // add rotation
   if (this.rotation_angle() != 0)
   {
      var qd = new quad(io_rect);
      qd.rotate(this.rotation_angle(), this.pivot_point()); // temporary
      qd.bounding_box(io_rect);
   }

   // recursive call to parent
   if (this.has_parent())
   {
      this.parent().local_to_global_coordinates(io_rect);
   }
}

function owk_layer_on_resizing()
{

}

function owk_layer_set_name(i_name)
{
   this.m_name = i_name;
}

function owk_layer_is_popup()
{
   return this.m_set_is_popup;
}

function owk_layer_set_is_popup(i_set_is_popup)
{
   this.m_set_is_popup = i_set_is_popup;
}

function owk_layer_is_modal()
{
   return this.m_modal;
}

function owk_layer_set_modal(i_modal)
{
   this.m_modal = i_modal;
}

function owk_layer_select()
{
   return this.m_select;
}

function owk_layer_set_select(i_select)
{
   this.m_select = i_select;

   if(this.m_select == true)
   {
       this.on_select();
   }
   else
   {
       this.on_unselect();
   }
   
   this.on_change_selecting();
}

function owk_layer_on_selecting()
{

}

function owk_layer_on_select()
{

}

function owk_layer_on_unselect()
{

}



function owk_layer_on_begin_selecting()
{

}

function owk_layer_on_end_selecting()
{

}


function owk_layer_disable()
{
   return this.m_disable;
}


function owk_layer_set_disable(i_disable)
{
   this.m_disable = i_disable;
}


function owk_layer_selectable()
{
   return this.m_selectable;
}


function owk_layer_set_selectable(i_selectable)
{
    this.m_selectable = i_selectable;
}

function owk_layer_on_change_selecting()
{

}

function owk_layer_selecting()
{
   return this.m_selecting;
}

function owk_layer_set_selecting(i_selecting)
{
   this.m_selecting = i_selecting;
}

layer.prototype = new bitmap;
layer.prototype.set_name = owk_layer_set_name;
layer.prototype.is_popup = owk_layer_is_popup;
layer.prototype.set_is_popup = owk_layer_set_is_popup;
layer.prototype.is_modal = owk_layer_is_modal;
layer.prototype.set_modal = owk_layer_set_modal;
layer.prototype.load_image = owk_layer_load_image;
layer.prototype.rend_bitmap = owk_layer_rend_bitmap;
layer.prototype.pivot_point = owk_layer_pivot_point;
layer.prototype.set_pivot_point = owk_layer_set_pivot_point;
layer.prototype.region = owk_layer_region;
layer.prototype.set_region = owk_layer_set_region;
layer.prototype.scale_factor = owk_layer_scale_factor;
layer.prototype.set_scale_factor = owk_layer_set_scale_factor;
layer.prototype.on = owk_layer_on;
layer.prototype.set_on = owk_layer_set_on;

layer.prototype.drag = owk_layer_drag;

layer.prototype.draging = owk_layer_draging;
layer.prototype.set_draging = owk_layer_set_draging;
layer.prototype.resizing = owk_layer_resizing;
layer.prototype.set_resizing = owk_layer_set_resizing;
layer.prototype.resizable = owk_layer_resizable;
layer.prototype.set_resizable = owk_layer_set_resizable;
layer.prototype.dragable = owk_layer_dragable;
layer.prototype.set_dragable = owk_layer_set_dragable;
layer.prototype.rotatable = owk_layer_rotatable
layer.prototype.set_rotatable = owk_layer_set_rotatable;
layer.prototype.scaleable = owk_layer_scaleable;
layer.prototype.set_scaleable = owk_layer_set_scaleable;
layer.prototype.disable = owk_layer_disable
layer.prototype.set_disable = owk_layer_set_disable;
layer.prototype.selectable = owk_layer_selectable;
layer.prototype.set_selectable = owk_layer_set_selectable;
layer.prototype.visible = owk_layer_visible;
layer.prototype.set_visible  = owk_layer_set_visible;
layer.prototype.opacity = owk_layer_opacity;
layer.prototype.set_opacity = owk_layer_set_opacity;
layer.prototype.scale_factor = owk_layer_scale_factor;
layer.prototype.set_scale_factor = owk_layer_set_scale_factor;
layer.prototype.rotation_angle = owk_layer_rotation_angle;
layer.prototype.set_rotation_angle = owk_layer_set_rotation_angle;
layer.prototype.invalidate = owk_layer_invalidate;
layer.prototype.invalidate_region = owk_layer_invalidate_region;
layer.prototype.on_draw = owk_layer_on_draw; 
layer.prototype.create = owk_layer_create;
layer.prototype.destroy = owk_layer_destroy;
layer.prototype.has_parent = owk_layer_has_parent;
layer.prototype.parent = owk_layer_parent;
layer.prototype.set_parent = owk_layer_set_parent;
layer.prototype.release_parent = owk_layer_release_parent;
layer.prototype.destroy = owk_layer_destroy;
layer.prototype.resize = owk_layer_resize;
layer.prototype.bounds_region = owk_layer_bounds_region;
layer.prototype.quad_region = owk_layer_quad_region;
layer.prototype.on_mouse_move_enter = owk_layer_on_mouse_move_enter;
layer.prototype.on_mouse_move_leave = owk_layer_on_mouse_move_leave;
layer.prototype.on_mouse_move = owk_layer_on_mouse_move;
layer.prototype.on_mouse_button_down = owk_layer_on_mouse_button_down;
layer.prototype.on_mouse_button_up = owk_layer_on_mouse_button_up;
layer.prototype.is_inside = owk_layer_is_inside;
layer.prototype.is_inside_resizing_box = owk_layer_is_inside_resizing_box;
layer.prototype.on_resizing = owk_layer_on_resizing;
layer.prototype.set_background = owk_layer_set_background;
layer.prototype.select = owk_layer_select;
layer.prototype.set_select = owk_layer_set_select;
layer.prototype.selecting = owk_layer_selecting;
layer.prototype.set_selecting = owk_layer_set_selecting;
layer.prototype.on_dragged = owk_layer_on_dragged;



// mouse listener events are send only if the mouse is inside the widget
layer.prototype.on_key_up = owk_layer_on_key_up; 
layer.prototype.on_key_down = owk_layer_on_key_down
layer.prototype.on_key_press = owk_layer_on_key_press;
layer.prototype.on_begin_draging = owk_layer_on_begin_draging
layer.prototype.on_draging = owk_layer_on_draging; 
layer.prototype.on_end_draging = owk_layer_on_end_draging;
layer.prototype.local_to_global_coordinates_point = owk_layer_local_to_global_coordinates_point;
layer.prototype.local_to_global_coordinates_rectangle = owk_layer_local_to_global_coordinates_rect;
layer.prototype.global_to_local_point = owk_layer_global_to_local_point;
layer.prototype.global_to_local_rect = owk_layer_global_to_local_rect;

layer.prototype.on_selecting = owk_layer_on_selecting;
layer.prototype.on_select = owk_layer_on_select;
layer.prototype.on_unselect = owk_layer_on_unselect;
layer.prototype.on_begin_selecting = owk_layer_on_begin_selecting;
layer.prototype.on_end_selecting = owk_layer_on_end_selecting;
layer.prototype.on_change_selecting = owk_layer_on_change_selecting;

layer.prototype.background = owk_layer_background;



//--------------------------------
//********************************
//***** Class layer_group ********
//********************************
//--------------------------------


//********************************
//********* Constructors *********
//********************************
function layer_group()
{
   this.m_layers = new Array();
   this.m_mouse_on_layer_ptr = 0; 
   this.m_wrapping = false;
   this.m_single_selection = false;
   this.m_multiple_selection = false;
   this.m_select_child_on_mouse_move = false;
   this.m_change_layer_order_on_click = false;
   this.m_call_layer_on_mouse_event = true;
   this.m_previous_single_sel_layer_ptr = 0;
   this.padding = new rectangle_2pts();
   this.margin = new rectangle_2pts();
   this.border = new rectangle_2pts();
   this.wrapping_margin = new rectangle_2pts();
}

function owk_layer_group_destroy()
{
   try
   {
      for (var i=0; i<this.m_layers.length; i++) 
      {
         this.m_layers[i].destroy();         
      } 
      
      for (var i=0; i<this.m_layers.length; i++) 
      {
         m_layers.pop();
      }
    
      this.ancestor_destroy();
   }
   catch(e){}
}

function owk_layer_group_remove_layer(i_layer)
{ 
   // find layer position
   
   var index_found = -1;
   for (var itr=0; itr < this.m_layers.length; itr++)
   {
      if (this.m_layers[itr] == i_layer)
      {
         this.m_layers.splice(itr,1);         
         break;
         //index_found = itr;
      }
   }
   
   /*
   if (index_found != -1)
   {
      // move back each items
      for (var itr=index_found; itr < m_layers.length - 1; itr++)
      {
         m_layers[itr] = m_layers[itr + 1];
      }
      --m_count_layers;
   }
*/
 //  i_layer.release_parent();
}



function owk_layer_group_on_mouse_move(i_mouse) 
{ 
   try
   {
      var taken = false;
   
      // dispatch to all layers the mouse event
      if (!taken && i_mouse.has_capture() != this) 
      {        
         // convert surface coordinate to layer
         var mouse_position = new point(i_mouse.position().x, i_mouse.position().y);
  
         this.global_to_local_point(mouse_position);
      
         // first time we enter
         if (this.is_popup() && this.is_inside(i_mouse.position()) && !this.mouse_move_inside_popup())
         {
            this.find_single_sel_layer();
            this.set_mouse_move_inside_popup(true);
         }

         var found_modal_layer_ptr = this.find_modal_layer();
         if (found_modal_layer_ptr )
         {
            taken = found_modal_layer_ptr.on_mouse_move(i_mouse);
            this.m_mouse_on_layer_ptr = found_modal_layer_ptr;
         }
         else
         {
            for (var i=this.m_layers.length-1; i >= 0; i--) 
            {
               var layer_ref = this.m_layers[i];

               // if (layer_ref.visible() && !layer_ref.disable().on() && layer_ref.is_inside(mouse_position)) 
               if (layer_ref.visible()  && layer_ref.is_inside(mouse_position)) 
               {
                  if (this.m_mouse_on_layer_ptr != layer_ref)
                  {            
                     if (this.m_mouse_on_layer_ptr != 0)
                     {
                        taken = this.m_mouse_on_layer_ptr.on_mouse_move_leave(i_mouse);
                     }
                    
                     this.m_mouse_on_layer_ptr = layer_ref;

                     taken = layer_ref.on_mouse_move_enter(i_mouse);               
                  }
                  
                  // select the layer under the mouse click
                  if (this.select_child_on_mouse_move())
                  {
                      this.do_selection_on_mouse_event(i_mouse, layer_ref);
                  }

                  taken = layer_ref.on_mouse_move(i_mouse);
                  
                  //if (taken==true)
                  //{               
                     break;
                 // }
               // break; // exit, because the layer take the mouse.
               }
            }


            if ((this.m_mouse_on_layer_ptr!=0) && (!this.m_mouse_on_layer_ptr.is_inside(mouse_position)))
            {
               taken = this.m_mouse_on_layer_ptr.on_mouse_move_leave(i_mouse);
               this.m_mouse_on_layer_ptr = 0;
            }      
         }
      }    
      
      if (taken == false)
      {
         taken = this.ancestor_on_mouse_move(i_mouse);
      }    
      
      return taken; 
   }
   catch(e){}
}

function owk_layer_group_on_mouse_button_down( i_mouse) 
{ 
   var taken = false;
   try
   {      
      // convert surface coordinate to widget
      var mouse_position = new point(i_mouse.position().x, i_mouse.position().y);
      this.global_to_local_point(mouse_position);
         
      var found_modal_layer_ptr = this.find_modal_layer();
      if (found_modal_layer_ptr )
      {
         taken = found_modal_layer_ptr.on_mouse_button_down(i_mouse);
         this.m_mouse_on_layer_ptr = found_modal_layer_ptr;
      }
      else
      {
         // hide the popup layer when is single selection and the mouse button up is released on a selected child.
         if ((i_mouse.has_capture() == this) && this.is_popup() && this.single_selection() && !this.is_inside(i_mouse.position()))
         {
            if (this.m_previous_single_sel_layer_ptr)
            {
               this.reselect_child(this.m_previous_single_sel_layer_ptr);
            }

            this.set_visible(false);
            // invalidate();
            taken = true;
         }

         // dispatch to all layers the mouse event
         for (var i=this.m_layers.length-1; i >= 0; i--) 
         {
            var layer_ref = this.m_layers[i];

            // if (layer_ref.visible() && !layer_ref.disable().on() && layer_ref.is_inside(mouse_position)) 
            if (layer_ref.visible()  && layer_ref.is_inside(mouse_position))
            {  
               // change the layer order on click
            //  if (change_layer_order_on_click())
               { 
                  this.remove_layer(layer_ref);
                  this.push_back_layer(layer_ref);
                  // refresh the surface for the priority of widget display
                 // owk_bool result = invalidate_region(layer_ref.region());

                  taken = true;
               }
               
               // select the layer under the mouse click
               if (!this.select_child_on_mouse_move())
               {
                     this.do_selection_on_mouse_event(i_mouse, layer_ref);
               }
               taken = layer_ref.on_mouse_button_down(i_mouse);
            
               if (taken==true)
               {
                  break;
               }
            }
         }
       }

      if (taken==false)
      { 
         taken = this.ancestor_on_mouse_button_down(i_mouse);
      }  

      if(taken==false)
      {
         i_mouse.release_capture();
      }
   }
   catch(e){}    
   return taken;
}


function owk_layer_group_on_mouse_button_up(i_mouse) 
{
   
   var taken = false;
   try
   { 
      // convert surface coordinate to widget
      var mouse_position = new point(i_mouse.position().x, i_mouse.position().y);

      this.global_to_local_point(mouse_position);
      var found_modal_layer_ptr = this.find_modal_layer();
      if (found_modal_layer_ptr )
      {
         taken = found_modal_layer_ptr.on_mouse_button_up(i_mouse);

         this.m_mouse_on_layer_ptr = found_modal_layer_ptr;
      }
      else
      {
         // hide the popup layer when is single selection and the mouse button up is released on a selected child.
         if ((i_mouse.has_capture() == this) && this.is_popup() && this.single_selection() && this.mouse_move_inside_popup())
         {
            if (this.m_previous_single_sel_layer_ptr)
            {
               this.reselect_child(this.m_previous_single_sel_layer_ptr);
            }

            this.visible(false);
            //this.invalidate();
            taken = true;
         }


         // dispatch to all layers the mouse event
         for (var i=this.m_layers.length-1; i >= 0; i--) 
         {
            var layer_ref = this.m_layers[i];
         //  if (layer_ref.visible() && !layer_ref.disable().on() && layer_ref.is_inside(mouse_position)) 
           
            if (layer_ref.visible()&& layer_ref.is_inside(mouse_position)) 
            {
               taken = layer_ref.on_mouse_button_up(i_mouse)
               if (taken)
               {
                  break; 
               }
            }
         }

         if (!taken)
         {
            taken = this.ancestor_on_mouse_button_up(i_mouse);
         }
      }

      if(taken==false)
      {
         i_mouse.release_capture();
      }
   }
   catch(e){}  
   return taken;
}

function owk_layer_group_on_key_down( i_keyboard) 
{
   var taken = false;

   for (var i=this.m_layers.length-1; i >= 0; i--) 
   { 
      layer_ref = this.m_layers[i];
      if (layer_ref.visible()&& layer_ref.is_inside(mouse_position)) 
      {
         taken = layer_ref.on_key_down(i_keyboard)
         if (taken)
         {
            break; 
         }
      }
   }
   return taken;
}

function owk_layer_group_on_key_up( i_keyboard) 
{
  var taken = false;

   for (var i=this.m_layers.length-1; i >= 0; i--) 
   { 
      layer_ref = this.m_layers[i];
      if (layer_ref.visible()&& layer_ref.is_inside(mouse_position)) 
      {
         taken = layer_ref.on_key_up(i_keyboard)
         if (taken)
         {
            break; 
         }
      }
   }
   return taken;
}

function owk_layer_group_draw_layer(i_layer)
{
  /* // draw resize control to the surface
   if (i_layer.visible())
   {   
      if (i_layer.rotation_angle() == 0.0)
      {
         rectangle src_rect(0, 0, i_layer.rend_bitmap().width()-1, i_layer.rend_bitmap().height()-1); 
         i_layer.rend_bitmap().copy(src_rect, rend_bitmap(), i_layer.region(), alpha_percent_to_8bit(i_layer.opacity())); // region is in widget coordinates
      }
     else
      {
         // draw entire bitmap to surface 
         // draw rendered widget control to the surface
         bitmap rotated_bitmap;
         i_layer.rend_bitmap().rotate_no_alpha(i_layer.region(), rotated_bitmap, i_layer.rotation_angle(), i_layer.pivot_point());  
         
         rectangle src_rect(0, 0, rotated_bitmap.width()-1, rotated_bitmap.height()-1);
         rectangle dst_rect;
         
         quad qd(i_layer.region());
         qd.rotate(i_layer.rotation_angle(), i_layer.pivot_point());
         qd.bounding_box(dst_rect);         

         rotated_bitmap.copy(src_rect, rend_bitmap(), dst_rect, alpha_percent_to_8bit(i_layer.opacity())); // region is in space coordinates

         rotated_bitmap.destroy();
      }
   }*/
}

function owk_layer_group_flatern_layers()
{   
	// render all layers into the current widget
	/*for (var i=0; i<count_layers(); i++) 
		draw_layer(get_layer(i));*/
}

function owk_layer_group_on_draw( i_surface,  i_region) // refresh a part of surface
{
/*
   owk_bool taken = false;

   if (visible())
   { 
      // render all layers to the current space
      for (int i=0; i<count_layers(); i++) 
      { 
         layer& layer_ref = get_layer(i);

         if (layer_ref.visible())
         {
            rectangle intersect_rect;

            // convert region to surface coordinate for invalidate
            rectangle layer_surface_region;
            layer_surface_region = layer_ref.bounds_region();
            if (layer_ref.has_parent())
               layer_ref.parent().local_to_global_coordinates(layer_surface_region );

            // generate the rectangle to redraw for this control: coordinates are global to the space
            if (i_region.intersect(layer_surface_region, intersect_rect)) 
            {           
               taken = layer_ref.on_draw(i_surface, intersect_rect);
            }
         }
      }   

      flatern_layers();
      taken = layer::on_draw(i_surface, i_region);
   }

   return taken;*/
}


function owk_layer_group_on_get_layer( i_index) // refresh a part of surface
{
   return this.m_layers[i_index];
}

function owk_layer_group_push_back_layer(i_layer) // refresh a part of surface
{
   this.m_layers.push(i_layer);
   
   for (var itr=0; itr < this.m_layers.length; itr++)
   {     
      this.m_layers[itr].m_div.style.zIndex=itr;       
   }   
}

function owk_layer_group_bring_to_front(i_layer) // refresh a part of surface
{
   this.remove_layer(i_layer);
   this.push_back_layer(i_layer);
}

//A tester jai vraiment pas essayer si ca fonctionne bien
function owk_layer_group_insert_layer(i_position, i_layer) // refresh a part of surface
{
   //Ajouter un lyaer a la fin
   this.m_layers.push(i_layer);
   
   //Decaller les layer
   for (var itr=i_position+1; itr < this.m_layers.length-1; itr++)
   { 
      this.m_layers[itr] = this.m_layers[itr-1];
   }

   //Replacer le layer à ajouter le layer qu'on voulait ajouter a la place de celui qui est à cette emplacement
   this.m_layers[i_position] = i_layer;

   this.m_layers[this.m_layers.length-1] = i_layer

   //Replacer l'ordre
   for (var itr=0; itr < this.m_layers.length; itr++)
   {     
      this.m_layers[itr].m_div.style.zIndex=itr;       
   }     
}





/*

function owk_layer_group_remove_layer(i_layer) // refresh a part of surface
{
   // find layer position
   var index_found = -1;
   for (var itr=0; itr < this.m_layers.length; itr++)
   {
      if (this.m_layers[itr] == i_layer)
      {
         break;
      }
   }
   
   if (index_found != -1)
   {
      // move back each items
      for (var itr=index_found; this.m_layers.length - 1; itr++)
      {
         this.m_layers[itr] = this.m_layers[itr + 1];
      }
   }

   i_layer.release_parent();  
}*/

function owk_layer_group_count_layers()
{
   return m_layers.length;
}


function owk_layer_group_apply_wrapping()
{
   var cur_xpos = this.border.left;
   var cur_ypos = this.border.top;
 
   var max_height = 0;

   for (var itr=0; itr < this.m_layers.length; itr++)
   {
      var layer_ref = this.m_layers.length[itr];

      // change coordinates of the layer
      var new_rect = new rectangle();
      new_rect.size = layer_ref.region().size;
      new_rect.origin.xy(cur_xpos + this.wrapping_margin.left + layer_ref.margin.left, cur_ypos + this.wrapping_margin.top + layer_ref.margin.top);

      if ((new_rect.origin.x + layer_ref.size.width > size.width))
      {
         // end of line
         cur_xpos = this.border.left;
         cur_ypos = cur_ypos + max_height;    
         new_rect.origin.xy(cur_xpos + this.wrapping_margin.left + layer_ref.margin.left, cur_ypos + this.wrapping_margin.top + layer_ref.margin.top);
         max_height = 0;
      }
      
      layer_ref.drag(new_rect, true);

      // goto next items
      cur_xpos = new_rect.origin.x + layer_ref.size.width + layer_ref.margin.right + this.wrapping_margin.right; 
      max_height = Math.max(max_height, layer_ref.size.height + layer_ref.margin.bottom + this.wrapping_margin.bottom);
   }
}


function owk_layer_group_wrapping()
{  
   return this.m_wrapping;
}

function owk_layer_group_set_wrapping(i_wrapping)
{  
   this.m_wrapping = i_wrapping;
}

function owk_layer_group_select_child_on_mouse_move()
{  
   return this.m_select_child_on_mouse_move;
}

function owk_layer_group_set_select_child_on_mouse_move(i_select_child_on_mouse_move  )
{ 
   this.m_select_child_on_mouse_move = i_select_child_on_mouse_move;
}

function owk_layer_group_multiple_selection()
{  
   return this.m_multiple_selection;
}

function owk_layer_group_set_multiple_selection(i_multiple_selection)
{  
   this.m_multiple_selection = i_multiple_selection;
}

function owk_layer_group_single_selection()
{  
     return this.m_single_selection;
}

function owk_layer_group_set_single_selection(i_single_selection)
{  
   this.m_single_selection = i_single_selection;
}

function owk_layer_group_on_child_selected(i_layer)
{  
   var taken = true;
   
   if (this.wrapping())
   {
      this.apply_wrapping();
   }

   return taken;
}

function owk_layer_group_on_child_dragged(i_layer)
{
   var taken = true;
   
   if (this.wrapping())
   {
      this.apply_wrapping();
   }

   return taken;  
}

function owk_layer_group_on_child_resized(i_layer)
{  
   var taken = true;
   
   if (this.wrapping())
   {
      this.apply_wrapping();
   }

   return taken;
}

function owk_layer_group_on_child_rotated(i_layer)
{  
   var taken = true;
   
   if (this.wrapping())
   {
      this.apply_wrapping();
   }

   return taken;
}

function owk_layer_group_on_child_scaled(i_layer)
{  
   var taken = true;
   
   if (this.wrapping())
   {
      this.apply_wrapping();
   }

   return taken;
}


function owk_layer_group_do_selection_on_mouse_event(i_mouse, i_sel_layer_ref)
{
   // select the layer under the mouse move (optional)
   if ((this.single_selection() || (this.multiple_selection()) && i_sel_layer_ref.selectable()))
   {
      // unselect all layers when conditions append
      {        
         if (this.single_selection() || (this.multiple_selection() && !i_mouse.ctrl_key_pressed()) || (this.multiple_selection() && !i_mouse.shift_key_pressed()))
         {           
            for (var i=this.m_layers.length-1; i >= 0; i--) 
            {                  
               var layer_ref = this.m_layers[i];

               if (layer_ref.select() && i_sel_layer_ref != layer_ref)
               {
                  layer_ref.set_select(false);
                  //layer_ref.invalidate();
               }
            }
         }
      }

     // if (this.multiple_selection() && i_mouse.shift_key_pressed())
     // {
         // do select all between the two items.
    //  }

      i_sel_layer_ref.set_selecting(true);
      i_sel_layer_ref.on_begin_selecting();
      i_sel_layer_ref.set_select(true);     
      i_sel_layer_ref.on_end_selecting();
      //i_sel_layer_ref.invalidate();
      i_sel_layer_ref.set_selecting(false);

   } 
}

function owk_layer_group_reselect_child(i_sel_layer_ref)
{
     // select the layer under the mouse move (optional)
   if ((this.single_selection() || this.multiple_selection()) && i_sel_layer_ref.selectable())
   {
      // unselect all layers when conditions append

      for (var i=this.m_layers.length-1; i >= 0; i--) 
      {                  
         var layer_ref = this.m_layers[i];

         if (layer_ref.select() && i_sel_layer_ref != layer_ref)
         {
             layer_ref.set_select(false);
             //layer_ref.invalidate();        
         }
      }

      i_sel_layer_ref.set_selecting(true);
      i_sel_layer_ref.on_begin_selecting();
      i_sel_layer_ref.set_select(true);
      i_sel_layer_ref.on_end_selecting();
      //i_sel_layer_ref.invalidate();
      i_sel_layer_ref.set_selecting(false);
   } 
}

function owk_layer_group_find_single_sel_layer()
{
   this.m_previous_single_sel_layer_ptr = 0;

   for (var i=this.m_layers.length-1; i >= 0; i--) 
   {                  
      var layer_ref = this.m_layers[i];

      if (layer_ref.select())
      {
         this.m_previous_single_sel_layer_ptr = layer_ref;
         break;
      }
   }
}

function owk_layer_group_find_modal_layer()
{
   var find_modal_layer_ptr = 0;
   for (var i=this.m_layers.length-1; i >= 0; i--)
   {
      var layer_ref = this.m_layers[i];
      if (layer_ref.is_modal())
      {
         find_modal_layer_ptr = layer_ref;
         break;
      }
   }
   return find_modal_layer_ptr;
}

layer_group.prototype.reselect_child = owk_layer_group_reselect_child;
layer_group.prototype.find_single_sel_layer = owk_layer_group_find_single_sel_layer;
layer_group.prototype.find_modal_layer = owk_layer_group_find_modal_layer;

layer_group.prototype = new layer;
layer_group.prototype.draw_layer = owk_layer_group_draw_layer;
layer_group.prototype.flatern_layers = owk_layer_group_flatern_layers;
layer_group.prototype.ancestor_destroy = owk_layer_destroy;
layer_group.prototype.count_layers = owk_layer_group_count_layers;
layer_group.prototype.get_layer = owk_layer_group_on_get_layer;
layer_group.prototype.push_back_layer = owk_layer_group_push_back_layer;
layer_group.prototype.remove_layer = owk_layer_group_remove_layer;
layer_group.prototype.bring_to_front = owk_layer_group_bring_to_front;
layer_group.prototype.insert_layer = owk_layer_group_insert_layer;
layer_group.prototype.on_mouse_move = owk_layer_group_on_mouse_move;
layer_group.prototype.on_mouse_button_down = owk_layer_group_on_mouse_button_down;
layer_group.prototype.ancestor_on_mouse_button_down = owk_layer_on_mouse_button_down;
layer_group.prototype.ancestor_on_mouse_button_up = owk_layer_on_mouse_button_up;
layer_group.prototype.ancestor_on_mouse_move = owk_layer_on_mouse_move;
layer_group.prototype.on_mouse_button_up = owk_layer_group_on_mouse_button_up;
layer_group.prototype.apply_wrapping = owk_layer_group_apply_wrapping;
layer_group.prototype.wrapping = owk_layer_group_wrapping;
layer_group.prototype.set_wrapping = owk_layer_group_set_wrapping;
layer_group.prototype.select_child_on_mouse_move = owk_layer_group_select_child_on_mouse_move;
layer_group.prototype.set_select_child_on_mouse_move = owk_layer_group_set_select_child_on_mouse_move;
layer_group.prototype.multiple_selection = owk_layer_group_multiple_selection;
layer_group.prototype.set_multiple_selection = owk_layer_group_set_multiple_selection;
layer_group.prototype.single_selection = owk_layer_group_single_selection;
layer_group.prototype.set_single_selection = owk_layer_group_set_single_selection;
layer_group.prototype.on_child_selected = owk_layer_group_on_child_selected;
layer_group.prototype.on_child_dragged = owk_layer_group_on_child_dragged;
layer_group.prototype.on_child_resized = owk_layer_group_on_child_resized;
layer_group.prototype.on_child_rotated = owk_layer_group_on_child_rotated;
layer_group.prototype.on_child_scaled = owk_layer_group_on_child_scaled;

layer_group.prototype.do_selection_on_mouse_event = owk_layer_group_do_selection_on_mouse_event;
layer_group.prototype.reselect_child = owk_layer_group_reselect_child;
layer_group.prototype.find_single_sel_layer = owk_layer_group_find_single_sel_layer;
layer_group.prototype.find_modal_layer = owk_layer_group_find_modal_layer;

