Object.extend(String.prototype, {
    // make substr work correctly in ie
    substr: function(start, length) {
        if (start < 0) {
            start = this.length + start;
            if (start < 0) {
                start = 0;
            }
        }

        if ('undefined' == typeof(length)) {
            end = this.length;
        }
        else {
            var end = start + length;
            if (end > this.length) {
                end = this.length;
            }
        }

        var substr = '';
        var i;
        for (i = start; i < end; i++)
            substr += this.charAt(i);
        return substr;
    },

// need to make these work with char lists later
    trim: function() {
    	return this.replace(/^\s+|\s+$/g,'');
    },

    ltrim: function() {
	    return this.replace(/^\s+/,'');
	},

    rtrim: function() {
    	return this.replace(/\s+$/,'');
    }
});

Object.extend(Array.prototype, {
    contains: function(s) {
        return this.any(function(n) { return n == s; });
    }
});

Object.extend(Form, {
    submit: function(form) {
        form = $(form);
        if ('INPUT' === form.submit.nodeName)
            form.submit.click();
        else
            form.submit();
    }
});


// getValue and setValue have been extended to allow getting/setting radio buttons. May be better just to create separate functions
Object.extend(Form.Element.Methods, {
  getValue: function(element) 
  {
    if ($(element) && $(element).type != 'radio')
    {
        element = $(element);
        var method = element.tagName.toLowerCase();
        return Form.Element.Serializers[method](element);
    }
    else
    {
        var value = null;
        var elements;

// not sure how this should work with other form elements like input arrays name="record_ids[]"
        // radio buttons
        elements = $$('input[type="radio"][name="' + element + '"]');
        if (elements.size() > 0)
        {
            var el = elements.find(function(el) { return el.checked });
            if (el)
                return el.value;
        }

        return value;
    }
  },

  setValue: function(element, value) {
    if ($(element))
    {
        element = $(element);
        var method = element.tagName.toLowerCase();
        Form.Element.Serializers[method](element, value);
        return element;
    }
    else
    {
        if (elements = $$('input[type="radio"][name="' + element + '"][value="' + value + '"]'))
            elements[0].checked = true;
    }
  }
});
var $F = Form.Element.Methods.getValue;
var $V = Form.Element.Methods.setValue;

Object.extend(Event, {
    KEY_ENTER:      13,
    KEY_ATSIGN:     64,
    KEY_PLUS:       43,
    KEY_MINUS:      45,
    KEY_PERIOD:     46,
    KEY_OPENPAREN:  40,
    KEY_CLOSEPAREN: 41,
    KEY_SHIFT:      16,
    KEY_CONTROL:    17,
    KEY_CAPSLOCK:   20,
    KEY_SPACE:      32,
	keyPressed: function(e)
	{
		return (e.which) ? e.which : window.event.keyCode;
	}
});


//from help balloon. Will determine if these are useful outside of help balloon later
Object.genGUID = function()
{
	var len = 8;
	if(!isNaN(parseInt(arguments[0]))) len = parseInt(arguments[0]);
	var chars = "abcdef0123456789";
	var output = "";
	while(output.length < len)
	{
		var rnd = Math.floor(Math.random() * (chars.length - 1));
		output += chars.charAt(rnd);
	}
	return output;
}
