	// ######################################################################### ELEMENT (v1.0)
	// NOTES
	// TODO
	// DONE
	// 2007-02-24 (v1.0)
	// ========================================================================= element
	function ge(k, d) {
		if (!d) { d = document }
		
		return document.getElementById(k);
	}
	// ========================================================================= element FORM
	function gfe(k, fod) {
		var doc, form, formElements, formElement, i, element, elementName;
		
		if (isForm(fod)) {
			form = fod;
		} else {
			if (isDocument(fod)) {
				doc = fod;
			} else {
				doc = document;
			}
			
			if (doc) { form = doc.forms[0] }
		}
		
		if (form) {
			formElements = form.elements;
			
			if (formElements) {
				if (formElements.length > 0) {
					for (i = 0; i < formElements.length; i++) {
						formElement = formElements[i];
						
						if (formElement) {
							if (formElement.name == k) {
								element = formElements[k]
								
								break;
							}
						}
					}
				}
			}
		}
		
		if (!element) {
			element = ge(k, doc);
			
			if (element) {
				f = element.form;
				
				elementName = element.name;
				
				if (elementName) {
					if (f) {
						if (f.elements[elementName]) { element = f.elements[elementName] }
					} else {
						if (element.type == 'radio') { element = doc.getElementsByName(elementName) }
					}
				}
			}
		}
		
		return element;
	}
	// ========================================================================= element form
	function sfev(k, v, fod) {
		var formElement_s, formElement, formElementOptions, formElementOption, i, formElementOptionValue;
		
		formElement_s = gfe(k, fod);
		
		if (formElement_s) {
			switch (formElement_s.type) {
			case 'text':
			case 'password':
			case 'hidden':
			case 'textarea':
			case 'file':
			
			case 'button':
			case 'image':
			case 'reset':
			case 'submit':
				formElement = formElement_s;
				
				formElement.value = v;
				
				break;
			
			case 'checkbox':
				formElement = formElement_s;
				
				if (cb(v)) {
					formElement.checked = true;
				} else {
					formElement.checked = false;
				}
				
				break;
			case undefined:
				if (formElement_s.length > 0) {
					for (i = 0; i < formElement_s.length; i++) {
						formElement = formElement_s[i];
						
						if (formElement) {
							if (formElement.type == 'radio') {
								if (formElement.value == v) {
									formElement.checked  = true;
								} else {
									formElement.checked  = false;
								}
							}
						}
					}
				}
			
			case 'select-one':
			case 'select-multiple':
				formElement = formElement_s;
				
				formElementOptions = formElement.options;
				
				if (formElementOptions) {
					if (formElementOptions.length > 0) {
						for (i = 0; i < formElementOptions.length; i++) {
							formElementOption = formElementOptions[i];
							
							if (formElementOption) {
								if (typeof(formElementOption.selected) == 'boolean') {
									formElementOptionValue = formElementOption.value;
									
									formElementOption.selected = false;
									
									if (v && formElementOptionValue) {
										if (String(',' + v + ',').indexOf(String(',' + formElementOptionValue + ',')) >= 0) {
											formElementOption.selected = true;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	// ------------------------------------------------------------------------- element form
	function gfev(k, fod) {
		var formElement_s, formElement, formElementOptions, formElementOption, i, value;
		
		formElement_s = gfe(k, fod);
		
		if (formElement_s) {
			switch (formElement_s.type) {
			case 'text':
			case 'password':
			case 'hidden':
			case 'textarea':
			case 'file':
			
			case 'button':
			case 'image':
			case 'reset':
			case 'submit':
				formElement = formElement_s;
				
				value = formElement.value;
				
				break;
			
			case 'checkbox':
				formElement = formElement_s;
				
				if (formElement.checked) {
					value = formElement.value;
					
					break;
				}
				
				break;
			case undefined:
				if (formElement_s.length > 0) {
					for (i = 0; i < formElement_s.length; i++) {
						formElement = formElement_s[i];
						
						if (formElement) {
							if (formElement.type == 'radio') {
								if (formElement.checked) {
									value = formElement.value;
									
									break;
								}
							}
						}
					}
				}
				
				break;
			
			case 'select-one':
			case 'select-multiple':
				formElement = formElement_s;
				
				formElementOptions = formElement.options;
				
				value = '';
				
				if (formElementOptions) {
					if (formElementOptions.length > 0) {
						for (i = 0; i < formElementOptions.length; i++) {
							formElementOption = formElementOptions[i];
							
							if (formElementOption) {
								if (formElementOption.selected) {
									if (value.length) { value += ',' }
									
									value += formElementOption.value;
								}
							}
						}
					}
				}
			}
			
			return value;
		}
	}
	// ========================================================================= element SHOW/HIDE
	function element_show(e) {
		if (e) {
			if (e.style) { e.style.display = '' }
		}
	}
	// ------------------------------------------------------------------------- element show/hide
	function element_hide(e){
		if (e) { e.style.display = 'none' }
	}
	// ========================================================================= element LEFT/TOP
	function element_getLeft(e) {
		var left;
		
		left = 0;
		
		while (e.offsetParent) {
			left = left + e.offsetLeft;
			
			e = e.offsetParent;
		}
		
		return left;
	}
	// ------------------------------------------------------------------------- element left/top
	function element_getTop(e) {
		var top;
		
		top = 0;
		
		while (e.offsetParent) {
			top = top + e.offsetTop;
			
			e = e.offsetParent;
		}
		
		return top;
	}
	// ========================================================================= element RESIZE
	function element_resize(e, w, h) {
		if (e) {
			e.style.width = w;
			e.style.height = h;
		}
	}
	// ========================================================================= element ANCESTOR
	function element_getAncestorByTagName(e, tn) {
		var ancestor;
		
		if (e && tn) {
			ancestor = e.parentNode;
				
			while (ancestor) {
				if (ancestor.tagName.toLowerCase() == tn.toLowerCase()) { return ancestor }
				
				ancestor = ancestor.parentNode;
			}
		}
	}
	// -------------------------------------------------------------------------
	// ek: elementKey
	function element_scrollIntoView(ek) {
		var element, elementTop, elementHeight;
		
		element = ge(ek);
		
		if (element) {
			elementTop = element_getTop(element);
			elementHeight = element.scrollHeight;
			
			if (elementTop < document.body.scrollTop) {
				element.scrollIntoView(true);
			} else {
				if (elementTop + elementHeight > document.body.scrollTop + document.body.clientHeight) { element.scrollIntoView(false) }
			}
		}
	}
	// -------------------------------------------------------------------------
	function getElementsByClassNamePrefix(e, cnp, tn) {
		var allElements, i, element, elementClassName, elements;
		
		if (cnp) {
			if (!e) { e = document }
			if (!tn) { tn = '*' }
			
			allElements = e.getElementsByTagName(tn);
			
			elements = new Array();
			
			if (allElements) {
				for (i in allElements) {
					element = allElements[i];
					
					elementClassName = element.className;
					
					if (elementClassName) {
						if (elementClassName.indexOf(cnp) == 0) { elements[elements.length] = element }
					}
				}
			}
			
			if (elements.length) { return elements }
		}
	}
	// -------------------------------------------------------------------------
	// e: element, sp: statePrefix, sk: stateKey, tn: tagName
	function element_changeState(e, sp, sk, tn) {
		var elements, i, element, elementClassName;
		
		if (!e) { e = document }
		if (!tn) { tn = '*' }
		
		elements = getElementsByClassNamePrefix(e, sp, tn);
		
		for (i in elements) {
			element = elements[i];
			
			elementClassName = element.className;
			
			if (elementClassName) {
				if (elementClassName.indexOf(sp + sk) == 0) {
					element.style.display = '';
				} else {
					element.style.display = 'none';
				}
			}
		}
	}
