function NumberField(AreaElem, PhoneElem)
{
	this.areaElem = AreaElem;
	this.phoneElem = PhoneElem;

	var self = this;
	
	// register some events :=)
	this.AddEvent(PhoneElem, "keyup", function(Event){return self.HandleCurPos(Event)}, true);
	this.AddEvent(PhoneElem, "keydown", function(Event){return self.HandleCurPos(Event)}, true);

	this.AddEvent(PhoneElem, "mouseup", function(Event){return self.HandleCurPos(Event)}, true);
	this.AddEvent(PhoneElem, "focus", function(Event){return self.HandleCurPos(Event)}, true);
	this.AddEvent(PhoneElem, "input", function(Event){return self.HandleInput(Event)}, true);
	this.AddEvent(PhoneElem, "paste", function(Event){return self.HandlePaste(Event)}, true);

	this.AddEvent(AreaElem, "keyup", function(Event){return self.HandleCurPos(Event)}, true);
	this.AddEvent(AreaElem, "mouseup", function(Event){return self.HandleCurPos(Event)}, true);
	this.AddEvent(AreaElem, "focus", function(Event){return self.HandleCurPos(Event)}, true);
	this.AddEvent(AreaElem, "input", function(Event){return self.HandleInput(Event)}, true);
	this.AddEvent(AreaElem, "paste", function(Event){return self.HandlePaste(Event)}, true);
}

NumberField.prototype.AddEvent = function(Elem, EventName, Func, Capture)
{
	/*
	if(Elem.addEventListener)
		Elem.addEventListener(Event, Func, Capture);
	else if(Elem.attachEvent)
		Elem.attachEvent("on" + Event, Func);
	*/
	Event.observe(Elem, EventName, Func, Capture);
}

NumberField.prototype.GetEvent = function(Event)
{
	if(!Event)
		Event = window.event;
	
	if(!Event.target && Event.srcElement)
		Event.target = Event.srcElement;

	return Event;
}

NumberField.prototype.HandlePaste = function(Event)
{
	var Event = this.GetEvent(Event);
	
	handynr = this.GetHandynr(window.clipboardData.getData('Text'));
	if(handynr)
	{
		this.InsertHandynr(handynr);
		return false;
	}
}

NumberField.prototype.HandleCurPos = function(Event)
{
	Event = this.GetEvent(Event);
	elem = Event.target;
	
	cursorPosBefore = elem.cursorPos;

	// a very dirty way
	if(document.selection)
	{
		sel = document.selection;
		r2 = sel.createRange();
		rng = elem.createTextRange();
		try
		{
			rng.setEndPoint("EndToStart", r2);
			elem.cursorPos = rng.text.length;
		}
		catch(e)
		{
			elem.cursorPos = 1;
		}
	}
	else
	{
		elem.cursorPos = elem.selectionStart;
	}

	// cut first null
	if(elem == this.areaElem && this.areaElem.value.length == 1 && (Event.keyCode == 48 || Event.keyCode == 96))
	{
		this.areaElem.value = "";
		return false;
	}

	// "<-" ot "<---" pressed - we jump to the area field
	if(elem == this.phoneElem && (Event.keyCode == "8" || Event.keyCode == "37") && Event.type == "keydown" && cursorPosBefore == 0)
	{
		// set cursor to the end of area
		//this.areaElem.value="";
		this.areaElem.focus();
		this.areaElem.value += "";
		return true;
	}
	
	// jump to the phone field
	if(elem == this.areaElem && this.areaElem.value.length == 3 && ((Event.keyCode >= 48 &&  Event.keyCode <= 57) || (Event.keyCode >= 96 && Event.keyCode <= 105)))
		this.phoneElem.focus();

	// "->" pressend - we jump to phone
	if(elem == this.areaElem && Event.keyCode == 39 && cursorPosBefore == 2)
		this.phoneElem.focus();
	
	// security check - the area field is max 3 characters
	if(this.areaElem.value.length > 3)
		this.areaElem.value = this.areaElem.value.substring(0, 3);
}

NumberField.prototype.HandleInput = function(Event)
{
	Event = this.GetEvent(Event);
	elem = Event.target;
	
	cursorPosBefore = elem.cursorPos;
	ss = elem.selectionStart;
	elem.cursorPos = ss;

	if(Math.abs(ss - cursorPosBefore) > 2)
	{
		handynr = this.GetHandynr(elem.value.substring(cursorPosBefore, ss));
		if(handynr)
			this.InsertHandynr(handynr);
	}
}

NumberField.prototype.GetHandynr = function(Text)
{
	// clean up
	Text = Text.replace(/[^0-9\+]/g, "");
	
	if(Text.match(/^01(5|6|7)\d+$/))
		return "+49" + Text.substring(1, 99);
	else if(Text.match(/^00491(5|6|7)\d+$/))
		return "+" + Text.substring(2, 99);
	else if(Text.match(/^\+491(5|6|7)\d+$/))
		return Text;
	
	return false;
}

NumberField.prototype.InsertHandynr = function(Handynr)
{
	this.areaElem.value = Handynr.substring(3, 6);
	this.phoneElem.value = Handynr.substring(6, 99);
}
