var selectUpdater = {
	get_lu: function (name, table) {
		c = ajax(function() {
				document.getElementById(name).innerHTML = c.responseText;
				if(document.getElementById(name).innerHTML.substr(0,1) != '<')
					document.getElementById(name).innerHTML = '<option /><option>'+document.getElementById(name).innerHTML;
			},'');
		c.open('GET','/ajax/get.php?table='+table,true);
		c.send(null);
	},
	
	change_lu: function (table, select) {
		var option = select.options[select.selectedIndex];
		var display = window.prompt('Change value to...?',option.text);
		if(display) {
			c = ajax(function() {
					document.getElementById(select.name).innerHTML = c.responseText;
				},'');
			c.open('GET','/ajax/change.php?table='+table+'&id='+option.value+'&value='+display,true);
			c.send(null);
		}
	},
	
	delete_lu: function (table, select) {
		var option = select.options[select.selectedIndex];
		var display = window.confirm('Delete table: "' + table + '" value: ' + option.value + ', "' + option.text + '"\nAre you sure?');
		if(display) {
			c = ajax(function() {
					document.getElementById(select.name).innerHTML = c.responseText;
				},'');
			c.open('GET','/ajax/delete.php?table='+table+'&value='+option.value,true);
			c.send(null);
		}
	},
	
	// Runs the ajax call to update the db, passes new value to update all boxes
	add_lu: function (name, table, column) {
		var display = window.prompt('New '+column+' to add?','');
		if(display) {
			c = ajax(function() {
					selectUpdater.update_all(column, display, eval('c.responseText'));
					document.getElementById(name).value = eval('c.responseText');
				},'');
			c.open('GET','/ajax/update.php?table='+table+'&column='+column+'&value='+display,true);
			c.send(null);
		}
	},
	
	// Updates all combo boxes stored in the listener listening to 'column' with display/value
	update_all: function (column, display, value) {
		o = document.createElement('option');
	    o.text = display;
	    o.value = value;
		for(var i=0; i < selectUpdater.listener.l[column].length; i++) { 
			if(document.getElementById(selectUpdater.listener.l[column][i])) {
				try { document.getElementById(selectUpdater.listener.l[column][i]).add(o.cloneNode(true),null); } // standards
				catch (e) { document.getElementById(selectUpdater.listener.l[column][i]).add(o.cloneNode(true)); } // ie
			} else {
				try { objectCreator.selectNodes.o[selectUpdater.listener.l[column][i]].add(o.cloneNode(true),null); } // standards
				catch (e) { objectCreator.selectNodes.o[selectUpdater.listener.l[column][i]].add(o.cloneNode(true)); } // ie
			}
		}
	},

	listener: {
		l: new Object,
		register: function(name, type) { 
			if(!this.l[type]) this.l[type] = new Array;
			this.l[type][this.l[type].length] = name;
			//alert('registered '+name+' to '+type);
		},
		unregister: function(name, type) {
			// Yeah yeah, this doesnt do anything right now, but it will be if its needed
			return true;
		}
	}
};

var objectCreator = {
	newTextInput: function(id) { 
		var table = arguments[1] ? arguments[1] : null; 
		var i;
		if(table) {
			var l = document.getElementById(table+'_length').value;
			try {  // for ie
				i = document.createElement('<input id="'+id+l+'" name="'+id+l+'" />');
			} catch(e) {  // for everything else
				i = document.createElement("input");
				i.setAttribute("name",id+l);
				i.setAttribute("id",id+l);
			}
		} else {
			try {  // for ie
				i = document.createElement('<input id="'+id+'" name="'+id+'" />');
			} catch(e) {  // for everything else
				i = document.createElement("input");
				i.setAttribute("name",id);
				i.setAttribute("id",id);
			}
		}
		i.setAttribute("type","text");
		return i;
	},
	
	newTextArea: function(id) { 
		var table = arguments[1] ? arguments[1] : null;
		var i;
		if(arguments[2]) var width = arguments[2];
		if(arguments[3]) var height = arguments[3];
		if(table) {
			var l = document.getElementById(table+'_length').value;
			try {  // for ie
				i = document.createElement('<textarea id="'+id+l+'" name="'+id+l+'" />');
			} catch(e) {  // for everything else
				i = document.createElement("textarea");
				i.setAttribute("name",id+l);
				i.setAttribute("id",id+l);
			}
		} else {
			try {  // for ie
				i = document.createElement('<textarea id="'+id+'" name="'+id+'" />');
			} catch(e) {  // for everything else
				i = document.createElement("textarea");
				i.setAttribute("name",id);
				i.setAttribute("id",id);
			}
		}
		if(width) i.setAttribute("cols",width);
		if(height) i.setAttribute("rows",height);
		return i;
	},
	
	newCheckbox: function(id) {
		var table = arguments[1] ? arguments[1] : null; 
		var i;
		if(table) {
			var l = document.getElementById(table+'_length').value;
			try {  // for ie
				i = document.createElement('<input id="'+id+l+'" name="'+id+l+'" />');
			} catch(e) {  // for everything else
				i = document.createElement("input");
				i.setAttribute("name",id+l);
				i.setAttribute("id",id+l);
			}
		} else {
			try {  // for ie
				i = document.createElement('<input id="'+id+'" name="'+id+'" />');
			} catch(e) {  // for everything else
				i = document.createElement("input");
				i.setAttribute("name",id);
				i.setAttribute("id",id);
			}
		}
		i.setAttribute("type","checkbox");
		return i;
	},
	
	newAddButton: function(name,table,column) {
		var i = document.createElement('button');
		i.setAttribute("onclick","selectUpdater.add_lu('"+name+"','"+table+"','"+column+"');return false;");
		// ie is stupid
		i.onclick = new Function(i.getAttribute('onclick'));
		i.innerHTML = 'Add new '+column;
		return i;
	},
	
	newDeleteRowButton: function(table,row) {
		var b = document.createElement('button');
		b.setAttribute('onclick',"objectCreator.deleteRow('"+table+"','"+table+row+"');return false;");
		b.onclick = new Function(b.getAttribute('onclick'));
		b.innerHTML = 'Delete Row';
		return b;
	},
	
	newContactRow: function(table) {
		var l = this.autocountTable(table);
		var t = document.getElementById(table);
		var r = t.insertRow(t.rows.length);
		r.id = table + l;
		
		var c = r.insertCell(r.cells.length);
		c.appendChild(objectCreator.selectNodes.getNode('ContactType','Type',table));
		c = r.insertCell(r.cells.length);
		c.appendChild(objectCreator.newTextInput('Contact',table));
		c = r.insertCell(r.cells.length);
		c.appendChild(objectCreator.newCheckbox('Preferred',table));
		c = r.insertCell(r.cells.length);
		c.appendChild(objectCreator.newDeleteRowButton(table,l));
	},
	
	newDegreeRow: function(table) {
		var l = this.autocountTable(table);
		
		var t = document.getElementById(table);
		var r = t.insertRow(t.rows.length);
		r.id = table + l;
		
		var c = r.insertCell(r.cells.length);
		// yes, I would write 'rowspan', but apparently ie requires its own internal caseing
		c.setAttribute('valign','top');
		c.appendChild(objectCreator.selectNodes.getNode('Degree','Degree',table));
		
		c = r.insertCell(r.cells.length);
		c.setAttribute('valign','top');
		c.setAttribute('class','short');
		c.appendChild(objectCreator.newTextInput('DegreeName',table));
		/*
		c.appendChild(objectCreator.selectNodes.getNode('DegreeName','DegreeName',table));
		c.innerHTML += '&nbsp;';
		c.appendChild(objectCreator.newAddButton('DegreeName'+l,'MLU_Degree','Degree'));
		*/
		
		c = r.insertCell(r.cells.length);
		c.setAttribute('valign','top');
		c.setAttribute('class','short');
		c.appendChild(objectCreator.newTextInput('Institute',table));
		/*
		c.appendChild(objectCreator.selectNodes.getNode('Institute','Institute',table));
		c.innerHTML += '&nbsp;';
		c.appendChild(objectCreator.newAddButton('Institute'+l,'MLU_Institute','Institute'));
		*/
		
		c = r.insertCell(r.cells.length);
		c.setAttribute('valign','top');
		c.setAttribute('class','short');
		c.appendChild(objectCreator.newTextInput('new_Institute_Country',table));
		
		c = r.insertCell(r.cells.length);
		c.setAttribute('valign','top');
		c.setAttribute('class','short');
		c.innerHTML += '&nbsp;';
		c.appendChild(objectCreator.newDeleteRowButton(table,l));
		
		/*
		r = t.insertRow(t.rows.length);
		r.id = table + l + '_1';
		c = r.insertCell(r.cells.length);
		c.appendChild(objectCreator.newTextInput('new_Institute_Country',table));
		//c.appendChild(objectCreator.selectNodes.getNode('new_Institute_Country','Country',table));
		//c.innerHTML += '&nbsp;';
		// c.appendChild(objectCreator.newAddButton('new_Institute_Country'+l,'MLU_Country','Country'));
		*/
	},
	
	newMembershipRow: function(table) {
		var l = this.autocountTable(table);
		var t = document.getElementById(table);
		var r = t.insertRow(t.rows.length);
		r.id = table + l;
		
		var c = r.insertCell(r.cells.length);
		c.setAttribute('valign','top');
		c.appendChild(objectCreator.newTextInput('Membership',table));
		/*
		c = r.insertCell(r.cells.length);
		//c.appendChild(objectCreator.newTextInput('Membership_Title',table));
		c.appendChild(objectCreator.newTextArea('Membership_Title',table,20,3));
		*/
		c = r.insertCell(r.cells.length);
		c.appendChild(objectCreator.newDeleteRowButton(table,l));
	},
	
	deleteRow: function(table,row) {
		//alert('table: '+table+' - row: '+row);
		var t = document.getElementById(table);
		for(var r=0;r<t.rows.length;r++) {
			if(t.rows[r].id == row) {
				t.deleteRow(r);
				if(t.rows[r] && t.rows[r].id == row+'_1') {
					t.deleteRow(r);
				}
				break;
			}
		}
	},
	
	autocountTable: function(table) {
		var l = document.getElementById(table+'_length');
		l.value = parseInt(l.value) + 1;
		return l.value;
	},
	
	selectNodes: {
		o: new Object,
		newNode: function(name, type, update) {
			if(this.o[type] || this.o[type+'_default']) {
				//alert('Option set already exists');
				return;
			}
			//alert(name + ' ' + type);
			var s = document.getElementById(name).cloneNode(true);
			s.id = type+'_default';
			this.o[s.id] = s;
			if(update) {
				selectUpdater.listener.register(s.id, type);
				this.o[s.id+'_update'] = true;
			}
		},
		getNode: function(id, type) {
			//alert(type +'->'+ this.o[type+'_default']);
			if(this.o[type+'_default']) {
				var i = this.o[type+'_default'].cloneNode(true);
				if(arguments[2] && document.getElementById(arguments[2]+'_length')) {
					var l = document.getElementById(arguments[2]+'_length').value;
					i.id = id+l;
					i.name = i.id;
				} else {
					i.id = id;
					i.name = id;
					//if(i.getAttribute('multiple')) i.name+='[]';
				}
				if(this.o[type+'_default_update'])
					selectUpdater.listener.register(i.id, type);
				return i;
			} return document.createElement('select');
		}
	}
};

function ajax(f,e) {
        var c;
        try {
                c = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
        } catch( e ) {
                alert('Your browser does not\nsupport the features needed');
                return;
        }
        c.onreadystatechange = function () {
                if(c.readyState==4 || c.readyState=='complete') {
                        if(c.status==200) f();
                        else if(e) e();
                        else alert('Error updating database\n[Status: '+c.status+']');
                }
        }
        return c;
}
