/* 

	200911*pike
		new functionality is all jquery. cleaning up.
		
	200806*pike
		renamed 'current' to defid
		removed searchformhandling - different in 2.0
		
	20060514*pike
		added 'current' to STLSwapElement 
		
	20060415*pike
	
	this wraps some tools throughout the site.
	<script language="javascript" src="shared/js/SiteTool.js"></script>
	<script language="javascript"><!--//
		if(self.SiteTool) {
		
			
	in a frameset, you should only load this lib in the top frame
		<script language="javascript"><!--//
			if(top.SiteTool) {
				top.SiteTool.zoom(2,self);
				...		

*/



	/* debugger */	
	function tron() 	{ SiteTool.debugtype="alert"; SiteTool.debug("tron"); }
	
	/* SiteTool */
	
	if (self!=top && top.SiteTool) alert("Warning: SiteTool should only be loaded once, \npreferably in the top window");
	
	var SiteTool = {	
	
		
		swapmem			: new Array(),
		stages			: new Array(),
		
		
		activepopid		: "",
		
		mailtipsubject 	: "Tip: $$TITLE$$",
		mailtipbody 	: "Hello\n\nI thought you might find this webpage interesting:\n\n\"$$TITLE$$\",\n$$URL$$",

		mailreportsubject 	: "LfC: inappropriate content: $$TITLE$$",
		mailreportbody 		: "Hello LabforCulture team\n\nI wanted to report inappropriate content on this page:\n\n\"$$TITLE$$\",\n$$URL$$",

		mailcontactsubject 	: "LfC: About '$$TITLE$$'",
		mailcontactbody 	: "Hello LabforCulture team\n\nI am contacting you about this webpage:\n\n\"$$TITLE$$\",\n$$URL$$",

	
		selectAllOptions: STLSelectAllOptions,
		promptNewOption	: STLPromptNewOption,
		deleteOption	: STLDeleteOption,
		checkForm 		: STLCheckForm,
		checkFormElement : STLCheckFormElement,
		clearInput		: STLClearInput,
		copyFormValue	: STLCopyFormValue,
		
		
		hasClassName	: STLHasClassName,
		addClassName	: STLAddClassName,
		removeClassName	: STLRemoveClassName,
		
		toggleElement	: STLToggleElement,
		toggleElements	: STLToggleElements,
		swapElement		: STLSwapElement,
		
		mouseX			: STLMouseX,
		mouseY			: STLMouseY,
		mouseLeaving	: STLMouseLeaving,
		mouseClickOutside	: STLMouseClickOutside,
		stopBubbling	: STLStopBubbling,
		
		openPop			: STLOpenPop,
		closePop		: STLClosePop,
		clickOutsidePop	: STLClickOutsidePop,
		
		
		mailTip			: STLMailTip,
		mailReport		: STLMailReport,
		mailContact		: STLMailContact,
		keepMePosted	: STLKeepMePosted,
		bookmark		: STLBookmark,
		
		debug				: STLDebug,
		debugtype			: (top.document.location.href.indexOf("?tron")!=-1 || 
								top.document.location.href.indexOf("&tron")!=-1)?"alert":"status"

	}
	
	function STLMouseX(evt) {
		if (evt.pageX) return evt.pageX;
		else if (evt.clientX)
			return evt.clientX +  (document.documentElement.scrollLeft ?
				document.documentElement.scrollLeft :
				document.body.scrollLeft);
		else return null;
	}
	function STLMouseY(evt) {
		if (evt.pageY) return evt.pageY;
		else if (evt.clientY)
			return evt.clientY +  (document.documentElement.scrollTop ?
				document.documentElement.scrollTop :
				document.body.scrollTop);
		else return null;
	}
	
	function STLMouseLeaving(elm,event) {
		var tg = (window.event) ? event.srcElement : event.target;
		//alert(tg);
		if (tg != elm) return false;
		var reltg = (event.relatedTarget) ? event.relatedTarget : event.toElement;
		while (reltg != tg && reltg.nodeName != 'BODY'  && reltg.nodeName != 'HTML') {
			reltg= reltg.parentNode;
			if (reltg==elm) return false;
		}	
		return true;
	}
	function STLMouseClickOutside(elm,event) {
		// works for mouseup and mousedown
		var target = (window.event) ? event.srcElement : event.target;
		if (target==elm) return false;
		while (target.nodeName != 'BODY'  && target.nodeName != 'HTML') {
			target= target.parentNode;
			if (target==elm) return false;
		}	
		return true;
	}
	
	function STLStopBubbling(event) {
		event.cancelBubble = true; // microsoft
        if (event.stopPropagation) {
        	//alert('stops');
        	event.stopPropagation(); // w3c
		}
	}
	
	function STLOpenPop(elmid,event,corner,offsetX,offsetY) {
	
		// there should only be one pop, being SiteTool.activepopid
		// an document.event is attached to close the pop on clickoutside
		// if you call this with a mousevent, the pop is 
		// located at corner (topleft,bottomright,..) with offset
		
		var elm = document.getElementById(elmid);
		if (elm) {
			if (SiteTool.activepopid == elmid) {
				// to benefit from this toggle, 
				// attach the event to onmousedown, not onclick
				SiteTool.closePop();
				this.stopBubbling(event);
				return;
			}
			if (SiteTool.activepopid) {
				SiteTool.closePop();
			}
			elm.style.display="block";
			SiteTool.activepopid = elmid;
			if (event) {
				//alert(event);
				if (!corner) corner = "topleft";
				if (!offsetX) offsetX = -15;
				if (!offsetY) offsetY = -15;
				var x = SiteTool.mouseX(event);
				var y = SiteTool.mouseY(event);
				var left = (corner.indexOf('left')==-1)?x-elm.offsetWidth+offsetX:x+offsetX;
				var top = (corner.indexOf('top')==-1)?y-elm.offsetHeight+offsetY:y+offsetY;
				elm.style.top	= top+"px";
				elm.style.left	= left+"px";
				elm.style.zIndex	= 999;
			}
			// clickoutside code
			if (document.addEventListener) {
				document.addEventListener ("mousedown",STLClickOutsidePop,false);
			} else if (document.attachEvent) {
				document.attachEvent ("onmousedown",STLClickOutsidePop);
			} else {
				//document.onmouseup= STLClickOutsidePop;
			}
			this.stopBubbling(event);
		}
		
	}

	function STLClosePop() {
		if (SiteTool.activepopid) {
			var active = document.getElementById(SiteTool.activepopid);
			if (active) {
				active.style.display="none";
				active.style.zIndex=1;
				SiteTool.activepopid = "";
				// clickoutside code
				if (document.removeEventListener) {
				 	document.removeEventListener ("mousedown",STLClickOutsidePop,false);
				} else if (document.detachEvent) {
				 	document.detachEvent ("onmousedown",STLClickOutsidePop);
				} else {
					//document.onmouseup= STLClickOutsidePop;
				}
			}
		}
	}
	
	function STLClickOutsidePop(event) {
		//alert('click');
		var current = document.getElementById(SiteTool.activepopid);
		if (current && SiteTool.mouseClickOutside(current,event)) {
			SiteTool.closePop();
		}
	}
	


	
  
  	function STLToggleElement(id,visible) {
		if (id && document.getElementById(id)) {
			document.getElementById(id).style.display=(visible)?"block":"none";
		}
	}
	
	function STLToggleElements(tagname,classname,visible) {
		var classedelems = document.getElementsByTagName(tagname);
		for (var ec=0;ec<classedelems.length;ec++) {
			var classmatch = false;
			var classattr = classedelems[ec].getAttribute("class");
			if (!classname) {
				//alert("all match");
				classmatch=true;
			} else if (classattr) {
				if (classattr.indexOf(classname)==0) {
					if (classattr==classname) {
						//alert("full match");
						classmatch=true;
					} else if (classattr.indexOf(classname+" ")==0) {
						//alert("start  match");
						classmatch=true;
					}
				} else if (classattr.indexOf(" "+classname)>=0) {
					if (classattr.indexOf(" "+classname+" ")>=0) {
						//alert("mid match");
						classmatch=true;
					} else if(classattr.indexOf(" "+classname)==classattr.length-classname.length-1 ) {
						//alert("end match");
						classmatch=true;
					}
				}
			}
			if (classmatch) classedelems[ec].style.display=(visible)?"block":"none";
			
		}
		
	}
	
	function STLSwapElement(id,context,defid) {
		//alert('STLSwapElement swapping div');
		if (!context) context="default";
		if (!this.swapmem[context] && defid) {
			this.swapmem[context] = defid;
			//alert("current:"+current);
		} 
		if (this.swapmem[context] && document.getElementById(this.swapmem[context])) {
			//alert('hiding' + this.swapmem[context]);
			document.getElementById(this.swapmem[context]).style.display="none";
		}
		if (this.swapmem[context]!=id) {
			if (id && document.getElementById(id)) {
				//alert('showing ' + id);
				document.getElementById(id).style.display="block";
				this.swapmem[context]=id;
			}
		} else {
			// if you swap a element with itself,
			// you effectively toggle it on and off
			//alert('clearing ' + context);
			this.swapmem[context]=null;
		}
	}
	
	
	/* --------------
		Form Tools
		
		new attribute on form elements:
		
			jscheck 					- if this evaluates to true, check is performed
			required, required-err		- boolean, checks if has value or selection or is checked 
			minlength, minlength-err 	- int, min stringlength
			maxlength, maxlength-err 	- int, max stringlength (but browser catches maxlenth)
			refused, refused-err		- string or csv, checks if value or selection does not contain refused values
			accepted, accepted-err		- string or csv, checks if value or selection contains nothing but accepted values
			refusedchars, refusedchars-err		- string, checks if selected values do not contain refused chars
			acceptedchars, acceptedchars-err	- string, checks if selected values contain nothing but accepted chars
			matchinput, matchinput-err	- html dom id, check if value or selection matches values or selection of refered object
			confirm, confirm-err		- string, ask for confirmation y/n
			zap							- string, if value contains this it is replaced with ""
			ignore						- string, if this equals value, value is zapped to ""
			lowercase					- boolean, converts value to lowercase
			uppercase					- boolean, converts value to uppercase
			
	-----------------*/
	
	function STLSelectAllOptions(selelm) {
		for (var oc=0;oc<selelm.options.length;oc++) {
			selelm.options[oc].selected=true;
		}
	}
	
	function STLPromptNewOption(selelm,msg,def) {
		if (!msg) msg = "Enter a new value ..";
		if (!def) def = "";
		var word = top.prompt(msg,def);
		if (word) {
			selelm.options[selelm.options.length] = new Option(word,word);
			selelm.selectedIndex = selelm.options.length-1;
		}
	}
	
	function STLDeleteOption(selelm,idx) {
		for (var oc=idx;oc<selelm.options.length;oc++) {
			selelm.options[oc]=selelm.options[oc+1];
		}
		selelm.options.length -= 1;
	}
	
	function STLCheckForm(theform,elmid) {
		
		
		
		if (!theform) theform = document.forms[0];
		if (theform) {
		
			
			
			// check elms
			var elm = (elmid)?document.getElementById(elmid):theform;
			if (elm) {
				
				var checks = new Array();
				var inputs = elm.getElementsByTagName("input");
				var selects = elm.getElementsByTagName("select");
				var textareas = elm.getElementsByTagName("textarea");
				for (var ec=0;ec<inputs.length;ec++) 	{ checks[checks.length] = this.checkFormElement(inputs.item(ec)); }
				for (var ec=0;ec<selects.length;ec++)  	{ checks[checks.length] = this.checkFormElement(selects.item(ec)); }
				for (var ec=0;ec<textareas.length;ec++) { checks[checks.length] = this.checkFormElement(textareas.item(ec)); }
			
				//alert(checks.length);
				// count your false checks
				var success = true;
				var message = "";
				for (var cc=0;cc<checks.length;cc++) {
					//alert(checks[cc][0]);
					if (!checks[cc][0]) {
						success = false;
						// dont do double messages (checkboxes etc)
						if (message.indexOf(checks[cc][1])==-1) message += checks[cc][1];
					}
				}
				
				if (message) message = message.substring(0,message.length-2)+".";
				
				// alert message if errors
				if (!success) {
					alert(message);
					return false;
				} else return true;
		
			} else alert("Error: Can't find element "+elmid);	
		} else  alert("Error: No form to check ?");
		
		return false;

		
	}
	
	function STLCheckFormElement(formelm) {
		// return a array[boolean:success,string:message]
		var success = true;
		var message = "";
		if (formelm.getAttribute("jscheck")) {
			if (eval(formelm.getAttribute("jscheck"))) {
				if ( formelm.getAttribute("type")=="checkbox" ) {
					// checkboxes and radiobuttons
					if (formelm.getAttribute("required")) {
						//alert("checkbox required");
						if (!formelm.checked) {
							success = false; 
							message += formelm.getAttribute("required-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					}
				} else if ( formelm.getAttribute("type")=="radio") {
					// checkboxes and radiobuttons
					if (formelm.getAttribute("required")) {
						//alert("radio required");
						// find all form elms with the same name, and see
						// if any one of them is checked
						var havecheck = false;
						//var elmname = formelm.getAttribute("name");
						//alert(elmname);
						//var elmform = formelm.form;
						//alert(elmform);
						if (formelm.hasAttribute("name")) {
							var elms = formelm.form[formelm.getAttribute("name")];
							//alert(elms);
							//alert(elms.length);
							for (var ec=0;ec<elms.length;ec++) {
								if (elms[ec].checked) {
									havecheck=true; break;
								}
							}
						} 
						if (!havecheck) {
							success = false; 
							message += formelm.getAttribute("required-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					}
				} else if (formelm.options && !formelm.getAttribute("options")) {
					// option elements
					if (formelm.getAttribute("required")) {
						if (formelm.selectedIndex==-1 || 
							(!formelm.options[formelm.selectedIndex].value 
								&& !formelm.options[formelm.selectedIndex].value)
						) {
							success = false; 
							message += formelm.getAttribute("required-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					}
					if (formelm.getAttribute("refused")) {
						var refarr = formelm.getAttribute("refused").split(",");
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								if (!selval) selval = formelm.options[ec].text;
								for (var rc=0;rc<refarr.length;rc++) {
									if (selval==refarr[rc]) {
										success = false; 
										message += formelm.options[ec].text+": "+formelm.getAttribute("refused-err")+";\n";
										SiteTool.addClassName(formelm," hilited");
									}
								}
							}
						}
					}
					if (formelm.getAttribute("accepted")) {
						var refarr = formelm.getAttribute("accepted").split(",");
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								if (!selval) selval = formelm.options[ec].text;
								for (var rc=0;rc<refarr.length;rc++) {
									if (selval!=refarr[rc]) {
										success = false; 
										message += formelm.options[ec].text+": "+formelm.getAttribute("accepted-err")+";\n";
										SiteTool.addClassName(formelm," hilited");
									}
								}
							}
						}
					}
					if (formelm.getAttribute("refusedchars")) {
						var accepted = true;
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								for (var cc=0; cc<selval.length;cc++) {
									if (formelm.getAttribute("refusedchars").indexOf(selval.substring(cc,cc+1))!=-1) {
										accepted = false; break;
									}
								}
							}
						}
						if (!accepted) {
							success = false; 
							message += formelm.getAttribute("refusedchars-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
						
					}
					if (formelm.getAttribute("acceptedchars")) {
						var accepted = true;
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								for (var cc=0; cc<selval.length;cc++) {
									if (formelm.getAttribute("acceptedchars").indexOf(selval.substring(cc,cc+1))==-1) {
										accepted = false; break;
									}
								}
							}
						}
						if (!accepted) {
							success = false; 
							message += formelm.getAttribute("acceptedchars-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					}
				} else {
					// all other elements (.value)
					if (formelm.getAttribute("required") && !formelm.value.length) {
						success = false; 
						message += formelm.getAttribute("required-err")+";\n";
						SiteTool.addClassName(formelm," hilited");
					}
					if (formelm.getAttribute("minlength") && formelm.value.length<formelm.getAttribute("minlength")) {
						success = false; 
						message += formelm.getAttribute("minlength-err")+";\n";
						SiteTool.addClassName(formelm," hilited");
					}
					if (formelm.getAttribute("maxlength") && formelm.value.length>formelm.getAttribute("maxlength")) {
						success = false; 
						message += formelm.getAttribute("maxlength-err")+";\n";
						SiteTool.addClassName(formelm," hilited");
					}
					if (formelm.getAttribute("refused") && formelm.value.indexOf(formelm.getAttribute("refused")!=-1)) {
						var accepted = true;
						for (var cc=0; cc<formelm.value.length;cc++) {
							if (formelm.getAttribute("refused").indexOf(formelm.value.substring(cc,cc+1))!=-1) {
								accepted = false; 
							}
						}
						if (!accepted) {
							success = false; 
							message += formelm.getAttribute("refused-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					}
					if (formelm.getAttribute("accepted")) {
						var accepted = true;
						for (var cc=0; cc<formelm.value.length;cc++) {
							if (formelm.getAttribute("accepted").indexOf(formelm.value.substring(cc,cc+1))==-1) {
								accepted = false; 
							}
						}
						if (!accepted) {
							success = false; 
							message += formelm.getAttribute("accepted-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					}
					
					// the rest are not errors, but transformations applied
					// based on the forms contents .
					if (formelm.getAttribute("zap") && formelm.value.indexOf(formelm.getAttribute("zap"))!=-1) {
						formelm.value=formelm.value.replace(formelm.getAttribute("zap"),"");
					}
					if (formelm.getAttribute("ignore") && formelm.value== formelm.getAttribute("ignore")) {
						formelm.value="";
					}
					if (formelm.getAttribute("lowercase")) {
						formelm.value=formelm.value.toLowerCase();
					}
					if (formelm.getAttribute("uppercase")) {
						formelm.value=formelm.value.toUpperCase();
					}
				}
				
				// any element
				if (formelm.getAttribute("matchinput")) {
					var srcvalue = formelm.value;
					if (formelm.options) srcvalue = formelm.options[formelm.selectedIndex].value;
					var dstelm = formelm.form[formelm.getAttribute("matchinput")];
					if (dstelm) {
						var dstvalue = dstelm.value;
						if (dstelm.options) dstvalue = dstelm.options[dstelm.selectedIndex].value;
						if (dstvalue!=srcvalue) {
							success = false; 
							message += formelm.getAttribute("matchinput-err")+";\n";
							SiteTool.addClassName(formelm," hilited");
						}
					} else {
						success = false; 
						message += "Can't find matching element '"+formelm.getAttribute("matchinput")+"';\n";
						SiteTool.addClassName(formelm," hilited");
					}
				}
				
				if (formelm.getAttribute("confirm")) {
					if (!confirm(formelm.getAttribute("confirm"))) {
						success = false; 
						message += formelm.getAttribute("confirm-err")+";\n";
						SiteTool.addClassName(formelm," hilited");
					}
				}
			} // else dont check
		} // else dont check
		if (!success && !message) {
			message = "Field "+formelm.name+" does not validate.";
		}
		return [success,message];
	}
	

	

	
	function STLClearInput(formelm,defmsg) {
		if (formelm.value==defmsg) formelm.value="";
	}
	function STLCopyFormValue(formelm1,formelm2) {
		//alert('STLCopyFormValue');
		if (formelm1 && formelm2) formelm1.value = formelm2.value;
	}



	function STLDebug(msg) {
		if (this.debugtype=="alert" && !confirm(msg)) this.debugtype="status";
		else if (this.debugtype=="status") window.status = msg;
	}

	/* ----------------
	
		dynamic css classes. should be 
		done by jquery nowadays, dont use these
		
	-------------------*/
	
	function STLHasClassName(elm,classname) {
		return new RegExp('\\b'+classname+'\\b').test(elm.className);
	}
	function STLAddClassName(elm,classname) {
		if(!this.hasClassName(elm,classname)){
			elm.className+=elm.className?' '+classname:classname;
		}
	}
	function STLRemoveClassName(elm,classname) {
		var rep=elm.className.match(' '+classname)?' '+classname:classname+' ';
		elm.className=elm.className.replace(rep,'');
	}



	function STLMailTip() {
		
		var maillink = "mailto:";
		
		var rex = /\$\$TITLE\$\$/gi;
		var subject = this.mailtipsubject.replace(rex,document.title);
		var body = this.mailtipbody.replace(rex,document.title);
		
		var rex = /\$\$URL\$\$/gi;
		body = body.replace(rex,document.location.href);
		
		maillink += "?subject="+encodeURI(subject);
		maillink += "&body="+encodeURI(body);
		
		document.location.href= maillink;
		return true;	
		
	}
	
	function STLMailContact(email) {
		
		var maillink = "mailto:"+email;
		
		var rex = /\$\$TITLE\$\$/gi;
		var subject = this.mailcontactsubject.replace(rex,document.title);
		var body = this.mailcontactbody.replace(rex,document.title);
		
		var rex = /\$\$URL\$\$/gi;
		body = body.replace(rex,document.location.href);
		
		maillink += "?subject="+encodeURI(subject);
		maillink += "&body="+encodeURI(body);
		
		document.location.href= maillink;
		return true;	
		
	}
	
	function STLMailReport(email) {
		
		var maillink = "mailto:"+email;
		
		var rex = /\$\$TITLE\$\$/gi;
		var subject = this.mailreportsubject.replace(rex,document.title);
		var body = this.mailreportbody.replace(rex,document.title);
		
		var rex = /\$\$URL\$\$/gi;
		body = body.replace(rex,document.location.href);
		
		maillink += "?subject="+encodeURI(subject);
		maillink += "&body="+encodeURI(body);
		
		document.location.href= maillink;
		return true;	
		
	}

	function STLKeepMePosted(object_id,node_id){
		document.notifyform.ContentNodeID.value=node_id; 
		document.notifyform.ContentObjectID.value=object_id; 
		document.notifyform.ActionAddToNotification.value="Notify me"; 
		document.notifyform.submit();
	}
	
	function STLBookmark(object_id,node_id){
		document.bookmarkform.ContentNodeID.value=node_id; 
		document.bookmarkform.ContentObjectID.value=object_id; 
		document.bookmarkform.ActionAddToBookmarks.value="Bookmark"; 
		document.bookmarkform.submit();
	}

	

