/**
dynamic html for TiledImage
$Id: PlaceLayer.js 11 2013-04-06 21:25:54Z nazotoko $
Copyright 2013 Shun N. Watanabe <nazotoko (a+) users.sourceforge.net>
@module TiledImage
**/
/**
Place Layer is a moving and zooming layer for placing HTML Elements.
@class PlaceLayer
@constructor
@parm name {String} name of the layer
@parm w {Number} width of the original image
@parm h {Number} height of the original image
**/
function PlaceLayer(name,w,h){
/**
* name of the layer
* @private
* @property name_
* @type String
*/
var name_=name,
/**
* parent (TiledImage) pointer
* @property parent
* @type Object
* @private
*/
parent,
/**
* DOM Element of the layer
* @property layer
* @type DOMElement
* @private
*/
layer,
/**
* max size
* @private
* @property maxSize
* @type Array[Number,Number]
*/
maxSize=[w,h],
/**
* current zoom level
* @private
* @property z_
* @type Number
*/
z_=0,
/**
* maximum zoom level
* @private
* @property maxZ
* @type Number
*/
maxZ=0,
/**
* list of objects on the layer
* @private
* @property obj
* @type Array
*/
obj=[];
d.mod(this,{
/**
* setParent are usually called form TiledImage object.
* see <a href="TiledImage.html#method_addLayer">TiledImage.addLayer</a>.
* @public
* @method setParent
* @required
* @param p {Object} object of TiledImage. It's called as parent.
*/
setParent:function (p){
parent=p;
maxZ=p.getZooms()[2];
layer=d.app(p.map,'div',{id:p.target.id+'-layer-'+name_,classname:'map'});
},
/**
* @public
* @method detach
* @required
*/
detach:function(){
parent.map.removeChild(layer);
layer=null;
},
/**
* @public
* @method setName
* @param name {String} name of the layer.
* @chainable
* @return this
*/
setName:function(name){
name_=name;
return this;
},
/**
* @public
* @method getName
* @required
* @return {String} name of the layer.
*/
getName:function(){
return name_;
},
/**
* @public
* @method getWrap
* @required
* @return {Array[Boolean,Boolean]} wrap flags
*/
getWrap:function(){
return [false,false];
},
/**
* @public
* @method getMaxSize
* @required
* @return {Array[Number,Number]} original image size
*/
getMaxSize:function(){
return maxSize;
},
/**
* append DOM Elements in the range. This checks the range and creates
* registed objects in the range.
* @public
* @method append
* @required
* @param l {Number} left edge by absolute position
* @param t {Number} top edge by absolute position
* @param r {Number} right edge by absolute position
* @param b {Number} bottom edge by absolute position
*/
append:function(l,t,r,b){
var i,o,x,y,w,h,dz=maxZ-z_;
l<<=dz;
t<<=dz;
r<<=dz;
b<<=dz;
for(i=0;i<obj.length;i++){
o=obj[i];
if(o.vis && o.x+o.w>l && o.x-o.w<r && o.y+o.h>t && o.y-o.h<b){
o.vis=false;
x=o.x>>dz;
y=o.y>>dz;
w=o.w>>dz;
h=o.h>>dz;
var ele=d.app(layer,o.ele,{style:{position:'absolute',left:x+'px',top:y+'px',width:w+'px',height:h+'px'}});
d.mod(ele,o.atr);
}
}
},
/**
* @public
* @method getMaxZ
* @required
* @return {Number} maximum zoom level
*/
getMaxZ:function(){
return maxZ;
},
/**
* set zoom level. This should be called though TiledImage object.
* @public
* @method setZoom
* @required
*/
setZoom:function(z){
z_=z;
},
/**
* @public
* @method removeAll
* @required
*/
removeAll:function(){
d.removeAll(layer);
for(var key in obj){
obj[key].vis=true;
}
},
/**
* @public
* @method addObj
* @param ele {String} element's name
* @param x {Number} left
* @param y {Number} top
* @param w {Number} width
* @param h {Number} height
* @param atr {Number} attribute. See <a href="d.html#method_mod">d.mod()</a>
* for detail.
* @chainable
* @return this
*/
addObj:function(ele,x,y,w,h,atr){
var obj={ele:ele,x:x,y:y,w:w,h:h,vis:true};
obj.atr=atr;
obj[obj.length]=obj;
return this;
},
// not implemented
rmObj:function(obj){
}
});
}