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

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

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;
	},
	
	
	validateForm : function(form) {
	
		this.form = null;
		this.firstBadElement = null;
		this.isValid = true;
		this.errorMessage = "";
		this.errorNodes = "";
		this.MessageBox = Xercel.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;
	        }
	        
	        if (node.fieldType == "IntegerField" && node.value) {
	        	var intValue;
	        	try {
	        		intValue = new Number(node.value);
	        	} catch (e) {
	        		intValue = null;
	        	}
	        	if ( ! intValue || isNaN(intValue)) {
		        	this.isValid = false;
		            this.errorMessage += "Значение поля <b>" + node.label + "</b> может быть только числом";
	            }
	        } 
	        
	        if (node.required) {
	        
	        	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");
					if ( ! dayNode.value) {
						if ( ! this.firstBadElement) {
							this.firstBadElement = dayNode;
						}
						this.isValid = false;
					} else if ( ! monthNode.value) {
						if ( ! this.firstBadElement) {
							this.firstBadElement = monthNode;
						}
						this.isValid = false;
					} else if ( ! yearNode.value) {
						if ( ! this.firstBadElement) {
							this.firstBadElement = yearNode;
						}
						this.isValid = false;
					}
					
					if ( ! dayNode.value || ! monthNode.value || ! yearNode.value) {
						if (this.MessageBox) {
			            	this.errorNodes += "<b>" + node.label + "</b><br/>";
			            } else {
			            	this.errorNodes += "\n" + node.label + "\n";
			            }
					}
				} else if ( ! node.value || node.value == "false") { // "false" for checkbox
	        		this.isValid = false;
	        		
			        if (node.fieldType == "AntispamField") {
			            this.errorMessage += "Пожалуйста, введите знаки, которые Вы видите на картинке.";
					}
					
					if ( ! 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 (this.MessageBox) {
		            	this.errorNodes += "<b>" + node.label + "</b><br/>";
		            } else {
		            	this.errorNodes += "\n" + node.label + "\n";
		            }
	        	}
	        }
	    }
		    
	    if (this.firstBadElement && this.firstBadElement.type != "hidden") {
	        this.firstBadElement.focus();
	    }
		    
		if ( ! this.isValid) {
			if (this.MessageBox) {
				this.MessageBox.warning("Поля отмеченные символом <font style=\"color: red; font-weight: bold;\">*</font> обязательны для заполнения. Пожалуйста, ведите значения для:<br/>" +
					this.errorNodes + this.errorMessage);
			} else {
				window.alert("Поля отмеченные символом \"*\" обязательны для заполнения. Пожалуйста, ведите значения для:\n" +
					this.errorNodes + this.errorMessage);
			}
		}
		
		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) {
			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) {
					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 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 + "_rq");
		if (labelNode) {
			labelNode.innerHTML = isRequired && ! parentNode.isProtected ? '*' : "";
		}
		
		parentNode.required = isRequired && ! parentNode.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);
	}
};

