var xmlHttp;

var Service;
var SimpleService;
var g_editFields = {};

var g_groupFields = {};  // this is a hack for now to get the reports in a group


function getXmlHttpObject() {
	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;
}


function setProfile(formName, login, password,go_button, message_box) {
	var qryR;
	var i;
	var fldCt;
	var url = "getQuery.php?qtable=en_company&qfld=login,password&qval=" + login + "," + password + "&enc=0,1&bool=false";
	var obj = document.getElementById(go_button);
	//window.open(url,'_blank');
	xmlHttp = getXmlHttpObject();
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
			qryR = xmlHttp.responseXML;
			if (login != '' && password != '') {
				if(qryR.documentElement.hasChildNodes && qryR.getElementsByTagName("en_company_uid")[0]) {
					
					if (qryR.getElementsByTagName("en_company_uid")[0].hasChildNodes())
						Manager.fieldChangeByName("en_company_uid",qryR.getElementsByTagName("en_company_uid")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("company_name")[0].hasChildNodes())
						Manager.fieldChangeByName("company_name",qryR.getElementsByTagName("company_name")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("addr_1")[0].hasChildNodes())
						Manager.fieldChangeByName("addr_1",qryR.getElementsByTagName("addr_1")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("addr_2")[0].hasChildNodes())
						Manager.fieldChangeByName("addr_2",qryR.getElementsByTagName("addr_2")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("city")[0].hasChildNodes())
						Manager.fieldChangeByName("city",qryR.getElementsByTagName("city")[0].childNodes[0].nodeValue);
						
					if (qryR.getElementsByTagName("state")[0].hasChildNodes())
						Manager.fieldChangeByName("state",qryR.getElementsByTagName("state")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("zip_code")[0].hasChildNodes())
						Manager.fieldChangeByName("zip_code",qryR.getElementsByTagName("zip_code")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("email_address")[0].hasChildNodes())
						Manager.fieldChangeByName("email_address",qryR.getElementsByTagName("email_address")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("contact_last")[0].hasChildNodes())
						Manager.fieldChangeByName("contact_last",qryR.getElementsByTagName("contact_last")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("contact_first")[0].hasChildNodes())
						Manager.fieldChangeByName("contact_first",qryR.getElementsByTagName("contact_first")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("phone")[0].hasChildNodes())
						Manager.fieldChangeByName("phone",qryR.getElementsByTagName("phone")[0].childNodes[0].nodeValue);
					if (qryR.getElementsByTagName("bill_to")[0].hasChildNodes())
						Manager.fieldChangeByName("bill_to",qryR.getElementsByTagName("bill_to")[0].childNodes[0].nodeValue);
					if (message_box != '')
						showMessage(message_box,'#000000','Profile retrieved');
				} else {
					if (message_box != '')
						showMessage(message_box,'#660000','Profile not found');
				}
			}
		}
	}
	xmlHttp.open("GET",url,true);
	xmlHttp.send(null);
	
}

function setLogin(formName, login, password,go_button, message_box) {
	if (login.length < 5) {
		showMessage(message_box,'#660000','Your login should be at least 5 characters long');
	} else if (password.length < 5) {
		showMessage(message_box,'#660000','Your password should be at least 5 characters long');
	} else {
		var qryR;
		var i;
		var fldCt;
		var qresult = "false";
		var url = "getQuery.php?qtable=en_company&qfld=login&qval=" + login + "&enc=0&bool=true";

		var obj = document.getElementById(go_button);
		xmlHttp = getXmlHttpObject();
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
				qryR = xmlHttp.responseXML;
				if(qryR.documentElement.hasChildNodes) {
					if (qryR.getElementsByTagName("qrecord")[0].hasChildNodes()) {
						qresult = qryR.getElementsByTagName("qrecord")[0].childNodes[0].nodeValue;					
					}
				}
				qresult = qresult.replace(/^\s+|\s+$/g, '') ;
				//alert("+" + qresult + "+");
				if (qresult == "true") {
					document.forms[formName]['profile_login'].value = '';
					document.forms[formName]['profile_passwd'].value = '';
					document.forms[formName]['make_login'].value = '0';
					showMessage(message_box,'#660000','That login is unavailable.  Please use another.');
				} else {
					document.forms[formName]['profile_login'].value = login;
					document.forms[formName]['profile_passwd'].value = password;
					document.forms[formName]['make_login'].value = '1';
					showMessage(message_box,'#000000','Your profile will be saved with this login');
				}
			}
		}
		xmlHttp.open("GET",url,true);
		xmlHttp.send(null);
	}
}

function ajaxPassCheck (login,password,message_box,success,goodcolor,failure,badcolor) {
	var qryR;
	var i;
	var fldCt;
	var qresult = "false";
	var url = "getQuery.php?qtable=en_company&qfld=login,password&qval=" + login + "," + password + "&enc=0,1&bool=true";
	xmlHttp = getXmlHttpObject();
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
			qryR = xmlHttp.responseXML;
			if(qryR.documentElement.hasChildNodes) {
				if (qryR.getElementsByTagName("qrecord")[0].hasChildNodes())
					qresult = qryR.getElementsByTagName("qrecord")[0].childNodes[0].nodeValue;
			}
			if (qresult == "true")
				showMessage(message_box,goodcolor,success);
			else
				showMessage(message_box,badcolor,failure);
		}
	}
	xmlHttp.open("GET",url,true);
	xmlHttp.send(null);
}

function showMessage(box_name,color,message) {
		var obj = document.getElementById(box_name);
		if (obj != undefined) {
			obj.style.color = color;
			obj.innerHTML = message;
		}
		return true;
	}


function clearForm(form_name) {
	var n =document.forms[form_name].length;
	for (i=0;i<n;i++) {
		document.forms[form_name][i].value = (fld_vals[document.forms[form_name][i].name] != undefined ? fld_vals[document.forms[form_name][i].name] : '');
		// alert (document.forms[form_name][i].name + " = " + (fld_vals[document.forms[form_name][i].name] != undefined ? fld_vals[document.forms[form_name][i].name] : ''));
	}
}


function mapFloat() {
	
	
}

function mapSet(map_object,current_scale,baseCoord,event) {
	// Get the scalex and scaley of the map
	//
	var coord = new Array(); 
	var box_point = boxClick(map_object,event);
	new_x = (baseCoord[0] + (box_point[0] * current_scale));
	new_y = (baseCoord[1] + (box_point[1] * current_scale));
	coord[0] = new_x;
	coord[1] = new_y;
	return coord;
	
}

function boxClick (id,event) {
	var coord = new Array(); 
	var obj = document.getElementById(id);
	var realpos = findRealPosition(id);
	var new_x = event.offsetX?(event.offsetX):event.pageX-realpos[0];
	var new_y = event.offsetY?(event.offsetY):event.pageY-realpos[1];
	coord[0] = new_x;
	coord[1] = new_y;
	return coord;
	
}

function findRealPosition(id) {
	var retn = new Array;
	var curleft = curtop = 0;
	var obj = document.getElementById(id);
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
		retn[0] = curleft;
		retn[1] = curtop;
		return retn;
	}
}

function crossPollinate(main_form,act_val,actee,on_value,off_value) {
	var x = document.forms[main_form][actee];
	if (act_val == true)
		x.value = on_value;
	else
		x.value = off_value;

	
}

function toggleBoxShow (box) {
	obj = document.getElementById(box);
	if (obj.style.display == 'none') {
		obj.style.display = '';
	} else {
		obj.style.display = 'none';
	}
}

function validateForm(form_id, r_list) {
	var required_list = r_list.split(",");
	var retn = true;
	var frm = document.forms[form_id];
	var obj;
	for (i=0;i<required_list.length;i++) {
		var obj = frm[required_list[i]];
		if (obj == "undefined" || obj.value=="")
			retn = false;
	}

	return retn;
}


function Manager() {
	var m_changedData = {};
	var m_errors = {};
	var m_form;
	var m_general_error_obj;
	var m_general_error_message='Some errors were detected';

	var self = this;

	this.setForm = function(form_id) {
		var err_span;
		m_form = document.forms[form_id];
		// check for general error span
		if (m_form) {
			err_span = m_form.id + "__error";
			m_general_error_obj = document.getElementById(err_span);
		}
		
	}

	this.setFormAction = function(action) {
		if (m_form)
			m_form.action = action;
	}

	this.setVarstoCurrent = function() {
		for (var key in g_editFields) {
			g_editFields[key].setValue(g_editFields[key].getValue());
		}
	}

	this.initvars = function() {
		for (var key in g_editFields) {
			g_editFields[key].init();
		}
	}

	this.formDataChanged = function(p_event) {
		var event;
		var e;
		var fieldId;
		var element;

		element = getEventTarget(p_event);

		fieldId = element.id;

		if (!g_editFields[fieldId])
			fieldId = element.name;

		field = g_editFields[fieldId];

		if (!field) {
			alert("Could not find field: " + fieldId);
			return;
		}

		value=field.getValue();

		if (value != field.getOriginalValue) 
			field.setValue(value);

	}

	this.fieldChangeByName = function(fieldId,value) {
		
		field = g_editFields[fieldId];

		if (!field) {
			alert("Could not find field: " + fieldId);
			return;
		}
		if (value != field.getOriginalValue) 
			field.setValue(value);

		
	}

	this.getFormData = function() {
		var value_pairs = {}
		for (var key in g_editFields) {
			field = g_editFields[key];
			value_pairs[key] = field.getValue();
		}
		var myJson = Object.toJSON(value_pairs);
		return myJson;
	}

	this.setError = function(key,message) {
		m_errors[key] = message;
	}

	this.validateFormData = function () {
		var json_pairs = self.getFormData();
		var p_errors=0;
		
		for (var key in g_editFields) {
			g_editFields[key].setValue(g_editFields[key].getValue());
			if (!g_editFields[key].testRequired()) {
				self.setError(key,'This is a required field.');  
				p_errors++;
			}
		}
			
		// make an AJAX call to test the value pairs on BOCs
		if (Service) {
				var callback = function(ajax_results) {
					var p_errors = self.handleSubmitErrors(ajax_results);
					if (p_errors == 0)
						self.signalSubmit();
				}
				Service.execute("VALIDATE",json_pairs,callback);
				p_errors = 1;
				return p_errors;		
		} else {
			p_errors = self.handleSubmitErrors(m_errors);
			return p_errors;
		}
	}

	this.handleFormSubmit = function() {
		var p_errors = 0;
		var g_found=0;
		var g_chosen=0;
		
		
		self.clearErrors();
		
		p_errors = self.validateFormData();

		// TODO:: take this out - it's getting late so I'm hacking this for the report orders
		err_rt = document.getElementById('error__rt');
		if (err_rt) {
			for (var key in g_editFields) {
				if (g_editFields[key].get_ge() == 'error__rt') {
					g_found++;
					
					if (g_editFields[key].getValue() == 'yes')
						g_chosen++;
				}
				
			}
			if (g_found > 0 && g_chosen == 0) {
				p_errors++;
				document.getElementById('error__rt').innerHTML = 'You must choose at least 1 report';
			} else {
				document.getElementById('error__rt').innerHTML = '';
			}
		}
	
		if (p_errors == 0) {
			document.getElementById('form__error').innerHTML = '';
			self.signalSubmit();
		} else {
			 document.getElementById('form__error').innerHTML = 'Some information is missing or incomplete.  Please check your information.';
		}
	}

	this.handleFormCancel = function(url) {
		window.open(url,"_self");
	}

	this.handleFormReset = function() {
		if (g_editFields) {
			for (var key in g_editFields) {
				g_editFields[key].reset();
			}
		}
	}

	this.handleSubmitErrors = function(ajax_errors) {
		p_errors = 0;
		if (ajax_errors) {
			for(var key in ajax_errors) {
				self.setError(key,ajax_errors[key]);
			}
		}
		for (var key in m_errors) {
			if (g_editFields[key]) {
				field = g_editFields[key];
				field.showError(m_errors[key]);
				p_errors++;
			}
		}
		return p_errors;
	}

	this.signalSubmit = function() {
		var json_pairs = self.getFormData();
		if (Service) {
			var callback = function(p_results) {
				self.submitForm();
			}
			
			Service.execute("CREATE",json_pairs,callback);
		} else {
			self.submitForm();
		}
	}

	this.submitForm = function() {
		//alert('submit');
		if (m_form)
			m_form.submit();
	}

	this.setFieldValue = function(id,value) {
		if (g_editFields[id])
			g_editFields[id].setValue(value);
	}

	this.setOriginalValue = function(id,value) {
		if (g_editFields[id])
			g_editFields[id].setOriginalValue(value);
	}

	this.getFieldValue = function(id) {
		if (g_editFields[id])
			return g_editFields[id].getValue();
	}

	this.clearErrors = function() {
		for (var key in g_editFields) {
			m_errors = {};
			g_editFields[key].hideError();
		}
	}
}

function DataField(p_holder, p_error_holder, p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;       // this is a hack - datafields in group x are grouped together so that ONE of tehm is required
	
	var self = this;

	this.get_ge = function() {
		return m_group_error;
	}

	

	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_value = m_originalvalue;
		
		m_field.value = m_originalvalue;
		m_id = m_field.id;
		self.hideError();
	}

	this.setGroupError = function(value) {
		m_group_error = value;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.setOriginalValue = function(value) {
		m_originalvalue = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		m_field.style.backgroundColor='#c18787';
		if (m_error) {
			
			m_error.innerHTML = error_msg;
		}
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error) {
			
			m_error.innerHTML = '';
		}
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

	self.init();    
}

function FileField(p_holder, p_error_holder, p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	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_value = m_originalvalue;
		m_id = m_field.id;
		self.hideError();
	}

	this.setValue = function(value) {
		//m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_value = m_originalvalue;
		self.init();
		
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		m_field.style.backgroundColor='#c18787';
		if (m_error)
			m_error.innerHTML = error_msg;
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error)
			m_error.innerHTML = '';
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();
}

function TextField(p_holder, p_error_holder, p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var self = this;
	var m_group_error;
	var m_group_error;

	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_value = m_originalvalue;
		m_id = m_field.id;
		self.hideError();
	}


	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {

		if (m_error) {   // Any combination field has only 1 error span
			m_error.innerHTML = error_msg;
		}
		m_field.style.backgroundColor='#c18787';
	}

	this.hideError = function() {
		if (m_error) {
			m_error.innerHTML = '';
		}
		m_field.style.backgroundColor='#ffffff';
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();
}

function TextAreaField(p_holder, p_error_holder,p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	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 );
		
		
		m_id = m_field.id;
		if (!m_originalvalue)
			m_originalvalue = (p_originalvalue ? p_originalvalue : '');
		m_value = m_field.value;
		self.hideError();
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		m_field.style.backgroundColor='#c18787';
		if (m_error)
			m_error.innerHTML = error_msg;
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error)
			m_error.innerHTML = '';
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();
}

function SelectField(p_holder,p_error_holder, p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	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) {
			if (m_field.selectedIndex) {
				m_originalvalue = m_field.options[m_field.selectedIndex].value;
			} else {
				m_originalvalue = (p_originalvalue ? p_originalvalue : '');
			}
		}
		
		m_value = m_originalvalue;
		m_id = m_field.id;
		self.hideError();
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		m_field.style.backgroundColor='#c18787';
		if (m_error)
			m_error.innerHTML = error_msg;
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error) 
			m_error.innerHTML = '';
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();
}

function CheckBoxField(p_holder,p_error_holder, p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_holder;
	var m_group_error;
	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_value = m_originalvalue;
		m_id = m_field.id;
		m_holder = document.getElementById(m_id + '__holder');
		self.hideError();
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		m_field.style.backgroundColor='#c18787';
		m_holder.style.backgroundColor='#c18787';
		if (m_error)
			m_error.innerHTML = error_msg;
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error)
			m_error.innerHTML = '';
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '' || m_field.checked == false)) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();

}

function RadioGroupField(p_holder,p_error_holder, p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	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_value = m_originalvalue;
		m_id = m_field.id;
		self.hideError();
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		m_field.style.backgroundColor='#c18787';
		if (m_error)
			m_error.innerHTML = error_msg;
	}

	this.hideError = function() {
		m_field.style.backgroundColor='#ffffff';
		if (m_error)
			m_error.innerHTML = '';
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();

}

function ButtonField(p_holder,p_originalvalue) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	var self = this;

	this.init = function() {
		m_field = (typeof p_holder       == 'string' ? document.getElementById(p_holder) : p_holder );
		if (!m_originalvalue)
			m_originalvalue = (p_originalvalue ? p_originalvalue : '');
		m_value = m_originalvalue;		
		m_id = m_field.id;
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
	}

	this.hideError = function() {
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();

}

function ComboField(p_holder) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	var self = this;

	function addModelField(id,obj) {
	}

	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 );
		//m_originalvalue = (p_originalvalue ? p_originalvalue : '');
		//m_value = m_originalvalue;
		m_id = m_field.id;
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.addRow = function() {
	}

	this.subtractRow = function() {
	}
	
	this.showError = function(error_msg) {
	}

	this.hideError = function() {
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();

}

function LabelField(p_holder) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_group_error;
	var self = this;

	this.init = function() {
		m_field = (typeof p_holder       == 'string' ? document.getElementById(p_holder) : p_holder );
		m_id = m_field.id;
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_field.value = m_originalvalue;
		init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
	}

	this.hideError = function() {
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();

}

function DateField(p_holder,p_error_holder) {
	var m_id;
	var m_originalvalue;
	var m_field;
	var m_error;
	var m_value;
	var m_required;
	var m_componentFields = {};
	var m_group_error;
	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 );
		m_id = m_field.id;
		self.setValue(m_field.value);
		var c_values = m_value.split("-");
		if (c_values.length < 3) {
			c_values[0]='0000';
			c_values[1]='00';
			c_values[2]='00';
		}
		m_componentFields[m_id + '__year'] = new TextField(m_id + '__year','',c_values[0]);
		m_componentFields[m_id + '__month'] = new TextField(m_id + '__month','',c_values[1]);
		m_componentFields[m_id + '__day'] = new TextField(m_id + '__day','',c_values[2]);
		self.hideError();
		
	}

	this.get_ge = function() {
		return m_group_error;
	}

	this.setValue = function(value) {
		m_field.value = value;
		m_value = value;
	}

	this.reset = function() {
		m_value = m_originalvalue;
		m_field.value = m_originalvalue;
		self.init();
	}

	this.getValue = function() {
		return m_field.value;
	}

	this.getOriginalValue = function() {
		return m_originalvalue;
	}

	this.showError = function(error_msg) {
		if (m_error) {
			
			m_error.innerHTML = error_msg;
		}
		for (var key in m_componentFields) {
			m_componentFields[key].showError();
		}
		
	}

	this.hideError = function() {
		if (m_error) {
			m_error.innerHTML = '';
		}
		for (var key in m_componentFields) {
			m_componentFields[key].hideError();
		}
	}

 	this.dateChanged = function() {
		self.setValue(m_componentFields[m_id + '__year'].getValue() + '-' + m_componentFields[m_id + '__month'].getValue() + '-' + m_componentFields[m_id + '__day'].getValue());
		
	}

	this.testRequired = function() {
		if (m_required && (m_value == null || m_value == '')) {
			self.showError('This is a required field.');
			return false;
		} else {
			return true;
		}
	}

	this.makeRequired = function() {
		m_required = true;
	}

    self.init();	
}

function getEventTarget(e) {
	if (!e) var e = window.event;
	element=e.target;
	if (!element) element = e.srcElement;
	return element;
}


function CompanyProfile() {
	var self = this;
	var m_tablename = 'en_company';
	var m_db_fields = {};
	var m_input_divs;
	var m_error_div;
	var m_data_save;

	this.init=function() {
		self.setdbfields();
	}

	this.setdbfields = function() {
		m_db_fields['company_name'] = '';
		m_db_fields['addr_1'] = '';
		m_db_fields['addr_2'] = '';
		m_db_fields['city'] = '';
		m_db_fields['state'] = '';
		m_db_fields['zip_code'] = '';
		m_db_fields['email_address'] = '';
		m_db_fields['phone'] = '';
		m_db_fields['contact_first'] = '';
		m_db_fields['contact_last'] = '';
		m_db_fields['bill_to'] = '';
	}

	this.toggleDataSave = function(value,key) {
		if (value == true) {
			m_data_save = true;
			g_editFields[key].setValue(true);
		} else  {
			//self.turnDiv('holder__data_retrieve','on');
			m_data_save = false;
			g_editFields[key].setValue(false);
		}
		
	}
	
	this.getProfile = function(input_div, error_div) {
		var lookup_value='';
		m_input_div = document.getElementById(input_div);
		m_error_div = document.getElementById(error_div);
		self.clearFields();
		lookup_value = m_input_div.value;
		if (lookup_value != '')
			self.getAjaxFieldData('email_address',m_input_div.value);
	}
	
	this.getCompanyFieldValues=function() {
		var field_data={};
		var i=0;
		for (var key in m_db_fields) {
			if (g_editFields[key]) {
				field_data[key] = g_editFields[key].getValue();
			}
		}
		return field_data;
	}

	this.getAjaxFieldData=function(key_fieldname,key_data) {
		var data = {};
		var json_data;
		var field_data	= {}
		data['tablename'] = m_tablename;
		data['key_field'] = key_fieldname;
		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);			
		}
		SimpleService.execute("QUERY",json_data,callback);
	}	

	this.saveAjaxFieldData=function(key_fieldname,key_data) {
		var data = {};
		var field_data = {};
		var json_data = {};
		data['tablename'] = m_tablename;
		data['key_field'] = key_fieldname;
		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.submitCompany(json_data);
		}
		SimpleService.execute("CREATE",json_data,callback);
	}
	
	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_editFields[key])
					g_editFields[key].setValue(data.data[key]);
			}
		} else {
			if (data.comment && m_error_div != undefined)
				m_error_div.innerHTML = data.comment;
		}
	}

	this.clearFields = function() {
		var field_data = self.getCompanyFieldValues();
		
		for (var key in field_data) {
			g_editFields[key].setValue('');
		}
	}

	this.handleCompanySubmit = function() {
		var p_errors;
		Manager.clearErrors();
		if (m_data_save) {
			var p_errors = Manager.validateFormData();
			if (p_errors == 0)
				self.saveAjaxFieldData('email_address','');
		} else {
			Manager.handleFormSubmit();
		}
	}

	this.submitCompany = function(json_data) {
		var data = json_data.evalJSON(true);
		var comment = data.comment;
		var tmp;
		if (data.comment && data.comment=="Record was created") {
			Manager.handleFormSubmit();
		} else {
			if (comment != undefined && data.key_field) {
				// special case - duplicate - should be most common
				tmp = comment.split(":");
				if (tmp.length == 3 && tmp[1] == " 1062")
					comment = "A record has already been created with that identifier";
				g_editFields[data.key_field].showError(comment);
				self.showError('form__error',comment);
			}
		}
		//Manager.handleFormSubmit();		
	}


	this.showError = function(error_div,message) {
		var obj = document.getElementById(error_div);
		if (obj != undefined)
			obj.innerHTML = message;
	}
	
	self.init();
}

function SimpleAjaxService() {
	// TODO: I'm using this to make an ajax service that does not use collections (see DataManager.php)
	//  I made a lot of my calls hodge-podge and I need to go back someday and create a consistent method
	//  of handling data requests
	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);
	}
}


function AjaxService(m_collection, m_object_name) {
	var self = this;
	var ajaxHTMLObject;

	this.setCollection = function(collection) {
		m_collection = collection;
	}

	this.setObject = function(object) {
		m_object_name = object;
	}

	this.getResponseObject = function() {
		var ajaxHTMLObject=null;
		try {
			// Firefox, Opera 8.0+, Safari
			ajaxHTMLObject=new xmlHttpRequest();
		} catch (e) {
			//Internet Explorer
			try  {
				ajaxHTMLObject=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				ajaxHTMLObject=new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
		return ajaxHTMLObject;
	}


	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 o = document.getElementById('form_spacer');
				

		var p_responseObject;
		var p_response = null;
		var json_response = null;
		if (!m_collection)
			m_collection = '';
		var o = document.getElementById('form_spacer');
		
		var url = 'manager.php?collection=' + m_collection + '&object=' + m_object_name + "&function=" + p_function;
		var params="json_params=" + p_params;
		o.innerHTML = url + '<br />\n' + 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;
				p_response = json_response.evalJSON(true);
				//alert(callback);
				//o.innerHTML = json_response;
				callback(p_response);
				
				
			}
		}
		
		p_responseObject.send(params);
	}
	
}

function FieldGroup() {
	var self = this;

	this.formDataChanged = function(fieldId,value) {

		var fieldId;

		fieldId = element.id;

		field = g_editFields[fieldId];

		if (!field) {
			alert("Could not find field: " + fieldId);
			return;
		}

		value=field.getValue();

		if (value != field.getOriginalValue) 
			field.setValue(value);

	}
	
}
