
var is_opera = navigator.userAgent.indexOf("Opera") > -1;
var is_ie = navigator.userAgent.indexOf("MSIE") > 1 && !is_opera;
var is_moz = navigator.userAgent.indexOf("Mozilla/5.") == 0 && !is_opera;
var is_gecko  = (navigator.product == "Gecko");


function getpart(target, which) {
	var tmp_arr = target.split('|');
	if (which >= 0 && which < tmp_arr.length)
		return tmp_arr[which];
	else
		return "";
}

function helpWindow(in_name) {
	var new_win = window.open("",in_name + "help","resizable,height=500,width=500,scrollbars");
	new_win.document.write(
		'<frameset rows=*,70><frame name=help src="/pagewiz/help/' + in_name + '.html">' + 
		'<frame name=button src="/pagewiz/help/helpbutton.html"></frameset>');
	new_win.document.close();
	new_win.focus();
}

function adel(in_arr, which) {
	which = which * 1;
	for (i = which; i < in_arr.length - 1; i++)
		in_arr[i] = in_arr[i+1];
	in_arr.length--;
}

function closeWin() {
	window.close();
	return false;
}

function getparamval(which) {
	if (params.indexOf(which) < 0)
		return "";
	var param_arr = params.split(';');
	var i;
	var debug_str;
	which = which + "=";
	//    lee=foo,bar,baz
	for (i=0; i < param_arr.length; i++) {
		if (param_arr[i].indexOf(which) == 0)
			return param_arr[i].substring(which.length);
	}
	return "";
}

// some prototype methods based on www.svendtofte.com/code/usefull_prototypes

// pwArray is used instead of Array, because a changed Array.prototype
// screws up for (i in Array) loops in htmlarea.  If you want to use these
// prototype functions, just remember to set A = new pwArray();

// BUG: pwArrays do *not* auto-resize when a higher-indexed element is set
// so "blah[blah.length] = 'hello';" fails.  Use "blah.push('hello');" instead.
if(navigator.userAgent.toLowerCase().indexOf("msie") == -1) {
Node.prototype.swapNode = function(node) {
	
	if(node == this.nextSibling)
		var insertBeforeNode = this;
	else
		var insertBeforeNode = this.nextSibling;
		
	var parentNode = this.parentNode;
	
	node.parentNode.replaceChild(this, node);
	parentNode.insertBefore(node, insertBeforeNode);
}
}
String.prototype.afterLast = function(a) {
	return this.substring(this.lastIndexOf(a)+1);
}

function pwArray() {}
pwArray.prototype = new Array();

// A.andnot(B) returns a copy of A with any of B's elements removed
pwArray.prototype.andnot = function andnot(B) {
	var ret = new Array();
	lookatthis:
	for (var i = 0; i < this.length; i++) {		// foreach(this)
		for (var j = 0; j < B.length; j++) 		// foreach(B)
			if (this[i] == B[j])				// if in B, forget this[i]
				continue lookatthis;
		ret.push(this[i])
	}
	return ret;
}

pwArray.prototype.indexOf = function(val) {   
	for (var i = 0; i < this.length; i++)
		if (this[i] == val)			// must exactly match array element
			return i;
	return -1;
}

pwArray.prototype.copy = function copy()
{
  var loop;
  var temp_array = new Array();
  for (loop = 0; loop < this.length; loop++)
  {
    temp_array[loop] = this[loop];
  }
  return temp_array;
}

// apply function f to each element, sort, then return the original elements
pwArray.prototype.sortBy = function(f) {
	var sep = String.fromCharCode(1);
	for (var i = 0; i < this.length; i++)
		this[i] = f(this[i]) + sep + this[i];
	this.sort();
	for (i = 0; i < this.length; i++)
		this[i] = this[i].substring(this[i].indexOf(sep)+1);
	return this;
}

//event handling functions - used to attach (append) an event to any given element
function addEvent(el, evname, func) {
	if (is_ie) {
		el.attachEvent("on" + evname, func);
	} else {
		el.addEventListener(evname, func, true);
	}
}

function removeEvent(el, evname, func) {
	if (is_ie) {
		el.detachEvent("on" + evname, func);
	} else {
		el.removeEventListener(evname, func, true);
	}
}

// **********************************************
//   Code to create draggable objects very easily
// **********************************************


// object to hold drag information.
var dragInfo = new Object();
//make sure it appears on top
dragInfo.zIndex = 10;

//To create a draggable obj, add an onMouseDown handler to the element that will be draggable
//  dragEl - the element (string 'id' or element object) to move when dragged (i.e. move a parent elemnent and all children 
//			when a certain child is dragged
//      i.e. <div onmousedown="dragStart(event, 'parentContainer')" 
function dragStart(ev, dragEl) {

	var el;
	var left, top;

	//if dragEl is a string, get the element of that id
	//if dragEl is an object, use that object
	//otherwise, use the object the event was initiated on
	if (typeof dragEl == "string") {
		dragInfo.dragEl = document.getElementById(dragEl);
	} else if(typeof dragEl == "object") {
		dragInfo.dragEl = dragEl;
	} else {
		dragInfo.dragEl = (is_ie) ? window.event.srcElement : ev.target;
	}
	
	//Use the parent element for text nodes.
	if (dragInfo.dragEl.nodeType == 3)
		dragInfo.dragEl = dragInfo.dragEl.parentNode;
	
	// Get cursor position with respect to the page.
	if (is_ie) {
		left = window.event.clientX + document.documentElement.scrollLeft
			+ document.body.scrollLeft;
		top = window.event.clientY + document.documentElement.scrollTop
			+ document.body.scrollTop;
		//alert(left  + " - " + top);
	} else if (is_gecko) {
		left = ev.clientX + window.scrollX;
		top = ev.clientY + window.scrollY;
	} else {
		return;
	}

	// Save starting positions of cursor and element.
	dragInfo.cursorStartX = left;
	dragInfo.cursorStartY = top;
	
	if(dragInfo.dragEl.style.left == "") {
		if (document.defaultView && document.defaultView.getComputedStyle) {
			dragInfo.dragEl.style.left = parseInt(document.defaultView.getComputedStyle(dragInfo.dragEl, '').getPropertyValue('left'));
		} else if(document.all && document.getElementById && dragInfo.dragEl.currentStyle) {
			dragInfo.dragEl.style.left = parseInt(dragInfo.dragEl.currentStyle.left);
		}
	}
	dragInfo.elStartLeft  = parseInt(dragInfo.dragEl.style.left);
	
	if(dragInfo.dragEl.style.top == "") {
		if (document.defaultView && document.defaultView.getComputedStyle) {
			dragInfo.dragEl.style.top = parseInt(document.defaultView.getComputedStyle(dragInfo.dragEl, '').getPropertyValue('top'));
		} else if(document.all && document.getElementById && dragInfo.dragEl.currentStyle) {
			dragInfo.dragEl.style.top = parseInt(dragInfo.dragEl.currentStyle.top);
		}
	} 
	dragInfo.elStartTop   = parseInt(dragInfo.dragEl.style.top);
	
	
	if (isNaN(dragInfo.elStartLeft)) dragInfo.elStartLeft = 0;
	if (isNaN(dragInfo.elStartTop))  dragInfo.elStartTop  = 0;
	
	// Update element's z-index.
	
	dragInfo.dragEl.style.zIndex = ++dragInfo.zIndex;

	// Capture mousemove and mouseup events on the page.
	addEvent(document, "mousemove", dragMove);
	addEvent(document, "mouseup", dragEnd)
	if (is_ie) {
		event.cancelBubble = true;
		event.returnValue = false;
	} else 
		ev.preventDefault();
}

function dragMove(ev) {

	var left, top;
	// Get cursor position with respect to the page.
	if (is_ie) {
		left = window.event.clientX + document.documentElement.scrollLeft
			+ document.body.scrollLeft;
		top = window.event.clientY + document.documentElement.scrollTop
			+ document.body.scrollTop;
	} else {
		left = ev.clientX + window.scrollX;
		top = ev.clientY + window.scrollY;
	}
	
	// Move drag element by the same amount the cursor has moved.
	
	dragInfo.dragEl.style.left = (dragInfo.elStartLeft + left - dragInfo.cursorStartX) + "px";
	dragInfo.dragEl.style.top  = (dragInfo.elStartTop  + top - dragInfo.cursorStartY) + "px";
	
	if (is_ie) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else 
		ev.preventDefault();
}

function dragEnd(ev) {
	
	// Stop capturing mousemove and mouseup events.
	removeEvent(document, "mousemove", dragMove);
	removeEvent(document, "mouseup", dragEnd);
}


// **********************************************
//  End draggable objects code
// **********************************************

