function InputHelper(options)
{
    var self = this;
    var error_shown = false;
    var item_array = new Array();
    var helper_options = null;

    var mainDefaults = {'alert_errors' : false,
                        'multiple_errors' : true}

    var optionDefaults = {'filter_function' : function(){return true;},
                          'fail_function' : function(){}};

    helper_options = $.extend({}, mainDefaults, options);

    function error(error_string)
    {
        if(helper_options['alert_errors'])
        {
            alert(error_string);
        }
    }

    self.setChangeFunction = function(item_name, new_change)
    {
        getItem(item_name).setChangeFunction(new_change);
    }

    self.addItem = function(item_name, find)
    {
        item_array.push(new InputItem(item_name, find));
    }

    self.addHiddenItem = function(item_name, value)
    {
        item_array.push(new HiddenItem(item_name, value));
    }

    self.getJSONData = function()
    {
        var json_data = {};

        $.each(item_array, function(name, item)
        {
            json_data[item.getName()] = item.getValue();
        });

        return $.toJSON(json_data);
    }

    self.addFilter = function(name, options)
    {
        getItem(name).addFilter($.extend({}, optionDefaults, options));
    }

    self.getValue = function(name)
    {
        return getItem(name).getValue();
    }

    self.testFilters = function()
    {
        var filters_passed = true;

        $.each(item_array, function(name, item){
            if(!error_shown)
            {
                if(!item.testFilters())
                {
                    filters_passed = false;
                    error_shown = helper_options['multiple_errors'] ? false : true;
                }
            }
        });

        error_shown = false;
        return filters_passed;
    }

    function getItem(item_name)
    {
        var to_return = false;

        $.each(item_array, function(key, value)
        {
            if(value.getName() == item_name)
            {
                to_return = value;
            }
        });

        if(!to_return)
        {
            error("getItem didn't find anything with the name '" + item_name + "'");
        }

        return to_return;
    }

    function HiddenItem(name, value)
    {
        var self = this;
        
        self.getValue = function()
        {
            return value;
        }

        self.getName = function()
        {
            return name;
        }

        self.testFilters = function()
        {
            return true;
        }
    }

    function InputItem(name, find_string)
    {
        var self = this;
        var type = null;
        var item = null;
        var filters = null;
        var changeFunction = function(input){return input;}

        function _init()
        {
            filters = new Array();

                //item is equal to the jQuery find.  If doesn't exist, throw error.
            item = $(find_string);

                //If count is 0, the item doesn't exist, if count is most than 1 it's a select
            if(item.length == 0)
            {
                error(find_string + " does not exist!");
            }
            else if(item.length == 1)
            {
                if(item.is('textarea'))
                {
                    type = 'textarea';
                }
                else if (item.is('input'))
                {
                    type = item.attr('type');
                }
                else if (item.is('select'))
                {
                    type = 'select';
                }
                else
                {
                    error("1 item, not textarea or input (" + find_string + ")");
                }
            }
            else
            {
                if(item.attr('type') != 'radio')
                {
                    error("multiple item, not a radio (" + find_string + ")");
                }

                type = 'radio';
            }
        }

        self.setChangeFunction = function(new_change)
        {
            changeFunction = new_change;
        }

            //Get the value of the item.
        self.getValue = function()
        {
            var clean_value = null;

            switch(type)
            {
                case 'textarea':
                case 'password':
                case 'text':
                    clean_value = item.val();
                    break;
                case 'select':
                    var to_return = item.find('option:selected').attr('value');
                    if(!to_return)
                    {
                        error("item select has no value (" + find_string + ")");
                    }
                    clean_value = to_return;
                    break;
                case 'checkbox':
                    clean_value = item.is(':checked') ? true : false;
                    break;
                case 'radio':
                    var checked_item = item.filter(':checked');

                    if(checked_item.length != 1)
                    {
                        error("radio item (" + find_string + ") has " + checked_item.length + " selected");
                    }
                    clean_value = checked_item.attr('value');
                    break;
                default:
                    error("(Getvalue), type is not normal, it is: " + type + " for " + name);
            }

            if(clean_value)
            {
                return changeFunction(clean_value);
            }

            return false;
        }

        self.addFilter = function(options)
        {
            filters.push(options);
        }

            //Get the name of the item
        self.getName = function()
        {
            return name;
        }

        self.testFilters = function()
        {
            var filters_passed = true;

            $.each(filters, function(index, filter)
            {
                if(!filter['filter_function'](self.getValue()))
                {
                    filter['fail_function']();
                    filters_passed = false;
                }
            });

            return filters_passed;
        }

        _init();
    }

    self.emptyFilter = function()
    {
        return function(to_filter)
        {
            if(!to_filter || to_filter.length == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }

    self.lengthFilter = function(min, max)
    {
        return function(to_filter)
        {
            if(to_filter.length < min || to_filter.length > max)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }

    self.regexFilter = function(regex_string)
    {
        return function(to_filter)
        {
            var regex = RegExp(regex_string);

            return regex.test(to_filter);
        }
    }
}




