    var xmlHttp = false;

    function httpInit() {

		if (xmlHttp == false){
		
	        if (window.XMLHttpRequest) { // Mozilla, Safari,...
	            xmlHttp = new XMLHttpRequest();
	            if (xmlHttp.overrideMimeType) {
	                xmlHttp.overrideMimeType('text/xml');                
	            }
	        } else if (window.ActiveXObject) { // IE
	            try {
	                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
	            } catch (e) {
	                try {
	                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	                } catch (e) {}
	            }
	        }
	
	        if (!xmlHttp) {
	            alert('Cannot create an XMLHTTP instance');
	            return false;
	        }
			
		}	

    }
	
	function executeSearch(){
		process_engine = "";
		search_form = document.searchForm;
		
		for (i = 0; i < search_form.engine.length; i++) {
			if (search_form.engine[i].checked == true)
				process_engine = search_form.engine[i].value; 
		}
		search_form.action = "../" + process_engine + "/search.php";
		return true;
	}
	

    function executeSearchAjax(){	
		httpInit();
		process_engine = "";
		var engineList = document.searchForm.engine;
		
		for (i = 0; i < engineList.length; i++) {
			if (engineList[i].checked == true){
				var engine = engineList[i].value; 
			}	
		}			
		var expression = document.getElementById("expression").value;        
        if ( expression == "" ){ 
			return;
		}else{
			expression = insertDefaultOperator(expression);
		}
		
        var url = "../" + engine + "/searchAjax.php?expression=" + expression;
		
        xmlHttp.open("POST", url, true);
        xmlHttp.onreadystatechange = updatePage;
        
        xmlHttp.send(null);
	
    }

    function updatePage(){
        var resultPortlet = document.getElementById("searchResult");
        var result = document.getElementById("result");
        var buffer = "";
        resultPortlet.style.display="block"; 

        result.innerHTML = "<img src='../image/common/loading.gif' border='0'>";

        if (xmlHttp.readyState == 4) {
            if (xmlHttp.status == 200) {
                var metaiah = xmlHttp.responseXML;         
      
                var groupList = metaiah.getElementsByTagName("group");
         
                for (var i = 0; i < groupList.length; i++) {                    
                    var group = groupList[i];
                    buffer += "<ul>";
                    buffer += " <li>" + group.getAttribute("label") + " (" + group.getAttribute("total") + ")";                    
                    sourceList =  group.childNodes;
                    
                    if (sourceList.length > 0){
                        buffer += "<ul>";
                        for (y = 0; y < sourceList.length; y++) {
                            var source = sourceList[y];
                            if (source.nodeType == 1){
                                buffer += "<li><a href='" + source.getAttribute("browse-url") +  "' target='metaResult'>" + source.getAttribute("label") + "</a> (" + source.getAttribute("total") + ") </li>"; 
                            }
                        }   
                        buffer += "</ul>";
                    }
                    buffer += " </li>";
                    buffer += "</ul>";

                }                                        
            } else {
                buffer = xmlHttp.responseText;
            }
            result.innerHTML = buffer;

        }

    }

    function portletClose(portletId){
		xmlHttp.abort();
        var portlet = document.getElementById(portletId);
        portlet.style.display = "none";

        return;
    }

    function insertDefaultOperator(str){

	
		var quotedExpressions = str.match(/("[^"]*")/g);
	
		// Substitui expressões dentro de aspas por %~~%
		if (quotedExpressions)
		{
			for (var i = 0; i < quotedExpressions.length; i++)
			{
				var qexp = quotedExpressions[i];
				var pos = str.indexOf(qexp);
				
				str = str.slice(0, pos) + "\%~~\%" + str.slice(pos + qexp.length);
			}	
		}
		
		var patterns = [ /^\s+/, /\s+$/, /\s+/g, / AND (AND|OR|NOT) AND /ig, /^NOT AND /i, / NOT AND /ig, / AND /g, / OR /g, /^NOT /, / NOT /g ];
		var replacements = [ "", "", " and ", " $1 ", "not ", " not ", " and ", " or ", "not ", " not " ];
	
		for (var i = 0; i < patterns.length; i++)
		{
			str = str.replace(patterns[i], replacements[i]);
		}	
		
		// Insere de volta a expressão dentro de aspas
		if (quotedExpressions)
		{
			for (var i = 0; i < quotedExpressions.length; i++)
			{
				str = str.replace(/%~~%/, quotedExpressions[i]);
			}	
		}
		
		return str;
    }

