function glDoAjaxCall(link, targetId, href) {
	var url = (link) ? link.href : unescape(escape(href));
	var http = new HTTP(url);
	http.addParameter('fromAjax', 'true');
	http.isFromAjax = false;
	http.link = link;
	http.target = findObject(targetId);
	http.cbObject = http;
	http.cbName = 'loadIntoTarget';
	http.call();
}

function HTTP(url, cbObject, cbName) {
	this.url = url;
	this.cbObject = cbObject;
	this.cbName = cbName;
	this.isCallUpdateData;
	this.isFromAjax = true;
	
	var _http = false;
	var self = this;
	
	var _parameters = new Array();
	this.addParameter = function(name, value) {
		var p = new Object();
		p.name = name;
		p.value = encodeURIComponent(value);
		_parameters[_parameters.length] = p;
	}
	this.loadIntoTarget = function(responseText) {
		var t;
		if ( this.target ) {
			t = this.target;
	//	} else {
	//		t = this.link.parentNode;
		}
		if ( !t ) {
			return;
		}
		t.style.position = 'absolute';
//		t.style.overflow = 'scroll';
		t.style.visibility = 'visible';
		t.innerHTML = responseText;
	}

	function addNodeParameter() {
		var node = self.node;
		if ( node && node.fullName ) {
			self.addParameter('nodeId', node.fullName);			
			addParentParameter(node);			
		}
	}

   this.clearParameter = function() {
		_parameters = new Array();
   }
   this.call = function() {
   	  _http = null;
	      if (window.XMLHttpRequest) { 
	         _http = new XMLHttpRequest();
	         if (_http.overrideMimeType) {
	            _http.overrideMimeType('text/html');
	         }
	      } else if (window.ActiveXObject) { // IE
	         try {                
	            _http = new ActiveXObject("Msxml2.XMLHTTP");
	         } catch (e) {
	            try {
	               _http = new ActiveXObject("Microsoft.XMLHTTP");
	            } catch (e) {}
	         }
	      }
      if (!_http) {
         alert('Failed to create XMLHTTP instance');
         return false;
      }
      if ( self.node ) {
      	addNodeParameter();
      }
      
      if ( self.isFromAjax ) {
      	self.addParameter('fromAjax', 'true');
      }
      
      _http.onreadystatechange = self.handleResponse;
      try {
	      _core.log('Call: ' + this.url, IConstant.LOG_USER_LEVEL);
	  } catch (e) {}
      
      _http.open('POST', this.url, true);
      _http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      
		var pStr = '';
		var sign = '';
		for (var i=0; i<_parameters.length; i++) {
			var p = _parameters[i];
			pStr += sign + p.name;
			pStr += '=';
			pStr += p.value;
			sign = '&';
		}
		_http.send(pStr);
   }
	
	this.getFullUrl = function() {
		var pStr = '';
		var sign = '';
		for (var i=0; i<_parameters.length; i++) {
			var p = _parameters[i];
			pStr += sign + p.name;
			pStr += '=';
			pStr += p.value;
			sign = '&';
		}
		return this.url + '?' + pStr;
	}
	this.handleResponse = function() {
		if ( !_http ) {
			return;
		}
    	 if (_http.readyState == 4) {
         if (_http.status == 200) {                  	     
            if ( self.cbObject && self.cbName ) {
            	if ( self.node || self.isCallUpdateData ) {
            		if ( updateDBData() ) {
            			self.cbObject[self.cbName](_http.responseText, self);
            		}
            	} else {
            	//	if ( checkError() ) {
		            	self.cbObject[self.cbName](_http.responseText, self);
		      //      }
	            }
            } else {
				if ( self.errorCb ) {
					self.errorCb[self.errorCbName](_http.responseText, self);
				}            
            	checkError();
	    //       alert(_http.responseText);
	        }
         } else {
         	if ( self.errorCb ) {
		        self.errorCb[self.errorCbName](_http.responseText, self);
		    } else {
		    	if ( _http.status * 1 >= 400 ) {
		         	alert('Server error: ' + _http.status + '\n' + _http.statusText);
		        }
	        }
         }
         _http = null;
       }	
	}   
	
	function addParentParameter(node) {
		var ps = new Array();
		var parent = node.parent;
		while ( parent ) {			
			ps[ps.length] = parent;
			parent = parent.parent;
		}
		if ( ps.length < 1 ) {
			return;
		}
		for (var i=ps.length - 1; i>=0; i--) {
			var fullName = ps[i].fullName;
			if ( fullName && fullName != 'root' ) {
				self.addParameter('parents', fullName);
			}
		}
	}	
	

	
	function checkError() {
		var responseText = _http.responseText;
		if ( !_core ) {
			return true;
		}
		var dbNode = Core.parseJSON(responseText);
		if ( !dbNode ) {
			return true;	
		}
		if ( dbNode.isError ) {
			alert('Internal error: ' + dbNode.message);
			return false;
		}
		return true;
	}			
	
	function updateDBData() {
		var responseText = _http.responseText;
		_core.log('json parsing begin.', IConstant.LOG_DEVELOPER_LEVEL);
		var dbNode = Core.parseJSON(responseText);
		_core.log('json parsing end.', IConstant.LOG_DEVELOPER_LEVEL);
		if ( !dbNode ) {
			if ( _core && _core.editor ) {
				_core.editor.closeMessageBox();	
			}
			//alert(	responseText );
			//_core.showMessage('Error', 'Invalid data format returned by server. Please refresh the page or relog in.');
			return false;		
		}
	//	alert(responseText);
		if ( dbNode.isError ) {
			if ( dbNode.isLogonInError ) {
				if ( self.errorCb ) {
					self.errorCb[self.errorCbName](_http.responseText, self);
				}
				alert('Your session has timed out, please login again.');
				window.location.href = 'index.do';
				return;
			}
			if ( _core ) {
				if ( _core.editor ) {				
					_core.editor.closeMessageBox();	
					_core.editor.clearActionNewNode(null);
					alert(dbNode.message);
//					_core.showMessage('Error', dbNode.message);
				}
				_glActionData = null;
			} else {
				alert(dbNode.message);			
			}
			if ( self.errorCb ) {
				self.errorCb[self.errorCbName](_http.responseText, self);
			}
			
			return false;
		}
		self.dbNode = dbNode;
		return true;
	}				
}

HTTP.prototype.nodeToId = function(node) {
	return Core.nodeToId(node);
}