// START CODE USED FOR AJAX CALLS ------------------------------------------------------------
var Manager;
var Service;
var xmlHttp;
var g_companyFields={};
var g_fieldpackages={};

function Manager() {
	var data_retrieved=false;
	var data_save=false;
	var data_retrieve_field_holder;
	var dr_on=false;
	var self=this;

	this.formDataChanged = function(p_event) {
		var event;
		var e;
		var fieldId;
		var element;
		element = getEventTarget(p_event);
		fieldId = element.id;
		if (!g_companyFields[fieldId])
			fieldId = element.name;
		field = g_companyFields[fieldId];
		if (!field) {
			alert("Could not find field: " + fieldId);
			return;
		}
		value=field.getValue();
		if (value != field.getOriginalValue) 
			field.setValue(value);
	}

	this.getCompanyFieldValues=function() {
		var field_data={};
		for (var key in g_companyFields) {
			if (g_companyFields[key].isInDB()) {
				field_data[key] = g_companyFields[key].getValue();
			}
		}
		return field_data;
	}

	this.getAjaxFieldData=function(key_data) {
		var data = {};
		var json_data;
		var field_data	= {}
		data['tablename'] = 'company';
		data['key_field'] = 'email_address';
		data['key_value'] = key_data;
		field_data = self.getCompanyFieldValues();
		data['data'] = field_data;
		data['comment'] = '';
		json_data = Object.toJSON(data);
		var callback = function(json_data) {
			self.setFieldsFromAjax(json_data);			
		}
		Service.execute("QUERY",json_data,callback);
	}

	this.saveAjaxFieldData=function() {
		var data = {};
		var field_data = {};
		var json_data = {};
		data['tablename'] = 'company';
		data['key_field'] = 'email_address';
		data['key_value'] = '';
		field_data = self.getCompanyFieldValues();
		data['data'] = field_data;
		data['comment'] = '';
		json_data = Object.toJSON(data);
		var callback = function(json_data) {		
		}
		Service.execute("CREATE",json_data,callback);
	}

	this.retrieveAjax = function(key_data) {
		self.clearFields();
		self.getAjaxFieldData(key_data);
	}

	this.setFieldsFromAjax = function(json_data) {
		var data = json_data.evalJSON(true);
		if (data.comment && data.comment=="Record located") {
			for (var key in data.data) {
				if (g_companyFields[key])
					g_companyFields[key].setValue(data.data[key]);
			}
			//self.turnDiv('holder__data_save','off');
		} else {
			//self.turnDiv('holder__data_save','on');
		}
	}

	this.clearFields = function() {
		for (var key in g_companyFields) {
			g_companyFields[key].setValue('');
		}
	}

	this.setDataRetrieved=function() {
		data_retrieved=true;
	}

	this.toggleDataSave = function(value) {
		if (value == true) {
			//self.turnDiv('holder__data_retrieve','off');
			data_save = true;
			g_companyFields['field__data_save'].setValue(true);
		} else  {
			//self.turnDiv('holder__data_retrieve','on');
			data_save = false;
			g_companyFields['field__data_save'].setValue(false);
		}
		
	}

	this.toggleRetrieveField = function() {
		if (dr_on==false) {
			Effect.BlindDown('fields__data_retrieve',{duration:.3});
			dr_on = true;
		} else {
			Effect.BlindUp('fields__data_retrieve',{duration:.3});
			dr_on = false;
		}
	}

	this.turnDiv = function(div,direction) {
		if (direction=='on') {
			Effect.Appear(div,{duration:.3});
			//document.getElementById(div).style.display='block';
		} else {
			Effect.Fade(div,{duration:.3});
			//document.getElementById(div).style.display='none';
		}
	}

	this.getFieldValue = function(id) {
		if (g_companyFields[id])
			return g_companyFields[id].getValue();
	}

}

function getEventTarget(e) {
	if (!e) var e = window.event;
	element=e.target;
	if (!element) element = e.srcElement;
	return element;
}


function DataField(p_fieldid,in_db) {
	var m_field;
	var m_value;
	var m_originalValue;
	var m_db_name;
	var m_in_db;

	var self=this;

	this.init = function() {
		m_field = document.getElementById(p_fieldid);
		m_orginalValue = m_field.value;
		m_db_name = p_fieldid;
		m_in_db = in_db;
	}

	this.setValue = function(p_value) {
		m_value = p_value;
		m_field.value = p_value;
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalValue;
	}

	this.getFieldName=function() {
		return m_field.id;
	}

	this.isInDB = function() {
		return m_in_db;
	}

	this.disable = function() {
		m_field.disabled=true;
	}

	this.enable = function() {
		m_field.disabled=false;
	}

	this.checkfield = function() {
		m_field.checked=true;
	}

	this.uncheckfield = function() {
		m_field.checked=false;
	}

	this.is_checked=function() {
		return m_field.checked;
	}

	self.init();
}

function AjaxService() {  
	var self = this;

	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_function,p_params,callback) {
		var p_responseObject;
		var p_response = null;
		var json_response = null;
		
		var url = "DataManager.php?function=" + p_function;
		var params="json_params=" + p_params;
		var o = document.getElementById('debug_area');
		//o.innerHTML = url + '&json_params=' + p_params;
		p_responseObject = self.getXmlHttpObject();
		
		p_responseObject.open("POST",url,true);
		p_responseObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		p_responseObject.setRequestHeader("Content-length", params.length);
		p_responseObject.setRequestHeader("Connection", "close");
		
		p_responseObject.onreadystatechange=function() {
			
			if ((p_responseObject.readyState==4 || p_responseObject.readyState=="complete")) {
				json_response =  p_responseObject.responseText;
				callback(json_response);
			}
		}
		p_responseObject.send(params);
	}
}


// END  CODE USED FOR AJAX CALLS -------------------------------------------------------------


// This is proof of concept and will be handled more generically later
function DataFieldPackage(p_package,p_master_field) {
	var self = this;
	var m_master_name;
	var m_master_field = {};
	var m_container = {};
	var m_fields = {};
	var m_package = {};

	//  Here are the really specific fields
	var opt_group = {};
	var opt_max=0;
	var opt_count=0;
	
	this.init = function() {
		m_master_name = p_master_field;
		m_container = document.getElementById(p_package);
		m_master_field= new DataField(p_master_field);
	}

	this.addField=function(p_field,in_db,in_opt_group) {
		m_fields[p_field] = new DataField(p_field,in_db);
		if (in_opt_group) {
			opt_group[p_field] = p_field;
		}
	}

	this.setOptMax=function(p_max) {
		opt_max=p_max;
	}

	this.getOptMax = function() {
		return opt_max;
	}

	this.registerCheck=function(is_checked,p_field) {
		if (is_checked)
			opt_count++;
		else
			opt_count--;
		if (opt_count > opt_max) {
			alert("Please select only " + opt_max);
			self.uncheckfield(p_field);
		}
	}

	this.disableGroup = function() {
		for (var key in opt_group) {
			self.uncheckfield(key);
			self.disable(key);
		}
		opt_count=0;
	}

	this.enableGroup = function() {
		for (var key in opt_group) {
			self.enable(key);
		}
	}

	this.enableMaster = function() {
		m_master_field.enable();
	}

	this.disableAll=function() {
		m_master_field.uncheckfield();
		m_master_field.disable();
		for (var key in m_fields) {
			self.disable(key);
		}
		opt_count=0;
	}

	this.enableAll=function() {
		m_master_field.enable();
		for (var key in m_fields) {
			self.enable(key);
		}
	}

	this.checkfield=function(p_field) {
		m_fields[p_field].checkfield();
		if (opt_group[p_field]) {
			self.registerCheck(true,p_field);
		}
	}

	this.uncheckfield=function(p_field) {
		m_fields[p_field].uncheckfield();
		if (opt_group[p_field]) {
			self.registerCheck(false,p_field);
		}
	}

	this.enable = function(p_member_field) {
		m_fields[p_member_field].enable();
	}

	this.disable = function(p_member_field) {
		m_fields[p_member_field].uncheckfield();
		m_fields[p_member_field].disable();
	}
	
	self.init();
}

