/**
 * Manage Sync/Async Requests
 */
 
var Request = function Request() {
	var _request;
	var _target;
	var _handler;
	var _hasEqualWord;
	
	var _getXmlHttpRequest = function _getXmlHttpRequest() {
		try {
			// Firefox, Opera 8.0+, Safari
			return new XMLHttpRequest();
		} catch (e) {
			// Internet Explorer
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				return new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
	};
	
	/*locale settings from fallback*/
	var _locale=false;
	this.createLocale = function(){_locale = new Locale();}
	this.getLocale = function(){return _locale;}
	/*end locale settings*/
	
	var _sync = function sync(uri, target, businessWord, addressWord, async, handler) {
	    if(__monitor == undefined || __monitor == null){
        	__monitor = new ActivityMonitor();
        }
        __monitor.on();
        
        _target  = target;
		_handler = handler;
		_businessWord = businessWord;
		_addressWord = addressWord;
		_hasEqualWord = "N";
		_request = _getXmlHttpRequest();
	
		if(_target == "suggestContent"){
			// verificar se já existe alguma requisição "suggest" anterior a atual. Caso positivo: abortar a mesma agora
			if(_allSuggestRequests.length > 0){
				for(var i=0; i<_allSuggestRequests.length; i++){
					if(_allSuggestRequests[i].getRequest().readyState!=4){
						_allSuggestRequests[i].getRequest().abort();
						__monitor.off();
					}
				}
				// zera array de requisições "suggest"
				_allSuggestRequests = new Array();
				_suggestIndex = 0;
			}
			
			// verifica se há alguma requisição "search" para a mesma palavra buscada na requisição "suggest"           
			if(_allSearchRequests.length>0){
				for(var i=0; i<_allSearchRequests.length; i++){
					if(_businessWord != "" && _allSearchRequests[i].getBusinessWord() != ""){
						if(_businessWord == _allSearchRequests[i].getBusinessWord()){
							_hasEqualWord = "S";
							break;
						}
					}
					if(_addressWord != "" && _allSearchRequests[i].getAddressWord() != ""){
						if(_addressWord == _allSearchRequests[i].getAddressWord()){
							_hasEqualWord = "S";
							break;
						}
					}
				}
			}
			
			if(_hasEqualWord == "N"){
				// adiciona requisição "suggest" em array                    
				_allSuggestRequests[_suggestIndex] = new SRequest(_businessWord, _addressWord, _request);
				_suggestIndex++;
			
			}else{
				// aborta requisição "suggest" atual
				_request.abort();
				// zera array de requisições "suggest"
				_allSuggestRequests = new Array();
				_suggestIndex = 0;
				Stage.suggestOnOff(null,{action: 'close'});
				return;
			}
			
		} else if (_target == "emailSend"){
			_target = 'mapSkinEmail';			
			//alert($D.get('emailEditor').contentWindow.document.body.innerHTML);
			uri += '&body=' + '<html><body>' + $D.get('emailEditor').contentWindow.document.body.innerHTML + '</html></body>';


		//Trata os Requests Explorer
		}else if (_target == "explorerResults"){

			if (_allExplorerRequests.length > 0) {
				for (var i = 0; i < _allExplorerRequests.length; i++) {
					if (_allExplorerRequests[i].getRequest().readyState != 4) {
						_allExplorerRequests[i].getRequest().abort();
						__monitor.off();
					}
				}
			}
			_allExplorerRequests[_explorerIndex] = new SRequest(false, false, _request);
			_explorerIndex++;
		
		} else {
			if (_target == "resultContent") {
				// verificar se já existe alguma requisição "search" anterior a atual. Caso positivo: abortar a mesma agora
				if (_allSearchRequests.length > 0) {
					for (var i = 0; i < _allSearchRequests.length; i++) {
						if (_allSearchRequests[i].getRequest().readyState != 4) {
							_allSearchRequests[i].getRequest().abort();
							__monitor.off();
						}
					}
					// zera array de requisições "search
					_allSearchRequests = new Array();
					_searchIndex = 0;
				}
				// adiciona requisição "search" em array
				_allSearchRequests[_searchIndex] = new SRequest(_businessWord, _addressWord, _request);
				_searchIndex++;
				
				// caso já exista alguma requisição "suggest": abortá-la agora
				if (_allSuggestRequests.length > 0) {
					for (var i = 0; i < _allSuggestRequests.length; i++) {
						if (_allSuggestRequests[i].getRequest().readyState != 4) {
							_allSuggestRequests[i].getRequest().abort();
							__monitor.off();
						}
					}
					// zera array de requisições "suggest"
					_allSuggestRequests = new Array();
					_suggestIndex = 0;
				}
				
				
			}
		}
		
		
		// travado para fazer requisicao assincrona por causa de um bug no ff
		_request.onreadystatechange = _syncCallBack;
		_request.open('GET', uri, true);
		//console.log(uri);
		_request.send('');
	};

	var _syncCallBack = function() {
			
		if (_request.readyState != 4)  {return; }
		
		__monitor.off();
		
		if(_target == "resultContent"){	     		
   		   // caso exista alguma requisição "suggest": abortá-la agora
		   if(_allSuggestRequests.length>0){
				for(var i=0; i<_allSuggestRequests.length; i++){
					if(_allSuggestRequests[i].getRequest().readyState!=4){
						_allSuggestRequests[i].getRequest().abort();
						__monitor.off();
					}	
				}												
				// zera array de requisições "suggest"
				_allSuggestRequests = new Array();
				_suggestIndex = 0;
			}
			
			//zera as requisições de ipoints e do explorer 
   		    abortRequests()
		}
		
		if (_handler) { // somente é "true" quando é requisição "suggest"
			_handler.apply(null, [_request]);
			return 0;
			
		} else if (_target == 'javascript' ||  _target == 'ipoints' || _target == 'javascriptFallBack') {
			var scriptContent = _request.responseText;
			if (scriptContent) {
				eval(_request.responseText);
			}
			
			if(_target == 'javascriptFallBack'){
				var params = _locale.getParams();
				setLoc(params.locId,params.ll)
				return ;
			}
			
			
		} else if ($D.get(_target)) {
				$D.get(_target).innerHTML = _request.responseText;
				var scriptTag = $D.get(_target).getElementsByTagName('script')[0];
				if (scriptTag) {
					var script = scriptTag.innerHTML;
					eval(script);
				}
		}
		
	};

	this.getSync = function getSync(uri, target, handler) {
		handler = handler || '';
        _sync(uri, target, null, null, false, handler);
    };
	
	this.getAsync = function getAsync(uri, target, businessWord, addressWord, handler) {
        _sync(uri, target, businessWord, addressWord, true, handler);
	};

	this.abort = function() {
		__monitor.off();//necessário ao abortar, caso contrário trava o 'loading...';
		_request.abort();	
	};

};