/* Implementing new methods to string */
String.prototype.trim = function(){
	return this.replace(/^\s+|\s+$/, '');
};

Array.prototype.merge = function( objArr ){
	for( var key in objArr ){
		this.push( objArr[key] );
	}
}

function isArray( argObj ){
	if( argObj.push ) return true;
	
	return false;
}


if( !window.XMLHttpRequest ){

	XMLHttpRequest = function() {
		this._object = null;
		this.onreadystatechange = function(){}
		
		this._getObject = function(){
			if ( navigator.userAgent.indexOf("MSIE") >= 0 ) { 
				var strName="Msxml2.XMLHTTP";
				if ( navigator.appVersion.indexOf("MSIE 5.5") >= 0 ) {
					strName="Microsoft.XMLHTTP";
				} 
				try{ 
					objXmlHttp=new ActiveXObject(strName);
					return objXmlHttp;
				}catch( e ){ 
					alert("Error. Scripting for ActiveX might be disabled") ;
					return null;
				} 
			} 
		}
		
		this._object = this._getObject();
		
		return this._object;
	}
	
}


/* Implementing new methods to object */
function merge( argObjSrc, argObj ){
	for( var attr in argObj ){
		if( typeof( argObjSrc[attr] ) == 'function' ) continue;
		
		if( argObjSrc[attr] ){
			if( isArray( argObjSrc[attr] ) ){
				argObjSrc[attr].merge( argObj[attr] );
			}else{
				try{
				var tmp = argObjSrc[atrr];
					argObjSrc[atrr] = new Array();
					argObjSrc[atrr].push( tmp );
					argObjSrc[atrr].push( obj.tmp );
				}catch( e ){}
			}
		}else{
			argObjSrc[attr] = argObj[attr];
		}
	}
}

/* Defining QueryString Class and creating a global instance */
function QueryStringClass(){
	this.toString = function(){
		return QueryStringClass = '[QueryString object]';
	}
	
	this.parse = function( queryString ){
		if( !queryString ) return {};
		
		var queryString = queryString.replace('?','');
		var arrParts = queryString.split('&');
		
		for( var i=0; i<arrParts.length; i++ ){
			arrPair = arrParts[i].split('=');
			this[ arrPair[0].trim() ] = unescape( arrPair[1].trim() );
		}
	}
}
var QueryString = new QueryStringClass();


/* Include Function */
function include( filename, container, type, data, additionalHandler, additionalHandlerContext, async ){
	if( !filename ) return false;
	
	var head = document.getElementsByTagName('head')[0];

	var baseFileName = filename;
	if( baseFileName.indexOf('?') > -1 ){
		var arrFilename = baseFileName.split('?');
		baseFileName = arrFilename[0];
		var qString = arrFilename[1];
	}
	if( baseFileName.indexOf('#') > -1 ){
		var arrFilename = baseFileName.split('#');
		baseFileName = arrFilename[0];
	}
	
	var arrFilename = baseFileName.split('.');
	if( !arrFilename.length ) return false;
	var extension = arrFilename[arrFilename.length-1].toLowerCase();
	
	if( !type ){
		type = extension;
	}
	
	switch( type ){
		case 'js':
			var importTag = document.createElement('script');
			importTag.type = 'text/javascript';
			importTag.src = baseFileName;
			QueryString.parse( qString );
			
			head.appendChild( importTag );
			
			break;
			
		case 'css':
			var importTag = document.createElement('link');
			importTag.rel = 'stylesheet';
			importTag.type = 'text/css';
			importTag.href = filename;
			
			QueryString = new QueryStringClass();
			
			head.appendChild( importTag );
			break;
		
		case 'xml':
			if( !additionalHandler ){
				additionalHandler = function(){}
			}
			getXMLJson( filename, async, additionalHandler );
		
		case 'tpl':
		case 'html':
		case 'htm':
			QueryString = new QueryStringClass();
			QueryString.parse( qString );
			var QueryStringCopy = QueryString;
			
			if( qString ){
				switch( extension ){
					case 'tpl':
					case 'html':
					case 'htm':
						/*filename = baseFileName;*/
						break;
				}
			}
			
			if( !container ){
				var doNotReadResponse = true;
			}
			
			if( typeof( container ) == 'string' ){
				container = document.getElementById( container );
			}			
			
			this.ajaxHandler = function(){
				if( ( objXMlHttp.readyState == 4 || objXMlHttp.readyState == "complete" ) && ( objXMlHttp.status == 200 || objXMlHttp.status == 304 ) ){
					window.XMLData = {};
					
					var responseText = objXMlHttp.responseText;
					responseText = responseText.split('&lt;').join('<');
					responseText = responseText.split('&gt;').join('>');
					responseText = responseText.split('&amp;nbsp;').join('&nbsp;');
					responseText = responseText.split('&amp;').join('&');
					responseText = responseText.replace( /^<pre><\/pre>$/gi, '' );
					responseText = unescape( responseText );
					
					if( !window.scriptBlocks ){
						window.scriptBlocks = new Array();	
					}
					
					if( responseText && responseText.match( /<head>.*erro.*http.*404.*<\/head>/i ) ) return;
					//if(responseText.indexOf('Erro HTTP 404')>-1) return false;
					
					try{
						var arrMatches = responseText.match(/<script.*?>((\r|\n|.)*?)<\/script>/gi);
						for( var i=0; i<arrMatches.length; i++ ){
							if( !arrMatches[i] ) continue;
						    var sScript = arrMatches[i].match(/<script.*?>((\r|\n|.)*?)<\/script>/i)[1];
							window.scriptBlocks.push( sScript );
						}
					}catch(e){}
					
					responseText = responseText.replace( /<script([^>]*(src *=)[^>]*?)>((\r|\n|.)*?)<\/script>/gi, '<myScript$1></myScript>' );
					responseText = responseText.replace( /<script.*?>((\r|\n|.)*?)<\/script>/gi, '' );
					responseText = responseText.replace( /<myScript(.*?)><\/myScript>/gi, '<script$1></script>' );
					
					try{
						var ZParser = new ZParse(myImplementation);
						ZParser.parse( responseText );
						var baseHTML = ZParser.process( {} );			
						
						if( data ){
							merge( window.XMLData, data );
						}
						merge( window.XMLData, QueryStringCopy );
						
						
						var ZParser = new ZParse(Implementation);
						ZParser.parse( baseHTML );
						var content = ZParser.process( window.XMLData );
					}catch( e ){
						var content = '';
					}
					
					try{
						container.innerHTML = content;
						
						for( var i=0; i<scriptBlocks.length; i++ ){
							eval(window.scriptBlocks[i]);
						}
						
						if( additionalHandler ){
							try{
								if( additionalHandlerContext ){
									additionalHandler.call( additionalHandlerContext );
								}else{							
									additionalHandler.call( this );
								}
							}catch(e){}
						}
					}catch( e ){
					}
				}
			}
			
			var objXMlHttp = new XMLHttpRequest();
			objXMlHttp.onreadystatechange = this.ajaxHandler;
			objXMlHttp.open( "GET", filename, true );
			objXMlHttp.send( null );
			
			break;
	}
}

function getXML( filename ){
	if( navigator.userAgent.indexOf("MSIE") >= 0 ){
		var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.load( filename );
	}else{
		var xmlDoc=document.implementation.createDocument("","",null);
		xmlDoc.async=false;
		xmlDoc.load(filename);
	}
	return xmlDoc;
}

function getXMLJson( filename, async, handler, additionalHandlerContext ){
	var objXMlHttp = new XMLHttpRequest();
	objXMlHttp.onreadystatechange = function(){
		if (objXMlHttp.readyState == 4 ){
			
			if( ( objXMlHttp.status == 200 || objXMlHttp.status == 304 ) && objXMlHttp.responseXML ){
				var objData	= ZParse.parseXMLToJSON( objXMlHttp.responseXML.documentElement );
			}else{
				var objData	= {};
			}
			if( additionalHandlerContext ){
				handler.call( additionalHandlerContext, objData );
			}else{							
				handler( objData );
			}
		}
	};
	objXMlHttp.open( "GET", filename, true );
	objXMlHttp.send( null );
	
	if( !async ){
		var objData	= ZParse.parseXMLToJSON( xmlDoc.documentElement );
	
		return objData;
	}
}

/* Including files for ZParse Usage */
/*include('/js/zparse/zparse.js');
include('/js/zparse/implementation.js');
include('/js/ajax/lib/iframeRequest.js');*/


/* ZParse personalization */
var myImplementation = {  
    'dataDelimiter': {  
        opener: '<:',  
        closer: ':>',  
        tags: {  
            'xmldata': { 
                type: 'single', 
				arguments: '{filename}',
                handler: function(tree, content, caller){ 
                    var filename = tree.arguments.filename;
					
					if( navigator.userAgent.indexOf("MSIE") >= 0 ){
						var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
						xmlDoc.async="false";
						xmlDoc.load( filename );
					}else{
						var xmlDoc=document.implementation.createDocument("","",null);
						xmlDoc.async=false;
						xmlDoc.load(filename);
					}
					
					var objData	= ZParse.parseXMLToJSON( xmlDoc.documentElement );
					
					for( attr in objData ){
						window.XMLData[attr] = objData[attr];
					}
					return '';
                } 
            }
        }  
    }  
};

