if (typeof Xercel == "undefined" || ! Xercel) {
	Xercel = {};
}

var Event = null;
if (typeof YAHOO != "undefined" && YAHOO.util.Event) {
	Event = YAHOO.util.Event;
}

var Locale = null;
if (typeof Xercel.Locale != "undefined" && Xercel.Locale) {
	Locale = Xercel.Locale;
}

Xercel.Util = {


	EMAIL_PATERN : "^[A-z0-9_\-]+(\.[_A-z0-9\\-]+)*@([_A-z0-9\\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$",
	
	
	fixMinWidthForIE : function() {
		try {
		   if ( !document.body.currentStyle) {
		   	return;
		   } //IE only
		} catch (e) {
			return;
		}
		var elems = document.getElementsByTagName("*");
		for(var e = 0; e < elems.length; e = e + 1) {
		   var eCurStyle = elems[e].currentStyle;
		   var l_minWidth = (eCurStyle.minWidth) ? eCurStyle.minWidth : eCurStyle.getAttribute("min-width"); //IE7 : IE6
		   if (l_minWidth && l_minWidth != 'auto') {
		      var shim = document.createElement("DIV");
		      shim.style.cssText = 'margin:0 !important; padding:0 !important; border:0 !important; line-height:0 !important; height:0 !important; BACKGROUND:RED;';
		      shim.style.width = l_minWidth;
		      shim.appendChild(document.createElement("&nbsp;"));
		      if (elems[e].canHaveChildren) {
		         elems[e].appendChild(shim);
		      } else {
		         //??
		      }
		   }
		}
	},
	
	getNodePosition : function(node) {
		var x = 0, y = 0, w = node.offsetWidth, h = node.offsetHeight;
		while (node) {
			x += node.offsetLeft;
			y += node.offsetTop;
			node = node.offsetParent;
		}
		return {'x': x, 'y': y, 'width': w, 'height': h};
	},
	
	leftTrim : function(input) {
		if ( ! input) {
			return "";
		}
		
		var index = 0;
		while (index < input.length && input.charAt(index) == ' ' ) {
			index = index + 1;
		}
	
	    return input.substring(index, input.length);
	},
	
	rightTrim : function(input) {
		if ( ! input) {
			return "";
		}
		
		var index = input.length - 1;
		while (index >= 0 && input.charAt(index) == ' ' ) {
			index = index - 1;
		}
		
		if (index < 0) {
			return "";
		}
	
	    return input.substring(0, index + 1);
	},
	
	
	trim : function(input) {
	    return input ? Xercel.Util.rightTrim(Xercel.Util.leftTrim(input)) : "";
	},
	
	
	validateEmailValue : function(value) {
		if (value) {
			var pattern = new RegExp(Xercel.Util.EMAIL_PATERN);
			if (pattern.test(value)) {
				return true;
			}
		}
		return false;
	},
	
	
	_validateFormat : function(node, useMessageBox) {
		var errorMessage = null;
		if (node.fieldType == "IntegerField") {
	       	var intValue;
	       	try {
	       		intValue = new Number(node.value);
	       	} catch (e) {
	       		intValue = null;
	       	}
	       	
	       	if ( ! intValue || isNaN(intValue)) {
	        	if (useMessageBox) {
	        		if (Locale) {
	        			errorMessage = Locale.FIELD_VALUE + "<b>" + node.label + "</b>" + Locale.INTEGER_ONLY + "<br />";
	        		} else {
	            		errorMessage = "Значение поля <b>" + node.label + "</b> может быть только числом<br />";
	            	}
	            } else {
	        		if (Locale) {
	        			errorMessage = Locale.FIELD_VALUE + node.label + Locale.INTEGER_ONLY + "\n";
	        		} else {
	            		errorMessage = "Значение поля " + node.label + " может быть только числом\n";
	            	}
	            }
			}
		}
		
		return errorMessage;
	},
	
	
	_validateLength : function(node, useMessageBox, required) {
		var errorMessage = null;
		var requireLengthValidation = ( node.maxLength && node.maxLength > 0 ) || ( node.minLength && node.minLength > 0 );
		var lengthError = requireLengthValidation && ( node.value.length > node.maxLength || node.value.length < node.minLength );
		var requiredError = requireLengthValidation && required;

		if ( lengthError || requiredError ) {
       		if (useMessageBox) {
            	errorMessage = "<b>" + node.label + "</b>";
            } else {
            	errorMessage = node.label;
            }
            
			if (Locale) {
				if ( node.maxLength && node.minLength ) {
					errorMessage += Locale.MIN_MAX_LENGTH_ERROR1 + node.minLength +
					 Locale.MIN_MAX_LENGTH_ERROR2 + node.maxLength + Locale.MIN_MAX_LENGTH_ERROR3;
				} else if ( node.minLength ) {
					errorMessage += Locale.MIN_LENGTH_ERROR1 + node.minLength + Locale.MIN_LENGTH_ERROR2;
				} else if ( node.maxLength ) {
					errorMessage += Locale.MAX_LENGTH_ERROR1+ node.maxLength + Locale.MAX_LENGTH_ERROR2;
				}
			} else {
				if ( node.maxLength && node.minLength ) {
					errorMessage += " (от " + node.minLength + "  до " + node.maxLength + " символов)";
				} else if ( node.minLength ) {
					errorMessage += " (от " + node.minLength + " символов)";
				} else if ( node.maxLength ) {
					errorMessage += " (до " + node.maxLength + " символов)";
				}
			}
			
			if (useMessageBox) {
            	errorMessage += "<br />";
            } else {
            	errorMessage += "\n";
            }
		}
		
		return errorMessage;
	},
	
	
	_validateRequered : function(node, useMessageBox, badElement) {
		var errorMessage = null;

       	if (node.type == "text" || node.type == "hidden") {
       		node.value = Xercel.Util.trim(node.value);
       	}

		if (node.fieldType == "DateField") {
			var dayNode = eval("document." + node.form.name + '.' + node.name + "Day");
			var monthNode = eval("document." + node.form.name + '.' + node.name + "Month");
			var yearNode = eval("document." + node.form.name + '.' + node.name + "Year");
			var valid = true;
			
			if ( ! dayNode.value) {
				if ( ! badElement) {
					badElement = dayNode;
				}
				valid = false;
			} else if ( ! monthNode.value) {
				if ( ! badElement) {
					badElement = monthNode;
				}
				valid = false;
			} else if ( ! yearNode.value) {
				if ( ! badElement) {
					badElement = yearNode;
				}
				valid = false;
			}
			
			if ( ! valid) {
		        if (useMessageBox) {
	            	errorMessage = "<b>" + node.label + "</b><br />";
	            } else {
	            	errorMessage = node.label + "\n";
	            }
	       }
		} else if ( ! node.value || node.value == "false" ) { // "false" for checkbox
			if (node.fieldType == "AntispamField") {
				if (useMessageBox) {
					if (Locale) {
						errorMessage = Locale.ANTISPAM_ERROR + "<br />";
					} else {
					   	errorMessage = "Пожалуйста, введите знаки, которые Вы видите на картинке.<br />";
					}
				} else {
					if (Locale) {
						errorMessage = Locale.ANTISPAM_ERROR + "\n";
					} else {
					   	errorMessage = "Пожалуйста, введите знаки, которые Вы видите на картинке.\n";
					}
				}
			} else {
				if ( ! badElement) {
					badElement = node;
				}
		        if (useMessageBox) {
	            	errorMessage = "<b>" + node.label + "</b><br />";
	            } else {
	            	errorMessage = node.label + "\n";
	            }
	       	}
       	}
       	
       	return errorMessage;
	},
	
	
	validateForm : function(form) {
	
		this.form = null;
		this.firstBadElement = null;
		this.isValid = true;
		this.errorMessage = "";
		this.MessageBox = Xercel.MessageBox || null;
		var useMessageBox = this.MessageBox !== null;
		
	
		if (typeof form == "string") {
			try {
				this.form = eval(form);
			} catch (e) {}
		} else {
			this.form = form;
		}
		
		if ( ! this.form) {
			window.alert("Xercel.Util.validateForm: Invalid input parametr.");
			return false;
		}
		
	    for (var i = 0; i < this.form.elements.length; i = i + 1) {
	        var node = form.elements[i];
	        if ( ! node.fieldType || node.disabled) {
	        	continue;
	        }
	        
	        var locMessage = null;

			if (node.value) {
		         locMessage = Xercel.Util._validateLength(node, useMessageBox, false);
	        	if ( ! locMessage) {
        			locMessage = Xercel.Util._validateFormat(node, useMessageBox);
        		}
	        } else if (node.required) {
				locMessage = Xercel.Util._validateLength(node, useMessageBox, true);
	        	if ( ! locMessage) {
		        	locMessage = Xercel.Util._validateRequered(node, useMessageBox, this.firstBadElement);
        		}
	    	}

			if ( locMessage && ! this.firstBadElement) {
				if (node.fieldType == "CheckBoxField") {
					this.firstBadElement = eval("document." + node.form.name + ".checkbox" + node.name);			
				} else if (node.fieldType == "RadioButtonField") {
					this.firstBadElement = eval("document." + node.form.name + ".radio" + node.name)[0];
				} else if (node.fieldType == "FileField" || node.fieldType == "ImageField") {
					this.firstBadElement = eval(node.form.name + '.' + node.name + "_newfile");
				} else {
	            	this.firstBadElement = node;
	            }
	        }
	        
	        if (locMessage) {
	        	this.errorMessage += locMessage;
	        	this.isValid = false;
	        }
		}

	    if (this.firstBadElement && this.firstBadElement.type != "hidden") {
	        this.firstBadElement.focus();
	    }
		    
		if ( ! this.isValid) {
			if (useMessageBox) {
				if (Locale) {
					this.MessageBox.warning(Locale.FORM_ERROR + "<br />" + this.errorMessage);
				} else {
					this.MessageBox.warning("Пожалуйста, ведите корректные значения для:<br />" + this.errorMessage);
				}
			} else {
				if (Locale) {
					window.alert(Locale.FORM_ERROR + "\n" + this.errorMessage);
				} else {
					window.alert("Пожалуйста, ведите корректные значения для:\n" + this.errorMessage);
				}
			}
		}
		
		if (typeof window.event != "undefined" && ! this.isValid) {
            window.event.returnValue = false;
        }
        
		return this.isValid;
	},
	
	windowStatus : function(form, buttons, statusNode) {
		
		this.statusNode = null;
		
		if (statusNode) {
			if (typeof statusNode == "string") {
				try {
					this.statusNode = document.getElementById(statusNode);
				} catch (e) {
					window.status = statusNode;
				}
			}
			if ( ! this.statusNode) {
				try {
					window.status = statusNode.innerHTML;
					this.statusNode = statusNode;
				} catch (e) {}
			}
		}
		
		if ( ! Event || ! buttons) {
			return;
		}
	
		for (var j = 0; j < buttons.length; j = j + 1) {
			buttons[j].set("disabled", true);
		}
	
	
		this.changed = false;
		this.buttons = buttons;
		
		this.onEditStatus = function (event, object) {
			if (Locale) {
				window.status = Locale.CHANGED;
			} else {
				window.status = "Изменен";
			}
			if (object) {
				if (object.bt) {
					for (var j = 0; j < object.bt.length; j = j + 1) {
						object.bt[j].set("disabled", false);
					}
				}
				if (object.sn) {
					if (Locale) {
						object.sn.innerHTML = "<font style=\"color: #CC9933;\">" + Locale.CHANGED + "</font>";
					} else {
						object.sn.innerHTML = "<font style=\"color: #CC9933;\">Изменен</font>";
					}
				}
			}
		};
	
	
		for (var i = 0; i < form.elements.length; i = i + 1) {
			var node = form.elements[i];
			if (node.fieldType) {
				if (node.fieldType == "FileField" || node.fieldType == "ImageField") {
					node = node.form[node.name + "_newfile"];
				}
				
				if (node.fieldType == "CalendarField") {
					Event.addListener(node, "click", this.onEditStatus, { bt: this.buttons, sn: this.statusNode } );
				} else {
					Event.addListener(node, "change", this.onEditStatus, { bt: this.buttons, sn: this.statusNode } );
				}
			}
		}
	
	},
	
	
	setProtected : function(node, value) {
	
		this.node = null;
		
		if (node) {
			if (typeof node == "string") {
				try {
					this.node = document.getElementById(node);
				} catch (e) {}
				
				if ( ! this.node) {
					try {
						this.node = eval(node);
					} catch (e) {}
				}
			} else {
				this.node = node;
			}
		}
		
		if ( ! this.node) {
			window.alert("Xercel.Util.setFieldValue: variable `node' can't be null or empty!");
			return;
		}
	
		if (this.node.fieldType == "CheckBoxField") {
			var checkboxNode = eval("document." + this.node.form.name + ".checkbox" + this.node.name);
			checkboxNode.disabled = value;			
		} else if (this.node.fieldType == "RadioButtonField") {
			var radioNode = eval("document." + this.node.form.name + ".radio" + this.node.name);
			if (radioNode && radioNode.length) {
				for (var i = 0; i < radioNode.length; i = i + 1) {
					radioNode[i].disabled = value;
				}
			}
		} else if (this.node.fieldType == "FileField" || this.node.fieldType == "ImageField") {
			var visibility = value ? "hidden" : "";
			var oldFile = document.getElementById(this.node.name + "_oldfile");
			if (oldFile) {
				oldFile.style.visibility = visibility;
			}
			var newFile = eval(this.node.form.name + '.' + this.node.name + "_newfile");
			if (newFile) {
				newFile.style.visibility = visibility;
			}
		} else if (this.node.fieldType == "DateField") {
			var monthNode = eval("document." + this.node.form.name + '.' + this.node.name + "Month");
			var dayNode = eval("document." + this.node.form.name + '.' + this.node.name + "Day");
			var yearNode = eval("document." + this.node.form.name + '.' + this.node.name + "Year");
			var hoursNode = eval("document." + this.node.form.name + '.' + this.node.name + "Hours");
			var minutesNode = eval("document." + this.node.form.name + '.' + this.node.name + "Minutes");
			var ampmNode = eval("document." + this.node.form.name + '.' + this.node.name + "Ampm");
			
			monthNode.disabled = value;
			dayNode.disabled = value;
			yearNode.disabled = value;
			
			if (hoursNode) {
				hoursNode.disabled = value;
			}
			
			if (minutesNode) {
				minutesNode.disabled = value;
			}
			
			if (hoursNode) {
				minutesNode.disabled = value;
			}
			
			if (ampmNode) {
				minutesNode.disabled = value;
			}
			
		} else {
			this.node.disabled = value;
		}
		
		if (value === true && this.node.required) {
			Xercel.Util.setRequired(this.node, false);
		}
		
		this.node.isProtected = value;
	},
	
	
	setLabel : function(node, labelValue) {
		var parentNode = null;
		
		if (node) {
			if (typeof node == "string") {
				try {
					parentNode = document.getElementById(node);
				} catch (e) {}
			} else {
				parentNode = node;
			}
		}
		
		if ( ! parentNode) {
			window.alert("Xercel.Util.setLabel: variable `node' can't be null or empty!");
			return;
		}
		
		var labelNode = document.getElementById(parentNode.name + "_label");
		if (labelNode) {
			labelNode.innerHTML = labelValue;
		}
	},


	setRequired : function(node, isRequired) {
		var element = null;
		
		if (node) {
			if (typeof node == "string") {
				try {
					element = document.getElementById(node);
				} catch (e) {}
			} else {
				element = node;
			}
		}
		
		if ( ! element) {
			window.alert("Xercel.Util.setLabel: variable `node' can't be null or empty!");
			return;
		}
		
		var rqNode = document.getElementById(element.name + "_rq");
		if (rqNode) {
			rqNode.innerHTML = isRequired && ! element.isProtected ? '*' : "";
		}
		
		element.required = isRequired && ! element.isProtected;
	},
	
	/*
	 * To deselect DateField set value as: "//"
	 */
	setFieldValue : function(node, value) {
		
		this.node = null;
		
		if (node) {
			if (typeof node == "string") {
				try {
					this.node = document.getElementById(node);
				} catch (e) {}
			} else {
				this.node = node;
			}
		}
		
		if ( ! this.node) {
			window.alert("Xercel.Util.setFieldValue: variable `node' can't be null or empty!");
			return;
		}
		
		value = value === null ? '' : value;
		
		this.node.value = value;	// text | password | hidden | select-one | textarea | checkbox
	
		if (this.node.fieldType == "FileField" || this.node.fieldType == "ImageField") {
			var oldFile = document.getElementById(this.node.name + "_oldfile");
			if (oldFile) {
				oldFile.innerHTML = '&#160;';
			}
			var newFile = eval(this.node.form.name + '.' + this.node.name + "_newfile");
			if (newFile && value === '') {
				newFile.value = value;
			}
		} else if (this.node.fieldType == "CheckBoxField") {
			var checkboxNode = eval("document." + this.node.form.name + ".checkbox" + this.node.name);
			checkboxNode.checked = "true" == value || true === value;
		} else if (this.node.fieldType == "RadioButtonField") {
			var radioNode = eval("document." + this.node.form.name + ".radio" + this.node.name);
			if (radioNode && radioNode.length) {
				for (var i = 0; i < radioNode.length; i = i + 1) {
					radioNode[i].checked = radioNode[i].value == value;
				}
			}
		} else if (this.node.fieldType == "DateField") {
			// format: "month/day/year hour:minute ampm"
			var tmpData = value.split(' ');
			var mdy = tmpData && tmpData[0] ? tmpData[0].split('/') : null;
			var hm = tmpData && tmpData[1] ? tmpData[1].split(':') : null;
			
			var month = mdy ? mdy[0] : '';
			var day = mdy ? mdy[1] : '';
			var year = mdy ? mdy[2] : '';
			var hour = hm ? hm[0] : null;
			var minute = hm ? hm[1] : null;
			var ampm = tmpData && tmpData[2] ? tmpData[2] : null;
			
			var monthNode = eval("document." + this.node.form.name + '.' + this.node.name + "Month");
			var dayNode = eval("document." + this.node.form.name + '.' + this.node.name + "Day");
			var yearNode = eval("document." + this.node.form.name + '.' + this.node.name + "Year");
			var hoursNode = eval("document." + this.node.form.name + '.' + this.node.name + "Hours");
			var minutesNode = eval("document." + this.node.form.name + '.' + this.node.name + "Minutes");
			var ampmNode = eval("document." + this.node.form.name + '.' + this.node.name + "Ampm");
	
			monthNode.value = month;
			dayNode.value = day;
			yearNode.value = year;
			
			if (hoursNode) {
				if (hour) {
					hoursNode.value = hour;
					this.node.value = this.node.value + " " + hour;
				} else if (hoursNode.value) {
					this.node.value = this.node.value + " " + hoursNode.value;
				} else {
					hoursNode.value = '';
				}
			}
			
			if (minutesNode) {
				if (minute) {
					minutesNode.value = minute;
					this.node.value = this.node.value + ":" + minute;
				} else if (minutesNode.value) {
					this.node.value = this.node.value + ":" + minutesNode.value;
				} else {
					minutesNode.value = '';
				}
			}
			
			if (ampmNode) {
				if (ampm) {
					ampmNode.value = ampm;
					this.node.value = this.node.value + " " + ampm;
				} else if (ampmNode.value) {
					this.node.value = this.node.value + " " + ampmNode.value;
				} else {
					ampmNode.value = '';
				}
			}
		} else if (node.fieldType == "MultiSelectListField") {
			for (var j = 0; j < this.node.options.length; j = j + 1) {
				this.node.options[j].selected = false;
			}
			
			if (value && typeof value != "undefined") {
				var pairs = value.split(", ");
				for (var k = 0; k < pairs.length; k = k + 1) {
					for (var m = 0; m < this.node.options.length; m = m + 1) {
						if (this.node.options[m].value == pairs[k]) {
							this.node.options[m].selected = true;
							break;
						}
					}
				}
			}
		}
		
	},
	
	
	getSelectedDescription : function(node) {
		this.node = null;
		
		if (node) {
			if (typeof node == "string") {
				try {
					this.node = document.getElementById(node);
				} catch (e) {}
			} else {
				this.node = node;
			}
		}
		
		if ( ! this.node) {
			window.alert("Xercel.Util.getSelectDescription: variable `node' can't be null or empty!");
			return;
		}
		
		if ( ! this.node.fieldType == "ListField") {
			window.alert("Xercel.Util.getSelectDescription: type of node is not `ListField'");
			return;
		}
		
		for (var i = 0; i < this.node.childNodes.length; i = i + 1) {
			if (this.node.childNodes[i].selected) {
				return this.node.childNodes[i].text;
			}
		}
		
		return null;
	},
	
	
	updateHiddenInput : function(node) {
	
		this.node = null;
		
		if (node) {
			if (typeof node == "string") {
				try {
					this.node = document.getElementById(node);
				} catch (e) {}
			} else {
				this.node = node;
			}
		}
	
		if ( ! this.node) {
			window.alert("Xercel.Util.updateHiddenInput: variable `node' can't be null or empty!");
			return;
		}
	
		if (this.node.fieldType == "FileField" || this.node.fieldType == "ImageField") {
			var oldFile = document.getElementById(this.node.name + "_oldfile");
			if (oldFile) {
				oldFile.innerHTML = '&#160;';
			}
			var newFile = eval("document." + this.node.form.name + '.' + this.node.name + "_newfile");
			this.node.value = newFile.value;
		} else if (this.node.fieldType == "CheckBoxField") {
			var checkboxNode = eval("document." + this.node.form.name + ".checkbox" + this.node.name);
			this.node.value = checkboxNode.checked;				
		} else if (this.node.fieldType == "RadioButtonField") {
			this.node.value = null;
			var radioNode = eval("document." + this.node.form.name + ".radio" + this.node.name);
			if (radioNode && radioNode.length) {
				for (var i = 0; i < radioNode.length; i = i + 1) {
					if (radioNode[i].checked === true || radioNode[i].checked == "true") {
						this.node.value = radioNode[i].value;
						break;
					}
				}
			}
		} else if (this.node.fieldType == "DateField") {
			var monthNode = eval("document." + this.node.form.name + '.' + this.node.name + "Month");
			var dayNode = eval("document." + this.node.form.name + '.' + this.node.name + "Day");
			var yearNode = eval("document." + this.node.form.name + '.' + this.node.name + "Year");
			var hoursNode = eval("document." + this.node.form.name + '.' + this.node.name + "Hours");
			var minutesNode = eval("document." + this.node.form.name + '.' + this.node.name + "Minutes");
			var ampmNode = eval("document." + this.node.form.name + '.' + this.node.name + "Ampm");
			
			this.node.value = monthNode.value + "/" + dayNode.value + "/" + yearNode.value;
			
			if (hoursNode) {
				this.node.value = hoursNode.value ? this.node.value + " " + hoursNode.value : this.node.value;
			}
			
			if (minutesNode) {
				this.node.value = minutesNode.value ? this.node.value + " " + minutesNode.value : this.node.value;
			}
			
			if (ampmNode) {
				this.node.value = ampmNode.value ? this.node.value + " " + ampmNode.value : this.node.value;
			}
			
		} else {
			window.alert("Xercel.Util.updateHiddenInput: field type not supported currently");
		}
	},
	
	
	waitNodeReady : function(nodeId, handler, scope) {
		var timerId = window.setInterval(function() {
		    var node = document.getElementById(nodeId);
		    if (node) {
		        window.clearInterval(timerId);
		        timerId = null;
		        handler(scope);
		    }
		}, 20);
	}
};
