/**
 * 处理XSLT
 * author: ybbk
 **/
function XSLTLoader(xslt) { 
    this.init=false;
 // determine brower 
    if (window.XMLHttpRequest && window.XSLTProcessor) { 
        // gecko or opera 
	        var request=new XMLHttpRequest(); 
	        request.open("GET", xslt, false); 
	        request.send(null); 
	        if (request.status==200 || request.status==0) { 
	            var xsltDoc=request.responseXML; 
	            var xsltProcessor=new XSLTProcessor(); 
	            xsltProcessor.importStylesheet(xsltDoc); 
	            this.processor=xsltProcessor; 
	            this.init=true; 
	        }else if(request.status==404){
	        	throw new Error('页面'+request.statusText+'未找到');
	        }else{
	        	throw new Error(request.statusText);
	        }
    } else if(typeof(window.ActiveXObject)!="undefined") {
        // ie 
        var xsltDoc= this.getXMLHttpRequest(); 
        if(!xsltDoc){
        	throw new Error('创建XMLHttpRequest对象失败!');
        }
       	xsltDoc.async=false;
       	xsltDoc.load(xslt); 
		if(xsltDoc.parseError.errorCode != 0) { 
			var myErr=xsltDoc.parseError; 
			throw new Error(myErr.reason);
        }else{
            var xslTemplate= this.getXSLTemplate();
            if(!xslTemplate){
            	throw new Error('创建XSLTemplate对象失败!');
            } 
            xslTemplate.stylesheet=xsltDoc; 
            this.processor=xslTemplate.createProcessor(); 
            this.init=true; 
        } 
    } else { 
		throw new Error('未知错误!');
    }
}

XSLTLoader.prototype.getXMLHttpRequest=function() { 
	return Try.these(
      function() {return new ActiveXObject('Msxml2.FreeThreadedDOMDocument60')},
      function() {return new ActiveXObject('MSXML2.FreeThreadedDOMDocument')}
    ) || false;
} 
XSLTLoader.prototype.getXSLTemplate=function() { 
	return Try.these(
      function() {return new ActiveXObject('MSXML2.XSLTemplate60')},
      function() {return new ActiveXObject('MSXML2.XSLTemplate')}
    ) || false;
}
XSLTLoader.prototype.load=function(xml) { 
    if (this.error || !xml || !this.init) return; 
    var request=this.getXMLHttpRequest(); 
    request.open("GET", xml, false); 
    request.send();
    if (request.status==200) { 
        this.xmlDoc=request.responseXML; 
        this.loaded=true; 
        return true; 
    }else if(request.status==404) {
    	throw new Error('页面'+request.statusText+'未找到');
        return false; 
    }else{
    	throw new Error(request.statusText);
    }
}
XSLTLoader.prototype.loadXml=function(xml) { 
	if (this.error || !xml || !this.init) return; 
	this.xmlDoc=xml;
	this.loaded=true;
	return true;
}
/** 
 * format loaded xml document. 
 */ 
XSLTLoader.prototype.tranform=function(element, params) { 
    if (!this.processor || !this.xmlDoc) {
        return; 
    }
    var xmlDoc=this.xmlDoc; 
    var processor=this.processor; 
    if (!params || typeof(params) != "object") 
        params={}; 
    if (processor.transformToFragment) { 
        for (var param in params) { 
            processor.setParameter(null, param, params[param]); 
        }
        var result=processor.transformToFragment(xmlDoc, document); 
        $(element).removeAll();
		$(element).appendChild(result);
    } else { 
        processor.input=xmlDoc; 
        for (var param in params) { 
            processor.addParameter(param, params[param]); 
        } 
        processor.transform();
      	$(element).innerHTML=processor.output;
    } 
}
var MyUtils = {
	removeAll: function(ele){
		if(ele.hasChildNodes()){
			var s = ele.childNodes;
			$A(s).each(function(node){
					ele.removeChild(node)
			});
		}
　	},
	center:function(ele){
		var view = document.viewport.getDimensions();
		var offs = document.viewport.getScrollOffsets();
		var elev = ele.getDimensions();
		var x = offs.left + view.width/2  - elev.width/2;
		var y = offs.top +  view.height/2 - elev.height/2;		
		ele.setStyle("left:"+x+"px;top:"+y+"px");
	}
}
Element.addMethods(MyUtils);

Ajax.XsltlUpdater = Class.create(Ajax.Request, {
	initialize: function($super, container, url, xslt,options) {
    	this.container = {
      		success: (container.success || container),
      		failure: (container.failure || (container.success ? null : container))
    	};
    	this.xslt =	xslt;
    	options = Object.clone(options);
    	var onComplete = options.onComplete;
    	options.onComplete = (function(response, json) {
    		var succ = response.getHeader("SUCCESS");
    		if(succ && succ=='ERROR'){
    			alert('出错啦! ' + response.responseText);
    			return;
    		}
      		this.updateContent(response);
      		if (Object.isFunction(onComplete)) onComplete(response, json);
    	}).bind(this);
    	$super(url, options);
  	},
  	updateContent: function(response) {
  		var receiver = this.container[this.success() ? 'success' : 'failure'],
        options = this.options;
		try{
			var myxslt = new XSLTLoader(this.xslt);
			myxslt.loadXml(response.responseXML);
			myxslt.tranform(receiver);
		}catch(e){
			$(receiver).update('错误信息.......:'+ (e.message));
		}
  	}
});

function AjaxUpdateTest(url,xslt,container){
	var myajax = new Ajax.XsltlUpdater(container,url,xslt,{method:'post',asynchronous:false,
		onLoading:function(){$(container).innerHTML='正在获取数据...'},
		onFailure:function(response){
			alert(response.status+'  '+response.getHeader("Content-type"))
		}
	});
}


function XmlProcessor(xml) {
	this.loadXml = function(xml){
		var response = xml.getElementsByTagName("response"); 
		if(response.length>0){
			this.code = response[0].getElementsByTagName("code")[0].firstChild.nodeValue;
    		this.msg = response[0].getElementsByTagName("msg")[0].firstChild.nodeValue; 
		}
	},
	this.getResult = function(){
		return this.code;
	},
	this.getContent = function(){
		return this.msg;
	},
	this.loadXml(xml);
};