Element.addMethods({
	/**
	* Puts a mask over this element to disable user interaction. Requires mask.css, flyDOM jQuery extension.
	* This method can only be applied to elements which accept child nodes.
	* @param {String} msg (optional) A message to display in the mask
	* @param {String} msgCls (optional) A css class to apply to the msg element
	* @return {Element} The mask element
	*/
	mask: function(el, msg, msgCls) {
		if (! $(el)) {
			return false;
		}
		
		$(el).unmask();
		
		el.addClassName("x-masked");
		
		el._mask = Math.random();
		
		var mask = new Element('div', {'class': "ext-el-mask", 'id': el._mask + 'm'});
		
		document.body.appendChild(mask);
		
		var parentOffset = el.cumulativeOffset(); //el.offset();
		mask.setStyle({
			'width': el.getWidth() + 'px',
			'height': el.getHeight() + 'px',
			'top': parentOffset.top + 'px',
			'left': parentOffset.left + 'px'
		});
		
		var selfOffset = mask.cumulativeOffset(), // offset relative to document
			positionedOffset = mask.positionedOffset() // relative to neares positioned ancestor
			
		/*if (selfOffset.left != positionedOffset.left) { // one of parent's elements is absolute
			var parentPosition = el.positionedOffset();
			$(mask).setStyle({
				'left': parentPosition.left + 'px',
				'top': parentPosition.top + 'px'
			});
		}*/
		var parentPosition = selfOffset;
		
		if (msg) {
			var mm = new Element('div', {'class': "ext-el-mask-msg", 'id': el._mask + 'mm'});

			if (msgCls) {
				mm.addClassName(msgCls);
			}
			
			mm.innerHTML = msg;
			
			//el.appendChild(mm);
			document.body.appendChild(mm);
		
			mm.setStyle({
				'left': ((parentPosition ? parentPosition.left : parentOffset.left) + (el.getWidth()/2 - mm.getWidth()/2)) + 'px',
				'top': ((parentPosition ? parentPosition.top : parentOffset.top) + (el.getHeight()/2 - mm.getHeight()/2)) + 'px'
			});	
		}

		return mask; //el.appendChild(mask);
	},

	unmask: function(el) {
		/*//if ($(el).down('div.ext-el-mask')) $(el).down('div.ext-el-mask').remove();
		//if ($(el).down('div.ext-el-mask-msg'))  $(el).down('div.ext-el-mask-msg').remove();
		if ($$('div.ext-el-mask').length > 0) {
			$$('div.ext-el-mask').first().remove();
		}
		
		if ($$('div.ext-el-mask-msg').length > 0) {
			$$('div.ext-el-mask-msg').first().remove();
		}*/
		if ($(el._mask + 'm')) {
			$(el._mask + 'm').remove();
		}
		if ($(el._mask + 'mm')) {
			$(el._mask + 'mm').remove();
		}
        
        return el;
        //return el.removeClassName("x-masked").removeClassName("x-masked-relative");
	}
});
