text: /*
  ---
  
  name: Request.HTML
  
  description: Extends the basic Request Class with additional methods for interacting with HTML responses.
  
  license: MIT-style license.
  
  requires: [Request, Element]
  
  provides: Request.HTML
  
  ...
  */
  
  Request.HTML = new Class({
  
  	Extends: Request,
  
  	options: {
  		update: false,
  		append: false,
  		evalScripts: true,
  		filter: false
  	},
  
  	processHTML: function(text){
  		var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
  		text = (match) ? match[1] : text;
  
  		var container = new Element('div');
  
  		return $try(function(){
  			var root = '<root>' + text + '</root>', doc;
  			if (Browser.Engine.trident){
  				doc = new ActiveXObject('Microsoft.XMLDOM');
  				doc.async = false;
  				doc.loadXML(root);
  			} else {
  				doc = new DOMParser().parseFromString(root, 'text/xml');
  			}
  			root = doc.getElementsByTagName('root')[0];
  			if (!root) return null;
  			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;
  		}) || container.set('html', text);
  	},
  
  	success: function(text){
  		var options = this.options, response = this.response;
  
  		response.html = text.stripScripts(function(script){
  			response.javascript = script;
  		});
  
  		var temp = this.processHTML(response.html);
  
  		response.tree = temp.childNodes;
  		response.elements = temp.getElements('*');
  
  		if (options.filter) response.tree = response.elements.filter(options.filter);
  		if (options.update) document.id(options.update).empty().set('html', response.html);
  		else if (options.append) document.id(options.append).adopt(temp.getChildren());
  		if (options.evalScripts) $exec(response.javascript);
  
  		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
  	}
  
  });
  
  Element.Properties.load = {
  
  	set: function(options){
  		var load = this.retrieve('load');
  		if (load) load.cancel();
  		return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
  	},
  
  	get: function(options){
  		if (options || ! this.retrieve('load')){
  			if (options || !this.retrieve('load:options')) this.set('load', options);
  			this.store('load', new Request.HTML(this.retrieve('load:options')));
  		}
  		return this.retrieve('load');
  	}
  
  };
  
  Element.implement({
  
  	load: function(){
  		this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
  		return this;
  	}
  
  });
  