
function fixGeckoDom(winObj){
	winObj=winObj?winObj:window;
	if(_x.is_Gecko){
		//for iframe
		winObj.HTMLIFrameElement.prototype.__defineGetter__("window",function(){
			var win={};
			win.document=this.contentDocument;
			return win;
		});
		//parentElement be null if the parent is the document.
		winObj.HTMLElement.prototype.__defineGetter__("parentElement", function () {
		   if (this.parentNode == this.ownerDocument){return null;}
		   return this.parentNode;
		});

		//innerText for Mozilla
		winObj.HTMLElement.prototype.__defineGetter__("innerText", function () {
	   		var r = this.ownerDocument.createRange();
		    r.selectNodeContents(this);
		    alert(r.toString());
		    return r.toString();
		});
		winObj.HTMLElement.prototype.__defineSetter__("innerText", function (sText) {
   			this.innerHTML = sText.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
		});
		//outerHTML for Mozilla
		winObj.HTMLElement.prototype.__defineGetter__("outerHTML", function () {
		   var attrs = this.attributes;
		   var str = "<" + this.tagName;
		   for (var i = 0; i < attrs.length; ++i){
		      str += " " + attrs[i].name + "=\"" + attrs[i].value + "\"";
				}
		   if (Crvs.emptyTags[this.tagName]){
		   		return str + "/>";
		   }
		   return str + ">" + this.innerHTML + "</" + this.tagName + ">";
		});
		winObj.HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
		   var r = this.ownerDocument.createRange();
		   r.setStartBefore(this);
		   var df = r.createContextualFragment(sHTML);
		   this.parentNode.replaceChild(df, this);
		});
		//outerText for Mozilla
		winObj.HTMLElement.prototype.__defineSetter__("outerText", function (sText) {
		   this.outerHTML = sText.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
		});
		//insertAdjacentHTML for mozilla
		winObj.HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
		   var df;   // : DocumentFragment
		   var r = this.ownerDocument.createRange();

		   switch (String(sWhere).toLowerCase()) {  // convert to string and unify case
		      case "beforebegin":
		         r.setStartBefore(this);
		         df = r.createContextualFragment(sHTML);
		         this.parentNode.insertBefore(df, this);
		         break;

		      case "afterbegin":
		         r.selectNodeContents(this);
		         r.collapse(true);
		         df = r.createContextualFragment(sHTML);
		         this.insertBefore(df, this.firstChild);
		         break;

		      case "beforeend":
		         r.selectNodeContents(this);
		         r.collapse(false);
		         df = r.createContextualFragment(sHTML);
		         this.appendChild(df);
		         break;
		      case "afterend":
		         r.setStartAfter(this);
		         df = r.createContextualFragment(sHTML);
		         this.parentNode.insertBefore(df, this.nextSibling);
		         break;
		  }
		};

    //attachEvent and detachEvent
	winObj.HTMLElement.prototype.attachEvent=function(sType,fHandler){
       var shortTypeName = sType.replace(/on/, "");
       fHandler._ieEmuEventHandler = function (e) {
          window.event=e;
          return fHandler();
       };
       this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler,false);
    }

	winObj.HTMLElement.prototype.detachEvent=function(sType,fHandler){
       var shortTypeName=sType.replace(/on/, "");
       if (typeof fHandler._ieEmuEventHandler=="function"){
          this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler,false);
       }else{   // we can always try :-)
          this.removeEventListener(shortTypeName, fHandler, true);
       }
    }
}
//event
if(_x.is_Gecko){
	//Source Element
	winObj.Event.prototype.__defineGetter__("srcElement",function(){
	   	var node = this.target;
	   	while (node.nodeType != 1){
	   		node = node.parentNode;
	   	}
	   	return node;
	});
	//Cancel the event bubble
	winObj.Event.prototype.__defineSetter__("cancelBubble", function(b){
	   if (b){this.stopPropagation();}
	});
	//Preventing default actions
	winObj.Event.prototype.__defineSetter__("returnValue", function(b){
	   if (!b) {this.preventDefault();}
	});
	//From and to element
	winObj.Event.prototype.__defineGetter__("fromElement", function(){
	   var node;
	   if (this.type == "mouseover"){
	      node = this.relatedTarget;
	    }
	   else if (this.type == "mouseout"){
	      node = this.target;
	    }
	   else{
	      return null;
	    }
	   while (node.nodeType != 1) {node = node.parentNode;}
	   return node;
	});
	winObj.Event.prototype.__defineGetter__("toElement", function(){
	   var node;
	   if (this.type == "mouseout"){
	      node = this.relatedTarget;
	    }
	   else if (this.type == "mouseover"){
	      node = this.target;
	    }
	   else{
	      return null;
	    }
	   while (node.nodeType != 1){ node = node.parentNode;}
	   return node;
	});
	//offsetX and offsetY
	winObj.Event.prototype.__defineGetter__("offsetX", function(){
	   return this.layerX;
	});
	winObj.Event.prototype.__defineGetter__("offsetY", function(){
	   return this.layerY;
	});
}
}
//dom enhancement for none prototype available browsers.
Crvs.Sys.Dom={
  execute:function(dom,memberName,args){
    var section;
    if(_x.is_Safari){
    	section=this.safariSection;
    }//else if(_x.is_Gecko&&dom.tagName.toLowerCase()=="body"){ //use this because HTMLBodyElement not been enhanced
      //section=this.safariSection;
    //}//else if(...) for other section
    if(!section||!eval("section."+memberName)){return;}
    var argsStr="dom,";
    if(args&&args.length){
     	for(var i=0;i<args.length;++i){
     		argsStr+="args["+i+"],";
     	}
    }
    argsStr=argsStr.substring(0,argsStr.length-1);
    return eval("section."+memberName+"("+argsStr+")");
  },
  fixGecko:fixGeckoDom,
  safariSection:{ //safari
  	insertAdjacentHTML:function(dom,sWhere,sHTML){ //insertAdjacentHTML
  			var df;
  			var r = dom.ownerDocument.createRange();
  			switch (String(sWhere).toLowerCase()) {  // convert to string and unify case
  		      case "beforebegin":
  			     r.setStartBefore(dom);
  			     df = r.createContextualFragment(sHTML);
  			     dom.parentNode.insertBefore(df, dom);
  		         break;
  		      case "afterbegin":
  			     r.selectNodeContents(dom);
  			     r.collapse(true);
  			     df = r.createContextualFragment(sHTML);
       			 dom.insertBefore(df, dom.firstChild );
  		         break;
  		      case "beforeend":
  			     r.selectNodeContents(dom);
  			     r.collapse(dom);
  			     df = r.createContextualFragment(sHTML);
        			 dom.appendChild(df);
  		         break;
  		      case "afterend":
        			 r.setStartAfter(dom);
        			 df = r.createContextualFragment(sHTML);
       			 dom.parentNode.insertBefore(df, dom.nextSibling);
  		         break;
  		  }
  	},
  	attachEvent:function(dom, sType,fHandler){
      	var shortTypeName = sType.replace(/on/, "");
  		   fHandler._ieEmuEventHandler = function (e) {
  			  var node = e.target;
  	   		  while (node.nodeType != 1) {
  				 node = node.parentNode;
  			  }
  			  e.srcElement=node;
  		    window.event = e;
  		    e.stopPropagation();
  		    return fHandler();
  		   };
  		   dom.addEventListener(shortTypeName, fHandler._ieEmuEventHandler,false);
  		},
  	detachEvent : function(dom, sType,fHandler){
  		   var shortTypeName = sType.replace(/on/, "");
  		   if (typeof fHandler._ieEmuEventHandler == "function"){
  		      dom.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler,false);
  		   }
  		   else{   // we can always try :-)
  		      dom.removeEventListener(shortTypeName, fHandler, true);
  		   }
  	}
  }
//, add some other solution here
};
Crvs.Sys.Dom.fixGecko(window);
