/*
 * Ext JS Library 2.2
 * Copyright(c) 2006-2008, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

// Create and append to the body, a Panel containing a block of code from the passed URL
function createCodePanel(url, title) {
	var panel = new Ext.Panel({
		hideMode: 'visibility',
		title: title,
    	width: 750,
    	style: {
    		'margin-top': '10px'
    	},
    	hideCollapseTool: true,
    	titleCollapse: true,
    	collapsible: true,
    	collapsed: true,
		autoScroll: true,
		renderTo: Ext.getBody(),
		listeners: {
			render: function(p) {
				p.getUpdater().setRenderer({
					render: Ext.isIE ? function(el, response, scripts, callback) {
						el.update('');
						var np = el.createChild({
							tag: 'pre',
							cls: 'code',
							cn: {
								tag: 'code'
							}
						});
						var t = response.responseText.split("\n");
						var c = np.child('code', true);
						for (var i = 0, l = t.length; i < l; i++) {
							var pre = document.createElement('pre');
							if (t[i].length) {
								pre.appendChild(document.createTextNode(t[i]));
								c.appendChild(pre);
							} else if (i < (l - 1)) {
								c.appendChild(document.createElement("br"));
							}
							
						}
					} : function(el, response, scripts, callback) {
						el.update('');
						el.createChild({
							tag: 'pre',
							cls: 'code',
							cn: {
								tag: 'code',
								html: response.responseText
							}
						});
					}
				});
			},
			beforeexpand: function(p) {
				p.load(url);
			},
			single: true
		}
	});
}

// Patch to allow XHR to local files. From hendricd: http://extjs.com/forum/member.php?u=8730
Ext.apply( Ext.lib.Ajax ,
{ forceActiveX:false,
  createXhrObject:function(transactionId)
        {
            var obj={  status:{isError:false}
            	     , tId:transactionId}, http;
            try
            {
            	
		if(Ext.isIE7 && !!this.forceActiveX){throw("IE7forceActiveX");}
                
		obj.conn= new XMLHttpRequest();
		
            }
            catch(e)
            {
                for (var i = 0; i < this.activeX.length; ++i) {
                    try
                    {
                        obj.conn= new ActiveXObject(this.activeX[i]);
			
                        break;
                    }
                    catch(e) { 
                    }
                }
            }
            finally
            {
            	obj.status.isError = typeof(obj.conn) === undefined;
            }	
            return obj;
            
        },
        
        getHttpStatus: function(reqObj){
        
        	var statObj = {  status:0
        			,statusText:''
        			,isError:false
        			,isLocal:false
        			,isOK:false
        			,error:null};
        	
        	try {
        		if(!reqObj)throw('noobj');
		        statObj.status = reqObj.status;
		        
		        statObj.isLocal = !reqObj.status && location.protocol == "file:" || 
		        		   Ext.isSafari && reqObj.status === undefined;
		        
		        statObj.isOK = (statObj.isLocal || (statObj.status > 199 && statObj.status < 300));
		        statObj.statusText = reqObj.statusText || '';
		    } catch(e){ //status may not avail/valid yet (or called too early).
		      } 
		    
    		return statObj; 
        
        },
        handleTransactionResponse:function(o, callback, isAbort)
		{
	
		
		callback = callback || {};
		var responseObject=null;
		
		 if(!o.status.isError){
			o.status = this.getHttpStatus(o.conn);	 	
		 	/* create and enhance the response with proper status and XMLDOM if necessary */
		 	responseObject = this.createResponseObject(o, callback.argument);
		 }
		
 		 if(o.status.isError){ /* checked again in case exception was raised - ActiveX was disabled during XML-DOM creation? */
 		     // And mixin everything the XHR object had to offer as well
		   responseObject = Ext.applyIf(responseObject||{},this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false)));
		   
		 }
		
		 responseObject.options = o.options;
		 responseObject.stat = o.status;
		 
		 if (o.status.isOK && !o.status.isError) {
			if (callback.success) {
				if (!callback.scope) {
					callback.success(responseObject);
				}
				else {
					callback.success.apply(callback.scope, [responseObject]);
				}
			}
		  } else {

			if (callback.failure) {
				if (!callback.scope) {
					callback.failure(responseObject);
				}
				else {
					callback.failure.apply(callback.scope, [responseObject]);
				}
			}

		 }
		
		if(o.options.async){
			this.releaseObject(o);	
			responseObject = null;
		}else{ 
			this.releaseObject(o);
			return responseObject; 
		}
			
	},
	createResponseObject:function(o, callbackArg)
	{
	    var obj = {};
	    var headerObj = {},headerStr='';

	    try{  //to catch bad encoding problems here
		obj.responseText = o.conn.responseText;
	    }catch(e){obj.responseText ='';}

	    obj.responseXML = o.conn.responseXML;

	    try{
		headerStr = o.conn.getAllResponseHeaders()||'';
	    } catch(e){}

	    if(o.status.isLocal){

		   o.status.isOK = ((o.status.status = (!!obj.responseText.length)?200:404) == 200);

		   if(o.status.isOK && (!obj.responseXML || obj.responseXML.childNodes.length == 0)){

			var xdoc=null;
			try{   //ActiveX may be disabled
				if(typeof(DOMParser) == 'undefined'){ 
					xdoc=new ActiveXObject("Microsoft.XMLDOM"); 
					xdoc.async="false";
					xdoc.loadXML(obj.responseText); 

				}else{ 
					try{  //Opera 9 will fail parsing non-XML content, so trap here.
						var domParser = new DOMParser(); 
						xdoc = domParser.parseFromString(obj.responseText, 'application\/xml'); 
					}catch(ex){}
					finally{domParser = null;}

				}
			} catch(ex){ 
				o.status.isError = true; 
				o.status.error = ex;

				}

			obj.responseXML = xdoc;
		    }

		    if(obj.responseXML){

			var parseBad = (obj.responseXML.parseError || 0) != 0 || obj.responseXML.childNodes.length == 0;
			if(!parseBad){
				headerStr = 'Content-Type: ' + (obj.responseXML.contentType || 'text\/xml') + '\n' + headerStr ;
				}			    
		    }		


	    }	

	   var header = headerStr.split('\n');
	   for (var i = 0; i < header.length; i++) {
	        var delimitPos = header[i].indexOf(':');
	    	if (delimitPos != -1) {
			headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2);
	    	}
	    }

	    obj.tId = o.tId;
	    obj.status = o.status.status;
	    obj.statusText = o.status.statusText;
	    obj.getResponseHeader = headerObj;
	    obj.getAllResponseHeaders = headerStr;
	    obj.stat = o.status

	    if (typeof callbackArg !== undefined) {
		obj.argument = callbackArg;
	    }

	    return obj;
        },
        
	request : function(method, uri, cb, data, options) {
	            
	             options = Ext.apply({async:true,
			   headers:false,
			   userId:null,
			   password:null,
			   xmlData:null }, options||{});
	            	                	
	                var hs = options.headers;
	                if(hs){
	                    for(var h in hs){
	                        if(hs.hasOwnProperty(h)){
	                            this.initHeader(h, hs[h], false);
	                        }
	                    }
	                }
	                if(options.xmlData){
	                    this.initHeader('Content-Type', 'text/xml', false);
	                    method = 'POST';
	                    data = options.xmlData;
	                }
	            	            
		    return this.makeRequest(method, uri, cb, data, options);
		    
        },
        asyncRequest:function(method, uri, callback, postData)
        {
            var o = this.getConnectionObject();

            if (!o || o.status.isError) {
                return null;
            }
            else {
            	o.options = options;
                try{
			o.conn.open(method, uri, true);
		} catch(ex){
			o.status.isError = true;
			o.status.error = ex;
			return Ext.apply(o,this.handleTransactionResponse(o, callback));
			
		}
		
		
		if (this.useDefaultXhrHeader) {
		    if (!this.defaultHeaders['X-Requested-With']) {
			this.initHeader('X-Requested-With', this.defaultXhrHeader, true);
		    }
		}

		if(postData && this.useDefaultHeader){
		    this.initHeader('Content-Type', this.defaultPostHeader);
		}

		 if (this.hasDefaultHeaders || this.hasHeaders) {
		    this.setHeader(o);
		}

		this.handleReadyState(o, callback);
		
		try{ o.conn.send(postData || null);
		} catch(ex){ 
			o.status.isError=true;
			o.status.error = ex;
			return Ext.apply(o,this.handleTransactionResponse(o, callback));
		}
			
					
		return o;
            }
        },
        
        makeRequest:function(method, uri, callback, postData, options)
        {
            var o = this.getConnectionObject();
            	     
            if (!o || o.status.isError) {
                return null;
            }
            else {
            	o.options = options;	
                try{
			o.conn.open(method, uri, options.async, options.userId, options.password);
		} catch(ex){
			o.status.isError = true;
			o.status.error = ex;
			var r=this.handleTransactionResponse(o, callback);
			return Ext.apply(o,r);
		}

		if (this.useDefaultXhrHeader) {
		    if (!this.defaultHeaders['X-Requested-With']) {
			this.initHeader('X-Requested-With', this.defaultXhrHeader, true);
		    }
		}

		if(postData && this.useDefaultHeader){
		    this.initHeader('Content-Type', this.defaultPostHeader);
		}

		 if (this.hasDefaultHeaders || this.hasHeaders) {
		    this.setHeader(o);
		}

		if(o.options.async){ //Timers won't work here as it's a blocking call
			this.handleReadyState(o, callback);
		}
		
		try{ o.conn.send(postData || null);
		} catch(ex){ 
			//Ext.apply(o,this.handleTransactionResponse(o, callback));
		}
				
		return options.async?o:Ext.apply(o,this.handleTransactionResponse(o, callback));
            }
   }});
	
Ext.lib.Ajax.forceActiveX = (document.location.protocol == 'file:');/* or other true/false mechanism */