﻿function JXUtil() {
}
function $$$() {
	var elements = new Array();

	for ( var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			if (document.getElementById) {
				element = document.getElementById(element);
			} else if (document.all) {
				element = document.all[element];
			}
		}
		if (arguments.length == 1) {
			return element;
		}

		elements.push(element);
	}

	return elements;
}
function processParamsMap(args, paramsMap, parentKey) {
	var j = args.length;
	var keys = paramsMap.keys();
	for ( var i = 0; i < keys.length; i++) {
		var key = keys[i];
		var value = paramsMap.get(key);
		if ((key.indexOf("-") != -1) || (key.indexOf("ws") != -1)
				|| (key.indexOf("method") != -1)
				|| (key.indexOf("callbackid") != -1)
				|| (key.indexOf("stamp") != -1) || (key.indexOf("xhr") != -1)) {
			alert("key can not include '-'");
		}
		if (value && typeof value == "object" && value.isMap()) {
			if (parentKey != null) {
				processParamsMap(args, value, parentKey + key + "-");
			} else {
				processParamsMap(args, value, key + "-");
			}
		} else {
			if (parentKey != null) {
				args[j++] = parentKey + key;
			} else {
				args[j++] = key;
			}
			args[j++] = value;
		}
	}
}

JXUtil.setValue = function(ele, val, flag) {
	if (val == null) {
		val = "";
	}

	var orig = ele;
	ele = $$$(ele);
	if (ele == null) {
		alert("setValue() can't find an element with id: " + orig + ".");
		return;
	}
	if (JXUtil._isHTMLElement(ele, "select")) {
		// We deal with select list elements by selecting the matching option
		// Begin by searching through the values
		var found = false;
		var i;
		// if((flag==null)||(flag=='value')){
		for (i = 0; i < ele.options.length; i++) {
			if (ele.options[i].value.toUpperCase() == val.toUpperCase()) {
				ele.options[i].selected = true;
				found = true;
				try {
					ele.onchange();
				} catch (e) {

				}
				break;
			} else {
				ele.options[i].selected = false;
			}
		}
		// }
		// If that fails then try searching through the visible text
		// if((flag!=null)&&(flag=='text')){
		for (i = 0; i < ele.options.length; i++) {
			if (ele.options[i].text.toUpperCase().indexOf(val.toUpperCase()) != -1) {
				ele.options[i].selected = true;
				found = true;
				try {
					ele.onchange();
				} catch (e) {

				}
				break;

			} else {
				ele.options[i].selected = false;
			}
		}
		// }

		if (found) {
			return;
		}

		return;
	}

	if (JXUtil._isHTMLElement(ele, "input")) {
		switch (ele.type) {
		case "checkbox":
			var origs = document.getElementsByName(orig);
			for ( var i = 0; i < origs.length; i++) {
				for ( var j = 0; j < val.length; j++) {
					if (origs[i].value == val[j]) {
						origs[i].checked = true;
					} else {
						origs[i].checked = null;
					}
				}
			}
			return;
		case "check-box":
		case "radio":
			ele.checked = (val == true);
			return;

		default:
			ele.value = val;
			return;
		}
	}

	if (JXUtil._isHTMLElement(ele, "textarea")) {
		ele.value = val;
		return;
	}

	// If the value to be set is a DOM object then we try importing the node
	// rather than serializing it out
	if (val.nodeType) {
		if (val.nodeType == 9 /* Node.DOCUMENT_NODE */) {
			val = val.documentElement;
		}

		val = JXUtil._importNode(ele.ownerDocument, val, true);
		ele.appendChild(val);
		return;
	}

	// Fall back to innerHTML
	ele.innerHTML = val;
};
JXUtil.getText = function(ele) {
	var orig = ele;
	ele = $$$(ele);
	if (ele == null) {
		alert("getValue() can't find an element with id: " + orig + ".");
		return "";
	}

	if (JXUtil._isHTMLElement(ele, "select")) {
		// This is a bit of a scam because it assumes single select
		// but I'm not sure how we should treat multi-select.
		var sel = ele.selectedIndex;
		if (sel != -1) {
			var reply = ele.options[sel].text;
			if (reply == null || reply == "") {
				reply = ele.options[sel].value;
			}

			return reply;
		} else {
			return "";
		}
	}

	if (JXUtil._isHTMLElement(ele, "input")) {
		switch (ele.type) {
		case "checkbox":
		case "check-box":
		case "radio":
			return ele.checked;
		default:
			return ele.value;
		}
	}

	if (JXUtil._isHTMLElement(ele, "textarea")) {
		return ele.value;
	}

	return ele.innerHTML;
}
JXUtil.getValue = function(ele) {

	var orig = ele;
	ele = $$$(ele);
	if (ele == null) {
		// alert("getValue() can't find an element with id: " + orig + ".");
		return "";
	}
	if (JXUtil._isHTMLElement(ele, "select")) {
		// This is a bit of a scam because it assumes single select
		// but I'm not sure how we should treat multi-select.
		var sel = ele.selectedIndex;
		if (sel != -1) {
			var reply = ele.options[sel].value;
			if (reply == null || reply == "") {
				reply = ele.options[sel].text;
			}

			return reply;
		} else {
			return "";
		}
	}

	if (JXUtil._isHTMLElement(ele, "input")) {
		switch (ele.type) {
		case "checkbox":
		case "check-box":
		case "radio":

			// return ele.value;
			if (typeof window.ActiveXObject != 'undefined') {
				var eles = document.getElementsByName(orig);
				
				for ( var i = 0; i < eles.length; i++) {
					if (eles[i].checked) {

						return eles[i].value;
					}
				}
			}
			if (document.implementation
					&& document.implementation.createDocument) {

				var temp = document.getElementById(orig);
				if (temp.checked) {

					return temp.value;
				} else
					return false;
			}
			return ele.checked;

		default:
			return ele.value;
		}
	}

	if (JXUtil._isHTMLElement(ele, "textarea")) {
		return ele.value;
	}

	return ele.innerHTML;
};

JXUtil.addOptions = function(ele, data, valuerev, textprop, clearFlag) {
	var orig = ele;
	ele = $$$(ele);
	if (ele == null) {
		alert("addOptions() can't find an element with id: " + orig + ".");
		return;
	}

	var useOptions = JXUtil._isHTMLElement(ele, "select");
	var useLi = JXUtil._isHTMLElement(ele, [ "ul", "ol" ]);

	if (!useOptions && !useLi) {
		alert("fillList() can only be used with select elements. Attempt to use: "
				+ JXUtil._detailedTypeOf(ele));
		return;
	}

	// Bail if we have no data
	if (data == null) {
		return;
	}

	var text;
	var value;
	var opt;

	if (JXUtil._isArray(data)) {
		// Loop through the data that we do have
		for ( var i = 0; i < data.length; i++) {
			if (useOptions) {
				if (valuerev != null) {
					if (textprop != null) {
						text = data[i][textprop];
						value = data[i][valuerev];
					} else {
						value = data[i][valuerev];
						text = value;
					}
				} else {
					if (textprop != null) {
						text = data[i][textprop];
						value = text;
					} else {
						text = "" + data[i];
						value = text;
					}
				}
				opt = new Option(text, value);
				if (!clearFlag) {
					ele.options[ele.options.length] = opt;
				} else {
					ele.options[i] = opt;
				}
			} else {
				li = document.createElement("li");
				li.innerHTML = "" + data[i];
				ele.appendChild(li);
			}
		}
	} else {
		var i = 0;
		for ( var prop in data) {
			i++;
			if (!useOptions) {
				alert("JXUtil.addOptions can only create select lists from objects.");
				return;
			}

			if (valuerev) {
				text = prop;
				value = data[prop];
			} else {
				text = data[prop];
				value = prop;
			}

			opt = new Option(text, value);
			if (!clearFlag) {
				ele.options[ele.options.length] = opt;
			} else {
				ele.options[i] = opt;
			}
		}
	}
};

JXUtil._agent = navigator.userAgent.toLowerCase();

JXUtil._isIE = ((JXUtil._agent.indexOf("msie") != -1) && (JXUtil._agent
		.indexOf("opera") == -1));

JXUtil._isHTMLElement = function(ele, nodeName) {
	if (ele == null || typeof ele != "object" || ele.nodeName == null) {
		return false;
	}

	if (nodeName != null) {
		var test = ele.nodeName.toLowerCase();

		if (typeof nodeName == "string") {
			return test == nodeName.toLowerCase();
		}

		if (JXUtil._isArray(nodeName)) {
			var match = false;
			for ( var i = 0; i < nodeName.length && !match; i++) {
				if (test == nodeName[i].toLowerCase()) {
					match = true;
				}
			}

			return match;
		}

		alert("JXUtil._isHTMLElement was passed test node name that is neither a string or array of strings");
		return false;
	}

	return true;
};

JXUtil._detailedTypeOf = function(x) {
	var reply = typeof x;

	if (reply == "object") {
		reply = Object.prototype.toString.apply(x); // Returns "[object class]"
		reply = reply.substring(8, reply.length - 1); // Just get the class
		// bit
	}

	return reply;
};

JXUtil._isArray = function(data) {
	return (data && data.join) ? true : false;
};

JXUtil._isDate = function(data) {
	return (data && data.toUTCString) ? true : false;
};

JXUtil._importNode = function(doc, importedNode, deep) {
	var newNode;

	if (importedNode.nodeType == 1 /* Node.ELEMENT_NODE */) {
		newNode = doc.createElement(importedNode.nodeName);

		for ( var i = 0; i < importedNode.attributes.length; i++) {
			var attr = importedNode.attributes[i];
			if (attr.nodeValue != null && attr.nodeValue != '') {
				newNode.setAttribute(attr.name, attr.nodeValue);
			}
		}

		if (typeof importedNode.style != "undefined") {
			newNode.style.cssText = importedNode.style.cssText;
		}
	} else if (importedNode.nodeType == 3 /* Node.TEXT_NODE */) {
		newNode = doc.createTextNode(importedNode.nodeValue);
	}

	if (deep && importedNode.hasChildNodes()) {
		for (i = 0; i < importedNode.childNodes.length; i++) {
			newNode.appendChild(JXUtil._importNode(doc,
					importedNode.childNodes[i], true));
		}
	}

	return newNode;
}
if (typeof document.importNode != "function") {
	document.importNode = function(importedNode, deep) {
		JXUtil._importNode(this, importedNode, deep);
	};
}

