function handleEnter(form,e) {
	var charCode;
	if(e && e.which) {
        	charCode = e.which;
	} else if (window.event) {
        	e = window.event;
        	charCode = e.keyCode;
    	}
	
	if(charCode == 13) {
		customAdd(form);
    	}
}


function submitEdit(field,sel) {
        var edit = document.getElementById(field+'_edit');
        var old = document.getElementById(field);
	var str = edit.value;

	if(sel !== 1) {
		var str = str.replace(/ /g,"_").replace(/,/g,".").replace(/:::/g,":;:");
	}

	if(str == ''||str== '_') {
		alert('Field may not be blank.');
		return false;
	}

        old.innerHTML = str;
        edit.style.display = 'none';
        old.style.cssText = 'display:inline';
	if(def = document.getElementById(field+'_default')) {
		def.style.cssText = 'display:inline';
	        if(def.name != edit.value) {
                old.style.cssText = 'color:rgb(255,0,0)';
        	}
	}
}

function editBrick(field,sel,blank) {
        var element = document.getElementById(field);
        var current = element.innerHTML;
        element.style.cssText = 'display:none';
	if(def = document.getElementById(field+'_default')) {
		def.style.cssText = 'display:none';
	}
	if(document.getElementById('opdiv')) {
		var div = document.getElementById('opdiv');
		div.innerHTML = "";
	}

        var edit = document.getElementById(field+'_edit');
        edit.style.cssText = 'display:inline';
        if(sel == 1) {
                for (i = 0; i < edit.options.length; i++) {
                        if(edit.options[i].value == current) {
                                edit.options[i].selected = true;
                                break;
                        }
                }
                edit.focus();
		edit.onchange = function() {submitEdit(field,1)};
		edit.onblur = function() {submitEdit(field,1)};
        } else {
		if(blank == null) {
                	edit.value = current.replace(/ /g,"_").replace(/,/g,".").replace(/:::/g,":;:");
		} else {
			document.getElementById(field + '_blank').style.cssText = 'display:none';
		}
                edit.select();
	        edit.onblur = function() {submitEdit(field)};
	}
}

function defaultBrick(id) {
	def_value = document.getElementById(id).name;
	id = id.slice(0,-8);
	var element = document.getElementById(id);
	element.innerHTML = def_value;
	element.style.cssText = 'color:black';
	if(document.getElementById('opdiv')) {
		var div = document.getElementById('opdiv');
		div.innerHTML = "";
	}
}

function defaultAll() {
	var type = document.getElementById('type').innerHTML;
	if(type == "Promoter") {
		if(prom_def = document.getElementById('oplist_default')) {
			var prom_old = document.getElementById('oplist');
			var prom_empty = document.getElementById('no_ops_span');
			prom_old.innerHTML = prom_def.innerHTML;
			if(prom_empty.style.display == "block") {
				prom_empty.style.cssText = "display:none";
				prom_old.style.cssText = "display:block;padding-bottom:10px";
			}
		}
		var tog = document.getElementById('const');
		tog.innerHTML = "ON";
	}
	if(type == "Coding DNA") {
		if(prot_def = document.getElementById('prot_name_default')) {
			var prot_name = document.getElementById('prot_name');
			var prot_type = document.getElementById('prot_type');
			prot_name.innerHTML = prot_def.name;
			prot_name.style.cssText = '';
			prot_type.innerHTML = 'Please select type';
			prot_type.style.cssText = 'color:red';
		}
	}
}

function addOp() {
	var div = document.getElementById('opdiv');
	var html = "<br><form style='padding-top:5px;'>Operator Name: <input type='text' id='addopname'> ";
	html += "Operator Location: <select id='addoptype'>";
	html += "<option value='Upstream of -35'>Upstream of -35</option>";
	html += "<option value='Between -35 and -10'>Between -35 and -10</option>";
	html += "<option value='Downstream of -10'>Downstream of -10</option></select>";
	html += " <input type='button' onClick='submitAddOp(1,this.form)' value='Add Operator' />";
	html += "<input type='button' onClick='submitAddOp(0)' value='Cancel' /></form>";
	div.innerHTML = html;
	div.style.cssText = 'display:inline';
}

function submitAddOp(k,form) {
	if(k==1) {
		var opname = form.addopname.value.replace(/ /g,"_").replace(/,/g,".").replace(/:::/g,":;:");
		if(opname == '') {
			alert('Operator name may not be blank.');
			return false;
		}
		var txt = form.addoptype.value;
	//	var deft = "<<";
		var li = document.createElement("li");
		li.id = opname;
		html = "<img src='images/delete.gif' style='vertical-align: bottom;' name='"+opname+"' ";
		html +="title='Delete operator site' onClick=delOp(this.name)> ";
		html +="<a href=# id='op_"+opname+"' name='"+opname+"' onClick=editBrick(this.id)>"+opname+"</a> ";
		html +="<input type='text' class = 'tb' id='op_"+opname+"_edit' style='display:none' onBlur='submitTextEdit(this.id)'/> ";
	//	html +="<a class='default' href=# id='op_"+opname+"_default' onClick=defaultBrick(this.id)>"+deft+"</a>";
		html +=" (<a href=# id='op_type_"+opname+"' name='"+txt+"' onClick=editBrick(this.id,1)>"+txt+"</a>";
		html +="<select class='sb' id='op_type_"+opname+"_edit' style='display:none'>";
		html +="<option value='Upstream of -35'>Upstream of -35</option>";
		html +="<option value='Between -35 and -10'>Between -35 and -10</option>";
		html +="<option value='Downstream of -10'>Downstream of -10</option>";
		html +="</select>) ";
	//	html +="<a class='default' href=# id='op_type_"+opname+"_default' onClick=defaultBrick(this.id)>"+deft+"</a>";
		li.innerHTML = html;
		document.getElementById('oplist').appendChild(li);
	}
	//Clear submission div
	var div = document.getElementById('opdiv');
	div.innerHTML = "";
	// Clear "none" (if any) from behind "Operator Sites:"
	var span = document.getElementById('no_ops_span');
	span.style.cssText = 'display:none';
	// Show operators
	document.getElementById('oplist').style.cssText = 'display:block;padding-bottom:10px';
}

function delOp(op) {
	var element = document.getElementById('op_'+op);
	var del = element.parentNode;
	if(confirm('Are you sure you want to delete '+op+'?')) {
		del.parentNode.removeChild(del);
	}
	// If no more operators, display message
	if(document.getElementById('oplist').childNodes.length==0) {
		document.getElementById('oplist').style.cssText = 'display:none';
		document.getElementById('no_ops_span').style.cssText = 'display:block;padding-bottom:10px';
	}
/*	else {
		chk = 1;
	}
	if(chk!=1) {
		//Clear submission div
		var div = document.getElementById('opdiv');
		div.innerHTML = "";
	}
*/
}

function customAdd(form) {
	// Get input
	var id = form.acbbid.value.replace(/ /g,"_").replace(/,/g,".").replace(/:::/g,":;:");
	var type = form.acbbtype.value;

	if(id == ''||id == '_') {
		alert('Brick ID may not be blank.');
		return false;
	}

	// Put into json form
	//var json = '{"title":{"type":"text","$t":"' + id + '"},';
	//json += '"g$type":[{"type":"text","$t":"' + type + '"}]}';

	// Add using AJAX
	addBrick(id,type);

	// send with feat = 3
	//sendJSON(json,3);
}

function toggleBrick() {
        var tog = document.getElementById('const');
        if(tog.innerHTML == 'OFF') {
                tog.innerHTML = 'ON';
        } else {
                tog.innerHTML = 'OFF';
        }
}

function printTable(j) {
	var json = j.feed.entry;
	var tot_res = parseInt(j.feed.openSearch$totalResults.$t);
	var ind_begin = parseInt(j.feed.openSearch$startIndex.$t);
	var per_page = parseInt(j.feed.openSearch$itemsPerPage.$t);

	var num_entries = j.feed.entry.length;
	var ind_end = ind_begin + num_entries -1;

	// Set up tables
	var table = '<table border="1" style="text-align:left">';
	table += '<tr><td colspan="3" style="text-align:center"><h3>SEARCH RESULTS</h3></td></tr>';
	table += '<tr><td style="text-align:center;"><h4>Protein</h4></td><td colspan=2 style="text-align:center;"><h4>Brick<h4></td></tr>';

	// Loop through entries
	var i;
for(i=0;i<num_entries;i++) {
	var entry = json[i];
	var brick = entry['g$parent_part'][0]['$t'];
	if(brick.length<=9&&brick.substr(0,3)=="BBa") {
		table+= "<tr>";
		var name = entry['content']['$t'];
		table+= "<td>" + name + "</td>";
		table+= "<td><a class='normal' href='http://partsregistry.org/wiki/index.php?title=Part:" + brick + "' onclick='window.open(this.href);return false;'>" + brick + "</a></td>";
		var len = entry['g$end'][0]['$t'] - entry['g$start'][0]['$t'] + 1;
	//	table+= "<td>" + len + "</td>";
		table+= "<td><input type='button' onclick='search(\"" + brick + "\")' value='Add' /></td>";
		// etc.
		table+= "</tr>";
	}
}

	table += '</table>';

if(tot_res!=0) {
	table+= "<p>";
	if(ind_begin!=1)
		table+= "<a onclick=#>&lt;&lt;Previous</a>";
//	table+= " Displaying results " + ind_begin + " to " + ind_end + " of " + tot_res + ". ";
	if(ind_end!=tot_res)
//		table+= "<a onclick=#>Next&gt;&gt;</a>";
	table+= "</p>";
}
else {
	table+= "No results found; please review query value(s).";
}

// print
	var div = document.getElementById("qdata");
	div.innerHTML = table;
}

var bad_chars = new Array();
bad_chars[0] = " ";
bad_chars[1] = ",";
bad_chars[2] = ":::";
var sub_clicked = '';

// check if the php script has inserted any errors that would prevent advancing to the next page
// if errors are found (i.e., if the error_msg variable is set from php), display them
function advance_page(next_page)
{
	if ((typeof(error_msg) != "undefined") && (typeof(error_msg) != null))
	{
		alert(error_msg)
	}
	else
	{
		location.href = next_page;
	}
}

// check submission of interface pages
function check_interface()
{
	//
	// Begin Functions for Interface 1
	//

	// check to be sure "BioBrick ID" field doesn't contain any forbidden chars
	if (sub_clicked == 'bb_add')
	{
		field_value = document.getElementById("bb_id").value;
		if (check_string(field_value) != 0)
		{
			return false;
		}
		if (field_value == '')
		{
			alert('BioBrick ID may not be blank.');
			return false;
		}
	}

	// check to be sure "BioBrick ID" field doesn't contain any forbidden chars
	if (sub_clicked == 'bb_qadd')
	{
		field_value = document.getElementById("bb_qid").value;
		if (check_string(field_value) != 0)
		{
			return false;
		}
		if (field_value == '')
		{
			alert('This BioBrick does not have a valid database ID; please build a custom BioBrick.');
			return false;
		}
	}

	// check that operator name doesn't contain any forbidden chars
        if (sub_clicked == 'op_add')
        {
		field_value = document.getElementById("op_name").value;
                if (check_string(field_value) != 0)
                {
			return false;
                }
		if (field_value == '')
		{
			alert('Operator Name may not be blank.');
			return false;
		}
        }

        // check that operator name doesn't contain any forbidden chars
        if (sub_clicked == 'prot_add')
        {
		field_value = document.getElementById("prot_name").value;
                if (check_string(field_value) != 0)
                {
			return false;
                }
                if (field_value == '')
                {
                        alert('Protein Name may not be blank.');
                        return false;
                }
        }


	//
	// Begin Functions for Interface 2
	//

        // check that protein name doesn't contain any forbidden chars
        if (sub_clicked == 'prot_add_2')
        {
		field_value = document.getElementById("prot_name").value;
                if (check_string(field_value) != 0)
                {
                        return false;
                }
                if (field_value == '')
                {
                        alert('Protein Name may not be blank.');
                        return false;
                }
        }

        // check that complex number doesn't contain any forbidden chars
        if (sub_clicked == 'comp_add')
        {
		field_value = document.getElementById("comp_sub").value;
                if (check_string(field_value) != 0)
                {
                        return false;
                }
                if (field_value == '')
                {
                        alert('Number of Subunits in Complex may not be blank.');
                        return false;
                }
		// also must check that input is an integer and no other type
		if (!is_int(field_value))
		{
			alert('Number of Subunits in Complex must be an integer.');
			return false;
		}
        }

	//
	// Begin Functions for Interface 3
	//

        // check that effector name doesn't contain any forbidden chars
        if (sub_clicked == 'eff_add')
        {
		field_value = document.getElementById("eff_name").value;
                if (check_string(field_value) != 0)
                {
                        return false;
                }
                if (field_value == '')
                {
                        alert('Effector Name may not be blank.');
                        return false;
                }
        }

        // check that max effectors per complex doesn't contain any forbidden chars
        if (sub_clicked == 'num_add')
        {
		field_value = document.getElementById("eff_num").value;
                if (check_string(field_value) != 0)
                {
                        return false;
                }
                if (field_value == '')
                {
                        alert('Max Effectors per Complex may not be blank.');
                        return false;
                }
                // also must check that input is an integer and no other type
                if (!is_int(field_value))
                {
                        alert('Max Effectors per Complex must be an integer.');
                        return false;
                }
        }

	//found no errors in input -- goodie gumdrops!
	return true;
}

// check one string for forbidden strings, return value is the number of types of bad char. found
function check_string(in_str)
{
	return_value = 0;
	for (i=0; i<= (bad_chars.length-1); i++)
	{
		bad_char = bad_chars[i];
		in_str   = in_str.toString();
                if (in_str.indexOf(bad_char) != -1)
		{
                        alert("Input cannot include the character \'" + bad_chars[i] + "\'");
			return_value++;
                }
        }
	return return_value;
}

// returns true if value contains all digits
function is_int(val)
{
	for (var i=0; i<val.length; i++)
	{
		//if (!isDigit(val.charAt(i)))
		if (isNaN(parseInt(val.charAt(i))))
		{
			return false;
		}
	}
	return true;
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}
