/** ***************************************************************************
  * Class        : dkform
	* Storage      : dkstore
  * Written by   : K.Vernon
	* Date Created : 27-Fév-2009
	*
  * *************************************************************************** */

dkform=function() {
	if (arguments.length) this.load(arguments);
};

dkform_store = {version:1.0} // for storing database form information
dkstatic = new dkform();

/* *********************************************
 * For each database generate a form and store
 * Also load the named form (always accesible 
 * with "this.form"
 * ********************************************* */
dkform.prototype.load = function (arguments) {
	// Arguments are : 
	// 1. Form ID in use
	// 2. Always an empty form
	
	// Get rid of the old form
	//if (oldform = document.getElementById("dk_main_form")) oldform.style.display="none"; 

	if (!dk_db_name) return;

	this.resetform = (arguments[1]=='T');
	this.openadvanced = (arguments[2]=='T');

	if (!dkform_store.initialised) {
		dkform_store.initialised = true;	
		dkform_store.no=0;
		dkform_store.forms = new Object();
		dkform_store.database = new Object();
		dkform_store.advanced_width = 600;
	
		// Create a DOM form for each database
		dkform_store.nodatabases=0;
		for (var database in dk_db_name) {	
			dkform_store.nodatabases++;
			var form = document.createElement("form");
		
			this.loadselect         (form, 'Use1',          dk_valid_use 		[database],dk_valid_use 		["DEFAULT"]);         // Criteria - "*1036;1035;4;1020;1034;1095;9980;";
			this.loadselect         (form, 'Keys2',         dk_valid_doctype[database],dk_valid_doctype	["DEFAULT"]);         // Doc Type - "33;35;24;25;28;7;8;18;1;17;30;19;20;26;9;10;";
			this.loadselect         (form, 'SortKey',       dk_valid_sort 	[database],dk_valid_sort 		["DEFAULT"]);         // Sort key - "4;1003;1031;1034;31;-31;32;-32;";
			this.loadcheckbox       (form, 'Restrict_Use10',dk_valid_new    [database],dk_valid_new    	["DEFAULT"], '9996'); // Nouveautés - 9996
			this.loadcheckbox       (form, 'ForcePhonetic', dk_valid_phon 	[database],dk_valid_phon 		["DEFAULT"], 'T');    // Phonetics - F
			this.loadcheckbox       (form, 'ForcePlural',   dk_valid_plur 	[database],dk_valid_plur 		["DEFAULT"], 'T');    // Plurals - F
	
			dkform_store.database[database] = new Object();
			dkform_store.database[database].form = form;
			dkform_store.database[database].def = dk_db_def[database]; // "T";
			dkform_store.database[database].desc = dk_db_desc[database]; // database description;
			dkform_store.database[database].annexe = dk_valid_annexe[database]; // annexes;
			if (dkform_store.database[database].def=='T') dkform_store.default_database = database;
		}
	} 
	this.form = document.getElementById(arguments[0]);
	this.modifyForm(); // From the DOM HTML, generate a new form with all the correct absolute positions
	dkform_store.forms[dkform_store.no++]=this.form;

	this.setdatabase(); 
	this.database_radio();
	
	if (this.resetform) {
		dkstatic.updateform(this.form, dkform_store.default_database);
		this.form.reset();
		dkstatic.modifydesc(this.form);
	} else {
		this.value = dkform_store.current_database; // set the value ready to call updatedatabase
		this.updatedatabase();
	}

	this.settoggle();
	if (this.openadvanced && !this.resetform) this.toggle();
	
	// Update the annexe checkboxes
	//dkstatic.upadteannexe();
	var ul = dkstatic.get_byclass(this.form, "allannexes", "UL");
	if (ul) dkstatic.checkhead(ul,true);

	
}

dkform.prototype.get_byclass = function(o, classname, tag) {
	if (!tag) tag="*";

	var p = o.getElementsByTagName(tag);
	
	if (classname==null) {
		return (p[0]) ? p[0] : null; 		
	} else {	
		classname = ' '+classname+' ';
		
		for (var i=0;i<p.length;i++) {
			var check = ' '+p[i].className+' ';
			if (check.indexOf(classname)!=-1) return p[i];		
		}	
	}
};

dkform.prototype.var_dump = function (element, limit, depth) {
  depth = depth?depth:0;
  limit = limit?limit:1;
 
  returnString = '<ol>';
 
  for (property in element) {
    //Property domConfig isn't accessable
    if (property != 'domConfig') {
      returnString += '<li><strong>'+ property + '</strong> <small>(' + (typeof element[property]) +')</small>';
 
      if (typeof element[property] == 'number' || typeof element[property] == 'boolean')
        returnString += ' : <em>' + element[property] + '</em>';
      if (typeof element[property] == 'string' && element[property])
        returnString += ': <div style="background:#C9C9C9;border:1px solid black; overflow:auto;"><code>' +
                                    element[property].replace(/</g, '&amp;lt;').replace(/>/g, '&amp;gt;') + '</code></div>';
 
      if ((typeof element[property] == 'object') && (depth < limit))
        returnString += this.var_dump(element[property], limit, (depth + 1));
 
      returnString += '</li>';
    }
  }
  returnString += '</ol>';
 
  if (depth == 0) {
    winpop = window.open("", "","width=800,height=600,scrollbars,resizable");
    winpop.document.write('<pre>'+returnString+ '</pre>');
    winpop.document.close();
  }  
 
  return returnString;
}

dkform.prototype.modifyForm = function() {

	// generate a DOM form from the original
	var oBody = document.body;
	dkstatic.createElement("form",this.form.name);
	var form = this.form.cloneNode(true);


	// Clone the form and save in the document body
	oBody.appendChild(form);
	var toggle = this.findclass(this.form, 'seeadvanced', '*');
	var simple = dkstatic.findclass(form, 'simple', '*');
	var advanced = dkstatic.findclass(form, 'advanced', '*');
	var close = dkstatic.findclass(form, 'close', '*');
	var annexes = dkstatic.findclass(form, 'annexes', '*');
	var summary = dkstatic.findclass(form, 'summary', '*');
	var remove = dkstatic.findclass(form, 'remove', 'a');
	var submit = dkstatic.findclasses(form, 'submit', 'img');
	var Data1 = dkstatic.findclass(form, 'Data1', 'input');

	// Position the simple class where the original form was
	var cForm = this.getPosition(this.form,true); // Find the exact position of the form in the body
	simple.style.position = "absolute";
	simple.style.left = cForm.left+"px";
	simple.style.top = cForm.top+"px";
	simple.style.height = cForm.height+"px";
	simple.style.width = cForm.width+"px";
	simple.style.zIndex = 98;			

//dkstatic.var_dump(cForm);

	// Position the advanced class where the link was
	if (toggle) {
		var cToggle = this.getPosition(toggle,true); // This is so we can break out the advanced options


		advanced.style.position = "absolute";
		advanced.style.left = cToggle.left+"px";
		advanced.style.top = (Math.floor(cToggle.top)+cToggle.height)+"px";
		advanced.style.width = dkform_store.advanced_width;			
		advanced.style.zIndex = 99;		
		if ((Math.floor(cToggle.left)+Math.floor(dkform_store.advanced_width)) > Math.floor(cToggle.availWidth)) {
			advanced.style.left=(cToggle.availWidth-dkform_store.advanced_width-20)+"px";
		}

	}
	
	// Create a CLOSE button in the "close" area
	if (close) {
		var text = document.createTextNode(close.innerHTML);
		var a = document.createElement("a");
		a.href="javascript:void(0)";
		a.onclick=dkstatic.toggle;
		a.appendChild(text);
		close.innerHTML = '';
		close.appendChild(a);
	}
	
	// Modify the annexes area
	if (annexes) {
		var li = document.createElement("li");
		li.style.display="inline";
		var ul = document.createElement("ul");
		var cloneAnnexe = annexes.cloneNode(false);
		ul.appendChild(cloneAnnexe);
		li.appendChild(ul);
		this.replace(annexes,li);
	}

	// Create a summary area
	if (summary) {
		summary.onmouseover=this.summaryShow;
		summary.onmouseout=this.summaryHide;
		var summarytext = summary.innerHTML;
		summary.innerHTML = "&#160;";
		var span = document.createElement("span");
		span.className = "summary";
		span.style.display='none';
		summary.className=' '+summary.className+' ';
		summary.className=String(summary.className).replace("summary","");
		summary.appendChild(span);
		var span = document.createElement("span");
		span.className = "remindertext";
		span.innerHTML = summarytext
		summary.appendChild(span);
	}
	// Create a remove area
	if (remove) {
		//remove.innerHTML = "Rétablir";
		remove.onclick=this.emptyForm;
		remove.style.cursor= (document.all) ? "hand" : "pointer";
	}

	for (var i=0;i<submit.length;i++) {
		submit[i].onclick=this.submitForm
	}
/*
	if (submit) {
		//remove.innerHTML = "Rétablir";
		submit.onclick=this.submitForm;
		//submit.onclick=function() {this.form.submit()}
		//remove.style.cursor= (document.all) ? "hand" : "pointer";
	}
*/
	// Empty the old form. We don't want to destroy it as we need it as a space holder!
	var o = this.form;
	//o.innerHTML = "&#160;";
	o.style.height = cForm.height+"px";
	o.style.width = cForm.width+"px";
	o.name+="x";
	o.id=o.name;
	o.style.visibility="hidden"; 
			//o.parentNode.removeChild(o);

	Data1.onkeypress=this.onenter;
	if (dk_url_origsearch!='') {
		var origlist = String(dk_url_origsearch).split("&");
		for (var i=0;i<origlist.length;i++) {
			var nv = origlist[i].split("=");
			if (nv[0]=='Data1') {
				if (nv[1]!='') Data1.className = Data1.className.replace("form-text","form-textblank");
				Data1.value=nv[1];
			}
		}
	}
  // Make this.form the new current form
	form.style.visibility="visible";
	this.form = form;

}


/* *********************************************
 * Submit Form
 * ********************************************* */
dkform.prototype.submitForm = function() {
	return dkstatic.submit(this);
}
dkform.prototype.submit = function(o) {
	form = dkstatic.findParentForm(o);
	if (form.Data1.value!='') {
			form.submit();
	}
	return false;
}
dkform.prototype.onenter = function(e) {
	var char = (e) ? e.which : event.keyCode;
	return (char==13) ? dkstatic.submit(this) : true;
}
/* *********************************************
 * Empty Form
 * ********************************************* */
dkform.prototype.emptyForm = function() {
	form = dkstatic.findParentForm(this);
	
	// Store hidden values (because IE form.reset() removes them!)
	var hidden = new Array();
	for (var i=0;i<form.elements.length;i++) {
		var o = form.elements[i]
		if (o.type && o.type=='hidden') hidden[o.name]=o.value;
	}
	
	dkstatic.updateform(form, dkform_store.default_database);
	form.reset();
	form.Data1.focus()

	// Restore hidden values (for IE as usual)
	for (var i=0;i<form.elements.length;i++) {
		var o = form.elements[i]
		if (o.type && o.type=='hidden') o.value = hidden[o.name];
	}

	dkstatic.modifydesc(form);
}
/* *********************************************
 * Show/Hide summary
 * ********************************************* */
dkform.prototype.summaryShow = function () {
	form = dkstatic.findParentForm(this);
	var summary = dkstatic.findclass(form, 'summary', '*');
	var reminder = dkstatic.findclass(form, 'reminder', '*');
	
	dkstatic.toggleHint('show', reminder, summary);
	
}
dkform.prototype.summaryHide = function () {
	form = dkstatic.findParentForm(this);
	var summary = dkstatic.findclass(form, 'summary', '*');
	var reminder = dkstatic.findclass(form, 'reminder', '*');
	dkstatic.toggleHint('hide', reminder, summary);
}

dkform.prototype.toggleHint = function (pType, pObj, pHintObj) {
	var o = document.getElementById("hintarea");
	if (pType=='show') {
		var c = this.getPosition(pObj,true);
		var zWidth = o.style.width
		if (zWidth.indexOf('px')!=-1) zWidth = zWidth.substr(0,zWidth.length-2)
		zEndPosition = Math.floor(zWidth) + c.left

		o.innerHTML = '<div class="hintcontainer"><div class="hint">'+pHintObj.innerHTML+'<div class="hint-pointer">&#160;</div></div></div>';
		if (zEndPosition > c.availWidth) {
			zTop = c.top + 16
			zLeft = c.availWidth - zWidth - 12; // The 12 is the width of the scroll bar (in IE
			o.innerHTML = '<div class="hintcontainer"><div class="hint">'+pHintObj.innerHTML+'</div></div>';
		} else {
			zTop = c.top - 8
			zLeft = c.left + c.width; // 22
			o.innerHTML = '<div class="hintcontainer"><div class="hint">'+pHintObj.innerHTML+'<div class="hint-pointer">&#160;</div></div></div>';
		}

		o.style.display = 'inline';
		o.style.top = zTop+'px';
		o.style.left = zLeft+'px';
	} else {
		o.style.display = 'none';
	}
}




/* *********************************************
 * Get the position of a certain element
 * ********************************************* */
dkform.prototype.getPosition = function (o, pIgnoreScroll) {
	var c=new Object();						
	
	if (document.all) {
		c.availHeight= document.body.clientHeight
		c.availWidth= document.body.clientWidth
	} else {
		c.availHeight = window.innerHeight
		c.availWidth = window.innerWidth
		c.availHeight = document.documentElement.scrollHeight;
		c.availWidth = document.documentElement.scrollWidth;
	}
	
	c.height=o.offsetHeight; c.width=o.offsetWidth	
	c.left=o.offsetLeft; c.top=o.offsetTop;
	while ((o=o.offsetParent) != null) { c.left += o.offsetLeft; c.top += o.offsetTop; }						
	
	if (!pIgnoreScroll) {
		c.top = c.top - document.documentElement.scrollTop
		c.left = c.left - document.documentElement.scrollLeft
	}
	c.maxWidth = c.availWidth - c.left + 1
	if (c.left < 0) c.left = 0;
	return c;
}


/* *********************************************
 * Set the current database
 * ********************************************* */
dkform.prototype.setdatabase = function() {
	for (var database in dkform_store.database) {
		if (dkform_store.database[database].def=='T') dkform_store.current_database = database;
	}
	// Get the default database from url
	if (dk_url_origsearch!='') {
		var origlist = String(dk_url_origsearch).split("&");
		for (var i=0;i<origlist.length;i++) {
			var nv = origlist[i].split("=");
			if (nv[0]=='database') {
				if (dkform_store.database[nv[1]]) dkform_store.current_database=nv[1];
			}
		}
	}
};

dkform.prototype.checkhead = function(ul,openifchecked) {
	// currently looking at an ul
	var ulchildren = ul.childNodes;
	var checked = 0;
	for (var i=0;i<ulchildren.length;i++) {
		var li = ulchildren[i];
		if (li.tagName!="LI") continue;
		var innerchecked = 0;
		var input = dkstatic.get_byclass(li, null, "INPUT"); // Get first INPUT

		if (li.className.indexOf("cbtitle")!=-1) {
			var ul  = dkstatic.get_byclass(li, null, "UL"); // Get first UL

			innerchecked = innerchecked | dkstatic.checkhead(ul,openifchecked);
			input.className = "cbtitleinput checked"+innerchecked;
			
			input.checked = (innerchecked>1);
			
			if (openifchecked && input.checked) {
				var div = dkstatic.get_byclass(li, "opencloseinner", "DIV"); // Get first DIV
				var a = dkstatic.get_byclass(li, "openclose", "A"); // Get first Anchor
				a.className = "openclose open";
				div.className = "opencloseinner show";
			}
			
		} else {
			var chk = (input.checked) ? 2 : 1;
			innerchecked = innerchecked | chk;
		}
		checked = checked | innerchecked;
	}
	return checked;	
};

/* *********************************************
 * Update the Annexe area
 * ********************************************* */
dkform.prototype.updateannexe = function(myform) {
	var tagName = (myform) ? myform.tagName : null;
	if (tagName!='FORM') myform = this.form;
	
	// Update the annexe checkboxes
	var ul = dkstatic.get_byclass(myform, "allannexes", "UL");
	if (ul) dkstatic.checkhead(ul);
			
	
	if (dkform_store.nodatabases!=1) {
		var current_database = dkstatic.getelem(myform, 'database', true).value;	
		if (current_database!=dkform_store.default_database) {
			dkstatic.setradioelem(myform, 'database', dkform_store.default_database);	
			dkstatic.updateform(myform, dkform_store.default_database);
		}
	}
	dkstatic.modifydesc(myform);
}

/* *********************************************
 * Update database area
 * ********************************************* */
dkform.prototype.updatedatabase = function() {
	if (this.value!=dkform_store.default_database) dkstatic.clearannexes(this.form);
	dkstatic.updateform(this.form, this.value);
	dkstatic.modifydesc(this.form); // This will also modify

    // Modification pour Safran (Atalante Full Web)
	// N'affiche pas les plural/phonetic box si la base par défaut ne comprend pas plural/phonetic
	var def_phon = dk_valid_phon[dkform_store.default_database];
	var def_plur = dk_valid_plur[dkform_store.default_database];
	var cur_phon = dk_valid_phon[this.value];
	var cur_plur = dk_valid_plur[this.value];
	
	if (def_phon=='' && def_plur=='') {
		var phonplur = dkstatic.findclass(this.form, 'phonplur', '*');		
		phonplur.className = (cur_phon=='' && cur_plur=='') ? 'phonplur hide' : 'phonplur show';
	}	

}

/* *********************************************
 * Modify the selection summary
 * ********************************************* */
dkform.prototype.modifydesc = function (form) {	
	if (!form || !form.name) form = this.form;
	
	var summary = dkstatic.findclass(form, 'summary', '*');
	var reminder = dkstatic.findclass(form, 'reminder', '*');
	var briefsummary = dkstatic.findclass(form, 'briefsummary', '*');

	var brief_annexes='';
	var brief_database='';
	var desc_brief = '';
	var desc_typedoc = '';

	var html = '';
	var defdatabase = false;
	for (var i=0;i<form.elements.length;i++) {
		var o = form.elements[i];
		if (o.className=='cbtitle') continue;
		var desc_all = '';
		var desc_plus = '';
		var desc_minus = '';
		var desc = '';
		//if (o.className.indexOf("changedvalue")==-1 && o.className.indexOf("defaultvalue")==-1) o.className+=' defaultvalue';
		//else 
		o.className = o.className.replace("changedvalue","defaultvalue");
		
		switch (String(o.tagName).toLowerCase()) {
		case 'input':
			switch (String(o.type).toLowerCase()) {
			case 'text':
				break;
			case 'radio':
				var s = o.parentNode.getElementsByTagName("span");
				if (o.defaultChecked && o.checked) defdatabase=true; 
				if (o.checked) if (s.length) desc_all = s[0].innerHTML;
				if (o.checked!=o.defaultChecked) {
					o.className = o.className.replace("defaultvalue","changedvalue");					
					 if (s.length) s[0].className = s[0].className.replace("defaultvalue","changedvalue");					
				} else {
					 if (s.length) s[0].className = s[0].className.replace("changedvalue","defaultvalue");					
				}
				if (o.checked && !o.defaultChecked) if (s.length) desc = s[0].innerHTML;
				break;
			case 'checkbox':
				var s = o.parentNode.getElementsByTagName("span");
				if (o.checked) if (s.length) desc_all = s[0].innerHTML;
				if (o.checked!=o.defaultChecked) {
					o.className = o.className.replace("defaultvalue","changedvalue");					
					 if (s.length) s[0].className = s[0].className.replace("defaultvalue","changedvalue");					
				} else {
					 if (s.length) s[0].className = s[0].className.replace("changedvalue","defaultvalue");					
				}
				if ((defdatabase || (o.name.substr(0,9)!='dk_annexe')) && (o.name!='')) {
					if (o.checked && !o.defaultChecked) if (s.length) desc_plus = s[0].innerHTML;
					if (!o.checked && o.defaultChecked) if (s.length) desc_minus = s[0].innerHTML;
			  }
				break;
			}
			break;
		case 'select':
			var suffix = (o.name=='SortKey') ? 'Classement : ' : '';
			for (var j=0;j<o.options.length;j++) {
				if (o.options[j].selected) {
					desc_all = suffix + o.options[j].innerHTML;
				}
				if (o.options[j].selected && !o.options[j].defaultSelected) {
					desc = suffix + o.options[j].innerHTML;
					o.className = o.className.replace("defaultvalue","changedvalue");
					//if (o.options[j].selected && !o.options[j].defaultSelected) desc_plus = suffix + o.options[j].innerHTML;
					//if (!o.options[j].selected && o.options[j].defaultSelected) desc_minus = o.options[j].innerHTML;
				}
			}
			if ((o.name=='Keys2') && (o.value!='')) desc_typedoc = ' - '+desc_all;
			break;
		}
		
		if (desc!='') html += '<li>'+desc+'</li>';	
		if (desc_plus!='') html += '<li><strong>+ </strong>'+desc_plus+'</li>';	
		if (desc_minus!='') html += '<li><strong>- </strong>'+desc_minus+'</li>';	
		if (desc_all!='') {
			//if (o.name.substr(0,9)=='dk_annexe') brief_annexes+=', '+desc_all;
			//if (o.name.substr(0,9)=='database') brief_database=desc_all+' ';
			
			if (o.name.substr(0,9)=='dk_annexe' && o.checked && o.defaultChecked) brief_annexes+=', '+desc_all;
			if (o.name.substr(0,9)=='database'  && o.checked && o.defaultChecked) brief_database=desc_all+' ';
		}
	}
	if (brief_annexes.substr(2)!='') brief_database=brief_annexes.substr(2);
	var briefsummary_text = '<strong>'+brief_database+'</strong>'+desc_typedoc;
	
	
	
	if (briefsummary) briefsummary.innerHTML = (briefsummary_text!='') ? briefsummary_text : ''; 
	if (summary) {
		if (html!='') {
			summary.innerHTML = '<ul>'+html+'</ul>';
			reminder.style.display = "";
		} else {
			summary.innerHTML = '';
			reminder.style.display = "none";
		}
	}
	//alert(form.name+"\n"+summary.innerHTML);
}

/* *********************************************
 * POPUP advanced form
 * ********************************************* */
dkform.prototype.findParentForm = function(o) {
	oForm = o;
	do {oForm = oForm.parentNode} while (oForm.tagName!='FORM');
	return oForm
}

dkform.prototype.settoggle = function() {
	var o = this.findclass(this.form, 'seeadvanced', '*');
	if (!o) return;
	
	var text = o.innerHTML;
	
	o.innerHTML = '';
	
	var span = document.createElement("span");
	span.innerHTML = text;
	
	var a = document.createElement("a");
	a.className="plus seeadvanceda";
	a.onclick=dkstatic.toggle;
	a.href="javascript:void(0)";
	a.appendChild(span);
	
	o.appendChild(a);
	return o;
}

dkform.prototype.toggle = function() {
	oForm = (this.form) ? this.form : dkstatic.findParentForm(this);	

	for (var i=0;i<dkform_store.no;i++) {
		var stform = dkform_store.forms[i]
		var oAdvanced = dkstatic.findclass(stform, 'advanced', '*');
		var oA = dkstatic.findclass(stform, 'seeadvanceda', '*');
		if (stform.name==oForm.name) {
			var hidden = String(oAdvanced.className).indexOf("hide")!=-1;
			if (hidden) {
				dkstatic.ie6fix_blocker_show(oAdvanced); // Back the div with an IFRAME to prevent SELECT from showing through
				oAdvanced.className = oAdvanced.className.replace("hide","show");
				oA.className = oA.className.replace("plus","minus");	
			} else {
				dkstatic.ie6fix_blocker_hide(); // Remove the IFRAME
				oAdvanced.className = oAdvanced.className.replace("show","hide");
				oA.className = oA.className.replace("minus","plus");			
			}
			stform.style.zIndex=98;
		} else {
			stform.style.zIndex=90;
			oAdvanced.className = oAdvanced.className.replace("show","hide"); // Make sure it's hidden
			oA.className = oA.className.replace("minus","plus");
		}
	}
	
	
	
}
dkform.prototype.ie6fix_blocker_show = function(oDOM) {
	try {
		var IEVersion = (navigator.appName=='Microsoft Internet Explorer')?parseFloat((new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})")).exec(navigator.userAgent)[1]):-1;
		if (IEVersion!=-1 && IEVersion < 7) {
			// Id of Division containing the Iframe & the frame blocker (For IE)
			// These are created in dk_common
			var divTag = document.getElementById("iblockerdiv");
			var iFrameTag = document.getElementById("iblocker");
			
			divTag.style.width=oDOM.style.width;
			divTag.style.height = (oDOM.style.height) ? oDOM.style.height : 356;
			divTag.style.top=oDOM.style.top;
			divTag.style.left=oDOM.style.left;
		
		
			iFrameTag.style.left = 0;
			iFrameTag.style.top = 0;
			iFrameTag.style.width = divTag.style.width;
			iFrameTag.style.height = divTag.style.height;
			iFrameTag.style.zIndex = divTag.style.zIndex-1;
			divTag.style.display = "block";
		}
	} catch (e) {
		// Doesn't really matter if this fails. The worst that can happen is that the SELECT shows through the popup
	}
}
dkform.prototype.ie6fix_blocker_hide = function() {
	try {
		var IEVersion = (navigator.appName=='Microsoft Internet Explorer')?parseFloat((new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})")).exec(navigator.userAgent)[1]):-1;
		if (IEVersion!=-1 && IEVersion < 7) {
			//Id of Division containing the Iframe & the frame blocker (For IE)
			var divTag = document.getElementById("iblockerdiv");
			divTag.style.display = "none";
		}
	} catch (e) {
		// No matter
	}
}
/* *********************************************
 * update the form (when the database changes)
 * ********************************************* */
dkform.prototype.updateform = function (form, database,reset) {
	this.replaceformnode(form, database, 'Use1');
	this.replaceformnode(form, database, 'Keys2');
	this.replaceformnode(form, database, 'SortKey');
	this.replaceformnode(form, database, 'Restrict_Use10');
	this.replaceformnode(form, database, 'ForcePhonetic');
	this.replaceformnode(form, database, 'ForcePlural');

	// If we want a default-only form (ie a block containing a search shortcut, don't fill in the fields
	if (!reset) {
		dkstatic.copyselects(form, database, 'Use1'); // IE has the incorrect values
		dkstatic.copyselects(form, database, 'Keys2');
		dkstatic.copyselects(form, database, 'SortKey');
		dkstatic.copycheckbox(form, database, 'Restrict_Use10');
		dkstatic.copycheckbox(form, database, 'ForcePhonetic');
		dkstatic.copycheckbox(form, database, 'ForcePlural');
	}

}
dkform.prototype.copycheckbox = function (form, database, name) {
	var store = eval('dkform_store.database[database].form.'+name);
	var currform = eval('form.'+name);
	currform.checked				=	store.checked;
	currform.defaultChecked	=	store.defaultChecked;
}
dkform.prototype.copyselects = function (form, database, name) {
	var store = eval('dkform_store.database[database].form.'+name);
	var currform = eval('form.'+name);
	for (var i=0;i<store.options.length;i++) {
		currform.options[i].selected=store.options[i].selected;
		currform.options[i].defaultSelected=store.options[i].defaultSelected;
	}
}
/* *********************************************
 * Generate the database radio buttons (and the annexes)
 * ********************************************* */
dkform.prototype.database_radio = function() {
	var o = this.findclass(this.form, 'databases', '*');
	if (o) {
		var database_default = this.findclass(o, 'defaultdatabase', '*');
		var annexes = this.findclass(o, 'annexes', '*');
		var otherdatabases = this.findclass(o, 'otherdatabases', '*');
		
		if (otherdatabases) var cloned_otherdatabases = otherdatabases.cloneNode(false);
		if (database_default) var cloned_database_default = database_default.cloneNode(false);
		if (annexes) var cloned_annexes = annexes.cloneNode(false);
	}
	

	for (var database in dkform_store.database) {
		var o = dkform_store.database[database]
		if (dkform_store.nodatabases==1) {
			var input = this.createElement("input","hidden","database");
			input.value=database
			if (database_default) cloned_database_default.appendChild(input);
			if (annexes) this.loadcheckbox_annexe (this.form, cloned_annexes, 'dk_annexe', o.annexe, dk_valid_annexe["DEFAULT"]);         // Annexes - "4;*1;3;2;";
		} else {
			var li=document.createElement("li");
			var input = this.createElement("input","radio","database");
			input.className="defaultvalue";
			input.value=database
			input.onclick=dkstatic.updatedatabase;
			input.checked=(database==dkform_store.current_database);
			if (o.def=='T') input.defaultChecked=true;
			li.appendChild(input);
			var span=document.createElement("span");
			span.className="defaultvalue";
			span.innerHTML = o.desc;
			li.appendChild(span);
			
			if (o.def=='T') {
				if (annexes) this.loadcheckbox_annexe (this.form, cloned_annexes, 'dk_annexe', o.annexe, dk_valid_annexe["DEFAULT"]);         // Annexes - "4;*1;3;2;";
				if (database_default) cloned_database_default.appendChild(li);
			} else {
				if (otherdatabases) cloned_otherdatabases.appendChild(li);
			}
		}
		
	}
	if (annexes) this.replace(annexes, cloned_annexes,true);
	if (database_default) this.replace(database_default, cloned_database_default,true);
	if (otherdatabases) this.replace(otherdatabases, cloned_otherdatabases,true);
	
	
	// Now for the crappy IE fix
	var o = dkform_store.database[dkform_store.default_database];
	this.updatecheckbox_annexe(this.form, cloned_annexes, 'dk_annexe', o.annexe, dk_valid_annexe["DEFAULT"]);
	this.setradioelem(this.form, 'database', dkform_store.current_database);	

}
/* *********************************************
 * Find the object containg the class
 * ********************************************* */
dkform.prototype.findclass = function (form, searchclass,tag) {
	var o = form.getElementsByTagName(tag);
	for (var i=0;i<o.length;i++) {
		if (String(' '+o[i].className+' ').indexOf(' '+searchclass+' ')!=-1) {
			return o[i];
		}
	}

};

dkform.prototype.findclasses = function (form, searchclass,tag) {
	var j = 0;
	var classes = new Array();
	var o = form.getElementsByTagName(tag);
	for (var i=0;i<o.length;i++) {
		if (String(' '+o[i].className+' ').indexOf(' '+searchclass+' ')!=-1) {
			classes[j++] = o[i];
		}
	}
	return classes;
}


/* *********************************************
 * Replace a form element
 * ********************************************* */
dkform.prototype.replaceformnode = function (form, database, type) {
	var oldNode = this.getelem(form, type); 
	var newNode = this.getelem(dkform_store.database[database].form, type)

	switch (true) {
	case (newNode.type=='checkbox'):
		newNode.onclick=dkstatic.modifydesc
		break;
	case (newNode.type=='text'):
		newNode.onchange=dkstatic.modifydesc
		break;
	case (String(newNode.tagName).toLowerCase()=='select'):
		newNode.onchange=dkstatic.modifydesc
		break;
	default:
		//alert(newNode.tagName)
		break;
	}
	
	if (oldNode && newNode) {
		return this.replace(oldNode, newNode); 
	} else {
		//if (!oldNode) alert("old node missing " + type)
		//if (!newNode) alert("new node missing " + type)
	}
}
/* *********************************************
 * Replace a node
 * ********************************************* */
dkform.prototype.replace = function (oldNode, newNode,noclone) {
	if (noclone) {
		var newNodeClone = newNode
	} else {
		var newNodeClone = newNode.cloneNode(true);
		if (newNode.onclick)  newNodeClone.onclick = newNode.onclick;
		if (newNode.onchange) newNodeClone.onchange = newNode.onchange;
/*
if (newNode.selected) newNodeClone.selected = newNode.selected;
if (newNode.defaultSelected) newNodeClone.defaultSelected = newNode.defaultSelected;
if (newNode.checked) newNodeClone.checked = newNode.checked;
if (newNode.defaultChecked) newNodeClone.defaultChecked = newNode.defaultChecked;
*/
	}
	
	return oldNode.parentNode.replaceChild(newNodeClone, oldNode);
}

/* *********************************************
 * Get a live form element
 * ********************************************* */
dkform.prototype.getelem = function (form, name, radio) {
	for (var j=0; j<form.elements.length; j++) {
		if (form.elements[j].name==name) {
			if (!radio || (radio && form.elements[j].checked)) return form.elements[j]; 
		}
	}
}

/* *********************************************
 * Set a form radio element
 * ********************************************* */
dkform.prototype.setradioelem = function (form, name, value) {
	for (var j=0; j<form.elements.length; j++) {
		if (form.elements[j].name==name && form.elements[j].value==value) {
			form.elements[j].checked=true; 
		}
	}
}

/* *********************************************
 * Clear all annexes
 * ********************************************* */
dkform.prototype.clearannexes = function (form) {
	for (var j=0; j<form.elements.length; j++) {
		if (String(form.elements[j].name).substr(0,9)=="dk_annexe") {
			form.elements[j].checked=false; 
		}
		if (form.elements[j].className.indexOf("cbtitleinput")!=-1) {
			form.elements[j].checked=false; 
		}
	}
};

/* *********************************************
 * Create an element. This is here due to an IE6 bug where the name is never set
 * ********************************************* */
dkform.prototype.createElement = function (tag, type, name, sel, defaultselected) {
	if (document.all) {
		var elem = document.createElement("<"+tag+" type='"+type+"' name='"+name+"'/>");
	} else {
		var elem = document.createElement(tag);
		elem.name = name;
		if (type!='') elem.type = type;
	}
	return elem;
}

/* *********************************************
 * Update the annexe check boxes 
 * NOTE : THIS IS ONLY BECAUSE IE HAS A BUG AND DOES NOT COPY THE CHECKED attributes
 * ********************************************* */
dkform.prototype.updatecheckbox_annexe = function (form, field, type, olist, olistdefault) {
	if (!document.all) return; // No need to do this for Firefox
	
	var list = olistdefault.split(";");
	var defaultlist=' ';
	for (var i=0;i<list.length;i++) {
		var value = list[i];
		if (value.substr(0,1)=='*') {
			defaultlist += value.substr(1) + ' ';
		}
	}
	list = olist.split(";");
					
	for (var i=0;i<list.length;i++) {
		if (list[i]=='') continue;
		try {
			var value = list[i];
			var checked = false;
			if (value.substr(0,1)=='*') {
				value = value.substr(1);
				checked = true;
			}
			var defaultchecked = (defaultlist.indexOf(' '+value+' ')!=-1);
			
			// IE Fix (after appending to the form, the checked values are removed
			for (var j=0;j<form.elements.length;j++) {
				var elem = form.elements[j];
				if (elem.name.substr(0,9)=='dk_annexe') {
					if (elem.value==value) elem.checked=checked;
					if (elem.value==defaultvalue) elem.defaultChecked=defaultchecked;
				}
			}
		} catch (e) {
			alert("dkform.prototype.loadcheckbox_annexe() - "+e.description);
		}
	} 

}
dkform.prototype.loadcheckbox_annexe = function (form, field, type, olist, olistdefault) {
	var list = olistdefault.split(";");
	var defaultlist=' ';
	for (var i=0;i<list.length;i++) {
		var value = list[i];
		if (value.substr(0,1)=='*') {
			defaultlist += value.substr(1) + ' ';
		}
	}
	list = olist.split(";");

	// NEW AREA
	var o = document.getElementById("dk_opacform_annexeall");
	if (!o) return;
	var annexes = o.cloneNode(true);
	
	var inps = annexes.getElementsByTagName("INPUT");
	for (var j=0;j<inps.length;j++) {
		objCheckbox = inps[j];
		if (objCheckbox.className!='cbtitle') {
			objCheckbox.onclick = dkstatic.updateannexe;
			objCheckbox.className="defaultvalue";
			var test = ';*'+objCheckbox.value+';';
			var zList = ";"+olist+';';
			objCheckbox.checked = (zList.indexOf(test)!=-1);	
			objCheckbox.defaultchecked = (defaultlist.indexOf(' '+objCheckbox.value+' ')!=-1);
		} else {
			objCheckbox.onclick = dkstatic.toggleabtitle;
		}	
	}
	var as = annexes.getElementsByTagName("A");
	for (var j=0;j<as.length;j++) {
		objAnchor = as[j];
		if (objAnchor.className.indexOf('openclose')!=-1) {
			objAnchor.href = 'javascript:void(0)';
			objAnchor.onclick = dkstatic.openclose;
		}	
	}
	
	field.appendChild(annexes);

	
/*
	for (var i=0;i<list.length;i++) {
		if (list[i]=='') continue;
		try {
			var value = list[i];
			var checked = false;
			if (value.substr(0,1)=='*') {
				value = value.substr(1);
				checked = true;
			}
			var defaultchecked = (defaultlist.indexOf(' '+value+' ')!=-1);
			
			var li = document.createElement("li");
			textvalue=String(document.getElementById("dk_opacform_annexe_"+value).innerHTML);
			text=document.createTextNode(textvalue);
			var span = document.createElement("span");
			span.className="defaultvalue";
			span.innerHTML = textvalue;

			var objCheckbox = this.createElement("input","checkbox",type+'['+i+']');
			objCheckbox.value = value;
			objCheckbox.checked = checked;
			objCheckbox.defaultChecked = defaultchecked;
			objCheckbox.onclick=dkstatic.updateannexe; 
			objCheckbox.className="defaultvalue";
			li.appendChild(objCheckbox);
			li.appendChild(span);

			field.appendChild(li); 
		} catch (e) {
			alert("dkform.prototype.loadcheckbox_annexe() - "+e.description);
		}
	} 
*/
};

dkform.prototype.openclose = function() {
	var parent = this.parentNode;
	var divs = parent.getElementsByTagName("DIV");
	
	var cls = (this.className.indexOf(" open")!=-1) ? "closed" : "open";
	this.className = "openclose "+cls;
	
	for (var i=0;i<divs.length;i++) {
		var div = divs[i];
		if (div.className.indexOf("opencloseinner")!=-1) {
			div.className = (cls=="closed") ? "opencloseinner hide" : "opencloseinner show";
			break; // Just perform one level
		}
	}
	
};
dkform.prototype.toggleabtitle = function() {
	var parent = this.parentNode;
	var inputs = parent.getElementsByTagName("INPUT");
	for (var i=0;i<inputs.length;i++) {
		if (inputs[i]!=this) {	
			inputs[i].checked = this.checked;
		}
	}
	dkstatic.updateannexe(this.form);	
};

/* *********************************************
 * Generate a CHECKBOX
 * ********************************************* */
dkform.prototype.loadcheckbox = function (form,type,checkedvalue,defaultcheckedvalue, value) {
	var objCheckbox = this.createElement("input","checkbox",type);
	objCheckbox.value = value;
	objCheckbox.defaultChecked = (defaultcheckedvalue=='T');
	objCheckbox.checked = (checkedvalue=='T');
	objCheckbox.disabled = (checkedvalue=='');
	objCheckbox.className="defaultvalue";
	form.appendChild(objCheckbox); 
	
	// IE Fix (after appending to the form, the checked values are removed
	var o = eval('form.'+type);
	o.defaultChecked = (defaultcheckedvalue=='T');
	o.checked = (checkedvalue=='T');
	o.disabled = (checkedvalue=='');
}

/* *********************************************
 * generate a SELECT
 * ********************************************* */
dkform.prototype.loadselect = function (form,type,olist, oDefaultList) {
	var list = oDefaultList.split(";");				
	for (var i=0;i<list.length;i++) {
		var value = list[i];
		if (value.substr(0,1)=='*') {
			defaultvalue = value.substr(1);
			break;
		}
	}

	var olistmod = olist; // Remove last semi-colon and add one on to the front
	var list = olistmod.split(";");				
	var objSelect = this.createElement("select","",type);
	objSelect.className="defaultvalue";
	var selectedvalue='';

	for (var i=0;i<list.length;i++) {
		try {
			var objOption = document.createElement("option");
			objOption.selected = false;

			var value = list[i];
			if (value.substr(0,1)=='*') {
				value = value.substr(1);
				//objOption.defaultSelected = true;
				objOption.selected = true;
				selectedvalue=value;
			} 
			if (value==defaultvalue) objOption.defaultSelected = true;
			
			objOption.text=String(document.getElementById("dk_opacform_"+type+"_"+value).innerHTML);

			objOption.value=value;
			objSelect.options.add(objOption);
			if (i==0) selectedvalue=value;
		} catch (e) {}
	} 
	objSelect.value = selectedvalue;
	form.appendChild(objSelect); 
}

/* *********************************************
 * RESIZE
 * ********************************************* */
dkform.prototype.resize = function () {
	if (!dkform_store.no) return;
	for (var i=0;i<dkform_store.no;i++) {
		var form = dkform_store.forms[i];
		var origform = document.getElementById(form.id+"x");
		
		var toggle = dkstatic.findclass(origform, 'seeadvanced', '*');
		var simple = dkstatic.findclass(form, 'simple', '*');
		var advanced = dkstatic.findclass(form, 'advanced', '*');

		// Position the simple class where the original form was
		var cForm = dkstatic.getPosition(origform,true); // Find the exact position of the form in the body
		simple.style.left = cForm.left+"px";
		simple.style.top = cForm.top+"px";
	
		// Position the advanced class where the link was
		if (toggle) {
			var cToggle = dkstatic.getPosition(toggle,true); // This is so we can break out the advanced options
			advanced.style.left = cToggle.left+"px";
			advanced.style.top = (Math.floor(cToggle.top)+cToggle.height)+"px";
			if ((Math.floor(cToggle.left)+Math.floor(dkform_store.advanced_width)) > Math.floor(cToggle.availWidth)) {
				advanced.style.left=(cToggle.availWidth-dkform_store.advanced_width-20)+"px";
			}
		}
	}
}
