__section__
default
__description__
Popup tree for topics in admin editor
__title__

__page__
admin
__lang__
en_US
__name__
topic_popup_js
__template__
/* record location of mouse on each click */
var hpts_mouseX;
var hpts_mouseY;
var hpts_offsetX;
var hpts_offsetY;
var hpts_locked_obj;

document.onmousedown = hpts_lock;
document.onmousemove = hpts_drag;
document.onmouseup   = hpts_release;

function hpts_lock(evt) {
	evt = (evt) ? evt : event;
	hpts_set_locked(evt);
	hpts_update_mouse(evt);

	if (hpts_locked_obj) {
		if (evt.pageX) {
			hpts_offsetX = evt.pageX - ((hpts_locked_obj.offsetLeft)
				? hpts_locked_obj.offsetLeft
				: hpts_locked_obj.left);
			hpts_offsetY = evt.pageY - ((hpts_locked_obj.offsetTop)
			? hpts_locked_obj.offsetTop
			: hpts_locked_obj.top);
		} else if (evt.offsetX || evt.offsetY) {
			hpts_offsetX = evt.offsetX - ((evt.offsetX < -2)
				? 0
				: document.body.scrollLeft);
			hpts_offsetY = evt.offsetY - ((evt.offsetY < -2)
				? 0
				: document.body.scrollTop);
		} else if (evt.clientX) {
			hpts_offsetX = evt.clientX - ((hpts_locked_obj.offsetLeft)
				? hpts_locked_obj.offsetLeft
				: 0);
			hpts_offsetY = evt.clientY - ((hpts_locked_obj.offsetTop)
				? hpts_locked_obj.offsetTop
				: 0);
		}
		return false;
	}

	return true;
}

function hpts_update_mouse(evt) {
	if (evt.pageX) {
		hpts_mouseX = evt.pageX;
		hpts_mouseY = evt.pageY;
	} else {
		hpts_mouseX = evt.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		hpts_mouseY = evt.clientY + document.documentElement.scrollTop  + document.body.scrollTop;
	}
}


function hpts_set_locked(evt) {
	var target = (evt.target) ? evt.target : evt.srcElement;
	if (target && target.className == "hpts-title") { 
		hpts_locked_obj = target.parentNode;
		return;
	}
	hpts_locked_obj = null;
	return;
}

function hpts_drag(evt) {
	evt = (evt) ? evt : event;
	hpts_update_mouse(evt);

	if (hpts_locked_obj) {
		hpts_locked_obj.style.left = (hpts_mouseX - hpts_offsetX) + "px";
		hpts_locked_obj.style.top  = (hpts_mouseY - hpts_offsetY) + "px";
		evt.cancelBubble = true;
		return false;
	}
}

function hpts_release(evt) {
	hpts_locked_obj = null;
}

[% names = name; name = name.0 %]

var [% name %]_selected_id = -1;
[%- FOR quickname = names %]
var [% quickname %]_selected_val;
[%- END %]
var [% name %]_selected_type;
var [% name %]_max_id = [% loop.max %];
var [% name %]_elem_focus = '[% name %]';

/* save which SELECT box has "focus", for adding */
function [% name %]_change_focus(elem) {
	[% name %]_elem_focus = elem;
}

/* handle keypresses in search field */
function [% name %]_search_key_handler(type, e) {
	var name = "[% name %]";
	if (type) {
		name = name + "-" + type;
	}

	if (!e) {
		e = window.event;
	}

	var key = e.which || e.keyCode;

	if (key == 27) { // esc
		[% name %]_close(type);

		e.returnValue = true;
		return true;
	} else {
		var searchobj = document.getElementById(name + "-searchfield");
		var searchstring = searchobj.value;
		var len  = searchstring.length;
		var last = searchstring.substring(len-1, len);

		var add = 0;
		if (last == '+') {
			add = 1;
		} else if (last == '=') {
			add = 2;
		}

		// adding only works with st, not stc ... but stc
		// is used only for secondary topic list for editing
		// topics, so it's not something used much, so i don't care
		if (add) {
			searchobj.value = '';
			[% name %]_search(type, searchstring.substring(0, len-1), add);
			searchobj.focus();

			e.returnValue = true;
			return true;
		} else {
			[% name %]_search(type);

			e.returnValue = false;
			return false;
		}
	}

	e.returnValue = false;
	return false;
}

/* find topics matching string */
function [% name %]_search(type, searchstring, add) {
	var name = "[% name %]";
	if (type) {
		name = name + "-" + type;
	}

	if (!searchstring) {
		var searchobj = document.getElementById(name + "-searchfield");
		searchstring = searchobj.value;
	}
	searchstring = searchstring.toLowerCase();

	var tids = new Array;
	var c = 0;
	for (var i = 0; i <= [% name %]_max_id; i++) {
		var obj = document.getElementById("[% name %]-fullname-" + i);
		if (obj) {
			var k = obj.value.lastIndexOf(' :: ');
			var myname = '';
			if (k < 0) {
				myname = obj.value;
			} else {
				myname = obj.value.substr(k + 4);
			}

			var j = 0;
			if (!searchstring) {
				j = 0;
			} else {
				var match = myname.toLowerCase().indexOf(searchstring);

				if (searchstring.length > 1) {
					if (match != -1) {
						j = 1;
					}
				// if search term is one letter, only use at beginning
				} else if (match == 0) {
					j = 1;
				}
			}

			if (j) {
				c++;
				var tidobj = document.getElementById("[% name %]-tid-" + i);
				if (add && c == 1) {
					if (add == 1) { // add normally
						[% name %]_main_add_really(tidobj.value, myname, [% name %]_get_weight(i), 1);
					} else if (add == 2) { // add as front page (second-highest weight)
						[% name %]_main_add_really(tidobj.value, myname, [% constants.topic_popup_weights.keys.nsort.reverse.1 %], 1);
					}
				} else if (!add) {
					var thistid = new Array (myname, i, tidobj.value);
					tids[tidobj.value] = thistid;
				}
			}
		}
	}

	/* clear selection */
	if (type == [% name %]_selected_type && [% name %]_selected_id != -1) {
		[% name %]_toggle_select([% name %]_selected_id, 0, type);
	}

	var thistext = '';
	/* Mozilla can't take sort routine, apparently */
	tids.sort();
	//tids.sort([% name %]_search_sort);

	for (var i = 0; i <= tids.length; i++) {
		if (tids[i]) {
			thistext = thistext +
				'<div nowrap><span id="[% name %]-ab-line-' + tids[i][1] +
				'" ondblclick="[% name %]_ok(\'ab\')" onclick="[% name %]_toggle_select(' +
				tids[i][1] + ',' + tids[i][2] +
				',\'ab\')"><a class="topic_sel" href="javascript:void(0);">' + tids[i][0] +
				'</a></span></div>';
		}
	}

	var htmlobj = document.getElementById(name + "-searchlist");
	htmlobj.innerHTML = thistext;

	/* don't submit page */
	return false;
}

/* sort the array of arrays */
function [% name %]_search_sort(a, b) {
	if (a[0].toLowerCase() > b[0].toLowerCase()) { return  1 }
	if (a[0].toLowerCase() < b[0].toLowerCase()) { return -1 }
	else                                         { return  0 }
}

/* get saved list */
function [% name %]_get_saved_tree() {
	var list = new Array;
	for (var i = 0; i <= [% name %]_max_id; i++) {
		var obj = document.getElementById("[% name %]-desc-" + i);
		if (obj && obj.style.display != 'block') {
			list.push(i);
		}
	}
	return(list.join(','));
}

/* reset saved */
function [% name %]_reset_saved_tree(list) {
	// convert array of integers to indexes
	var saved = new Array;
	for (var i = 0; i <= list.length; i++) {
		saved[ list[i] ] = 1;
	}

	for (var i = 0; i <= [% name %]_max_id; i++) {
		var obj = document.getElementById("[% name %]-desc-" + i);
		if (obj) {
			if (saved[i]) {
				[% name %]_collapse(i);
			} else {
				[% name %]_expand(i);
			}
		}
	}
}

/* collapse entire tree */
function [% name %]_collapse_all() {
	for (var i = 0; i <= [% name %]_max_id; i++) {
		var obj = document.getElementById("[% name %]-desc-" + i);
		if (obj) {
			[% name %]_collapse(i);
		}
	}

	var mybutton = document.[% form_field_form %].[% name %]_topic_toggle_all;
	mybutton.value = "Expand";
	mybutton.onclick = [% name %]_expand_all;
}

/* expand entire tree */
function [% name %]_expand_all() {
	for (var i = 0; i <= [% name %]_max_id; i++) {
		var obj = document.getElementById("[% name %]-desc-" + i);
		if (obj) {
			[% name %]_expand(i);
		}
	}

	var mybutton = document.[% form_field_form %].[% name %]_topic_toggle_all;
	mybutton.value = "Collapse";
	mybutton.onclick = [% name %]_collapse_all;
}

/* expand or collapse a sub-tree */
function [% name %]_toggle_expand(id) {
	var obj = document.getElementById("[% name %]-desc-" + id);

	if (obj.style.display != 'block') {
		[% name %]_expand(id);
	} else {
		[% name %]_collapse(id);
	}
}

/* expand a sub-tree */
function [% name %]_expand(id) {
	var obj = document.getElementById("[% name %]-desc-" + id);
	var plus = document.getElementById("[% name %]-plus-" + id);
	var node = document.getElementById("[% name %]-node-" + id);

	obj.style.display = 'block';
	plus.src = "[% image_path %]minus.png";
	node.src = "[% image_path %]open_node.png";
}

/* collapse a sub-tree */
function [% name %]_collapse(id) {
	var obj = document.getElementById("[% name %]-desc-" + id);
	var plus = document.getElementById("[% name %]-plus-" + id);
	var node = document.getElementById("[% name %]-node-" + id);

	obj.style.display = 'none';
	plus.src = "[% image_path %]plus.png";
	node.src = "[% image_path %]closed_node.png";
}

/* select or unselect a node */
function [% name %]_toggle_select(id, val, type) {
	var name = "[% name %]";
	var iname = "[% name %]";
	if (type) {
		name = name + "-" + type;
		iname = iname + "_" + type;
	}

	if ([% name %]_selected_id != -1) {
		/* turn off old selected value */
		var oldname = "[% name %]";
		if ([% name %]_selected_type) {
			oldname = oldname + "-" + [% name %]_selected_type;
		}
		var old = document.getElementById(oldname + "-line-" + [% name %]_selected_id);
		old.className = "hpts-label-unselected";
	}

	var img_main = document[iname + "_main_img"];
	if (id == [% name %]_selected_id && type == [% name %]_selected_type) {
		/* clicked twice, turn it off and go back to nothing selected */
		[% name %]_selected_id = -1;
		[% name %]_selected_type = '';
		img_main.style.visibility = "hidden";
	} else {
		/* turn on selected item */
		var new_obj = document.getElementById(name + "-line-" + id);
		new_obj.className = "hpts-label-selected";
		[% name %]_selected_id = id;
		[%- FOR quickname = names %]
		[% quickname %]_selected_val = val;
		[%- END %]
		[% name %]_selected_type = type;

		/* make topic image appear/disappear */
		var img_obj = document.getElementById("[% name %]-img-" + id);
		if (img_obj) {
			img_main.style.visibility = "visible";
			img_main.src = "[% constants.imagedir %]/topics/" + img_obj.value;
		} else {
			img_main.style.visibility = "hidden";
		}
	}
}

/* it's showtime! */
function [% name %]_show(type) {
	var name = "[% name %]";
	var iname = "[% name %]";
	if (type) {
		name = name + "-" + type;
		iname = iname + "_" + type;

// Moz unhappy with this
//		if (type == 'ab') {
//			var searchobj = document.getElementById(name + "-searchfield");
//			searchobj.focus();
//		}
	}

	var mybuttons = new Array ('[% names.join("','") %]');
	for (var i = 0; i < mybuttons.length; i++) {
		var mybutton = document.[% form_field_form %][mybuttons[i] + '_topic_toggle'];
		if (mybutton) {
			mybutton.src = "[% image_path %]admin-topic-close.gif";
			mybutton.alt = "close";
			mybutton.title = "Close Topics Window";
			if (type) {
				mybutton.onmouseup = new Function ('[% name %]_close("' + type + '")');
			} else {
				mybutton.onmouseup = function () { [% name %]_close() };
			}
		}
	}

	var obj  = document.getElementById(name + "-outer");
	var obj2 = document.getElementById("[% name %]-display");
	var ot   = obj2.offsetTop;
	/* get absolute value of element */
	while ((obj2 = obj2.offsetParent) != null) {
		ot += obj2.offsetTop;
	}

	// var x = Math.floor(hpts_mouseX - ([% width %]/2));
	var x = 2;
	// x = (x > 2 ? x : 2);
	// var y = Math.floor(hpts_mouseY - ([% IF height %][% height %]/5 * 4[% ELSE %]100[% END %]));
	// var y = Math.floor(hpts_mouseY - 100);
	//var y = Math.floor(window.pageYOffset + 20);
	var y = ot; // - 7;
	y = (y > 2 ? y : 2);

	obj.style.right = x + "px";
	obj.style.top   = y + "px";

	obj.style.visibility = "visible";

	document[iname + "_main_img"].style.visibility = "hidden";

[%- IF hide_selects %]
	for(var f = 0; f < document.forms.length; f++) {
		for(var x = 0; x < document.forms[f].elements.length; x++) {
			var e = document.forms[f].elements[x];
			if (e.options) {
				e.style.visibility = "hidden";
			}
		}
	}
[%- END; IF hide_textareas %]
	for(var f = 0; f < document.forms.length; f++) {
		for(var x = 0; x < document.forms[f].elements.length; x++) {
			var e = document.forms[f].elements[x];
			if (e.rows) {
				e.style.visibility = "hidden";
			}
		}
	}
[%- END %]

	var mytree = document.[% form_field_form %].[% name %]_tree_pref;
	mytree.value = type;
}

function [% name %]_switch(type_a, type_b) {
	[% name %]_close(type_a);
	[% name %]_show(type_b);
}

function [% name %]_cancel(type) {
	[% name %]_close(type);
}

function [% name %]_close(type) {
	var name = "[% name %]";
	var iname = "[% name %]";
	if (type) {
		name = name + "-" + type;
		iname = iname + "_" + type;
	}

	var mybuttons = new Array ('[% names.join("','") %]');
	for (var i = 0; i < mybuttons.length; i++) {
		var mybutton = document.[% form_field_form %][mybuttons[i] + '_topic_toggle'];
		if (mybutton) {
			mybutton.src = "[% image_path %]admin-topic-open.gif";
			mybutton.alt = "open";
			mybutton.title = "Open Topics Window";
			if (type) {
				mybutton.onmouseup = new Function ('[% name %]_show("' + type + '")');
			} else {
				mybutton.onmouseup = function () { [% name %]_show() };
			}
		}
	}

	/* hide window */
	var obj = document.getElementById(name + "-outer");
	obj.style.visibility = "hidden";

	/* clear selection */
	if (type == [% name %]_selected_type && [% name %]_selected_id != -1) {
		[% name %]_toggle_select([% name %]_selected_id, 0, type);
	}

[%- IF hide_selects %]
	for(var f = 0; f < document.forms.length; f++) {
		for(var x = 0; x < document.forms[f].elements.length; x++) {
			var e = document.forms[f].elements[x];
			if (e.options) {
				e.style.visibility = "visible";
			}
		}
	}
[%- END; IF hide_textareas %]
	for(var f = 0; f < document.forms.length; f++) {
		for(var x = 0; x < document.forms[f].elements.length; x++) {
			var e = document.forms[f].elements[x];
			if (e.rows) {
				e.style.visibility = "visible";
			}
		}
	}
[%- END %]
}

function [% name %]_get_all_names(id) {
	var obj = document.getElementById("[% name %]-fullname-" + id);
	if (obj) {
		return obj.value;
	}
}

function [% name %]_get_weight(id) {
	var obj = document.getElementById("[% name %]-weight-" + id);
	if (obj) {
		return obj.value;
	}
}

/* user clicks the ok button */
function [% name %]_ok() {
	if ([% name %]_selected_id == -1) {
		alert("Please select an item and click Add Topic, or Close Window when you're done.");
		return;
	}

	/* fill in a form field if they spec'd one */
	[% IF form_field %][% IF form_field_form %]document.forms["[% form_field_form %]"][% ELSE %]document.forms[0][% END %].elements["[% form_field %]"].value = [% name %]_selected_val;[% END %]

	/* trigger onselect */
	[%- IF onselect == name _ "_main_add" %]
	if ([% name %]_elem_focus == '[% names.1 %]') {
		[% names.1 %]_main_add([% names.1 %]_selected_val);
	} else {
		[% name %]_main_add([% name %]_selected_val);
	}
	[%- ELSIF onselect %][% onselect %]([% name %]_selected_val);
	[% END %]
}

[% FOR name = names %]

function [% name %]_main_add(val) {
	var name   = [% names.0 %]_get_all_names([% names.0 %]_selected_id);
	var weight = [% names.0 %]_get_weight([% names.0 %]_selected_id);
	[% name %]_main_add_really(val, name, weight);
}

function [% name %]_main_add_really(val, name, weight, noerr) {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	var duplicates = new Array;
	for (var i = 0; i < myselect.length; i++) {
		if (myselect[i].value == val) {
			duplicates.unshift(i);
		}
	}

	var do_it = 1;
	if (duplicates.length) {
		do_it = (noerr || confirm("This operation will replace the existing topic from the selection box.  Continue?"));
	}

	if (do_it) {
		for (var i = 0; i < duplicates.length; i++) {
			[% name %]_remove_really(duplicates[i]);
		}

		var newindex = myselect.length; // default to end of list
		for (var i = 0; i < myselect.length; i++) {
			var myval = myselect[i].value;
			if (myval.indexOf('-') == 0) {
				if (myval.substr(1) <= weight) {
					newindex = i;
					i = myselect.length;
				}
			}
		}

		var oldindex = myselect.length;
		myselect[oldindex] = new Option(name, val);
		[% name %]_main_reorder(oldindex, newindex);
	}
}

/* move item in list */
function [% name %]_main_reorder(oldindex, newindex) {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	myselect.focus();

	if (myselect[oldindex].value.indexOf('-') == 0) {
		return;
	}

	if (oldindex != newindex) {
		var myoption = new Option(myselect[oldindex].text, myselect[oldindex].value);

		if (oldindex > newindex) {
			for (var i = oldindex-1; i >= newindex; i--) {
				myselect[i+1] = new Option(myselect[i].text, myselect[i].value);
			}
		} else if (oldindex < newindex) {
			for (var i = oldindex+1; i <= newindex; i++) {
				myselect[i-1] = new Option(myselect[i].text, myselect[i].value);
			}
		}
		myselect[newindex] = myoption;
	}
	myselect.selectedIndex = newindex;
}

/* user clicks the remove button */
function [% name %]_move_item(direction, noerr) {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	if (myselect.selectedIndex == -1) {
		if (!noerr) {
			alert("Please select an item to remove.");
		}
		return;
	}

	[% name %]_main_reorder(myselect.selectedIndex, myselect.selectedIndex - direction);
}

/* user clicks the remove button */
function [% name %]_remove(noerr) {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	if (myselect.selectedIndex == -1) {
		if (!noerr) {
			alert("Please select an item to remove.");
		}
		return;
	}

	[% name %]_remove_really(myselect.selectedIndex);

	/* loop! */
	if (myselect.selectedIndex != -1) {
		[% name %]_remove(1);
	}
}

function [% name %]_remove_really(index) {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	if (myselect[index].value.indexOf('-') == 0) {
		/* don't remove dividers, just deselect */
		myselect[index].selected = false;
	} else {
		/* remove it */
		myselect[index] = null;
	}
}

/* user clicks the submit button */
function [% name %]_submit(button) {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	for (var i = 0; i < myselect.length; i++) {
		myselect[i].selected = true;
	}

[% IF name == names.1 -%]
	[% names.0 %]_submit(button);
[% ELSE -%]
	var mysaved = document.[% form_field_form %].[% name %]_saved_tree;
	mysaved.value = [% name %]_get_saved_tree();

	var myop = document.[% form_field_form %].[% name %]_submit_op;
	myop.name = button.name;
	myop.value = button.value;

	document.[% form_field_form %].submit();
[% END -%]
}

function [% name %]_load_names() {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	if (myselect[0]) {
		myselect[0].selected = true;
	}
}

function [% name %]_visit() {
	var myselect = document.[% form_field_form %].[% name %]_main_select;

	if (myselect.selectedIndex == -1) {
		if (!noerr) {
			alert("Please select an topic to visit.");
		}
		return;
	}

	document.location = '[% gSkin.rootdir %]/admin.pl?op=topics&nexttid='
		+ myselect[myselect.selectedIndex].value;
}

[% END %]

__seclev__
10000
__version__
$Id: topic_popup_js;admin;default,v 1.20 2005/09/22 20:10:23 tvroom Exp $
