/* *********************************************************************
 * 
 * $Id: manage_data.js 152 2009-11-26 18:31:47Z dhorn $
 * 
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
  * 
*******************************************************************   */
function clearPHPSession(p_sess_var) {
	var svc = new DataService('');
	var arg=[];
	arg[0]=p_session_var;
	svc.executeSpecialService('login.php','clearSession',arg);
}

function setPHPSession(p_sess_var,p_value) {
}

function EditField(p_holder, p_error_holder, p_originalvalue) {
	var m_id;
	var m_field;
	var m_error;
	var m_originalvalue;
	var m_value;
	var self=this;
	
	this.init=function() {
		m_field = (typeof p_holder       == 'string' ? document.getElementById(p_holder) : p_holder );
		m_error = (typeof p_error_holder == 'string' ? document.getElementById(p_error_holder) : p_error_holder );
		if (!m_originalvalue)
			m_originalvalue = (p_originalvalue ? p_originalvalue : m_field.value);
		self.setValue(m_originalvalue);
		m_id = m_field.id;
		self.hideError();
	}

	this.setValue=function(p_value) {
		m_field.value = p_value;
		m_value = p_value;
	}

	this.getValue=function() {
		self.setValue(m_field.value);
		return m_value;
	}

	this.getFieldId=function() {
		return m_id;
	}

	this.getField = function() {
		return m_field;
	}

	this.getOriginalValue=function() {
		return m_originalvalue;
	}

	this.showError = function(p_msg) {
		m_field.style.backgroundColor='#c18787';
		if (m_error) {
			m_error.style.display='';			
			m_error.innerHTML = p_msg;
		}
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error) {
			m_error.style.display='none';
			m_error.innerHTML = '';
		}
	}

	this.reset=function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.init();
}

function HiddenField(p_holder, p_error_holder, p_originalvalue) {
	
}

function DropDownField(p_holder, p_error_holder, p_originalvalue) {
	var self = new EditField(p_holder, p_error_holder, p_originalvalue);
}

function DataManager(m_collection) {
	var Service;
	var m_mode;
	var m_signalHandlers={};
	var m_editFields={};
	var m_changedData={};
	var m_collection;
	var self=this;

	this.init=function() {
		Service=new DataService(m_collection);
		self.setSignalHandler("SUBMIT",this.submit);

		self.setResponseHandler("SubmitResponse",this.handleSubmitResponse);
	}

	this.signal=function(p_signal) {
		p_action = self.getSignalHandler(p_signal);
		p_action();
	}

	this.submit=function() {
		var Params={};
		for (var p_id in m_editFields) {
			
		}
		var Params=m_changedData;
		Params['mode'] = self.getMode();
		Service.execute("SUBMIT",Params);
	}

	this.handleSubmitResponse=function(p_arguments) {
		var p_result = p_arguments.result;
		for (var el in p_result) {
			alert(el + " : " + p_result[el]);
		}
	}

	this.handleSubmitErrors=function(p_response) {
		var p_field_errs = p_response.fieldlevelErrors;
		for (var p_id in p_field_errs) {
			m_editFields[p_id].showError(p_field_errs[p_id]);
		}
	}

	this.handleFormDataChanged=function(p_field) {
		//alert("Updating to " + p_field.value);
		m_editFields[p_field.id].setValue(p_field.value);
		m_editFields[p_field.id].hideError();
		if (p_field.value != m_editFields[p_field.id].getOriginalValue())
			self.setChangedValue(p_field.id,p_field.value);
		else
			self.clearChangedValue(p_field.id);
	}

	this.hideAllFieldErrors=function() {
		for (var p_id in m_editFields) {
			m_editFields[p_id].hideError();
		}
	}

	this.setMode=function(p_mode) {
		m_mode = p_mode;
	}

	this.getMode=function() {
		return m_mode;
	}

	this.enterMode=function(p_mode) {
		// Override this
	}

	this.getService=function() {
		return Service;
	}

	this.setSignalHandler=function(p_signal,p_action) {
		m_signalHandlers[p_signal] = p_action;
	}

	this.setResponseHandler=function(p_response,p_action) {
		Service.setResponseHandler(p_response,p_action);
	}

	this.getSignalHandler=function(p_signal) {
		return m_signalHandlers[p_signal];
	}

	this.getDataFields = function() {
		return m_editFields;
	}

	this.getDataField=function(p_index) {
		return m_editFields[p_index];
	}

	this.getDataFieldObj=function(p_fieldname) {
		return m_editFields[p_fieldname].getField();
	}

	this.addDataField=function(p_field) {
		var p_id = p_field.getFieldId();
		m_editFields[p_id] = p_field;
	}

	this.setChangedValue=function(p_field_id, p_value) {
		m_changedData[p_field_id] = p_value;
		m_editFields[p_field_id].setValue(p_value);
	}

	this.clearChangedValue=function(p_field_id) {
		m_editFields[p_field_id].setValue(m_editFields[p_field_id].getOriginalValue());
		delete (m_changedData[p_field_id]);
	}

	this.init();
}

function DataService(m_collection) {
	var m_responseHandlers={};
	var self=this;

	this.setResponseHandler=function(p_response,p_handler) {  // p_handler is a function that has been passed from the DataManager
		m_responseHandlers[p_response] = p_handler;
	}

	this.setCollection=function(p_collection) {
		m_collection = p_collection;
	}

	this.getResponseHandler=function(p_type) {
		return m_responseHandlers[p_type];
	}

	this.getXmlHttpObject=function() {
		var xmlHttp=null;
		try {
			// Firefox, Opera 8.0+, Safari
			xmlHttp=new XMLHttpRequest();
		} catch (e) {
			//Internet Explorer
			try  {
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
		return xmlHttp;
	}

	this.execute=function(p_rpcname, p_params) {
		var p_url='ajax_utils.php';
		var p_xrq = self.getXmlHttpObject();
		var p_response=null;
		var p_response_text;
		var p_response_type;
		var p_callback;
		var p_args;

		p_args="Collection=" + m_collection + "&" + "RPC=" + p_rpcname + "&Args=" + Object.toJSON(p_params);
		p_xrq.open("POST",p_url,true);
		p_xrq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		p_xrq.setRequestHeader("Content-length", p_args.length);
		p_xrq.setRequestHeader("Connection", "close");
		p_xrq.onreadystatechange=function() {
			if (p_xrq.readyState==4 || p_xrq.readyState=="complete") {
				p_response_text = p_xrq.responseText;
				p_response=p_response_text.evalJSON(true);
				if (p_response.type) {
					p_response_type=p_response.type;
					p_callback = m_responseHandlers[p_response_type];
					p_callback(p_response);
				}
			}
		}
		p_xrq.send(p_args);
	}

	this.executeSpecialClass = function(p_class,p_rpcname,p_params,p_callback) {
		var p_url='ajax_utils.php';
		var p_xrq = self.getXmlHttpObject();
		var p_response=null;
		var p_response_text;
		var p_response_type;
		var p_args;

		p_args="Collection=" + m_collection + "&Class=" + p_class + "&" + "RPC=" + p_rpcname + "&Args=" + Object.toJSON(p_params);
		//alert(p_args);
		p_xrq.open("POST",p_url,true);
		p_xrq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		p_xrq.setRequestHeader("Content-length", p_args.length);
		p_xrq.setRequestHeader("Connection", "close");
		p_xrq.onreadystatechange=function() {
			if (p_xrq.readyState==4 || p_xrq.readyState=="complete") {
				p_response_text = p_xrq.responseText;
				p_response=p_response_text.evalJSON(true);
				p_callback(p_response);
			}
		}
		p_xrq.send(p_args);
	}
}

