var DATA_TYPE_ALHPANUM = 1;
var DATA_TYPE_NUMBER = 2;
var DATA_TYPE_ARRAY = 3;
var DATA_TYPE_BOOL = 4;

var DISPLAY_TYPE_TEXT = 1;
var DISPLAY_TYPE_CHECKRADIO = 2;
var DISPLAY_TYPE_TABLE = 3;
var DISPLAY_TYPE_DROP = 4;

var INPUT_ALPHANUM = 1;
var INPUT_INTEGER = 2;
var INPUT_DECIMAL = 3;
var INPUT_EMAIL = 4;


function detail_title(tit)
{
	return '<p><span class = "detailed_content_title">' +  tit + '</span></p>';
}

function detail_title_data(tit, dat)
{
	return '<p><span class = "detailed_content_title">' +  tit + '</span><span class = "detailed_content_data"/>' + dat + '</span></p>';
}

function detail_data(dat)
{
	if (dat == undefined)
		return"";
	if (dat == null)
		return "";
	var datdat = dat.replace(/ /g, "");
	if (dat.length == 0)
		return "";
		
	return '<p><span class = "detailed_content_data"/>' + dat + '</span></p>';
}





var TitleDropdown = Array();

dropdown_pair.prototype.constructor = new dropdown_pair();
function dropdown_pair(id, val)
{
	this.db_ID = id;
	this.value = val;
}


//dataObj - can automatically fill keys fields from server, automatically fill fields (ie values) from server,
//and display itself in appropriate text fields
dataRecord.prototype = new dataRecord;

dataObj.prototype.constructor = new dataObj;
dataObj.prototype.display = dataObj_display;
dataObj.prototype.fillKeys = dataObj_fillKeys;
dataObj.prototype.fillFieldsFromDB = dataObj_fillFieldsFromDB;
dataObj.prototype.fillFieldsFromHTML = dataObj_fillFieldsFromHTML;
dataObj.prototype.fillEnabledFieldsFromHTML = dataObj_fillEnabledFieldsFromHTML;
dataObj.prototype.getValueForField = dataObj_getValueForField;
dataObj.prototype.clearAllFields = dataObj_clearAllFields;
dataObj.prototype.array_for_DB = dataObj_array_for_DB;
dataObj.prototype.enableAllFields = dataObj_enableAllFields;
dataObj.prototype.clearEnabledFields = dataObj_clearEnabledFields;
dataObj.prototype.enableField = dataObj_enableField;
dataObj.prototype.debugFields = dataObj_debugFields;
dataObj.prototype.TX = dataObj_TX;
dataObj.prototype.DuplicateFields = dataObj_DuplicateFields;
dataObj.prototype.IsEdited = dataObj_IsEdited;
dataObj.prototype.ContainsData = dataObj_ContainsData;



function dataRecord()
{
	this.id = "";
	this.type = -1;
	this.reqd = false;
	this.display_elem = "";
	this.arrayPtr = null;
}


function dataObj(group)
{
	this.fields = Array();
	this.keys = Array();
	this.enabled_fields = Array();
	this.html_group = group + "_";	
}

function dataObj_fillKeys(obj)
{
	var i=0; 

	for (i=1; i <= obj.count_keys; i++) 
	{
		list_str = "obj.k" + i;
		this.keys.push(eval(list_str));
	}
}

function dataObj_fillFieldsFromDB(obj)
{
	var i = 0;
	for(i=0; i < this.keys.length; i++)
	{
		this.fields[this.keys[i]] = eval("obj." + this.keys[i]);
		var elem = gbi(this.html_group + this.keys[i]);
		if (elem != undefined)
		{
			if (elem.type == "checkbox" || elem.type == "radio")
				if (this.fields[this.keys[i]] == "")
					this.fields[this.keys[i]] = '0';
		}
	}
}

function dataObj_getValueForField(fld)
{
	var elem = gbi(this.html_group + fld);
	if(elem == undefined)
		return;

	if ((this.fields[fld] != undefined) && (this.fields[fld].indexOf("SQL_DATE") == 0))
	{
		this.fields[fld] = eval(this.html_group + fld + "_CALENDAR").sqGetSQLDateString();
	}	
	else
	{
		if ((elem.type == "text")||(elem.type == "textarea"))
		{
			var value = gbi(this.html_group + fld).value;
			value = value.replace(/&/g, escape('&'));

			this.fields[fld] = value; 
		}
		else if (elem.type == "checkbox" || elem.type == "radio")
		{
			this.fields[fld] = elem.checked ? '1': '0';
		}
	}
	
}

function dataObj_fillFieldsFromHTML()
{
	var i = 0;
	for(i=0; i < this.keys.length; i++)
	{
		this.getValueForField(this.keys[i]);
	}
}

function dataObj_clearAllFields()
{
	for(i=0; i < this.keys.length; i++)
	{
		if (this.fields[this.keys[i]] != undefined)
		{
			this.fields[this.keys[i]] = "";
		}
	}
}

/*exactly the same as fillFieldsFromHTML, but if its a large form it may be divided into sections, so we may only be storing data for 1 section 
ie - store product data, but ignore contact details*/
function dataObj_fillEnabledFieldsFromHTML()
{
	var i = 0;
	for(i=0; i < this.keys.length; i++)
	{
		var elem_name = this.html_group + this.keys[i];
		if (in_array(this.enabled_fields, elem_name))
		{
			this.getValueForField(this.keys[i]);
		}
	}
}



function dataObj_enableAllFields()
{
	this.enabled_fields.length = 0;
	for(i=0; i < this.keys.length; i++)
	{
		this.enabled_fields.push(this.html_group + this.keys[i]);
	}
}


function dataObj_clearEnabledFields()
{
	this.enabled_fields.length = 0;
}

function dataObj_enableField(name)
{
	this.enabled_fields.push(name);
}

function dataObj_debugFields()
{
	var str = "debug fields \n";
	var i=0; 
	for(i=0; i < this.keys.length; i++)
	{
		if (this.fields[this.keys[i]] != undefined)
		{
			str += this.keys[i] + " " + this.fields[this.keys[i]] + "\n";
		}
	}
	alert(str);
}




function dataObj_display()
{
	var i = 0;
	for(i=0; i < this.keys.length; i++)
	{
		/*if its a date field, set the calendar & the do the display*/
		if ((this.fields[this.keys[i]] != undefined)&&( this.fields[this.keys[i]].indexOf("SQL_DATE") == 0 ))
		{
			var sbd = new SB_Date();

			sbd.fromSQL(this.fields[this.keys[i]].substr(8));
			if (gbi(this.html_group + this.keys[i] + "_CALENDAR_text") != null)
			{
				set_div_text(this.html_group + this.keys[i] + "_CALENDAR_text", sbd.get_date_string());
				eval(this.html_group + this.keys[i]  + "_CALENDAR").sqSetSelected(sbd.day, sbd.month, sbd.year);
				eval(this.html_group + this.keys[i]  + "_CALENDAR").sqScrollTo(sbd.month, sbd.year);
			}
		}
		else 
		{
			var elem = gbi(this.html_group + this.keys[i]);
			if (elem != null)
			{
				if(this.fields[this.keys[i]] != undefined)
				{
					if ((elem.type == "text")||(elem.type == "textarea") )
					{
						elem.value = this.fields[this.keys[i]].replace(/\|n/g, "\n");
					}
					else if (elem.type == "checkbox" || elem.type == "radio")
					{
						elem.checked = (this.fields[this.keys[i]] == 1 );
						/*values can be "" rather than 0 - force it to 0 so we can use the compareObj to detect any changes*/
						if (this.fields[this.keys[i]].length == 0)
							this.fields[this.keys[i]] = '0';

					}
				}
				else
				{
					if (elem.value)
						elem.value = "";
				}
			}
		}
	}
}

function dataObj_array_for_DB()
{
	var ar = Array();
	for(i=0; i < this.keys.length; i++)	
	{
		var elem_name = this.html_group + this.keys[i];
		if (in_array(this.enabled_fields, elem_name))
		{
			ar.push(this.keys[i]);
			if (this.fields[this.keys[i]] == undefined)
				ar.push("");
			else
				ar.push(this.fields[this.keys[i]]);
		}
	}
	return ar;
}

function dataObj_TX(command)
{
	var tar = this.array_for_DB();
	var ar = new Array();
	ar.push('COMMAND');
	ar.push(command);
	array_append(ar, tar);


	var hs = new hs_Transport();
	hs.RequestFromArray(ar);
	hs.TX();
}

function dataObj_DuplicateFields(obj)
{
	var i=0; 
	obj.fields.length = 0;
	obj.keys.length = 0;
	obj.html_group = this.html_group;

	for (i=0; i <= this.keys.length; i++) 
	{
		obj.keys.push(this.keys[i]);
	}

	for(i=0; i < this.keys.length; i++)
	{
		obj.fields[this.keys[i]] = this.fields[this.keys[i]];
	}
}

function dataObj_IsEdited(obj)
{
	var i=0;
	var thisval;
	var objval;
	for(i=0; i < this.keys.length; i++)
	{		
		if (this.fields[this.keys[i]] == undefined)// can happen if no record in db
			thisval = "";
		else
			thisval = this.fields[this.keys[i]].replace("SQL_DATE", "");
		if (obj.fields[this.keys[i]] == undefined)
			objval = "";
		else
			objval = obj.fields[this.keys[i]].replace("SQL_DATE", "");

		if (this.fields[this.keys[i]] == undefined)
			thisval = "";
		if (obj.fields[this.keys[i]] == undefined)
			objval = "";
		/*TODO TO DO - for now, ignore differences where "" != 0*/
		var do_skip = false;
			if (thisval == "" && objval == 0)
				do_skip = true;;
			if (thisval == 0 && objval == "")
				do_skip = true;
			/* ignore differences if a field is disabled*/
			if (do_skip == false)
			{
				var elem = gbi(this.html_group + this.keys[i]);
				if (elem != null)
				{
					if (elem.disabled == true)
						do_skip = true;
				}
			}


		if ((this.keys[i] == "db_Title")||(this.keys[i] == "db_Title2")) //ignore the dropdowns - they are a pain!
			do_skip = true;

		if (this.keys[i] == "db_ShowID")
			do_skip = true;

		if (do_skip == false)
		{
			var testval = thisval.replace(/\|n/g, "\n");
			if (testval != unescape(objval) )
				return true;
		}
	}
	return false;
}

function dataObj_ContainsData()
{
	var i=0;
	for(i=0; i < this.keys.length; i++)
	{		
		if (this.fields[this.keys[i]] != undefined)
		{
			if (this.fields[this.keys[i]].indexOf("SQL_DATE") == -1) /*don't compare date fields - they always contain something*/
				if (this.fields[this.keys[i]].length > 0 )
					return true;
		}
	}
	return false;
}


//push all elements of ar2 onto ar2 (typically ar1 will be the command ar from a a transport command, and ar2 will be the data collected from a form
function array_append(ar1, ar2)
{
	var a = 0; 
	for (a=0; a < ar2.length; a++)
	{
		ar1.push(ar2[a]);
	}
}	

//an existing member logs on - data is displayed in the input fields ready for member to edit
function fill_html_fields(obj, keys_ar, elem_group)
{
	var i = 0;
	for(i=0; i < keys_ar.length; i++)
	{
		var elem = gbi(elem_group + keys_ar[i]);
		if (elem != null)
		{
			var str = "obj." + keys_ar[i];
			var val = eval(str);
			elem.value = val;
		}
	}
}









function fill_array_keys(ar, list)
{
	var i=0; 

	for (i=1; i < list.count; i++) 
	{
		list_str = "list.k" + i;
		ar.push(eval(list_str));
	}
}


/* underline (or whatever) the fields on the form which are required */
function do_requiredFieldsDisplay(html_group, ar)
{
	var i = 0; 
	for (i=0; i < ar.length; i++)
	{
		if (ar[i].required)
		{
			if (gbi(html_group + "_" + ar[i].id) != null)
				gbi(html_group + "_" + ar[i].id).parentNode.style.textDecoration = "underline";
			else
				alert("cannot underline" + ar[i].id);
		}
	}
}


/*validation done on each keyup in a text field*/
function validate_input(dataObj, id, required_ar)
{
	if (gbi(id) == null)
		return;
	var c = 0;
	var ch = "";
	var elem = id.substr(dataObj.html_group.length, id.length - dataObj.html_group.length);
	if (elem == null)
		alert("got elem null " + id);

	//first a general check for js injection type stuff
	var val = gbi(id).value;
	if (val.indexOf("<") != -1)
	{
		val = val.replace(/</g, "");
		ch = "<";
	}
	if (val.indexOf(">") != -1)
	{
		val = val.replace(/>/g, "");
		ch = ">";
	}
	if (val.indexOf(';') != -1)
	{
		val = val.replace(/;/g, "");
		ch = ";";
	}
	if (val.indexOf("|") != -1) /*using | internally for line breaks*/
	{
		val = val.replace(/\|/g, "");
		ch = "|";
	}
	if (ch.length != 0 )
	{
		gbi(id).value = val;
		alert("Sorry - you cannot enter the " + ch + "character - it has been removed.");
		return ch;
	}

	var retVal = "";
	var found = -1;
	for (r=0; r < required_ar.length; r++)
	{
		if (required_ar[r].id == elem)
			found = r;
	}
	if (found >= 0 )
	{
		if (required_ar[found].input_type == INPUT_ALPHANUM)
			return retVal;
		var val_entered = gbi(id).value;
		var new_val = val_entered;
		var char_changed = "";		

		for (c = 0; c < val_entered.length; c++)
		{
		//	ch = val_entered[c];
		ch = val_entered.charAt(c);
			switch (required_ar[found].input_type)
			{
				case INPUT_INTEGER:
					if (ch < '0' || ch > '9')
					{
						char_changed = ch;
						retVal = ch;
						new_val = new_val.replace(ch, '');
					}
					break;
				case INPUT_DECIMAL:
					if ((ch < '0' || ch > '9')&&(ch != '.') )
					{
						char_changed = ch;
						retVal = ch;
						new_val = new_val.replace(ch, '');
					}
					break;				
			}
		}
		if (char_changed.length != 0 )
		{
			if (required_ar[found].input_type == INPUT_INTEGER)			
				alert("This field is numeric - you can only use the characters 1 to 9");
			else
				alert("This field is decimal - you can only use the characters 1 to 9 plus the '.' (decimal point) ");
		}
		gbi(id).value = new_val;
	}
	return ch;			
}
	


/*on submit data, check that all required fields contain data*/
function get_missing_fields_string(dataObj, required_ar)
{
	var k = 0;
	var r = 0;
	var m = 0;

	var Missing = Array();

	for (k=0; k < dataObj.keys.length; k++)
	{
		var found = -1;
		for (r=0; r < required_ar.length; r++)
		{
			if (required_ar[r].id == dataObj.keys[k])
				found = r;
		}
		if (found >= 0 )
		{
			if (required_ar[found].required)
			{
				var req_val = dataObj.fields[dataObj.keys[k]].replace(" ", "");
				if (req_val.length == 0 )
				{
					Missing.push(required_ar[found].display_name);
					gbi(dataObj.html_group  + dataObj.keys[k]).parentNode.style.color = '#d00080';
				}
			}
		}
	}
	var str = "";
	if (Missing.length)
	{
		for(m=0; m < Missing.length; m++)
		{
			str += Missing[m];
			if (m < Missing.length-1)
				str += ", ";			
		}
	}
	return str;
}

