1 /**
  2 Not instanciable.
  3 * @constructor
  4 */
  5 var YDom = {
  6 	/**
  7 	* get dom element from target data.
  8 	* @param {string/domElement} target dom object or id.
  9 	* @return {domElement/null} domElement if target is window, document , a dom object or its id , else null.
 10 	*/
 11 	get:function(target){
 12 		var nod = typeof(target)=="string" ? document.getElementById(target):target;
 13 		return nod&&(nod.tagName||nod==document||nod==window) ? nod : null;
 14 	},
 15 	/**
 16 	* create dom element.<br/>
 17 	* ex:<br/><code>YDom.create('label',{style:{border:'solid 1px #088'}},["ok?",YDom.create('input',{type:'checkbox'})]);</code>
 18 	* @param {string} name dom tag name.
 19 	* @param {object} [datas] the dom element parameters object. ex {width:100,style:{width:"100px"}}
 20 	* @param {array} [childs] the dom element childs. child units can be domElement or string.
 21 	* @return {domElement} the created new domElement
 22 	*/
 23 	create :function create(name,datas,childs){
 24 		try{
 25 			var dn = document.createElement(name.toUpperCase());
 26 			
 27 			var dataAssign=function(tgt,src,indx){
 28 				for(var i in src)
 29 					if(src[i].join || typeof(src[i])=="object")	dataAssign(tgt[i],src[i]);
 30 					else										tgt[i] = src[i];
 31 			}
 32 			dataAssign(dn,datas);
 33 			if(childs && childs.join){
 34 				for(var i in childs){
 35 					if(typeof(childs[i])=="string")dn.appendChild(document.createTextNode(childs[i]));
 36 					else dn.appendChild(childs[i]);
 37 				}
 38 			}
 39 		}catch(e){
 40 			var stacktrace = YFunction.stackTrace(0);
 41 			throw(["","YDom.create Error:","",e,"","call stack : [ "+stacktrace.join('\n> ')+" ]"].join('\n'));
 42 		//	throw(e);
 43 		}
 44 		return dn;
 45 	},
 46 	/**
 47 	* get dom element position from nearest parent with style.position='absolute'.<br/>
 48 	* @param {domElement/mixed} source domElement.
 49 	* @return {array} dom element absolute offset possition.
 50 	*/
 51 	absoluteOffset:function(node){
 52 		var tmpobj=YDom.get(node);
 53 		var cnt = 0;
 54 		while(cnt==0||(tmpobj&&tmpobj.style!='absolute'&&tmpobj.tagName.toLowerCase()!='body')){
 55 			tmpobj = tmpobj.offsetParent;
 56 			cnt++;
 57 		}
 58 		return YDom.offset(node,cnt);
 59 	},
 60 	/**
 61 	* get dom element position.<br/>
 62 	* get position in window if limit==0 or not set.
 63 	* @param {domElement/mixed} source domElement.
 64 	* @param {int} limit element offset recursions. Infinite if <=0 .
 65 	* @return {array} dom element offset possition.
 66 	*/
 67 	offset:function(node,limit){
 68 		var l = typeof(limit)=="number"&&limit!=0 ? limit : -1;
 69 		var res = [0,0];
 70 		var tmpobj=YDom.get(node);
 71 		var cnt = 0;
 72 		while(tmpobj&& cnt!=l){
 73 			res[0]+=tmpobj.offsetLeft-tmpobj.scrollLeft;
 74 			res[1]+=tmpobj.offsetTop;//-tmpobj.scrollTop;
 75 			tmpobj = tmpobj.offsetParent;
 76 			cnt++;
 77 		}
 78 		return res;
 79 	},
 80 	/**
 81 	* clone dom element, his datas and childrens.<br/>
 82 	* @param {domElement/mixed} source domElement.
 83 	* @return {domElement} the created new domElement
 84 	*/
 85 	clone:function(source){
 86 		var node = YDom.get(source); if(!node)return null;
 87 		var attr = YDom.getAttributes(node);
 88 		if(attr.style)attr.style=YCss.cleanedStyle(node);
 89 		var sons = []
 90 		if(node.childNodes){
 91 			for(var i in node.childNodes){
 92 				if(node.childNodes[i].nodeType==1){
 93 					sons.push(YDom.clone(node.childNodes[i]));
 94 				}else if(node.childNodes[i].nodeType==3){
 95 					sons.push(node.childNodes[i].nodeValue+"");
 96 				}
 97 			}
 98 		}return YDom.create(node.tagName,attr,sons);
 99 	},
100 	/** get dom element dimensions
101 	* @param {string/domElement} target dom object or id.
102 	* @return {array} dom element dimensions
103 	*/
104 	size:function(target){
105 		var node = YDom.get(target);
106 		return (node&&typeof(node.offsetWidth)=="number")? [node.offsetWidth,node.offsetHeight] : [0,0];
107 	},
108 	/** get content dimensions
109 	* @param {string/domElement} content dom object or id or html code.
110 	* @return {array} content dimensions
111 	*/
112 	contentSize:function(content){
113 		if(!document||!document.body){throw("\nYDom.contentSize Error:\ndocument.body musts exist");}
114 		var spans = YDom.create('span',{style:{padding:"0px"}});
115 		var node = YDom.get(content);
116 		if(node){	spans.appendChild(node);
117 		}else{		spans.innerHTML=""+content;}
118 		document.body.appendChild(spans);
119 		var size = YDom.size(spans);
120 		document.body.removeChild(spans);
121 		return size;
122 	},
123 	/** convert elements collection to array
124 	* @param {collection} collection tags collection.
125 	* @return {array} tags list
126 	*/
127     collectionToList:function(collection){
128 		var tlist = [];
129 		for(var j=0;j<collection.length;j++)tlist.push(collection.item(j));
130 		return tlist;
131 	},
132 	/** get all elements having an id from root or in the document
133 	* @param {dom}		[root] default = document.documentElement
134 	* @return {array} tags list indexed by their ids;
135 	*/
136 	getElementsByIds:function(root){
137 		var result={};
138 		YDom.parse(function(dom,dat){if(dom.id)	result[dom.id]=dom;},{},root);
139 		return result;
140 	},
141 	/** parse all elements from root or in the document
142 	* @param {function} Function invoked on every parsed dom element. type:Function(domElement,datas)
143 	* @param {mixed}	datas used when <b>Function</b> is invoked
144 	* @param {dom}		[root] default = document.documentElement
145 	*/
146 	parse:function(Function,datas,root){
147 		root=root?root:document.documentElement;
148 		var iter=function(_root){
149 			if(root.tagName){
150 				Function(_root,datas);
151 				for(var i=0;i<_root.childNodes.length;i++)	iter(_root.childNodes[i]);
152 			}
153 		};
154 		iter(root);
155 	},
156 	/** get elements list by criterias
157 	* @param {string/string Array} tagNames tags names.
158 	* @param {string/string Array} criterias elements properties filters (ex:{title:'the title',name:'the name'}).
159 	* @param {dom}	[root] default = document
160 	* @return {array} tags list
161 	*/
162     geElements:function(tagNames,criterias,root){
163 		root=root?root:document;
164         var tnl = tagNames&&tagNames.join?tagNames:[tagNames];
165         var ctr = criterias?criterias:{};
166         
167         var tlist = [],list = [];
168         for(var i in tnl){
169             var tl = root.getElementsByTagName(tnl[i]);
170             for(var j=0;j<tl.length;j++)tlist.push(tl.item(j));
171         };
172         for(var i in tlist){
173             var allok=true;
174             for(var j in criterias)
175                 if(tlist[i][j]!=criterias[j]){allok=false;break;}
176             if(allok)list.push(tlist[i]);
177         }
178         return list;
179     },
180 	/** return dom element attributes in a new object
181 	* @param {string/domElement} name dom object or id.
182 	* @return {object} dom element attributes
183 	*/
184 	getAttributes:function(target){
185 		var node = YDom.get(target);
186 		var obj = {};
187 		if(node)for(var i in node){	if(node.hasAttribute(i))obj[i]=node[i];}
188 		return obj;
189 	}
190 };
191 var YDomNew = yDomNew = ydomNew = ydomnew = YdomNew = YDom.create;
192