Combo = function(_obj, _params) {

    var _holder = $(_obj);
    var _combo = null;
    var _box = null;
    var _open = false;

    var _init = function() {

        var _selected = _holder.attr('selectedIndex') != undefined ? $(_holder.find('option')[_holder.attr('selectedIndex')]) : _holder.find('option:selected');

        if (_params && _params.hasLabel)
            var _label = String($('label[for="'+_holder.attr('id')+'"]').html()).toUpperCase();
        else
            var _label = _selected.text();

        var _val = _selected.val();

        _holder.hide();
        _holder.val(_val);
        _holder.before('<a href="#" class="combo" id="combo-'+_holder.attr('id')+'">'+_label+'</a>');
        _classes = _holder.attr('class') ? _holder.attr('class') : (_params && _params.classes ? _params.classes : '');
        _combo = $('a#combo-'+_holder.attr('id'));

        if (_holder.attr('tabindex') != "0" && _holder.attr('tabindex') != 0 && _holder.attr('tabindex') != null) {
            _combo.attr('tabindex', _holder.attr('tabindex'));
        }

        if (_classes) {
            _classes = _classes.split(' ');
            for (var i in _classes) {
                _combo.addClass(_classes[i]);
            }
        }

        _combo.after('<div class="combo-box" id="combo-'+_holder.attr('id')+'-box">');

        _box = $('div#combo-'+_holder.attr('id')+'-box');

        if (_params && _params.boxClasses) {
            _classes = _params.boxClasses.split(' ');
            for (var i in _classes) {
                _box.addClass(_classes[i]);
            }
        }

        _holder.find('option').each(function(i) {
            if (!$(this).hasClass('label')) {
                var _class = $(this).val() == _val ? ' class="selected"' : '';
                _box.append('<a href="#" rel="'+$(this).val()+'"'+_class+'>'+$(this).text()+'</a>');
            }
        });

        _combo.hover(function() {
            $(this).addClass('hover');
        }, function() {
            $(this).removeClass('hover');
        });

        _combo.bind('click', function(e) {
            e.preventDefault();
            e.stopPropagation();

            if (!_open) {

                $('div.combo-box').hide();
                $('a.combo').removeClass('hover');
                $('a.combo').removeClass('open');

                $(this).addClass('open');

                _box.css({
                    'left':$(this).position().left,
                    'top':$(this).position().top+(_params && _params.offsetTop ? _params.offsetTop : 0)
                }).show().scrollTop(
                    (_box.find('a.selected').length) ? _box.find('a.selected').position().top-85 : 0
                );

                _open = true;
                $(document).bind('click', _documentClickHandler);

            } else {
                _documentClickHandler(e);
            }
            return;
        });

        _box.find('a').bind('click', function(e) {
            e.preventDefault();
            var _id = $(this).parent().attr('id');
            $(this).parent().find('a').removeClass('selected');
            $(this).addClass('selected');
            _combo.html($(this).html());
            _combo.addClass('combo-selected');

            var _oldVal = _holder.val();
            _holder.val($(this).attr('rel'));

            if (_holder.val() != _oldVal) {
                _holder.trigger('change');
            }
            _documentClickHandler(e);
            return;
        });

        var _documentClickHandler = function(e) {
            _box.hide();
            _open = false;
            _combo.removeClass('hover');
            _combo.removeClass('open');
            $(document).unbind('click', _documentClickHandler);
            return;
        }

    }

    _init();

}
