function attachEventListener(element, name, handler)
{
	if (window.addEventListener)
		element.addEventListener(name, handler, false);
	else if (window.attachEvent)
		element.attachEvent("on" + name, handler);
	else
		eval("element.on" + name + " = handler;");
}

function attachObjectToMethod(object, method)
{
	switch (typeof(method))
	{
	case "string":
		return function()
		{
			return object[method].apply(object, arguments);
		};
	case "function":
		return function()
		{
			return method.apply(object, arguments);
		};
	}
}

function fixE(e)
{
	e = e || window.event;
	if (e.layerX == null)
		e.layerX = e.offsetX;
	if (e.layerY == null)
		e.layerY = e.offsetY;
	if (e.which == null)
		e.which = e.button;
	if (e.srcElement == null)
		e.srcElement = e.target;
	return e;
}

function setCaretToEnd(control)
{
	if (control.createTextRange)
	{
		var range = control.createTextRange();
		range.collapse(false);
		range.select();
	}
	else if (control.setSelectionRange)
		control.setSelectionRange(control.value.length, control.value.length);
}

function MaskEdit(element, mask)
{
	this.element = element;
	this.mask = mask;
	this.element.maxlength = mask.length;
	this.value = this.element.value;
	attachEventListener(this.element, "blur", attachObjectToMethod(this, "OnBlur"));
	attachEventListener(this.element, "focus", attachObjectToMethod(this, "OnFocus"));
	attachEventListener(this.element, "keydown", attachObjectToMethod(this, "OnKeyDown"));
	attachEventListener(this.element, "keyup", attachObjectToMethod(this, "OnKeyUp"));
}

MaskEdit.prototype.OnBlur = function(e)
{
	e = fixE(e);
	if (!/[\d+]/.test(this.value))
		this.element.value = this.value = "";
};

MaskEdit.prototype.OnFocus = function(e)
{
	e = fixE(e);
	if (this.value.length == 0 || this.value == null)
		this.element.value = this.value = this.mask.substring(0, this.mask.indexOf('#'));
	setCaretToEnd(this.element);
};

MaskEdit.prototype.OnKeyDown = function(e)
{
	e = fixE(e);
	this.element.value = this.value;
	if (e.ctrlKey || e.altKey || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 13 || e.keyCode == 46)
		return true;
	var keyCode = e.keyCode >= 96 && e.keyCode <= 105 ? e.keyCode - 48 : e.keyCode;
	if (keyCode < 48 || keyCode > 57)
		return false;
	this.value = this.value.replace(/[^\d]/gi, "") + String.fromCharCode(keyCode);
	this.value = this.MaskValue(this.value);
	this.element.value = this.value;
	setCaretToEnd(this.element);
	return false;
};

MaskEdit.prototype.OnKeyUp = function(e)
{
	if (e.keyCode == 8 || e.keyCode == 46)
		this.value = this.element.value;
	this.element.value = this.value;
};

MaskEdit.prototype.MaskValue = function(value)
{
	var result = "";
	for (var i = 0, j = 0; i < this.mask.length; i++)
		if (this.mask.charAt(i) == "#")
			if (j >= value.length)
				break;
			else
				result += value.charAt(j++);
		else
			result += this.mask.charAt(i);
	return result;
};
