// ARGO - full javascript environment

(function () { // encapsulation

// String extensions 1.0
// no requirements
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 

var nbsp = String.fromCharCode(160); // non-breaking space

// skip leading whitespace
String.prototype.ltrim = function() {return this.replace(/^\s*(.*)/, "$1");}

// skip trailing whitespace
String.prototype.rtrim = function() {return this.replace(/\s*$/, "");}

// skip leading and trailing whitespace
String.prototype.trim = function() {return this.ltrim().rtrim();}

// test if the string is empty
String.prototype.isEmpty = function() {return (this.search(/\S/) < 0) ? true : false;}

// test if string is empty HTML
String.prototype.isEmptyHtml = function() {
	// by fczbkk
	var str = this;
	var blankCharacters = [" ", "&nbsp;", "&#032;"];
	for (var i = 0; i < blankCharacters.length; i++)
		str = str.replace(eval("/" + blankCharacters[i] + "/gi"), "");
	return (str.isEmpty());
}

// removes all HTML tags from string
String.prototype.removeHtmlTags = function() {
	// by Sam Stephenson, http://prototype.conio.net/
	return this.replace(/<\/?[^>]+>/gi, '');
}

// removes all HTML tags and entities from string
String.prototype.removeHtml = function() {
	// by Sam Stephenson, http://prototype.conio.net/
	var div = document.createElement('div');
	div.innerHTML = this.removeHtmlTags();
	return div.childNodes[0].nodeValue;
}

// escapes all "forbiden" HTML characters (<>&")
String.prototype.escapeHtml = function() {
	// by Sam Stephenson, http://prototype.conio.net/
	var div = document.createElement('div');
	var text = document.createTextNode(this);
	div.appendChild(text);
	return div.innerHTML.replace(/["]/gi,'&quot;');
}

// this shall render HTML code to plain text.
String.prototype.htmlToText = function() {
	// TODO - implement it, current implementation is temporary and incomplete
	return this.removeHtmlTags();
}

// Split string into 2 substrings by delimiter
String.prototype.split2 = function(delimiter) {
	var text = this;
	var result = new Array();
	var index = text.indexOf(delimiter);
	if (index < 0) {
		result[0] = text;
	} else {
		result[0] = text.substring(0, index);
		result[1] = text.substring(index + 1);
	}
	return result;
}


// evt 1.0
// no requirements
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 
// TODO - needs extensive testing
// TODO - needs performance optimnization
// TODO - needs compatiblity testis and optimization
// TODO - there are some mysterious issue with MSIE, solve with Marian

var evt = {
	capture: true,  // set true to enable event capturing
	bubble:  false, // set true to enable event bubbling
	
	storage: new Array(), // stores all event handlers
	
	handler: function(e) {
		// standard event handler. Could be overriden if necessary
		var obj = this;
		if ((typeof obj == "undefined") || (obj == null)) return false;
		if (typeof e == "undefined") e = window.event;
		
		// prevent usage of built-in event propagation mechanism
		if (typeof e.stopPropagation == "function")
			e.stopPropagation(); // standard way
		else if (typeof e.cancelBubble != "undefined")
			e.cancelBubble = true; // MSIE hack
		
		// own event propagation mechanism
		var propagationPath = new Array();
		var actualNode = obj;
		
		// bubble up to document and process every event handler on your way
		var evtChain = new Array();
		var chainIndex = 0; // beware, chainIndex is used in both "bubble" and "capture" loop
		
		function handleEventAtNode(e, actualNode, phase) {
			if (e == null) return false;
			if (actualNode == null) return false;
			if ((typeof (actualNode.evtStorage) != "undefined") && (typeof (actualNode.evtStorage[e.type]) != "undefined")) {
				for (i in actualNode.evtStorage[e.type]) {
					if (actualNode.evtStorage[e.type][i].phase == phase) {
						if (e.evtStopped) {
							return true; // look if handler stopped an event
						}
						// add enhanced data to event
						e.evtData = actualNode.evtStorage[e.type][i];
						if (e.mouseX && e.mouseY) {
							e.evtData.position = {x: emouseX, y:mouseY};
						} else {
							e.evtData.position = null;
						}
						e.evtData.time = new Date().getTime();
						// run event handler
						actualNode.evtStorage[e.type][i].fn(e);
					}
				}
			}
			return true;
		}
		
		// window is not a part of DOM tree, so we must process it separate
		if (actualNode == window) {
			handleEventAtNode(e, actualNode, evt.bubble);
			handleEventAtNode(e, actualNode, evt.capture);
			return true;
		}
		
		// bubbling phase
		if (actualNode != document) {
			bubble:
				do {
					handleEventAtNode(e, actualNode, evt.bubble);
					if (actualNode.evtStopped)
						break bubble;
					evtChain[chainIndex++] = actualNode;
					actualNode = actualNode.parentNode;
				} while (actualNode && (actualNode.parentNode));
		}
		handleEventAtNode(e, actualNode, evt.bubble);
		
		capture:
			do {
				if (actualNode.evtStopped)
					break capture;
				handleEventAtNode(e, actualNode, evt.capture); // third parameter indicates capture phase
				actualNode = evtChain[--chainIndex];
			} while (chainIndex >= 0);
		
		return true;
	},
	
	add: function(obj, evType, fn, phase, evId, evGrp) {
		// Attaches event listener to element "obj".
		// evId - unique identifier of event handler
		// evGrp - identifier of event handler group
		if (typeof phase == "undefined")      phase = evt.bubble; // bubbling is default
		if (typeof evId == "undefined")       evId = ""; // default id is empty
		if (typeof evGrp == "undefined")      evGrp = ""; // default group is empty
		var i = evt.storage.length;
		evt.storage[i] = {
			obj:        obj,
			evType:     evType,
			fn:         fn,
			phase:      phase,
			evId:       evId,
			evGrp:      evGrp
		}
		// append event handler definition to element's handler storage
		if (typeof obj.evtStorage == "undefined")
			obj.evtStorage = new Array();
		if (typeof obj.evtStorage[evType] == "undefined") {
			obj.evtStorage[evType] = new Array();
		}
		obj.evtStorage[evType][obj.evtStorage[evType].length] = evt.storage[i];
		obj["on" + evType] = evt.handler;
		return true;
	},
	
	remove: function(evId) {
		// Removes event listener from object
		//	Parameter "fn" is the same function that has been added by evt.add. If the function to remove
		//	is not the same, it will not be removed, even if the two functions had identical syntax.
		var newStorage = new Array();
		var newElmStorage;
		var i1, i2, i3, i4, i2max, i4max;
		i1 = 0;
		i2max = evt.storage.length;
		for (i2 = 0; i2 < i2max; i2++) {
			if (evt.storage[i2].evId == evId) {
				i3 = 0;
				i4max = evt.storage[i2].obj.evtStorage[evt.storage[i2].evType].length
				newElmStorage = new Array();
				for (i4 = 0; i4 < i4max; i4++) {
					if (evt.storage[i2].obj.evtStorage[i4].evId != evId) {
						newElmStorage[i3++] = evt.storage[i2].obj.evtStorage[i4];
					}
				}
			} else {
				newStorage[i1++] = evt.storage[i2];
			}
			evt.storage = newStorage;
		}
		return false; // not removed
	},
	
	flush: function() {
		// removes all event handlers from storage
		if (delete evt.storage)
			return true;
		else {
			evt.storage = null;
			return true;
		}
		return false;
	},
	
	getTarget: function(e) {
		//	Finds event target
		if (typeof e.target == "undefined") e.target = e.srcElement;
		return e.target;
	},
	
	getTrigger: function(e) {
		// Finds element that owns the event handler
		if (e && e.evtData)
			return e.evtData.obj;
		return null;
	},
	
	getPosition: function(e) {
		if (e && e.evtData)
			return e.evtData.position;
		return null;
	},
	
	getTime: function(e) {
		if (e && e.evtData)
			return e.evtData.time;
		return null;
	},
	
	getKey: function(e) {
		if (window.event) {
			return window.event.keyCode;
		} else if (e) {
			return e.which;
		} else {
			return null;
		}
	},
	
	stop: function(e) {
		// stops event propagation
		e.evtStopped = true;
		return true;
	},
	
	cancel: function(e) {
		// stops event propagation
		// and cancels processing of default event handler
		e.evtStopped = true;
		if (e.preventDefault)
			e.preventDefault();
		else
			e.returnValue = false;
		return true;
	},
	
	isEvent: function(obj) {
		if (typeof obj.evtData != "undefined")
			return true;
		return false;
	}
}

// xcp 1.0
// requires log
// exception handling

var Exception = function(name, message) {
	// Exception object constructor
	this.name = name;
	this.message = message;
	return true;
}

var xcp = {
	warnings: false, // if true, warning messages are on
	errors:   true,  // if true, error messages are on
	_log:     false, // true if log is on and properly initialized - private, do not change
	
	init: function() {
		if (log.initialized)
			xcp._log = true;
		return true;
	},
	
	create: function(name, message) {
		// creates exception and returns argument that can be used at xcp.invoke method
		var ex = new Exception(name, message);
		return ex;
	},
	
	invoke: function(ex) {
		// invokes exception
		throw ex;
		return ex;
	},
	
	warn: function(ex, location) { // non-critical exception handler
		if (xcp.warnings) {
			var result = "Warning"+"\n";
			result = "JavaScript exception: " + ex.name+"\n";
			result += "Warning message: " + ex.message + "\n";
			result += "Warning location: " + location + "\n";
			if (xcp._log)
				log.write(result, "warning");
		}
		return true;
	},
	
	err: function(ex, location) { // critical exception handler
		if(xcp.errors) {
			var result = "Error"+"\n";
			result += "JavaScript exception: " + ex.name+"\n";
			result += "Error message: " + ex.message + "\n";
			result += "Error location: " + location + "\n";
			if (xcp._log)
				log.write(result, "error");
		}
		return true;
	}
}

// preset exceptions
xcp.preset = {};
xcp.preset.missingArgument = xcp.create("xcpMissingArgument", "Mandatory function argument is missing.");
xcp.preset.illegalArgType = xcp.create("xcpIllegalArgType", "Illegal function argument type.");
xcp.preset.argumentPropertyMissing = xcp.create("xcpArgumentPropertyMissing", "Argument object property is missing.");
xcp.preset.illegalArgValue = xcp.create("xcpIllegalArgValue", "Illegal function argument value.");


// elm 1.3
// requires evt, xcp
// handles DOM elements, encapsulates common DOM operations
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 
// 1.3	method getChildrenByTag added
// 1.2	method create is now able to work with className attribute
// 1.1	methods envelope and envelopeChildren corrected. Interface modified for better usability

var elm = {
	
	xHtmlNameSpace: "http://www.w3.org/1999/xhtml",
	
	get: function(obj) {
		// HtmlElement elm.get(HtmlElement|String|Event obj)
		// Returns HTML element that belongs to object obj.
		if (typeof obj == "undefined") return null;
		if (typeof obj == "string") // if obj is String, returns object with id obj
			return document.getElementById(obj);
		var trigger = evt.getTrigger(obj);
		if (trigger != null) return trigger; // if obj is Event, returns event trigger
		return obj; // if obj is HtmlElement, returns it unchanged
	},
	
	getByTag: function(tagName, srcElm) {
		// returns array of elements with given tagName
		srcElm = (srcElm) ? srcElm : document;
		if (srcElm.all && (tagName == "*"))	// MSIE hack
			return(srcElm.all);
		if (srcElm.getElementsByTagName)	// standard way
			return srcElm.getElementsByTagName(tagName);
		return false;
	},
	
	getByClass: function(className, srcElm, tagName) {
		// not very effective. If you can, use only when parentElement and tagName is specified
		// thanx http://www.dustindiaz.com/getelementsbyclass for inspiration
		var result = new Array();
		srcElm = (srcElm) ? srcElm : document;
		tagName = (tagName) ? tagName : "*";
		var allElm = elm.getByTag(tagName, srcElm);
		var i, j = 0;
		for (i = 0; i < allElm.length; i++ ) {
			if (cls.has(allElm[i], className)) {
				result[j++] = allElm[i];
			}
		}
		return result;
	},
	
	getParent: function(node) {
		// returns parent element. If there is no parent element it returns null
		if ((typeof node == "undefined") || (node == null)) return null; // node is not defined, there is no parent
		var parent = node.parentNode;
		if ((typeof parent == "undefined") || (parent == null)) return null; // parent node is not defined, there is no parent
		if (typeof parent.tagName == "undefined") return null; // parent node is not HTML element
		return parent;
	},
	
	getAncestorByTag: function(node, tagName) {
		tagName = tagName.toLowerCase();
		var actualTagName = "";
		do {
			node = elm.getParent(node);
			if (node == null) return false; // parent not found
			actualTagName = node.tagName.toLowerCase();
		} while ((actualTagName != tagName) && (actualTagName != "html"));
		if (actualTagName == tagName) return node; // element found
		else return null; // no element found
	},
	
	getChildrenByTag: function(tagName, srcElm) {
		if (typeof srcElm == "undefined") return null;
		tagName = tagName.toLowerCase();
		srcElm = elm.get(srcElm);
		var result = new Array();
		if (srcElm.firstChild) {
			var actualNode = srcElm.firstChild;
			do {
				if (actualNode.tagName && (actualNode.tagName.toLowerCase() == tagName)) {
					result[result.length] = actualNode;
				}
				actualNode = actualNode.nextSibling;
			} while (actualNode != null);
		}
		return result;
	},
	
	getValue: function(srcElm) {
		// HtmlCollection elm.getByTag(String tagName[, HtmlElement srcElm])
		// Collects all child elements of srcElm with given tagName
		// TODO - what about radiobuttons and checkboxes?
		srcElm = elm.get(srcElm);
		if (srcElm == null) return null;
		if ((typeof srcElm.value != "undefined") && (typeof srcElm.value != null)) {
			return srcElm.value;
		}
		if (srcElm.tagName.toLowerCase() == "select")
			if (typeof (srcElm.selectedIndex != "undefined") && (typeof srcElm.options != "undefined")) { // element is SELECT
				if (srcElm.selectedIndex >= 0)
					return srcElm.options[srcElm.selectedIndex].value; // if select is multiple, returns only first value
			} else return null;	// multiple select, nothing selected
		return srcElm.innerHTML;
	},
	
	setValue: function(targetElm, targetValue) {
		// String elm.getValue(HtmlElement srcElm)
		// Reads element value. Can read inputs and selects
		// TODO - what about radiobuttons and checkboxes?
		targetElm = elm.get(targetElm);
		if (targetElm == null) return false;
		if (targetElm.options && (targetElm.options.length > 0)) { // element is SELECT
			var i;
			for (i = 0; i < targetElm.options.length; i++) {
				if (targetElm.options[i].value == targetValue) {
					targetElm.options[i].selected = true;
					targetElm.options[i].setAttribute("selected", "selected");
					return true;
				} else {
					targetElm.options[i].selected = false;
					targetElm.options[i].setAttribute("selected", "");
				}
			}
			return false;
		} else if (typeof targetElm.value != "undefined") {
			targetElm.value = targetValue;
			return true;
		}
		return false;
	},
	
	getAttribute: function(srcElm, attrName) {
		srcElm = elm.get(srcElm);
		if ((attrName == "class") && (typeof srcElm.getAttribute("class") == "undefined"))
			return srcElm.getAttribute("className");
		if ((attrName == "for") && (srcElm.getAttribute("for") == null))
			return srcElm.getAttribute("htmlFor");
		if (typeof srcElm[attrName] != "undefined") {
			return srcElm[attrName];
		}
		return srcElm.getAttribute(attrName);
	},
	
	create: function(config) {
		// creates element tree defined by config object
		if (!config || (typeof config["tagName"] == "undefined") || !config["tagName"]) {
			xcp.invoke(xcp.preset.argumentPropertyMissing); // insufficient config data
			return false;
		}
		if (document.createElementNS) { // Gecko, standard
			newElement = document.createElementNS(elm.xHtmlNameSpace, config["tagName"]);
		} else {
			newElement = document.createElement(config["tagName"]);
		}
		var i, j;
		for (i in config) {
			switch (i) {
				case "tagName": break; // already used
				case "children": // create childNodes
					for (j in config["children"]) {
						newElement.appendChild(elm.create(config["children"][j]));
					}
					break;
				case "style": // style definitions
					for (j in config["style"]) {
						newElement.style[j] = config["style"][j];
					}
					break;
				case "className":
					newElement.className = config[i];
					break;
				default: // add standard attribute
					newElement.setAttribute(i, config[i]);
					break;
			}
		}
		return newElement;
	},
	
	envelope: function(obj, envelopeData) {
		// envelopes element obj by newly created element
		if (typeof envelopeData == "undefined") envelopeData = {};
		var envelope = elm.create(envelopeData);
		obj.parentNode.insertBefore(envelope, obj);
		envelope.appendChild(obj);
		return envelope;
	},
	
	envelopeChildren: function(obj, envelopeData) {
		// envelopes obj childNodes by newly created element
		if (typeof envelopeData == "undefined") envelopeData = {};
		var envelope = elm.create(envelopeData);
		while (obj.firstChild != null) {
			envelope.appendChild(obj.firstChild);
		}
		obj.appendChild(envelope);
		return envelope;
	}
}


// cook 1.1
// no requirements
// object for cookie manipulations
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 

var cook = {
	
	set: function(name, value, days, domain, path) {
		// sets cookie
		var date; // Date
		var expires; // String
		value = value + "; ";
		if ((typeof days != "undefined") && (days != null)) {
			date = new Date();
			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
			expires = "expires=" + date.toGMTString() + "; ";
		} else {
			expires = "";
		}
		if ((typeof domain != "undefined") && (domain != null) && (domain.indexOf(".") != -1)) {
			domain = "domain=" + domain + "; ";
		} else {
			domain = "";
		}
		if (typeof path != "undefined") {
			path = "path=" + path;
		} else {
			path = "path=/";
		}
		document.cookie = name + "=" + value + expires + domain + path;
		return true;
	},
	
	get: function(name) {
		// gets cookie value by name
		var i; // Int iterator
		var nameEQ = name + "="; // String
		var c; // String
		var ca = document.cookie.split(";"); // Array of Strings
		for (i = 0; i < ca.length; i++) {
			c = ca[i];
			while (c.charAt(0) == " ")
				c = c.substring(1, c.length);
			if (c.indexOf(nameEQ) == 0)
				return c.substring(nameEQ.length, c.length);
		}
		return null;
	},
	
	remove: function(name) {
		// unsets cookie
		cook.set(name, "", -1);
	}
}


// log 1.0
// requires cls

var log = {
	enabled:      true,  // if true, logging is on
	initialized:  false, // if true, log is prepared to work
	messagesId:   "messages",
	messages:     null,
	messagesList: null,
	
	init: function(messagesId) {
		if (typeof messagesId != "undefined")
			log.messagesId = messagesId;
		log.messages = elm.get(log.messagesId);
		if (log.messages == null)
			return false; // init failed
		log.messagesList = document.createElement("ul");
		log.messages.appendChild(log.messagesList);
		log.initialized = true; // init succeded
		return true;
	},
	
	write: function(msgText, msgType) {
		var i;
		if ((typeof msgText == "undefined") && (msgText == null)) {
			msgText = "";
		}
		msgText = msgText.toString();
		if (!log.enabled) return true;
		if (log.messagesList == null) return false; // error - list not initialized properly
		var li = document.createElement("li");
		if ((typeof msgType != "undefined") && (msgType != null) && (msgType != "")) {
			cls.add(li, msgType);
		}
		var msgLines = msgText.split("\n");
		var br = null;
		var msg = null;
		for (i = 0; i < msgLines.length; i++) {
			msg = document.createTextNode(msgLines[i]);
			br = document.createElement("br")
			li.appendChild(msg);
			li.appendChild(br);
		}
		if (log.messagesList.firstChild)
			log.messagesList.insertBefore(li, log.messagesList.firstChild);
		else
			log.messagesList.appendChild(li);
		return true;
	},
	
	clear: function() {
		while (messagesList.firstChild) {
			messagesList.removeChild(messagesList.firstChild);
		}
		return true;
	}
}

// cls v1.0
// no requirements
// handles multiple element classes
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 

var cls = {
	// Class manipulations
	get: function(obj) {
		// Array cls.get(HtmlElement obj)
		// Returns all classes of the element "obj" as Array of Strings
		var cl; // String
		if (obj && obj.tagName) {
			cl = obj.className.replace(/\s+/g, " ");
			if (cl == "") return new Array();
			return cl.split(" ");
		}
		return null;
	},
	
	has: function(obj, cl) {
		// Boolean cls.has(HtmlElement obj, String cl)
		// Returns true if element "obj" contains the class "cl"
		var i; // Int
		var actCl; // Array
		if ((typeof cl == "string") && (actCl = cls.get(obj)))
			for (i = 0; i < actCl.length; i++)
				if (actCl[i] == cl)	return true;
		return false;
	},
	
	add: function(obj, cl) {
		// Boolean cls.add(HtmlElement obj, String cl)
		// Adds class "cl" to element "obj" if it is not present
		var actCl = cls.get(obj);
		if ((typeof cl != "undefined") && (actCl != null)) {
			if (!cls.has(obj, cl))
				obj.className += (actCl.length > 0) ? " " + cl : cl;
			return true;
		}
		return false;
	},
	
	remove: function(obj, cl) {
		// Boolean cls.remove(HtmlElement obj, String cl)
		// Removes class "cl" from element "obj"
		var i; // Int iterator
		var actCl = cls.get(obj); // String
		var tempCl = ""; // String
		if ((typeof cl == "string") && (actCl != null)) {
			for (i = 0; i < actCl.length; i++) {
				if (actCl[i] != cl) {
					if (tempCl != "") {tempCl += " ";}
					tempCl += actCl[i];
				}
				obj.className = tempCl;
			}
			return true;
		}
		return false;
	},

	replace: function(obj, oldCl, newCl) {
		// Boolean cls.replace(HtmlElement obj, String oldCl, String newCl)
		// Replaces class "oldCl" by class "newCl". If there is no "oldCl" adds "newCl".
		var i; // Int iterator
		var actCl = cls.get(obj); // String
		var tempCl = ""; // String
		if ((typeof oldCl == "string") && (typeof newCl == "string") && (actCl != null)) {
			if (cls.has(obj, newCl)) {
				cls.remove(obj, oldCl);
			} else if (cls.has(obj, oldCl)) {
				for (i = 0; i < actCl.length; i++) {
					if (tempCl != "") {tempCl += " ";}
					tempCl += (actCl[i] == oldCl) ? newCl : actCl[i];
				}
				obj.className = tempCl;
			} else {
				cls.add(obj, newCl);
			}
			return true;
		}
		return false;
	}
}

// performanceTracker 1.0
// requires cook

var performanceTracker = {
	trackingPoints: [],
	cookieName: "requestTime",
	
	addTrackingPoint: function(tpId, tpName) {
		performanceTracker.trackingPoints[tpId] = {
			id: tpId,
			time: new Date(),
			name: tpName
		}
		return performanceTracker.trackingPoints[tpId];
	},
	
	getReport: function() {
		var report = "";
		var separator = "";
		var tp = performanceTracker.trackingPoints;
		var lastTime = cook.get(performanceTracker.cookieName);
		for (i in tp) {
			report += separator + tp[i].name + ": " + (tp[i].time.getTime() - lastTime) + "ms";
			lastTime = tp[i].time.getTime();
			separator = "\n";
		}
		return report;
	},
	
	saveRequestTime: function() {
		var now = new Date();
		cook.set(performanceTracker.cookieName, now.getTime());
		return true;
	}
}
// gui 1.0
// requires elm, evt, cls, dhtml, xcp
// GUI elements
//
// gui.tooltip - creates DHTML tooltip
// gui.elmSwitch - turns blocks on or off according to the value of some input fields




var gui = {
	
	turnBlock: function(obj, action) {
		// action = "off" - turns obj off
		// action = "on"	- turns obj on
		var i;
		var fieldsDisabled = false;
		switch (action) {
			case "off":
				obj.style.display = "none";
				fieldsDisabled = true;
				break;
			case "on":
				obj.style.display = "";
				break;
		}
		var inputs = obj.getElementsByTagName("input");
		for (i = 0; i < inputs.length; i++) {
			inputs[i].disabled = fieldsDisabled;
		}
		var selects = obj.getElementsByTagName("select");
		for (i = 0; i < selects.length; i++) {
			selects[i].disabled = fieldsDisabled;
		}
		var textareas = obj.getElementsByTagName("textarea");
		for (i = 0; i < textareas.length; i++) {
			textareas[i].disabled = fieldsDisabled;
		}
		return true;
	},
	
	turnBlockView: function(obj, action) {
		// action = "off" - turns obj off
		// action = "on"	- turns obj on
		if (action == "off") obj.style.display = "none";	
		if (action == "on") obj.style.display = "";
		return true;
	}
}




gui.tooltip = {
	cls:       "guiTooltip",
	container: null,
	
	add: function(node, innerHTML) {
		node = elm.get(node);
		if (gui.tooltip.container == null) {
			// create tooltip container
			gui.tooltip.container = elm.create({
				tagName: "div",
				className: gui.tooltip.cls
			});
			gui.tooltip.container.style.display = "none";
			gui.tooltip.container.style.position = "absolute";
			document.body.appendChild(gui.tooltip.container);
		}
		node.guiTooltip = {
			container: gui.tooltip.container,
			innerHTML: innerHTML
		}
		evt.add(node, "mouseover", gui.tooltip.show);
		evt.add(node, "mouseout", gui.tooltip.hide);
		
		return true;
	},
	
	show: function(node) {
		node = elm.get(node);
		node.guiTooltip.container.innerHTML = node.guiTooltip.innerHTML;
		var nodeTitle = node.getAttribute("title");
		if (nodeTitle != null) {
			node.guiTooltip.title = nodeTitle;
			node.setAttribute("title", "");
		}
		dhtml.moveTo(node.guiTooltip.container, dhtml.getX(node) + dhtml.getW(node), dhtml.getY(node) + dhtml.getH(node));
		node.guiTooltip.container.style.zIndex=999;
		node.guiTooltip.container.style.display = "";
			
	},
	
	hide: function(node) {
		node = elm.get(node);
		node.guiTooltip.container.style.display = "none";
		if (typeof node.guiTooltip.title == "string") {
			node.setAttribute("title", node.guiTooltip.title);
		}
	}
}

gui.elmSwitch = {
	// checkbox that turns defined elements on or off
	cls:         "elmSwitch",
	onAttr:      "switchOn", // this attribute contains array of attributes that have to be turned on when box is checked
	offAttr:     "switchOff", // this attribute contains array of attributes that have to be turned on when box is unchecked
	
	init: function(obj) {
		var inputField = elm.get(obj);
		
		if (inputField.tagName.toLowerCase() == "select") {
			gui.elmSwitch.runSelect(obj);
			evt.add(inputField, "change", gui.elmSwitch.runSelect);
		}
		if ((inputField.tagName.toLowerCase() == "input") && (inputField.getAttribute("type") == "checkbox")) {
			gui.elmSwitch.runCheckBox(obj);
			evt.add(inputField, "click", gui.elmSwitch.runCheckBox);
		}
		return true;
	},
	
	enable: function(obj) {
		// enables object; may be overriden
		var elmNode = elm.get(obj);
		elm.turn(elmNode, "on");
		return true;
	},
	
	disable: function(obj) {
		// enables object; may be overriden
		var elmNode = elm.get(obj);
		elm.turn(elmNode, "off");
		return true;
	},
	
	_disableBlocks: function(blockIdArray) {
		for (i in blockIdArray) {
			k = blockIdArray[i];
			blockNode = elm.get(k);
			if (blockNode != null) {
				gui.elmSwitch.disable(blockNode);
			}
		}
		return true;
	},
	
	_enableBlocks: function(blockIdArray) {
		for (i in blockIdArray) {
			k = blockIdArray[i];
			blockNode = elm.get(k);
			if (blockNode != null) {
				gui.elmSwitch.enable(blockNode);
			}
		}
		return true;
	},
	
	runCheckBox: function(obj) {
		var chkBox = elm.get(obj);
		var blockIdArray;
		var blockNode;
		var i, j, k;
		if (chkBox.checked) {
			// turn off blocks from offAttr
			blockIdArray = variable.parseJsonString(elm.getAttribute(chkBox, gui.elmSwitch.offAttr));
			gui.elmSwitch._disableBlocks(blockIdArray);

			// turn on blocks from onAttr
			blockIdArray = variable.parseJsonString(elm.getAttribute(chkBox, gui.elmSwitch.onAttr));
			gui.elmSwitch._enableBlocks(blockIdArray);
		} else { // obj unchecked
			
			// turn off blocks from onAttr
			blockIdArray = variable.parseJsonString(elm.getAttribute(chkBox, gui.elmSwitch.onAttr));
			gui.elmSwitch._disableBlocks(blockIdArray);

			// turn on blocks from offAttr
			blockIdArray = variable.parseJsonString(elm.getAttribute(chkBox, gui.elmSwitch.offAttr));
			gui.elmSwitch._enableBlocks(blockIdArray);
		}
		return true;
	},
	
	runSelect: function(obj) {
		var selectField = elm.get(obj);
		var blockIdArray;
		var blockNode;
		var i, j, k;
		// assume that it is not multiple select as multiple selects are pure evil
		
		for (i = 0; i < selectField.options.length; i++) {
			
			// turn on blocks from onAttr
			blockIdArray = variable.parseJsonString(elm.getAttribute(selectField.options[i], gui.elmSwitch.onAttr));
			gui.elmSwitch._disableBlocks(blockIdArray);
			
			// turn on blocks from offAttr
			blockIdArray = variable.parseJsonString(elm.getAttribute(selectField, gui.elmSwitch.offAttr));
			gui.elmSwitch._enableBlocks(blockIdArray);
		}
		
		if (selectField.selectedIndex) {
			// enable and disableBlocks
			blockIdArray = variable.parseJsonString(elm.getAttribute(selectField.options[selectField.selectedIndex], gui.elmSwitch.onAttr));
			gui.elmSwitch._enableBlocks(blockIdArray);
			
			blockIdArray = variable.parseJsonString(elm.getJsonAttribute(selectField.options[selectField.selectedIndex], gui.elmSwitch.offAttr));
			gui.elmSwitch._disableBlocks(blockIdArray);
		}
		
		return true;
	}
	
}




gui.replaceByImage = function(obj, src, alt) {
	// replaces object content by image
	obj.innerHTML = "<img src=\""+src+"\" alt=\""+alt+"\" />";
	return true;
}
// fieldChecker 1.2
// requires elm, evt, string
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 
// TODO - needs extensive tests
// TODO - enhancement to selects and radiobuttons (?)
// TODO - enable parametric classNames to define more check formula parameters
// 1.1	methods working with "IsModified" flag refactored
// 1.1	default field value is always generated when field is empty

var fieldChecker = {
	invalidClass: "invalid",
	configAttribute: "fieldCheckerCfg",
	
	add: function(obj, ruleSet) {
		// adds fieldChecker functionality to input field.
		// ruleset is associative array of validation rules, default values and error messages
		obj = elm.get(obj);
		if (obj == null) return false;
		
		// mark field as not modified
		fieldChecker.clearModified(obj);
		
		// add relevant rules from specified ruleset.
		obj.fieldChecker_ruleSet = new Array();
		var configStr = elm.getAttribute(obj, fieldChecker.configAttribute);
		var configArray = {};
		if (configStr != null) {
			configArray = variable.evalString(configStr);
		}
		var classNames = cls.get(obj);
		
		// add rules by className
		var i;
		for (i = 0; i < classNames.length; i++) {
			if (typeof configArray[classNames[i]] == "undefined") {
				configArray[classNames[i]] = []; // there are no parameters
			}
		}
		
		var ruleName;
		for (ruleName in configArray) {
			if ((typeof ruleSet[ruleName] != "undefined") && (ruleSet[ruleName] != null)) {
				obj.fieldChecker_ruleSet[ruleName] = variable.clone(ruleSet[ruleName], true);
				// add parameters (order is important)
				if (typeof obj.fieldChecker_ruleSet[ruleName].cfg == "undefined") {
					obj.fieldChecker_ruleSet[ruleName].cfg = {};
				}
				for (i in configArray[ruleName]) {
					if (typeof configArray[ruleName][i] != "undefined") {
						obj.fieldChecker_ruleSet[ruleName].cfg[i] = configArray[ruleName][i];
					}
				}
			}
		}
		
		// try to add label
		if (obj.getAttribute("id") != null) {
			var labels = document.getElementsByTagName("label");
			for (i = 0; i < labels.length; i++) {
				if (labels[i].getAttribute("for") == obj.getAttribute("id")) {
					obj.fieldChecker_label = labels[i];
				}
			}
		}
		
		// on focus insert default value, on blur remove it
		evt.add(obj, "focus", function(e) { fieldChecker.setDefaultValue(e); fieldChecker.check(e); });
		evt.add(obj, "blur", function(e) { fieldChecker.clearDefaultValue(e); fieldChecker.check(e); });
		
		// check field when user changes content of input field
		evt.add(obj, "keyup", function(e) { fieldChecker.setModified(e); fieldChecker.check(e); });
		evt.add(obj, "blur", function(e) { fieldChecker.setModified(e); fieldChecker.check(e); });
		
		// check field now
		fieldChecker.check(obj);
		return true;
	},
	
	setDefaultValue: function(obj) {
		obj = elm.get(obj);
		// obj is now HTML element, so we can use it
		if (elm.getValue(obj) == "") {
			for (rule in obj.fieldChecker_ruleSet) {
				if (typeof obj.fieldChecker_ruleSet[rule].def != "undefined") {
					elm.setValue(obj, obj.fieldChecker_ruleSet[rule].def);
					if (obj.select) obj.select();
					return true;
				}
			}
		}
		return true;
	},
	
	clearDefaultValue: function(obj) {
		obj = elm.get(obj);
		// obj is now HTML element, so we can use it
		if (fieldChecker.isModified(obj)) return true; // object's value has been modified so we should not change it
		for (rule in obj.fieldChecker_ruleSet) {
			if (typeof obj.fieldChecker_ruleSet[rule].def != "undefined") {
				if (elm.getValue(obj) == obj.fieldChecker_ruleSet[rule].def) {
					elm.setValue(obj, "");
					fieldChecker.clearModified(obj);
					return true;
				}
			}
		}
		return true;
	},
	
	setModified: function(inputObj) {
		inputObj = elm.get(inputObj);
		inputObj.fieldCheckerIsModified = true;
		return true;
	},
	
	clearModified: function(inputObj) {
		inputObj = elm.get(inputObj);
		inputObj.fieldCheckerIsModified = false;
		return true;
	},
	
	isModified: function(inputObj) {
		inputObj = elm.get(inputObj);
		if (typeof inputObj.fieldCheckerIsModified == "undefined") {
			return false;
		} else {
			return inputObj.fieldCheckerIsModified;
		}
	},
	
	check: function(inputObj) {
		// this function checks if field value is valid.
		// obj can be event targeted to field, or field itself.
		inputObj = elm.get(inputObj);
		// obj is now HTML element, so we can check it
		var cfg; // array of parameters for checking function
		for (rule in inputObj.fieldChecker_ruleSet) {
			// check by fn and exit if invalid
			if (typeof inputObj.fieldChecker_ruleSet[rule].fn != "undefined") {
				cfg = inputObj.fieldChecker_ruleSet[rule].cfg;
				if (!inputObj.fieldChecker_ruleSet[rule].fn(elm.getValue(inputObj), cfg)) {
					fieldChecker.setInvalid(inputObj, rule);
					return false;
				}
			}
			// check by reg and exit if invalid
			if (typeof inputObj.fieldChecker_ruleSet[rule].reg != "undefined") {
				if (elm.getValue(inputObj).search(inputObj.fieldChecker_ruleSet[rule].reg) < 0) {
					fieldChecker.setInvalid(inputObj, rule);
					return false;
				}
			}
		}
		// passed tests, set it valid
		fieldChecker.setValid(inputObj);
		return true;
	},
	
	setValid: function(inputObj) {
		inputObj = elm.get(inputObj);
		inputObj.fieldChecker_error = null;
		cls.remove(inputObj, fieldChecker.invalidClass);
		return true;
	},
	
	setInvalid: function(inputObj, rule) {
		inputObj = elm.get(inputObj);
		// disabled fields should not be set as invalid (but neither as valid)
		if (elm.getAttribute(inputObj, "disabled") && (elm.getAttribute(inputObj, "disabled") == "disabled")) {
			return true;
		}
		if (!inputObj.disabled && (typeof rule != "undefined") && (rule != null)) {
			inputObj.fieldChecker_error = inputObj.fieldChecker_ruleSet[rule].err;
		}
		cls.add(inputObj, fieldChecker.invalidClass);
		return true;
	},
	
	isValid: function(obj) {
		return !cls.has(obj, fieldChecker.invalidClass);
	},
	
	setLabel: function(obj, label) {
		obj.fieldChecker_label = label;
		return true;
	},
	
	getLabel: function(obj, resultType) {
		// TODO - modify result by resultType
		// defined result types: plain, html
		var result = "";
		if (obj.fieldChecker_label) {
			result = result + obj.fieldChecker_label.innerHTML;
			result = result.replace(/[:]?\s*$/g,"");
			result = result.trim();
			result = result.htmlToText();
		}
		return result;
	},
	
	getMessage: function(obj) {
		// returns error message of the object if any
		if ((typeof obj.fieldChecker_error != "undefined") && (obj.fieldChecker_error != null)) {
			var result = obj.fieldChecker_error;
			var label = fieldChecker.getLabel(obj, "plain");
			if (label == "") label = obj.getAttribute("title");
			if ((label == "") || (label == null)) label = obj.name;
			result = result.replace(/\{label\}/g, '"' + label + '"');
			result = result.replace(/\{value\}/g, '"' + elm.getValue(obj) + '"');
			return result;
		}
		return "";
	}
}


// formChecker 1.1
// requires elm, evt, cls, fieldChecker, String
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 

var formChecker = {
	invalidClass: "invalid",
	noSubmitCheckCls: "noSubmitCheck", // when the form has this class, it is not checked on submit, so even invalid form can be submitted
	invalidMsgTitle: "Warning, some fields are not filled properly",
	invalidMsgShowFields: false, // show detailed error messges for all fields?
	chkBoxRequired: {
		cls: "chkRequired",
		err: "Checkbox {label} must be checked."
	},
	
	add: function(obj, ruleSet) {
		// adds formChecker functionality to form.
		// ruleset is associative array of validation rules, default values and error messages
		
		obj = elm.get(obj);
		if (obj == null) return false;
		
		// init fieldChecker for each input in form
		obj.formChecker_fields = new Array();
		obj.formChecker_chkBoxes = new Array();
		
		var inputs = obj.getElementsByTagName("input");
		var inputType;
		for (i = 0; i < inputs.length; i++) {
			inputType = inputs[i].getAttribute("type");
			if ((inputType == "text") || (inputType == "password") || (inputType == "file") || (inputType == "hidden")) {
				fieldChecker.add(inputs[i], ruleSet);
				obj.formChecker_fields[obj.formChecker_fields.length] = inputs[i];
			}
			if ((inputType == "checkbox") && (cls.has(inputs[i], formChecker.chkBoxRequired.cls))) {
				obj.formChecker_chkBoxes[obj.formChecker_chkBoxes.length] = inputs[i];
			}
		}
		
		var textareas = obj.getElementsByTagName("textarea");
		for (i = 0; i < textareas.length; i++) {
			fieldChecker.add(textareas[i], ruleSet);
			obj.formChecker_fields[obj.formChecker_fields.length] = textareas[i];
		}
		evt.add(obj, "submit", formChecker.submit);
		return true;
	},
	
	check: function(formObj) {
		// this function checks if all fields in form are valid.
		// obj can be an event targeted to a form, or the form itself.
		var i;
		var passed = true;
		var ruleName = "";
		var obj = elm.get(formObj);
		
		// obj is now HTML element, so we can check it
		obj.formChecker_error = "";
		for (i = 0; i < obj.formChecker_fields.length; i++) {
			if (!obj.formChecker_fields[i].disabled && !fieldChecker.check(obj.formChecker_fields[i])) {
				passed = false;
				obj.formChecker_error += fieldChecker.getMessage(obj.formChecker_fields[i]) + "\r\n";
			}
		}
		if (!passed) {
			formChecker.setInvalid(obj);
			return false;
		}
		formChecker.setValid(obj);
		return true;
	},
	
	setValid: function(obj) {
		obj.formChecker_error = null;
		cls.remove(obj, formChecker.invalidClass);
		return true;
	},
	
	setInvalid: function(obj, field) {
		cls.add(obj, formChecker.invalidClass);
		return true;
	},
	
	displayMessage: function(obj) {
		var msg = formChecker.invalidMsgTitle.removeHtml();
		if (formChecker.invalidMsgShowFields) {
			msg += "\r\n" + obj.formChecker_error;
		}
		alert(msg);
	},
	
	checkChkBoxes: function(formObj) {
		if (typeof formObj.formChecker_chkBoxes != "undefined") {
			var result = true;
			var i;
			var box;
			for (i in formObj.formChecker_chkBoxes) {
				box = formObj.formChecker_chkBoxes[i];
				if (!box.checked) {
					box.fieldChecker_label = fieldChecker.findLabel(box);
					box.fieldChecker_error = formChecker.chkBoxRequired.err;
					formObj.formChecker_error += fieldChecker.getMessage(box) + "\r\n";
					return false;
				}
			}
		}
		return true;
	},
	
	submit: function(obj) {
		// obj could be form or event
		var e = null; // submit event
		if (typeof obj.tagName == "undefined") { // item is not HTML element
			e = obj;
		}
		obj = elm.get(obj);
		// obj is now HTML form element, so we can check it
		if (!cls.has(obj, formChecker.noSubmitCheckCls) && !(formChecker.check(obj) && (formChecker.checkChkBoxes(obj)))) {
			// form invalid, display error messages
			formChecker.displayMessage(obj);
			if (e != null) evt.cancel(e);
			return false;
		}
		return true;
	}
}


// fieldCheckerRules v0.1
// no requirements
// messages and some rules shall be localized
// TODO - perform more tests
// TODO - support for parametric testing
// TODO - compare with IMA and add missing definitions (Date etc.)


var fieldCheckerRules = {}

// basic private definitions
fieldCheckerRules._df                    = {};
fieldCheckerRules._df.specChars          = " \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xD7\xF7";
fieldCheckerRules._df.alphaLowercaseISO  = "\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF";
fieldCheckerRules._df.alphaUppercaseISO  = "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDE";
fieldCheckerRules._df.alphaLowercaseUTF  = "\u00E1\u00E9\u0115\u00ED\u00F3\u00FA\u016F\u00FD\u017E\u0161\u010D\u0159\u010F\u0165\u0148" + fieldCheckerRules._df.alphaLowercaseISO;
fieldCheckerRules._df.alphaUppercaseUTF  = "\u00C1\u00C9\u0114\u00CD\u00D3\u00DA\u016E\u00DD\u0160\u017D\u010c\u0158\u010E\u0164\u0147" + fieldCheckerRules._df.alphaUppercaseISO;

fieldCheckerRules.percentage = {
	// number -  exponential form allowed, unlimited decimal digits
	reg: new RegExp("^(([0-9]{1,2})|(100{1}))?$"),
	err: "Field {label} must contain a number from 0 to 100."
};
fieldCheckerRules.email = {
	reg: new RegExp("^([a-zA-Z0-9]+[a-zA-Z0-9\._-]*[a-zA-Z0-9]+@[a-zA-Z0-9]+[a-zA-Z0-9\._-]*[a-zA-Z0-9]+[\.]{1}[a-zA-Z]{2,4})?$"),
	err: "Políčko {label} musí obsahovat platnou e-mailovou adresu."
};
fieldCheckerRules.safeChars = {
	reg: new RegExp("^[0-9a-zA-Z_]{0,}$"),
	err: "Field {label} must contain only safe characters."
};
fieldCheckerRules.alphaLowercase = {
	reg: new RegExp("^.*$"),
	// reg: new RegExp("^[a-z" + fieldCheckerRules._df.alphaLowercaseUTF + " ]{1,}$")),
	err: "Field {label} must contain only lowercase alphabet characters."
};
fieldCheckerRules.alphaUppercase = {
	reg: new RegExp("^.*$"),
	// new RegExp("^[A-Z" + fieldCheckerRules._df.alphaUppercaseUTF + " ]{1,}$")),
	err: "Field {label} must contain only uppercase alphabet characters."
};
fieldCheckerRules.alpha = {
	reg: new RegExp("^.*$"),
	// reg: new RegExp("^[a-zA-Z" + fieldCheckerRules._df.alphaUppercaseUTF + fieldCheckerRules._df.alphaLowercaseUTF + " ]{1,}$")),
	err: "Field {label} must not contain numbers or special characters."
};
fieldCheckerRules.alphanumeric = {
	reg: new RegExp("^.*$"),
	// reg: new RegExp("^[a-zA-Z" + fieldCheckerRules._df.alphaUppercaseUTF + fieldCheckerRules._df.alphaLowercaseUTF + "0-9 ]{1,}$"))
	err: "Field {label} must contain only alphanumeric characters."
};
fieldCheckerRules.text = {
	reg: new RegExp("^.*$"),
	// reg: new RegExp("^[a-zA-Z" + fieldCheckerRules._df.alphaUppercaseUTF + fieldCheckerRules._df.alphaLowercaseUTF + "0-9" + specChars + "]{1,}$")),
	err: "Field {label} must contain only text."
};
fieldCheckerRules.color = {
	reg: new RegExp("^([#]{1}[0-9a-fA-F]{6})?$"),
	err: "Field {label} must contain hexadecimal RGB color definition (for example #336699)."
};
fieldCheckerRules.url = {
	reg: new RegExp("^(http(s)?://(([a-zA-Z0-9]+([-_.]?[a-zA-Z0-9])*\.([a-zA-Z]){2,4})|(([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}))(:[0-9]{2,5})?(/([-!_:~&=$?.|;,%a-zA-Z0-9[\\]]|(%[0-9a-fA-F]{2}))*)*)?$"),
	def:  "http://",
	err: "Field {label} must contain valid URL (for example \"http://www.google.com\")."
};
fieldCheckerRules.phone = {
	reg: new RegExp("^[0-9()+-/ ]{0,}$"),
	err: "Políčko {label} musí obsahovat platné telefonní číslo."
};
fieldCheckerRules.domains = {
	// general check for the list of domains made problems (MS IE)
	// the following regular expression were unsuccessfully tried and then commented out:

	// reg: new RegExp("^(([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*\.[a-zA-Z]{2,4})[,\f\n\r]\n?)*$"),
	// reg: new RegExp("^(([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[\.]{1}[a-zA-Z]{2,4})([ \f\n\r]*[,]?[ \f\n\r]*)+)*$"),
	// reg: new RegExp("^(([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[\.]{1}[a-zA-Z]{2,4}(\/{1}[-_~&=\?\.a-zA-Z0-9]*)*)[,]?)*$"),

	// current solution only checks whether characters are from the valid set
	// the reg.expr. also contains various white spaces to enable the comfortable editing
	// ( white space char (\s) did not work)
	reg: new RegExp("^[0-90-9a-zA-Z\-\_\.\~\&\=\?,\r\n\t\f ]{0,}$"),
	err: "Field {label} must contain domain names."
};

fieldCheckerRules.required = {
	fn:
		function(str) {
			return (str.search(/\S/) < 0) ? false : true;
		},
	err: "Políčko {label} nesmí být prázdné."
};
fieldCheckerRules.multipleEmails = {
	// requires checks.email
	fn:
		function(str) {
			if (str == "") return true;
			var addresses = str.split(','); // Array of Strings
			var fieldOK = true; // Boolean
			var rule = fieldCheckerRules.email; // RegExp
			var i; // Int
			var actualAddress; // String
			for (i = 0; i < addresses.length; i++) {
				if (addresses[i].trim) actualAddress = addresses[i].trim();
				else actualAddress = addresses[i];
				fieldOK = fieldOK && ((actualAddress.search(rule) < 0) ? false : true);
			}
			return fieldOK;
		},
	err: "Field {label} must contain only valid e-mail addresses separated by commas \",\"."
};




// localized definitions

fieldCheckerRules.number = {
	// notNegative -  positive numbers and zero, exponential form allowed, unlimited decimal digits
	reg: new RegExp("^([\+\-]?[0-9]{1,}([\.][0-9]{1,})?(e[\+\-]{1}[0-9]{1,2})?)?$"),
	err: "Políčko {label} musí obsahovat číslo."
};

fieldCheckerRules.notNegative = {
	// notNegative -  only positive numbers (without zero), exponential form allowed, unlimited decimal digits
	reg: new RegExp("^([\+]?[0-9]{1,}([\.][0-9]{1,})?(e[\+\-]{1}[0-9]{1,})?)?$"),
	err: "Field {label} must contain positive number or 0."
};

fieldCheckerRules.positive = {
	reg: new RegExp("^(([\+]?[0-9]*[1-9]{1}[0-9]*([\.][0-9]{1,})?(e[\+\-]{1}[0-9]{1,})?)|([\+]?[0-9]{1,}([\.][0-9]*[1-9]{1}[0-9]*){1}(e[\+\-]{1}[0-9]{1,})?))?$"),
	err: "Field {label} must contain number greater than 0."
};
// dhtml 0.2
// requires elm
// dhtml positioning and calculations
// 
// protected by creative commons deed
// under the following conditions: Attribution, Share Alike
// http://creativecommons.org/licenses/by-sa/2.5/
// 

var dhtml = {
	positioning: "absolute",
	
	getX: function(obj) {
		// element's position relative to offsetParent
		return obj.offsetLeft;
	},
	
	getAbsX: function(obj) {
		// from http://www.quirksmode.org/js/findpos.html
		// many thanks to Peter Paul Koch
		// element's position relative to page
		obj = elm.get(obj);
		var curleft = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent) {
				curleft += obj.offsetLeft;
				obj = obj.offsetParent;
			}
		} else if (obj.x) {
			curleft += obj.x;
		}
		return curleft;
	},
	
	setX: function(obj, x) {
		// moves obj to specified x-coordinate
		obj = elm.get(obj);
		obj.style.position = dhtml.positioning;
		obj.style.left = x + "px";
		return true;
	},
	
	setAbsX: function(obj, x) {
		dhtml.setX(obj, x - dhtml.getAbsX(obj) + dhtml.getX(obj));
		return true;
	},
	
	getY: function(obj) {
		// element's position relative to offsetParent
		return obj.offsetTop;
	},
	
	getAbsY: function(obj) {
		// from http://www.quirksmode.org/js/findpos.html
		// many thanks to Peter Paul Koch
		// element's position relative to page
		obj = elm.get(obj);
		var curtop = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent) {
				curtop += obj.offsetTop
				obj = obj.offsetParent;
			}
		} else if (obj.y) {
			curtop += obj.y;
		}
		return curtop;
	},
	
	setY: function(obj, y) {
		// moves obj to specified y-coordinate
		obj = elm.get(obj);
		obj.style.position = dhtml.positioning;
		obj.style.top = y + "px";
		return true;
	},
	
	setAbsY: function(obj, y) {
		dhtml.setY(obj, y - dhtml.getAbsY(obj) + dhtml.getY(obj));
		return true;
	},
	
	setW: function(obj, w) {
		// sets width of the object
		obj = elm.get(obj);
		obj.style.width = w + "px";
		var realWidth = obj.offsetWidth;
		if (realWidth != w) {
			obj.style.width = (2*w - realWidth) + "px";
		}
		return true;
	},
	
	getW: function(obj) {
		obj = elm.get(obj);
		return obj.offsetWidth;
	},
	
	setH: function(obj, h) {
		// sets height of the object
		obj = elm.get(obj);
		obj.style.height = h + "px";
		var realHeight = obj.offsetHeight;
		if (realHeight != h) {
			obj.style.height = (2*h - realHeight) + "px";
		}
		return true;
	},
	
	getH: function(obj) {
		obj = elm.get(obj);
		return obj.offsetHeight;
	},
	
	moveTo: function(obj, x, y) {
		obj = elm.get(obj);
		dhtml.setX(obj, x);
		dhtml.setY(obj, y);
		return true;
	},
	
	moveBy: function(obj, x, y) {
		dhtml.setX(obj, dhtml.getX(obj) + x);
		dhtml.setY(obj, dhtml.getY(obj) + y);
		return true;
	},
	
	resizeTo: function(obj, w, h) {
		obj = elm.get(obj);
		dhtml.setW(obj, w);
		dhtml.setH(obj, h);
		return true;
	},
	
	resizeBy: function(obj, w, h) {
		dhtml.setW(obj, dhtml.getW(obj) + w);
		dhtml.setH(obj, dhtml.getH(obj) + h);
		return true;
	},
	
	isOver: function(obj, x, y) {
		// returns true if point [x,y] is over the object obj
		var xMin = dhtml.getAbsX(obj);
		if (x < xMin) return false;
		var xMax = xMin + dhtml.getW(obj);
		if (x > xMax) return false;
		var yMin = dhtml.getAbsY(obj);
		if (y < yMin) return false;
		var yMax = yMin + dhtml.getH(obj);
		if (y > yMax) return false;
		return true;
	},
	
	isMouseOver: function(obj) {
		// returns true if mouse pointer is over the object obj
		// TODO
		return false;
	},
	
	isEventOver: function(obj, e) {
		// returns true if event e has been triggered over the object obj
		// TODO
		return false;
	},
	
	floatToStart: function(obj, targetObj) {
		// moves element obj from current position to the start of element targetObj. Then it makes obj first child of targetObj.
		return true;
	},
	
	floatAfter: function(obj, targetSibling) {
		// moves element obj from current position after the specified element targetSibling. Then it appends obj to targetSibling's parent element right after targetSibling.
		return true;
	},
	
	winW: function() { // by pixy, http://www.pixy.cz/blogg/clanky/js-rozmery-okna.html
		var windowWidth;
		if (window.innerWidth) // NN4, Opera, Mozilla
			windowWidth = window.innerWidth;
		else if (document.documentElement && document.documentElement.clientWidth) // MSIE6 std. mode
			windowWidth = document.documentElement.clientWidth;
		else if (document.body && document.body.clientWidth) // older MSIE + MSIE6 in quirk mode
			windowWidth = document.body.clientWidth;
		else windowWidth = null;
		return windowWidth;
	},
	
	winH: function() { // by pixy, http://www.pixy.cz/blogg/clanky/js-rozmery-okna.html
		var windowHeight;
		if (window.innerHeight) // NN4, Opera, Mozilla
			windowHeight = window.innerHeight;
		else if (document.documentElement && document.documentElement.clientHeight) // MSIE6 std. mode
			windowHeight = document.documentElement.clientHeight;
		else if (document.body && document.body.clientHeight) // older MSIE + MSIE6 in quirk mode
			windowHeight = document.body.clientHeight;
		else windowHeight = null;
		return windowHeight;
	},
	
	winX: function() {
		if(browser.ie)
			return document.body.scrollLeft;
		else
			return window.pageXOffset;
	},
	
	winY: function() {
		if (browser.ie)
			return document.body.scrollTop;
		else
			return window.pageYOffset;
	},
	
	pageW: function() {
		// Core code from quirksmode.org
		// edit for Firefox by pHaez
		// taken from Lokesh Dhakar - http://www.huddletogether.com
		
		var xScroll;
		if (window.innerWidth && window.scrollMaxX) {	
			xScroll = document.body.scrollWidth;
		} else if (document.body.scrollWidth > document.body.offsetWidth){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
		}
		
		// for small pages with total width less then width of the viewport
		var winWidth = dhtml.winW();
		if (xScroll < winWidth){	
			pageWidth = winWidth;
		} else {
			pageWidth = xScroll;
		}
		return pageWidth;
	},
	
	pageH: function() {
		// Core code from quirksmode.org
		// edit for Firefox by pHaez
		// taken from Lokesh Dhakar - http://www.huddletogether.com
		
		var yScroll;
		if (window.innerHeight && window.scrollMaxY) {	
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			yScroll = document.body.offsetHeight;
		}
		
		// for small pages with total height less then height of the viewport
		var winHeight = dhtml.winH();
		if (yScroll < winHeight){
			pageHeight = winHeight;
		} else { 
			pageHeight = yScroll;
		}
		return pageHeight;
	},
	
	pageScrollTop: function() {
		// Core code from quirksmode.org
		// taken from Lokesh Dhakar - http://www.huddletogether.com
		var yScroll;
		if (window.pageYOffset) {
			yScroll = window.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
			yScroll = document.documentElement.scrollTop;
		} else if (document.body) {// all other Explorers
			yScroll = document.body.scrollTop;
		} 
		return yScroll;
	},

	fitToPage: function(obj) {
		obj = elm.get(obj);
		// first fit coordinates to not overflow right bottom border
		
		// then fit coordinates to not overflow top left coordinates
		
		// then position the block
	
		return true;
	}
}


// actions v1.0
// requires evt, elm, cls, string, formManager

var actions = {
	popupWindow: {
		// open popup window with size specified by custom attributes
		cls:        "popupWindow",
		widthAttr:  "popupWidth", // custom attribute name
		heightAttr: "popupHeight", // custom attribute name
		
		onClick: function(e) {
			var obj = evt.getTrigger(e);
			while (!cls.has(obj, actions.popupWindow.cls)) {
				obj = obj.parentNode;
			}
			if (obj == null) return false;
			var scrollBarWidth = 18; // guess...
			var winWidth = obj.getAttribute(actions.popupWindow.widthAttr);
			var winHeight = obj.getAttribute(actions.popupWindow.heightAttr);
			var winUrl = obj.getAttribute("href");
			var paramStr = (winWidth ? "width=" + (parseInt(winWidth) + scrollBarWidth) + ", " : "") + (winHeight ? "height=" + (parseInt(winHeight) + scrollBarWidth) + ", " : "") + " menubar=0, resizable=1, status=0";
			var popupWin = window.open(winUrl, "_blank", paramStr);
			evt.cancel(e);
			return true;
		}
	},
	
	openUrl: {
		// open url written to input field that is specified by custon attribute
		cls:        "openUrl",
		selectCls:  "openSelectedUrl", // class when url is select's option value
		sourceAttr: "openUrlSource", // custom attribute, specifies target input field
		
		onClick: function(e) {
			var obj = evt.getTrigger(e);
			var source = obj.getAttribute(actions.openUrl.sourceAttr);
			var url = "";
			if ((source != null) && (source != "")) {
				var sourceInput = elm.get(source);
				if ((sourceInput.tagName.toLowerCase() == "select") && cls.has(sourceInput, actions.openUrl.selectCls)) {
					url = sourceInput.options[sourceInput.selectedIndex].text;
				} else { // normal input
					url = elm.getValue(sourceInput); 
				}
			}
			if ((url != null) && (url != "") && (elm.getValue(sourceInput) != "-1"))
				var popupWin = window.open(url, "_blank");
			evt.cancel(e);
			return true;
		}
	},
	
	openMail: {
		// open email written to input field that is specified by custon attribute
		cls:           "openMail",
		selectCls:     "openSelectedMail",
		recipientAttr: "openMailSource", // custom attribute, specifies source input field
		
		onClick: function(e) {
			var obj = evt.getTrigger(e);
			var source = obj.getAttribute(actions.openMail.recipientAttr);
			if ((source != null) && (source != "")) {
				var sourceInput = elm.get(source);

				if ((sourceInput.tagName.toLowerCase() == "select") && cls.has(sourceInput, actions.openMail.selectCls)) {
					url = sourceInput.options[sourceInput.selectedIndex].text;
				} else { // normal input
					url = elm.getValue(sourceInput); 
				}
			}
			if ((url != null) && (url != "") && (url != "-1"))
				window.location = "mailto:" + url;
			evt.cancel(e);
			return true;
		}
	},
	
	clearForm: {
		// clears all form fields
		cls:           "clearForm",
		
		onClick: function(e) {
			var btnObj = evt.getTrigger(e);
			var formObj = btnObj.form;
			formManager.clearAll(formObj);
			evt.cancel(e);
			return true;
		}
	},
	
	submitOnChange: {
		// when user selects an option from select field, submits containing form
		cls: "submitOnChange",
		
		onChange: function(e) {
			var obj = evt.getTrigger(e);
			var formObj = obj.form;
			if ((typeof formObj != "undefined") && (formObj != null)) {
				formObj.submit();
			}
			return true;
		}
	},
	
	submitOnClick: {
		// SUBMIT button
		cls: "submitOnClick",
		
		onClick: function(e) {
			var obj = evt.getTrigger(e);
			var formObj = obj.form;
			if ((typeof formObj != "undefined") && (formObj != null)) {
				formObj.submit();
			}
			return true;
		}
	},
	
	replaceByImg: {
		// element is replaced by image after page load
		// TODO - improve this
		cls:      "replaceByImg",
		srcAttr:  "replaceSrc", // custom attribute name
		
		onLoad: function(obj) {
			var obj = elm.get(obj);
			src = obj.getAttribute(actions.replaceByImg.srcAttr);
			if (src != null) {
				alt = obj.innerHTML;
				alt = alt.removeInlineHtml();
				obj.innerHTML = "<img src=\""+src+"\" alt=\""+alt+"\" />";
			}
			return true;
		}
	},

	replaceImage: {
		// replaces image source by link target
		cls:          "replaceImage",
		targetAttr:   "replaceImageTarget", // custom attribute, specifies target image
		imageSrcAttr: "replaceImageSrc",
		
		onClick: function(e) {
			var obj = evt.getTrigger(e);
			var target = elm.get(obj.getAttribute(actions.replaceImage.targetAttr));
			if (target != null) {
				var href = obj.getAttribute(actions.replaceImage.imageSrcAttr);
				if (href == null) return false;
				var title = obj.getAttribute("title");
				if (title == null) title = "";
				target.innerHTML = "<img src=\"" + href+"\" alt=\""+title+"\" />";
				target.style.display = "block";
				evt.cancel(e);
			}
			return true;
		}
	}
}

// page init 2.0m modified for ARGO
//
// page
//   requires performanceTracker, log, xcp, elm, evt, gui, cook, actions, fieldChecker, fieldCheckerRules, formChecker

performanceTracker.addTrackingPoint("response", "Time from request to server response");

var page = {
	imgUrl: null, // absolute URL of images directory
	elements: {},  // all elements processed by javascript
	tags: {},      // all tags processed by javascript
	showPerformanceReports: false, // debug for performance improvements
	
	init: function() {
		// runs only once at every page
		
		performanceTracker.addTrackingPoint("onload", "Response download finished, onload event");
		
		log.init("messages"); // init loging
		xcp.init(); // init exception handling support
		
		// in debug mode set xcp.warnings and performanceReports to true
		xcp.warnings = false;
		xcp.errors = true;
		page.showPerformanceReports = false;
		cook.set("javascript", "enabled");
		
		var i; // integer iterator
		
		// init meta tags
		try {
			page.elements["meta"] = document.getElementsByTagName("meta");
			for (i = 0; i < page.elements["meta"].length; i++) {
				if (page.elements["meta"][i].name && page.elements["meta"][i].name == "img_root") {
					page.imgUrl = page.elements["meta"][i].content;
				}
			}
		} catch(ex) { xcp.err(ex, 'initContent tables'); }
		
		try {
			page.elements["body"] = document.getElementsByTagName("body");
			page.tags["body"] = true;
			document.body = page.elements["body"][0]; // it is there, but what if...
		} catch(ex) { xcp.warn(ex, 'initContent body'); }
		
		if (typeof jax != "undefined") {
			// application uses JAX engine
			jax.block.initContent = page.initContent;
			jax.init();
		} else {
			// standard REQ/RES application
			page.initContent();
		}
		
		performanceTracker.addTrackingPoint("JsInitDone", "JS initialization finished");
		if (page.showPerformanceReports) {
			log.write(performanceTracker.getReport(), "info");
		}
		
		return true;
	},
	
	initContent: function(block) {
		// runs on each block loaded to page (including page itself)
		if (typeof block == "undefined") block = document;
		

		
		var i, j, k; // integer iterator
		var src, alt;
		var obj;
		
		page.initObjects(block); // onload objects initialization
		page.initElementsByTagName(block); // init tags
		page.initElementsByClassName(block); // init classes
		page.initElementsById(block); // init unique elements

		return true;
	},
	
	done: function() {
		evt.flush();
	}
}

evt.add(window, "load", page.init);
evt.add(window, "unload", page.done);




page.initObjects = function(block) {
/*	
	// run lightBox
	lightBox.loadingImage.src = '/static/814/loading.gif';
	lightBox.closeButton.src = '/static/814/close.gif';
	lightBox.loadingImage.style.zIndex = '550';
	lightBox.closeButton.style.zIndex = '700';
	lightBox.overlay.style.zIndex = "590";
	lightBox.lightBox.style.zIndex = '600';
	lightBox.init();
	return true;
*/
}

page.initElementsByTagName = function(block) {

	// init divs
	try {
		page.elements["div"] = block.getElementsByTagName("div");
		page.tags["div"] = true;
		var src, alt;
		for (i = page.elements["div"].length-1; i >= 0 ; i--) {
			// detect divs replaced by images
			src = page.elements["div"][i].getAttribute("replaceSrc");
			alt = "";
			if (src != null) {
				gui.replaceByImage(page.elements["div"][i], src, alt);
			}
		}
	} catch(ex) { xcp.warn(ex, 'initContent divs'); }
	
	// init spans
	try {
		page.elements["span"] = block.getElementsByTagName("span");
		page.tags["span"] = true;
		var src, alt;
		for (i = page.elements["span"].length-1; i >= 0 ; i--) {
			// detect spans replaced by images
			src = page.elements["span"][i].getAttribute("replaceSrc");
			alt = "";
			if (src != null) {
				gui.replaceByImage(page.elements["span"][i], src, alt);
			}
		}
	} catch(ex) { xcp.warn(ex, 'initContent spans'); }
	
	// init anchors
	try {
		page.elements["a"] = elm.getByTag("a", block);
		page.tags["a"] = true;
	} catch(ex) { xcp.err(ex, 'initContent anchors'); }
	
	// init forms
	try {
		page.elements["form"] = block.getElementsByTagName("form");
		page.tags["form"] = true;
		for (i = 0; i < page.elements["form"].length; i++) {
			// init formChecker
			formChecker.add(page.elements["form"][i], fieldCheckerRules);
			if (typeof jax != "undefined") {
				evt.add(page.elements["form"][i], "submit", jax.form.submit);
			}
		}
	} catch(ex) { xcp.warn(ex, 'initContent forms'); }
	
	// init lists
	try {
		page.elements["ul"] = block.getElementsByTagName("ul");
		page.tags["ul"] = true;
		for (i = page.elements["ul"].length-1; i >= 0 ; i--) {

		}
	} catch(ex) { xcp.warn(ex, 'initContent lists'); }
	
	return true;
}

page.initElementsByClassName = function(block) {
	// init elements marked by class
	// only elements processed by init cycles are used
	try {
		for (k in page.elements) {
			for (i = page.elements[k].length -1; i >= 0; i--) {
				
				try {
					// init actions
					for (j in actions) {
						if (actions[j].cls && cls.has(page.elements[k][i], actions[j].cls)) {
							if (actions[j].onLoad) {
								actions[j].onLoad(page.elements[k][i]);
							}
							if (actions[j].onClick) {
								evt.add(page.elements[k][i], "click", actions[j].onClick);
							}
							if (actions[j].onSubmit) {
								evt.add(page.elements[k][i], "submit", actions[j].onSubmit);
							}
						}
					}
				} catch(ex) { xcp.warn(ex, 'initContent init elements by class - init actions'); }
			}
		}
	} catch(ex) { xcp.warn(ex, 'initContent init elements by class'); }
	
	return true;
}

page.initElementsById = function(block) {
	// init unique elements
	// for AJAX compatiblity it is necessary to check if selected id is in given block
	
	return true;
}



})();


/*
 * jQuery 1.2.6 - New Wave Javascript
 *
 * Copyright (c) 2008 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
 * $Rev: 5685 $
 */
(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();



/**
 * jQuery lightBox plugin
 * This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
 * and adapted to me for use like a plugin from jQuery.
 * @name jquery-lightbox-0.5.js
 * @author Leandro Vieira Pinho - http://leandrovieira.com
 * @version 0.5
 * @date April 11, 2008
 * @category jQuery plugin
 * @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)
 * @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US
 * @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
 */
(function($){$.fn.lightBox=function(settings){settings=jQuery.extend({overlayBgColor:'#000',overlayOpacity:0.8,fixedNavigation:false,imageLoading:'images/lightbox-ico-loading.gif',imageBtnPrev:'images/lightbox-btn-prev.gif',imageBtnNext:'images/lightbox-btn-next.gif',imageBtnClose:'images/lightbox-btn-close.gif',imageBlank:'images/lightbox-blank.gif',containerBorderSize:10,containerResizeSpeed:400,txtImage:'Image',txtOf:'of',keyToClose:'c',keyToPrev:'p',keyToNext:'n',imageArray:[],activeImage:0},settings);var jQueryMatchedObj=this;function _initialize(){_start(this,jQueryMatchedObj);return false;}
function _start(objClicked,jQueryMatchedObj){$('embed, object, select').css({'visibility':'hidden'});_set_interface();settings.imageArray.length=0;settings.activeImage=0;if(jQueryMatchedObj.length==1){settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));}else{for(var i=0;i<jQueryMatchedObj.length;i++){settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'),jQueryMatchedObj[i].getAttribute('title')));}}
while(settings.imageArray[settings.activeImage][0]!=objClicked.getAttribute('href')){settings.activeImage++;}
_set_image_to_view();}
function _set_interface(){$('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="'+settings.imageLoading+'"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="'+settings.imageBtnClose+'"></a></div></div></div></div>');var arrPageSizes=___getPageSize();$('#jquery-overlay').css({backgroundColor:settings.overlayBgColor,opacity:settings.overlayOpacity,width:arrPageSizes[0],height:arrPageSizes[1]}).fadeIn();var arrPageScroll=___getPageScroll();$('#jquery-lightbox').css({top:arrPageScroll[1]+(arrPageSizes[3]/10),left:arrPageScroll[0]}).show();$('#jquery-overlay,#jquery-lightbox').click(function(){_finish();});$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function(){_finish();return false;});$(window).resize(function(){var arrPageSizes=___getPageSize();$('#jquery-overlay').css({width:arrPageSizes[0],height:arrPageSizes[1]});var arrPageScroll=___getPageScroll();$('#jquery-lightbox').css({top:arrPageScroll[1]+(arrPageSizes[3]/10),left:arrPageScroll[0]});});}
function _set_image_to_view(){$('#lightbox-loading').show();if(settings.fixedNavigation){$('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();}else{$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();}
var objImagePreloader=new Image();objImagePreloader.onload=function(){$('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);objImagePreloader.onload=function(){};};objImagePreloader.src=settings.imageArray[settings.activeImage][0];};function _resize_container_image_box(intImageWidth,intImageHeight){var intCurrentWidth=$('#lightbox-container-image-box').width();var intCurrentHeight=$('#lightbox-container-image-box').height();var intWidth=(intImageWidth+(settings.containerBorderSize*2));var intHeight=(intImageHeight+(settings.containerBorderSize*2));var intDiffW=intCurrentWidth-intWidth;var intDiffH=intCurrentHeight-intHeight;$('#lightbox-container-image-box').animate({width:intWidth,height:intHeight},settings.containerResizeSpeed,function(){_show_image();});if((intDiffW==0)&&(intDiffH==0)){if($.browser.msie){___pause(250);}else{___pause(100);}}
$('#lightbox-container-image-data-box').css({width:intImageWidth});$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({height:intImageHeight+(settings.containerBorderSize*2)});};function _show_image(){$('#lightbox-loading').hide();$('#lightbox-image').fadeIn(function(){_show_image_data();_set_navigation();});_preload_neighbor_images();};function _show_image_data(){$('#lightbox-container-image-data-box').slideDown('fast');$('#lightbox-image-details-caption').hide();if(settings.imageArray[settings.activeImage][1]){$('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();}
if(settings.imageArray.length>1){$('#lightbox-image-details-currentNumber').html(settings.txtImage+' '+(settings.activeImage+1)+' '+settings.txtOf+' '+settings.imageArray.length).show();}}
function _set_navigation(){$('#lightbox-nav').show();$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({'background':'transparent url('+settings.imageBlank+') no-repeat'});if(settings.activeImage!=0){if(settings.fixedNavigation){$('#lightbox-nav-btnPrev').css({'background':'url('+settings.imageBtnPrev+') left 15% no-repeat'}).unbind().bind('click',function(){settings.activeImage=settings.activeImage-1;_set_image_to_view();return false;});}else{$('#lightbox-nav-btnPrev').unbind().hover(function(){$(this).css({'background':'url('+settings.imageBtnPrev+') left 15% no-repeat'});},function(){$(this).css({'background':'transparent url('+settings.imageBlank+') no-repeat'});}).show().bind('click',function(){settings.activeImage=settings.activeImage-1;_set_image_to_view();return false;});}}
if(settings.activeImage!=(settings.imageArray.length-1)){if(settings.fixedNavigation){$('#lightbox-nav-btnNext').css({'background':'url('+settings.imageBtnNext+') right 15% no-repeat'}).unbind().bind('click',function(){settings.activeImage=settings.activeImage+1;_set_image_to_view();return false;});}else{$('#lightbox-nav-btnNext').unbind().hover(function(){$(this).css({'background':'url('+settings.imageBtnNext+') right 15% no-repeat'});},function(){$(this).css({'background':'transparent url('+settings.imageBlank+') no-repeat'});}).show().bind('click',function(){settings.activeImage=settings.activeImage+1;_set_image_to_view();return false;});}}
_enable_keyboard_navigation();}
function _enable_keyboard_navigation(){$(document).keydown(function(objEvent){_keyboard_action(objEvent);});}
function _disable_keyboard_navigation(){$(document).unbind();}
function _keyboard_action(objEvent){if(objEvent==null){keycode=event.keyCode;escapeKey=27;}else{keycode=objEvent.keyCode;escapeKey=objEvent.DOM_VK_ESCAPE;}
key=String.fromCharCode(keycode).toLowerCase();if((key==settings.keyToClose)||(key=='x')||(keycode==escapeKey)){_finish();}
if((key==settings.keyToPrev)||(keycode==37)){if(settings.activeImage!=0){settings.activeImage=settings.activeImage-1;_set_image_to_view();_disable_keyboard_navigation();}}
if((key==settings.keyToNext)||(keycode==39)){if(settings.activeImage!=(settings.imageArray.length-1)){settings.activeImage=settings.activeImage+1;_set_image_to_view();_disable_keyboard_navigation();}}}
function _preload_neighbor_images(){if((settings.imageArray.length-1)>settings.activeImage){objNext=new Image();objNext.src=settings.imageArray[settings.activeImage+1][0];}
if(settings.activeImage>0){objPrev=new Image();objPrev.src=settings.imageArray[settings.activeImage-1][0];}}
function _finish(){$('#jquery-lightbox').remove();$('#jquery-overlay').fadeOut(function(){$('#jquery-overlay').remove();});$('embed, object, select').css({'visibility':'visible'});}
function ___getPageSize(){var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=window.innerWidth+window.scrollMaxX;yScroll=window.innerHeight+window.scrollMaxY;}else if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight;}else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight;}
var windowWidth,windowHeight;if(self.innerHeight){if(document.documentElement.clientWidth){windowWidth=document.documentElement.clientWidth;}else{windowWidth=self.innerWidth;}
windowHeight=self.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight;}else if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight;}
if(yScroll<windowHeight){pageHeight=windowHeight;}else{pageHeight=yScroll;}
if(xScroll<windowWidth){pageWidth=xScroll;}else{pageWidth=windowWidth;}
arrayPageSize=new Array(pageWidth,pageHeight,windowWidth,windowHeight);return arrayPageSize;};function ___getPageScroll(){var xScroll,yScroll;if(self.pageYOffset){yScroll=self.pageYOffset;xScroll=self.pageXOffset;}else if(document.documentElement&&document.documentElement.scrollTop){yScroll=document.documentElement.scrollTop;xScroll=document.documentElement.scrollLeft;}else if(document.body){yScroll=document.body.scrollTop;xScroll=document.body.scrollLeft;}
arrayPageScroll=new Array(xScroll,yScroll);return arrayPageScroll;};function ___pause(ms){var date=new Date();curDate=null;do{var curDate=new Date();}
while(curDate-date<ms);};return this.unbind('click').click(_initialize);};})(jQuery);

(function ($) {
	$(document).ready(function () {

		$(".goBack").click(function(e) {
			history.go(-1);
			return false;
		});
			
		$(".printPage").click(function(e) {
			window.print();
			return false;
		});
			
		$(".hideOnLoad").hide();
		
		
		$("hideOnClick").click(function() {
			this.hide();
		});
	
		$('*[rel=lightbox]').lightBox({
			imageLoading: '/static/2619/lightbox-ico-loading.gif',
			imageBtnClose: '/static/2619/lightbox-btn-close.gif',
			imageBtnPrev: '/static/2619/lightbox-btn-prev.gif',
			imageBtnNext: '/static/2619/lightbox-btn-next.gif'
		});
	});
})(jQuery);



