// --- ASO DOM EXTEND
// --- Amin Ladhani fevrier 2009
// --- v1.0

	aso.domExtended = {
		xmlhttp : {
			responseText : null,
			get : function(file,arg,doBefore,doAfter){
				var _this 	= this;
				var xhr 	= new XMLHttpRequest();
				if(doBefore!=null) doBefore();
				xhr.onreadystatechange = function(){
				if(xhr.readyState == 4){
						_this.responseText = xhr.responseText;
						if(doAfter!=null) doAfter();
					}
				}
				xhr.open("GET",file+arg);
				xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
				xhr.send(null);	
			},
			post : function(file,arg,doBefore,doAfter){
				var _this 	= this;
				var xhr 	= new XMLHttpRequest();
				if(doBefore!=null) doBefore();
				xhr.onreadystatechange=function(){ 
					if(xhr.readyState == 4 && xhr.status==200){
						_this.responseText = xhr.responseText;
						if(doAfter!=null) doAfter();
					}
				};
				xhr.open("POST", file, true); 
				xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
				xhr.send(arg);
			}
		},
		getPosition_ : function(){
			var curleft = 0;
			var curtop = 0;
			var pos = {};
			obj = this;
			obj2 = this;
			if(obj.offsetParent){
				while(1){
					curleft += obj.offsetLeft;
					if(!obj.offsetParent)break;
					obj = obj.offsetParent;
				}
			}else if(obj.x){
				curleft += obj.x;
			}
			if(obj2.offsetParent){
				while(1){
					curtop += obj2.offsetTop;
					if(!obj2.offsetParent) break;	
					obj2 = obj2.offsetParent;
				}
			}else if(obj2.y){
				curtop += obj2.y;
			}
			pos.x = curleft;				
			pos.y = curtop;
			return pos;
		},
		movable_ : function(obj){
			var _this = this;
			this.target = obj['container'] ? obj['container'] : this ;
			this.zIndexValue = obj['zIndex'] ? obj['zIndex'] : null ;
			this.onStart = obj['onStart'] ? obj['onStart'] : null ;
			this.onComplete = obj['onComplete'] ? obj['onComplete'] : null ;
			this.onmousedown = function(e){
				_this.target.style.position = 'fixed';
				_this.target.className = _this.target.className+' __movable';
				_this.initialpos = Math.ceil(_this.target.offsetLeft+_this.target.offsetWidth/2);
				_this.marge = Math.ceil(_this.initialpos-getClient(e).x);
				zIndex();
				aso.domExtended.frame.hide(document);
				document.addEvent('mousemove',move);
				document.addEvent('mouseup',stop);
				document.body.onmousedown = function(){return false;};
				document.body.onselectstart = function(){return false;};
			};
			this.target.onmousedown = function(){ zIndex(); };
			var move = function(e){
				_this.target.style.marginLeft = '-'+_this.target.offsetWidth/2+'px';
				_this.target.style.marginTop = '-'+_this.offsetHeight/2+'px';
				_this.target.style.top = getClient(e).y+'px';
				_this.target.style.left = (getClient(e).x+_this.marge)+'px';
			};
			var stop = function(e){
				document.removeEvent('mousemove',move);
				document.removeEvent('mouseup',stop);
				document.body.style.select = "";
				if(!document.all)document.body.focus();
				document.body.onmousedown = function(){};
				document.body.onselectstart = function(){};
				aso.domExtended.frame.show();
				if(_this.onComplete) _this.onComplete();
			};
			var zIndex = function(){
				_this.movableArray = [];
				var margin = 1;
				var movableElement = document.getElementsByTagName('*');
				for(var i = 0; i<movableElement.length;i ++){
					if(movableElement[i].className.match(/__DOMPopup/)){
						var index = movableElement[i].style.zIndex 
							? parseInt(movableElement[i].style.zIndex)-1
							: '' ;
						movableElement[i].style.zIndex = index;
					}
				}
				_this.target.style.zIndex = index ? index+1 : _this.zIndexValue ;
			};
			zIndex();
		},
		resizable_ : function(obj){
			if(!obj && !obj['element']) return false;
			var _this = this;
			this.element = obj['element'];
			this.d = obj['distance'];
			this.onStart = obj['onStart'] ? obj['onStart'] : null ;
			this.onComplete = obj['onComplete'] ? obj['onComplete'] : null ;
			this.onmousedown = function(e){ 
				document.addEvent('mousemove',move,false);
				document.addEvent('mouseup',stop,false);
				aso.domExtended.frame.hide(document);
				document.body.onmousedown = function(){ return false; };
				document.body.onselectstart = function(){return false;}
			};
			var move = function(e){
				e.cancelBubble = true;
				_this.element.style.width = ((getClient(e).x-_this.offsetWidth+_this.d)-_this.element.getPosition().x)+'px';
				_this.element.style.height = ((getClient(e).y-_this.offsetHeight+_this.d)-_this.element.getPosition().y)+'px';
			};
			var stop = function(){
				document.removeEvent('mousemove',move,false);
				document.removeEvent('mouseup',stop,false);
				document.body.onmousedown = function(){};
				document.body.onselectstart = function(){}
				document.body.focus();
				aso.domExtended.frame.show();
				if(_this.onComplete) _this.onComplete();
			};
		},
		frame : {
			hide : function(container){
				this.ifrArray = [];
				this.element = container.getElementsByTagName('*');
				for(var i = 0; i<this.element.length; i++){
					if(this.element[i].tagName == 'IFRAME'){
						this.ifrArray.push(this.element[i]);
						this.element[i].style.display = 'none';
					}
				}
			},
			show : function(){
				for(var i = 0; i<this.ifrArray.length; i++)
					this.ifrArray[i].style.display = '';
			}
		},
		addEvent_ : function(action,func){
			var event = aso.domExtended.getEventType(action)
			if(document.attachEvent){
				return this.attachEvent(event,func);
			}else{
				return this.addEventListener(event,func,false);
			}
		},
		removeEvent_ : function(action,func){
			var event = aso.domExtended.getEventType(action)
			if(document.attachEvent){
				return this.detachEvent(event,func);
			}else{
				return this.removeEventListener(event,func,false);
			}
		},
		getEventType : function(action){
			var event;
			switch(action){
				case 'mousedown':
				case 'onmousedown':
					event = document.all 
						? 'onmousedown' 
						: 'mousedown' ;
				break;
				case 'mousemove':
				case 'onmousemove':
					event = document.all 
						? 'onmousemove' 
						: 'mousemove' ;
				break;
				case 'mouseup':
				case 'onmouseup':
					event = document.all 
						? 'onmouseup' 
						: 'mouseup' ;
				break;
				case 'mouseover':
				case 'onmouseover':
					event = document.all 
						? 'onmouseover' 
						: 'mouseover' ;
				break;
				case 'click':
				case 'onclick':
					event = document.all 
						? 'onclick' 
						: 'click' ;
				break;
				case 'mouseover':
				case 'onmouseover':
					event = document.all 
						? 'onmouseover' 
						: 'mouseover' ;
				break;
			}
			return event;
		},
		getClient_ : function(e){
			e = window.event ? window.event : e ;
			var pos = {};
			pos.x = e.clientX;
			pos.y = e.clientY;
			return pos;
		},
		jsCss_ : function(obj){
			for(i in obj) this.style[i] = obj[i];
		},
		trueCss_ : function(){
			// ToDo
		},
		attribute_ : function(obj){
			for(i in obj){
				var attrib = i=='class' && document.all ? 'className' : i ;
				this.setAttribute(attrib,obj[i]);
			}
		}
	}
	
	aso.element = {
		newElement : function(element,obj){
			elem = document.createElement(element);
			if(obj){
				for(var i in obj){
					if(typeof obj[i]=='string'){
						if(i=='html') elem.innerHTML = obj[i];
					}else if(typeof obj[i]=='object'){
						if(i=='jsCss') elem.jsCss(obj[i]);
						if(i=='attribute') elem.attribute(obj[i]);
					}
				}
			}
			return elem;
		}
	}
	
	__domelement.extend('getPosition',aso.domExtended.getPosition_);
	__domelement.extend('movable',aso.domExtended.movable_);
	__domelement.extend('resizable',aso.domExtended.resizable_);
	__domelement.extend('addEvent',aso.domExtended.addEvent_);
	__domelement.extend('removeEvent',aso.domExtended.removeEvent_);
	__domelement.extend('jsCss',aso.domExtended.jsCss_);
	__domelement.extend('trueCss',aso.domExtended.trueCss_);
	__domelement.extend('attribute',aso.domExtended.attribute_);
	__window.getClient = aso.domExtended.getClient_;
	xmlhttp = aso.domExtended.xmlhttp;
	DOMElement = aso.element.newElement;
	
	