/**
 * jQuery custom selectboxes
 *
 * Copyright (c) 2008 Krzysztof Suszyński (suszynski.org)
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * @version 0.6.1
 * @category visual
 * @package jquery
 * @subpakage ui.selectbox
 * @author Krzysztof Suszyński <k.suszynski@wit.edu.pl>
 **/
jQuery.fn.selectbox = function(options)
{
    /* Default settings */
    var settings = 
    {
        className: 'jquery-selectbox',
        animationSpeed: "normal",
        listboxMaxSize: 10,
        replaceInvisible: false
    };
    var commonClass = 'jquery-custom-selectboxes-replaced';
    var listOpen = false;
    var showList = function(listObj)
    {
        var selectbox = listObj.parents('.' + settings.className + '');
        listObj.slideDown(settings.animationSpeed, function()
        {
            listOpen = true;
        });
        selectbox.addClass('selecthover');
        jQuery(document).bind('click', onBlurList);
        return listObj;
    }
    var hideList = function(listObj)
    {
        var selectbox = listObj.parents('.' + settings.className + '');
        listObj.slideUp(settings.animationSpeed, function()
        {
            listOpen = false;
            jQuery(this).parents('.' + settings.className + '').removeClass('selecthover');
        });
        jQuery(document).unbind('click', onBlurList);
        return listObj;
    }
    var onBlurList = function(e)
    {
    	// if this function exists, this is the product page.  track the click on the dropdowns
    	if (jQuery.isFunction(window.gaTrackingClickDropdownEvent)){
    		var select_id = jQuery(e.target).next().attr('id');
    		if (select_id.indexOf('color_select') >= 0)	gaTrackingClickDropdownEvent('Color');
    		else if (select_id.indexOf('size_select') >= 0)	gaTrackingClickDropdownEvent('Size');
    	}
        var trgt = e.target;
        var currentListElements = jQuery('.' + settings.className + '-list:visible').parent().find('*').andSelf();
        if (jQuery.inArray(trgt, currentListElements) < 0 && listOpen) 
        {
            hideList(jQuery('.' + commonClass + '-list'));
        }
        return false;
    }

    var escapeValue = function(v)
    {
	var regExp = / /g;

	return v.replace(regExp, '~');
    }

    var unescapeValue = function(v)
    {
	var regExp = /~/g;

	return v.replace(regExp, ' ');
    }
    
    /* Processing settings */
    settings = jQuery.extend(settings, options || {});
    /* Wrapping all passed elements */
    return this.each(function()
    {
        var _this = jQuery(this);
        if (_this.filter(':visible').length == 0 && !settings.replaceInvisible) 
            return;
        var replacement = jQuery('<div class="' + settings.className + ' ' + commonClass + '">' +
        '<div class="' +
        settings.className +
        '-moreButton" />' +
        '<div class="' +
        settings.className +
        '-list ' +
        commonClass +
        '-list" />' +
        '<input type="text" class="' +
        settings.className +
        '-currentItem" readonly/>' +
        '</div>');
        jQuery('option', _this).each(function(k, v)
        {
            var v = jQuery(v);
            var listElement = jQuery('<span class="' + settings.className + '-item value-' + escapeValue(v.val()) + ' item-' + k + '">' + v.text() + '</span>');
            listElement.click(function()
            {
                var thisListElement = jQuery(this);
                var thisReplacment = thisListElement.parents('.' + settings.className);
                var thisIndex = thisListElement[0].className.split(' ');
                for (k1 in thisIndex) 
                {
                    if (/^item-[0-9]+$/.test(thisIndex[k1])) 
                    {
                        thisIndex = parseInt(thisIndex[k1].replace('item-', ''), 10);
                        break;
                    }
                };
                var thisValue = thisListElement[0].className.split(' ');
                for (k1 in thisValue) 
                {
                    if (/^value-.+$/.test(thisValue[k1])) 
                    {
                        thisValue = unescapeValue(thisValue[k1].replace('value-', ''));
                        break;
                    }
                };
                thisReplacment.find('.' + settings.className + '-currentItem').attr('value', thisListElement.text());
                thisReplacment.find('select').val(thisValue).trigger('change');
                var thisSublist = thisReplacment.find('.' + settings.className + '-list');
                if (thisSublist.filter(":visible").length > 0) 
                {
                    hideList(thisSublist);
                }
                else 
                {
                    showList(thisSublist);
                }
            }).bind('mouseenter', function()
            {
                jQuery(this).addClass('listelementhover');
            }).bind('mouseleave', function()
            {
                jQuery(this).removeClass('listelementhover');
            });
            jQuery('.' + settings.className + '-list', replacement).append(listElement);
            if (v.filter(':selected').length > 0) 
            {
                jQuery('.' + settings.className + '-currentItem', replacement).attr('value', v.text());
            }
        });
        replacement.find('.' + settings.className + '-currentItem').keyup(function(e)
        {
            var _input = $(this);
            _input.select();
            var iv = $(this).attr('value');
            
            var first_char = iv[0]
            //console.log(first_char);
            
            
            
            var found = false;
            jQuery('option', _this).each(function(k, v)
            {
                var v = jQuery(v);
                var first_char_option = v.html()[0];
                if (first_char == first_char_option) 
                {
                    $(this).parents(replacement).find('select').val(v.val()).triggerHandler('change');
                    _input.attr({
                        'value': v.html()
                    });
                    found = true;
                }
                
            });
            
            if (!found) 
            {
                _input.attr({
                    'value': $(this).parents(replacement).find('select option:eq(0)').html()
                });
                $(this).parents(replacement).find('select').val($(this).parents(replacement).find('select option:eq(0)').val()).triggerHandler('change');
            }
            _input.select();
            
        });
        replacement.find('.' + settings.className + '-moreButton, .' + settings.className + '-currentItem').click(function()
        {
            var thisMoreButton = jQuery(this);
            var otherLists = jQuery('.' + settings.className + '-list').not(thisMoreButton.siblings('.' + settings.className + '-list'));
            hideList(otherLists);
            var thisList = thisMoreButton.siblings('.' + settings.className + '-list');
            if (thisList.filter(":visible").length > 0) 
            {
                hideList(thisList);
            }
            else 
            {
                showList(thisList);
            }
            
            $(this).select();
            
        }).bind('mouseenter', function()
        {
            jQuery(this).addClass('morebuttonhover');
        }).bind('mouseleave', function()
        {
            jQuery(this).removeClass('morebuttonhover');
        });
        _this.hide().replaceWith(replacement).appendTo(replacement);
        var thisListBox = replacement.find('.' + settings.className + '-list');
        var thisListBoxSize = thisListBox.find('.' + settings.className + '-item').length;
        if (thisListBoxSize > settings.listboxMaxSize) 
            thisListBoxSize = settings.listboxMaxSize;
        if (thisListBoxSize == 0) 
            thisListBoxSize = 1;
        var thisListBoxWidth = Math.round(_this.width() + 5);
        if (jQuery.browser.safari) 
            thisListBoxWidth = thisListBoxWidth * 0.94;
        replacement.css('width', thisListBoxWidth + 'px');
        thisListBox.css({
            width: Math.round(thisListBoxWidth) + 'px'
        });
    });
}
jQuery.fn.unselectbox = function()
{
    var commonClass = 'jquery-custom-selectboxes-replaced';
    return this.each(function()
    {
        var selectToRemove = jQuery(this).filter('.' + commonClass);
        selectToRemove.replaceWith(selectToRemove.find('select').show());
    });
}

