function CBusinessObject(ObjectCode, RecordID){
	this.HttpRequest = new CHttpRequest();

	this.OnResponse = "";
	this.AssyncCall = true;
	this.ParseResponse = true;
	this.RawResponse = false;
	this.IsExtension = false;
	
	this.ObjectCode = ObjectCode;
	if(typeof(RecordID) == "undefined")
		this.RecordID = 0;
	else
		this.RecordID = RecordID;
	this.QueryString = "";
	this.ObjectData = null;
	this.Debug = false;
	this.DebugInNewWindow = false;
	this.Context = new Array();

	this.Save = function(sHandlerName){
		this.HttpRequest.QueryString = this.QueryString +"&RequestRecordID=1";
		//this.HttpRequest.OnResponse = this.OnResponse;
		//this.HttpRequest.AssyncCall = this.AssyncCall;
		//this.HttpRequest.Debug = this.Debug;
		//return this.HttpRequest.Send();
		this.RawResponse = true;
		return this.SendRequest(sHandlerName);
	}
	
	this.Load = function(sHandlerName, arRequestProperties){
		if(typeof(arRequestProperties) == "undefined")
			arRequestProperties = new Array();
		//this.HttpRequest = new CHttpRequest();
		this.HttpRequest.AssyncCall = this.AssyncCall;
		this.HttpRequest.AddProperty("nAction", 607);
		this.HttpRequest.AddProperty("ObjectCode", this.ObjectCode);
		this.HttpRequest.AddProperty("RecordID", this.RecordID);
		this.HttpRequest.AddProperty("FunctionName", "__LoadObject");
		for(var i = 0; i < arRequestProperties.length; i++)
			this.HttpRequest.AddProperty("PropertyRequest["+i+"]", arRequestProperties[i]);
		return this.SendRequest(sHandlerName);
	}
	
	this.Call = function(sFunctionName, Arguments, sHandlerName){
		
		//this.HttpRequest = new CHttpRequest();
		this.HttpRequest.QueryString = this.QueryString;
		this.HttpRequest.AssyncCall = this.AssyncCall;
		this.HttpRequest.AddProperty("nAction", 607);
		this.HttpRequest.AddProperty("ObjectCode", this.ObjectCode);
		this.HttpRequest.AddProperty("RecordID", this.RecordID);
		this.HttpRequest.AddProperty("FunctionName", sFunctionName);
		this.HttpRequest.AddProperty("ParseResponse", this.ParseResponse);
		for(var argument in Arguments){
			this.HttpRequest.AddProperty("Arguments["+ argument +"]", Arguments[argument]);
		}
		return this.SendRequest(sHandlerName);
	}

	this.SendRequest = function(sHandlerName){
		this.HttpRequest.Debug = this.Debug;
		this.HttpRequest.DebugInNewWindow = this.DebugInNewWindow;
		this.HttpRequest.Context = this.Context;
		if(typeof(sHandlerName) != 'undefined' && sHandlerName != "")
			this.HttpRequest.AddProperty("HandlerName", sHandlerName);
		this.HttpRequest.AddProperty("IsExtension", ( (this.IsExtension) ? "1" : "0" ) );
		if(this.AssyncCall) {
			if(this.RawResponse && sHandlerName){
				this.HttpRequest.OnResponse = sHandlerName;
			}else{
				this.HttpRequest.OnResponse = "_BoOnRequestComplete";
			}
			this.HttpRequest.Send();			
			return null;
		}else{
			var Request = this.HttpRequest.Send();
			//alert(Request.responseText);
			if(!this.RawResponse){ 
				return _BoOnRequestComplete(Request.responseXML.childNodes[0]);
			}else{			      
				return Request;
			}
		}
	}
}

function CBisinessObjectAction(ObjectCode, ActionCode){ // predi se kazvashe CObjectAction .. ako nqkoi ima problemi => Ivo
	this.HttpRequest = new CHttpRequest();
	this.OnResponse = "";
	this.AssyncCall = true;
	this.ObjectCode = ObjectCode;
	this.ActionCode = ActionCode;
	this.ParseResponse = true;
	
	this.Debug = false;
	this.DebugInNewWindow = false;
	
	this.CallMethod = function(sFunctionName, Arguments, sHandlerName){
		this.HttpRequest = new CHttpRequest();
		this.HttpRequest.AssyncCall = this.AssyncCall;
		this.HttpRequest.AddProperty("nAction", 610);
		this.HttpRequest.AddProperty("ObjectCode", this.ObjectCode);
		this.HttpRequest.AddProperty("ActionCode", this.ActionCode);
		this.HttpRequest.AddProperty("FunctionName", sFunctionName);
		this.HttpRequest.AddProperty("ParseResponse", this.ParseResponse);
		for(var argument in Arguments){
			this.HttpRequest.AddProperty("Arguments["+ argument +"]", Arguments[argument]);
		}
		return this.SendRequest(sHandlerName);
	}
	
	this.SendRequest = function(sHandlerName){
		this.HttpRequest.Debug = this.Debug;
		this.HttpRequest.DebugInNewWindow = this.DebugInNewWindow;
		if(typeof(sHandlerName) != 'undefined' && sHandlerName != "")
			this.HttpRequest.AddProperty("HandlerName", sHandlerName);
		if(this.AssyncCall) {
			if(this.RawResponse && sHandlerName){
				this.HttpRequest.OnResponse = sHandlerName;
			}else{
				this.HttpRequest.OnResponse = "_BoOnRequestComplete";
			}
			this.HttpRequest.Send();			
			return null;
		}else{
			var Request = this.HttpRequest.Send();			
			if(!this.RawResponse){
				return _BoOnRequestComplete(Request.responseXML.childNodes[0]);
			}else{			      
				return Request;
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////////////////////////
function _BoOnRequestComplete(ObjectXML){
	var ResultObject = new Object();
	var HandlerName;
	var i;
	var bParseResponse = true;
	if(ObjectXML == null) 
		return ResultObject;
	
	for(i = 0; i < ObjectXML.childNodes.length; i++){
		//alert(ObjectXML.childNodes[i].tagName.toLowerCase());
		if(ObjectXML.childNodes[i].tagName.toLowerCase() == "response" && bParseResponse){
			//alert('Parsing Response');
			ResultObject = _BoParseResponse(ObjectXML.childNodes[i]);
		}else if(ObjectXML.childNodes[i].tagName.toLowerCase() == "parseresponse"){
			bParseResponse = (ObjectXML.childNodes[i].childNodes[0].text == 'true');
		}else if(ObjectXML.childNodes[i].tagName.toLowerCase() == "handlers"){
			if(ObjectXML.childNodes[i].childNodes.length > 0){
				HandlerName = ObjectXML.childNodes[i].childNodes[0].text;
			}
		}
	}
	ResultObject.__ResponseXML = ObjectXML;
	if(HandlerName != null)
		eval(HandlerName+"(ResultObject);");
	
	return ResultObject;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
function _BoParseResponse(Response){	
	var ResultObject = new Object();
	if(Response == null)
		return ResultObject;
		
	if(Response.childNodes.length == 0 && typeof(Response.nextSibling) != "undefined" && Response.nextSibling != null)	
		Response = Response.nextSibling;			
	
	
	if(Response == null || !Response.childNodes)
		return ResultObject;
	var ObjectProperties = Response.childNodes;
	var Value = null;
	var CurrentProperty = null;
	var i;
	
	for(i = 0; i < ObjectProperties.length; i++){
		CurrentProperty = ObjectProperties[i];
		if((CurrentProperty.childNodes.length == 1 && CurrentProperty.childNodes[0].nodeType == 3) || CurrentProperty.childNodes.length == 0){
			if(CurrentProperty.childNodes.length == 0 && CurrentProperty.nodeType != 3){
				Value = "";
			}else{
				Value = decodeURIComponent(CurrentProperty.text);
			}
		}else{		  
			Value = _BoParseResponse(CurrentProperty);
		}
		if(typeof(CurrentProperty.tagName) != 'undefined'){
			if(typeof(ResultObject[CurrentProperty.tagName]) == 'undefined'){
				ResultObject[CurrentProperty.tagName] = Value;
			}else if(typeof(ResultObject[CurrentProperty.tagName].push) != 'undefined') {
				ResultObject[CurrentProperty.tagName].push(Value);
			}else{
				ResultObject[CurrentProperty.tagName] = new Array(ResultObject[CurrentProperty.tagName], Value);
			}
		}else{
			ResultObject.Value = Value;
		}
	}		
	return ResultObject;
}
