var oldOnLoad = window.onload;
window.onload = init;

document.write('<style>.noscript { display: none } .script { display: block }</style>');

function init()
{
    // If we're on the special PayPal forwarding page, submit the
    // invisible form

    var toPayPal = $("toPayPal");
    if (toPayPal) {
	toPayPal.submit();
    }

//     // Find all phone number and currency fields and assign them a
//     // special input handler

//     var payPalForm = $("payPalForm");
//     document.getElementsByClassName(
// 	"phoneNumber", payPalForm).each(assignHandler);
//     document.getElementsByClassName(
// 	"USD", "payPalForm").each(assignHandler);

//     // Assign click handlers to control visibility

// //     Event.observe(???, 'click', clickHandler, false);
// //     ???.relatedElement = $('???');

    // Put the focus on the first field

    var payPalForm = $("payPalForm");
    if (payPalForm) {
	Form.focusFirstElement(payPalForm);
    }

    // Chain to the next onLoad function

    if (typeof oldOnLoad == "function") oldOnLoad();
}

function assignHandler(node, index)
{
    // If this a textfield, add an InputController to it and set up a
    // handler for keypress events

    if (isTextField(node)) {
	if (!node.inputController) assignInputController(node);
	Event.observe(node, 'keypress', handler, false);
    }
    else if (node.hasChildNodes()) {
	$A(node.childNodes).each(assignHandler);
    }
}

function handler(event)
{
    var element = Event.element(event);
    if (element.inputController) {
	return element.inputController.handleEvent(event);
    }
}

function clickHandler(event)
{
    var element = Event.element(event);
    if (element.checked) {
	element.relatedElement.style.display = "block";
    }
    else {
	element.relatedElement.style.display = "none";
    }
}

var InputController = Class.create();
InputController.prototype = {
    initialize: function(inputList, sizes)
    {
	this._inputList = inputList;
	this._sizes = sizes;
	this._fieldSize =
	    sizes.inject(
		0,
		function(accumulator, value, index) {
		    return accumulator + value;
		});
	this._field = "";
    },

    handleEvent: function(event)
    {
	var keyCode = Event.getKeyCode(event);
	var charCode = Event.getCharCode(event);

	// Control characters get normal processing

	if (/\cA-\cZ/.test(charCode)) return;

	// If it's not a left or right arrow key, a backspace, a
	// delete or a digit, we ignore the character

	if (!(keyCode == Event.KEY_LEFT || keyCode == Event.KEY_RIGHT ||
	      keyCode == Event.KEY_BACKSPACE || keyCode == Event.KEY_DELETE ||
	      /[0-9]/.test(charCode))) {
	    return;
	}

	var element = Event.element(event);
	var caret = this.viewToModel(element);
	this.modelToView(caret);

	if (keyCode == Event.KEY_LEFT) {
	    caret.start = Math.max(0, caret.start - 1);
	}
	else if (keyCode == Event.KEY_RIGHT) {
	    caret.end = Math.min(this._field.length, caret.end + 1);
	    caret.start = caret.end;
	}
	else if (keyCode == Event.KEY_BACKSPACE) {
	    if (caret.start == caret.end) {
		caret.start = Math.max(0, caret.start - 1);
	    }
	    var length = caret.end - caret.start;
	    this._field =
		this._field.splice(caret.start, length, String.fill(length));
	}
	else if (keyCode == Event.KEY_DELETE) {
	    if (caret.start == caret.end) {
		caret.end = Math.min(this._field.length, caret.end + 1);
	    }
	    var length = caret.end - caret.start;
	    this._field =
		this._field.splice(caret.start, length, String.fill(length));
	    caret.start = caret.end;
	}
	else { /* digit */
	    if (caret.start == caret.end) {
		caret.end = Math.min(this._field.length, caret.end + 1);
	    }
	    var length = caret.end - caret.start;
	    this._field =
		this._field.splice(caret.start, length, String.fill(length));
	    this._field =  this._field.setCharAt(caret.start, charCode);
	    caret.start = Math.min(this._field.length, caret.start + 1);
	}
	caret.end = caret.start;

	this.modelToView(caret);

	// Don't allow further processing

	Event.stop(event);
    },

    viewToModel: function(element)
    {
	var caret = getCaretPosition(element);
	var offset = 0;

	this._field = String.fill(this._fieldSize);
	for (var i = 0; i < this._sizes.length; i++) {
	    var value = this._inputList[i].value;

	    if (this._inputList[i] == element) {
		var adjustment = offset /* + (this._sizes[i] - value.length)*/;
		//if (value.length == 0) adjustment--;
		caret.start += adjustment;
		caret.end += adjustment;
		alert(caret.start + " " + caret.end);
	    }

	    this._field =
		this._field.splice(
		    offset + (this._sizes[i] - value.length),
		    value.length, value);
	    offset += this._sizes[i];
	}

	return caret;
    },

    modelToView: function(caret)
    {
	offset = 0;
	for (var i = 0; i < this._sizes.length; i++) {
	    var size = this._sizes[i];
	    var element = this._inputList[i];
	    element.value = this._field.substr(offset, size);
	    if (caret.start >= offset && caret.start < size + offset) {
		this._inputList[i].focus();
		setCaretPosition(this._inputList[i],
				 caret.start - offset, caret.end - offset);
	    }
	    offset += size;
	}
    }
}

function isTextField(node) {
    var value =
	node.nodeType == 1 &&
	node.nodeName.toLowerCase() == "input" &&
	node.type.toLowerCase() == "text";
    return value;
}

function assignInputController(node)
{
    // Create an InputController object

    var inputList = findAllInputNodes(node);
    var sizes = new Array();
    for (var i = 0; i < inputList.length; i++) {
	var max = parseInt(inputList[i].getAttribute("maxlength"));
	if (!max) alert("Missing maxlength in input node list");
	sizes[i] = max;
    }
    var inputController = new InputController(inputList, sizes);

    // Give each textfield a reference to the InputController

    for (var i = 0; i < inputList.length; i++) {
	inputList[i].inputController = inputController;
    }
}

function findAllInputNodes(node)
{
    var inputList = new Array();
    inputList.push(node);
    while ((node = findNextInputNode(node)) != null) {
	inputList.push(node);
    }
    return inputList;
}

function findNextInputNode(node)
{
    while (node != null) {
	node = node.nextSibling;
	if (node && isTextField(node)) break;
    }
    return node;
}

Object.extend(Event, {
    getKeyCode: function(event) {
	return (event.which) ? event.which : event.keyCode;
    },
    getCharCode: function (event) {
	return String.fromCharCode(Event.getKeyCode(event));
    },
    clone: function(event, newTarget) {
	var obj = new Object();
	for (var i in event) {
	    if (i == "target" || i == 'srcElement') {
		obj[i] = newTarget;
	    }
	    else {
		obj[i] = event[i];
	    }
	}
	return obj;
    }
});

Object.extend(String, {
    fill: function(length, fillStr) {
        if (typeof fillStr == "undefined") fillStr = " ";
	var str = "";
	for (var i = 0; i < length; i++) str += fillStr;
	return str;
    }
});

Object.extend(String.prototype, {
    splice: function(pos, rmLength, addStr) {
	if (typeof addStr == "undefined") addStr = "";

	var str1 = this.substring(0, pos);
	var str2 = this.substring(pos + rmLength);
	return str1 + addStr + str2;
    },

    setCharAt: function(pos, c) {
	return this.splice(pos, 1, c);
    },

    pad: function(padSize, padRight, padChar) {
	if (typeof padRight == "undefined") padRight = true;
	if (typeof padChar == "undefined") padChar = " ";

	if (this.length >= padSize) return this;
	var padding = String.fill(padSize - this.length, padChar);
	if (padRight) return this + padding;
	return padding + this;
    }
});
