//ӦΪHTMLAjax
Request.HTML = new Class({

 //̳Request
 Extends: Request,

 options: {
  //Ƿ
  update: false,
  //Ƿִַű
  evalscrpts: true,
  //Ƿ
  filter: false
 },

 //HTML
 processHTML: function(text){
  //ΪHTMLҳ
  var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
  //ȡ<body></body>ַ֮
  text = (match) ? match[1] : text;
  
  //htmlڵ
  var container = new Element('div');
  
  //ڵ,ȳʹXMLDOMHTMLڵ,ʧܵĻֱinnerHTML
  return $try(function(){
   //һڵ,Ϊ뱣֤XMLƬиڵ
   var root = '<root>' + text + '</root>', doc;
   //IEĴ
   if (Browser.Engine.trident){
    //ʹActiveXؼ
    doc = new ActiveXObject('Microsoft.XMLDOM');
    //ͬ
    doc.async = false;
    doc.loadXML(root);
   } else {
    //ʹñ׼DOM
    doc = new DOMParser().parseFromString(root, 'text/xml');
   }
   //ȡڵ
   root = doc.getElementsByTagName('root')[0];
   //ͨڵ,Ƶcontainer
   for (var i = 0, k = root.childNodes.length; i < k; i++){
    var child = Element.clone(root.childNodes[i], true, true);
    if (child) container.grab(child);
   }
   return container;
   //XMLDOMʧܵĻֱinnerHTML
  }) || container.set('html', text);
 },

 //ɹ,Requestͬ
 success: function(text){
  var ptions = this.options, response = this.response;
  
  //ͳű,֮ʣHTML
  response.html = text.stripscrpts(function(scrpt){
   response.javascrpt = scrpt;
  });
  
  //HTMLеĽڵ
  var temp = this.processHTML(response.html);
  
  //󶨽ڵ㵽صĶ
  response.tree = temp.childNodes;
  response.elements = temp.getElements('*');
  
  //ṩ˱ǩ,ڵ
  if (options.filter) response.tree = response.elements.filter(options.filter);
  //ָҪµElement,ӦµElement
  if (options.update) $(options.update).empty().adopt(response.tree);
  //ָͽű
  if (options.evalscrpts) $exec(response.javascrpt);
  
  //ø෽,ɹ¼
  this.onSuccess(response.tree, response.elements, response.html, response.javascrpt);
 }

});

//ΪElementloadԵsettergetter
Element.Properties.load = {
 
 //setter
 set: function(options){
  //ʱȡRequest.HTML
  var load = this.retrieve('load');
  //,ȡ(sendòload?)
  if (load) send.cancel();
  //Request.HTMLò
  return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
 },

 //getter
 get: function(options){
  //ṩò߲ڻ
  if (options || ! this.retrieve('load')){
   //ò
   if (options || !this.retrieve('load:options')) this.set('load', options);
   //Request.HTML
   this.store('load', new Request.HTML(this.retrieve('load:options')));
  }
  //ػRequest.HTML
  return this.retrieve('load');
 }

};

//ΪElementload
Element.implement({
 
 //Զҳڵ㵽ǰElement
 load: function(){
  //׼ȡloadܵõRequest.HTMLʵ,Ȼ
  //עArray.linkʹ,ʹsend,ҿѡ
  this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
  return this;
 }

});


