$j = jQuery;
function toggle_cs(elem){
    var select = $j(elem);
    var state = select.data('state');
    if( state == 'expanded' ){
        collapse_cs(select);
    }else{
        expand_cs(select);
    }
    select.children('div.select_box').children('input.transp_input').focus();
}
function expand_cs(elem){
    lose_focus_global(); // для кривых браузеров *и окуда такие берутся?..*
    var select = $j(elem);
    select.data('selection',1);
    var items_box = $j('#'+select.attr('id')+'items_box');
    if( !items_box.parent().is('body') ){
        items_box.appendTo('body');
    }

    var pos = select.offset();
    var height = select.height(); // opera неправильно определяет высоту! оО
    var width = select.width(); // ширину тоже

    if($j.browser.opera || $j.browser.msie){ //и ie туда же =(
        height = select[0].clientHeight;
        width = select[0].clientWidth;
    }

    items_box.css({'top': pos.top+height,
                   'left': pos.left,
                   'min-width': width+'px'});
    items_box.slideDown('normal');
    select.data('state', 'expanded');
    setTimeout(function(){select.removeData('selection')}, 300);
}
function lose_focus_cs(elem){
    var select = $j(elem);
    var select_box = select.children('.select_box');

    collapse_cs(select);
    select_box.removeClass('focus');
}
function lose_focus_element(elem){
    var select = $j(elem);
    setTimeout( function(){
                if(!select.data('selection')){
                    lose_focus_cs(select);
                }
            }, 300);
}
function lose_focus_global(){
    var selects = $j('.custom_select');
    selects.map( function(idx,elem){ lose_focus_cs(elem); } );
}
function collapse_cs(elem){
    var select = $j(elem);
    var items_box = $j('#'+select.attr('id')+'items_box');
    items_box.slideUp('normal');
    select.data('state', 'collapsed');
}
function kbd_cs_select(e, select, cb_select){
    e = e || window.event;
    select = $j(select);
    var key = e.keyCode;

    if( key == 38){ //up arrow
        prev_cs_element(select, cb_select);
    }else if( key == 40 ){ //down arrow
        next_cs_element(select, cb_select);
    }
}
function next_cs_element(select, cb_select){
    select = $j(select);
    var input_el = select.children('.select_box').children('input.transp_input');
    var hidden_el = select.children('.select_box').children('input.hidden_input');
    var items = $j('#'+select.attr('id')+'items_box').children('.item');

    var index = parseInt( select.attr('current') );
    if(index<items.length-1){
        index += 1;

        var other = $j(items[index]);
        var title = $j.trim(other.text());
        var value = $j.trim(other.attr('value'));

        input_el.val( title );
        hidden_el.val( value );

        select.attr('current', index);
        if(cb_select && typeof cb_select == 'function'){
            cb_select(index, title, value);
        }
    }
}
function prev_cs_element(select, cb_select){
    select = $j(select);
    var input_el = select.children('.select_box').children('input.transp_input');
    var hidden_el = select.children('.select_box').children('input.hidden_input');
    var items = $j('#'+select.attr('id')+'items_box').children('.item');

    var index = parseInt( select.attr('current') );
    if(index>0){
        index -= 1;
        var other = $j(items[index]);
        var title = $j.trim(other.text());
        var value = $j.trim(other.attr('value'));

        input_el.val( title );
        hidden_el.val( value );

        select.attr('current', index);
        if(cb_select && typeof cb_select == 'function'){
            cb_select(index, title, value);
        }
    }
}
var hide_timer;
function cs_selection(elem){
    //некий хак для неких браузеров ( у которых выделение скролбара вызывает потерю фокуса элемента )
    //выделение скролбара обычно вызывает onScroll, поэтому мы говорим, что происходит selection
    //плохо, что после этого мы не можем отследить потерю фокуса со скролбара,
    //поэтому считаем, что фокус теряется через 2 секунды простоя (в течении двух секунд не происходит выбора или перемотки)
    var select = $j(elem);
    select.data('selection', 1);
    clearTimeout(hide_timer);
    hide_timer = setTimeout( function(){ select.removeData('selection'); lose_focus_element(elem); }, 2000 );
}
function set_active_element(select, elem, cb_select){
    select = $j(select);
    elem = $j(elem);

    select.data('selection', 1);
    var value = elem.attr('value');
    var title = $j.trim( elem.children('.title').text() );
    var idx = elem.index();

    var input_el = select.children('.select_box').children('input.transp_input');
    var hidden_el = select.children('.select_box').children('input.hidden_input');


    hidden_el.val(value);
    input_el.val(title);
    select.attr('current', idx);

    collapse_cs(select);
    input_el.focus();

    if(cb_select && typeof cb_select == 'function'){
        cb_select(idx, title, value);
    }

    setTimeout( function(){select.removeData('selection');}, 300 );
}

