jmagic = {
    objects: {
        'select': {}, 
        'checkbox': {}, 
        'radio': {}, 
        'file': {}
    },
    file_options: {
        'button_title': 'Файл', 
        'button_class': null
    },
    active_select: null, 

    reload: function(type, id, attrs) {
        if(!type || type === undefined) return false;
        if(!id || id === undefined) return false;
        if(!attrs || attrs === undefined) attrs = {};

        if(jmagic.objects[type] == undefined) return false;
        if(jmagic.objects[type][id] == undefined) {
            jmagic[type]($('#'+id));
            return true;
        }

        if(type=='select') {
            var obj = $('#_'+id);

            var oval = obj.val();
            var val = obj.find('option[value='+oval+']').text();
            var options = obj.children();

            $('#'+id).val(oval);
            var fobj = $('#jmagic_select_input_'+id);
            fobj.val(val);
            for(var a in attrs) {
                if(attrs[a] == 'remove') fobj.removeAttr(a);
                else fobj.attr(a, attrs[a]);
            }


            var height = options.length*26;
            var scode =  jmagic.construct_options(options);
            var fs = $('#jmagic_fake_select_'+jmagic.objects[type][id]);
            fs.html(scode).css('height', (height > 182 ? 182 : height)+'px');
        /*
            $('li.jmagic_fake_option', fs).click(function() {
                    //$('#jmagic_fake_select_'+tid).hide();
                    var o = $(this);
    				var p = o.parent().prev();
    				var id = p.attr('id').replace('jmagic_select_input_', '');
                    $('#jmagic_select_input_'+id).val(o.text());
                    $('#'+id).val(o.attr('id').replace('jmagic_option_value_', '')).change();
            }).hover(
                function() {
                    $(this).css({'padding': '3px', 'background': '#7EAE1D'});
                },
                function() {
                    $(this).css({'padding':'3px', 'background': 'transparent'});
                }
            );*/
        }
        if(type == 'checkbox') {
            var obj = $('#_'+id);
        }
    },

    construct_options: function(collection) {
        var scode = ''
        $.each(collection, function(i, n) {
            var o = $(n);
            if(n.tagName.toLowerCase() == 'optgroup') {
                scode += '<li class="jmagic_fake_optgroup" style="padding:3px;font-weight:bold;background:#F6F6F6;"">'+o.attr('label')+'</li>';
                var opts = o.children();
                scode += jmagic.construct_options(opts);
            } else if(n.tagName.toLowerCase() == 'option') {
                scode += '<li class="jmagic_fake_option" style="padding:3px 3px 3px 5px;border-top:1px solid #fff;border-bottom:1px solid #fff;color:#999;" id="jmagic_option_value_'+o.attr('value')+'">'+o.text()+'</li>';
            }
        });
        return scode;
    },

    check_select: function(e) {
        if(e.target != jmagic.active_select) {
            $(jmagic.active_select).next().hide();
            jmagic.active_select = null;
        }
    },
    
    select: function(obj, loop) {
        if(obj[0].tagName.toLowerCase() != 'select') return false;
        
        if(obj.length > 1) {
            $.each(obj, function(i, n) {
                jmagic.select($(n), true);
            });
        } else {
            // находим значение
            var id = obj.attr('id');
            var oval = obj.val();
            var val = obj.find('option[value='+oval+']').text();
            var options = obj.children();
            var tid = 'ts_'+(new Number(new Date()));
			
            var height = options.length*20;
            //var width = obj.width();
            var width = 116;
            if(!width) width = parseFloat(obj.css('width').replace('px', ''));

            jmagic.objects.select[id] = tid;
			
            $('label[for='+id+']').attr('for', 'jmagic_select_input_'+id);
            obj.before('<input type="hidden" id="'+id+'" name="'+obj.attr('name')+'" value="'+oval+'" />');
            obj.before('<input type="text" id="jmagic_select_input_'+id+'" name="temp_select_'+tid+'" readonly="true" class="'+obj.attr('class')+'" value="'+val+'" style="cursor:default;background-image:url(/img/jmagic-select-btn.gif);background-position:right 5px;background-repeat:no-repeat;height:20px;padding-right:11px;border:1px solid #999;padding-left: 5px;" />');
            var scode = '<ul id="jmagic_fake_select_'+tid+'" class="jmagic_fake_select" style="position:absolute;list-style:none;min-width:'+width+'px;;background:#fff;border:1px solid #999999;margin-top:-1px;display:none;padding:0;cursor:default;height:'+(height > 182 ? 182 : height)+'px;overflow-x:hidden;overflow-y:auto;z-index:3500;">';
            scode += jmagic.construct_options(options);
            scode += '</ul>';
            obj.before(scode);
            obj.attr('id', '_'+id).attr('disabled', true).hide();
			
            $('#jmagic_select_input_'+id).click(function() {
                var o = $(this).next();
                if(o.css('display').toLowerCase() == 'none') {
                    o.show();
                    jmagic.active_select = this;
                    $(document).bind('click', jmagic.check_select);
                } else {
                    o.hide();
                    jmagic.active_select = null;
                    $(document).unbind('click', jmagic.check_select);
                }
            });			
            
            $(document).ready(function() {
                $('#'+id).change(function() {
                    obj.val($('#'+id).val());
                    obj.change();
                });
            });
            if(loop === true) return false;
        }
        /*
        $('li.jmagic_fake_select').live('click', function(e) {
            
        });
*/
        $('li.jmagic_fake_option').live('click', function() {
            //$('#jmagic_fake_select_'+tid).hide();
            var o = $(this);
            var p = o.parent().prev();
            var id = p.attr('id').replace('jmagic_select_input_', '');
            $('#jmagic_select_input_'+id).val(o.text());
            $('#'+id).val(o.attr('id').replace('jmagic_option_value_', '')).change();
            o.parent().hide();
        }).hover(
            function() {
                $(this).css({
                    'background': '#fbffec', 
                    'borderTop': '1px solid #dcef9b', 
                    'borderBottom': '1px solid #dcef9b'
                });
            },
            function() {
                $(this).css({
                    'background': 'transparent', 
                    'background': 'transparent', 
                    'borderTop': '1px solid #fff', 
                    'borderBottom': '1px solid #fff'
                });
            }
            );
    },
	
    checkbox: function(obj, options, c) {
        if(obj.length == 0 || obj[0].tagName.toLowerCase() != 'input') return false;
        
        if(c === undefined) c = obj.length;
        if(obj.length > 1) {
            $.each(obj, function(i, n) {
                jmagic.checkbox($(n), options, obj.length);
            });
        } else {
            var defaults = {
                height: 32, 
                width: 37, 
                img: '/img/jmagic-checkbox.png'
            }
            options = $.extend(defaults, options);
            
            // находим значение
            var id = obj.attr('id');
            var ch = obj.attr('checked');
            var pos = ch ? '0 0' : '-'+options.width+'px 0';
            obj.data('jm-checked', options.width);
            
            if(obj.hasClass('charmed')) {
                var fc = $('#jmagic_fake_checkbox_'+obj.data('jmagic-tid'));
                if(ch) {
                    fc.addClass('checked').css('background-position', pos);
                } else {
                    fc.removeClass('checked').css('background-position', pos);
                }
                return false;
            }
            
            var tid = 'ts_'+(new Number(new Date()));
			
            var code = '<span class="jmagic-fake-checkbox'+(ch?' checked':'')+'" id="jmagic_fake_checkbox_'+id+'" style="display:inline-block;height:'+options.height+'px;width:'+options.width+'px;background:url('+options.img+') no-repeat '+pos+';">&nbsp;</span>';
            obj.after(code).hide();
            
            if(c !== 1) return false;
        }
		
        obj.change(function() {
            var o = $(this);
            var id = o.attr('id');
            var co = $('#jmagic_fake_checkbox_'+id);
            if(o.attr('checked')) {
                co.addClass('checked').css('background-position', '0 0');
            } else {
                co.removeClass('checked').css('background-position', '-'+o.data('jm-checked')+'px 0');
            }
        });
		
        $('span.jmagic-fake-checkbox').live('click', function() {
            var o = $(this);
            var p = o.prev();
            if(o.hasClass('checked')) {
                o.removeClass('checked').css('background-position', '-'+o.data('jm-checked')+'px 0');
                p.removeAttr('checked');
            } else {
                o.addClass('checked').css('background-position', '0 0');
                p.attr('checked', true);
            }
            p.change();
            return false;
        });
    },
        
    radio: function(obj, c) {
        if(obj[0].tagName.toLowerCase() != 'input') return false;
        
        if(obj.length > 1) {
            $.each(obj, function(i, n) {
                jmagic.radio($(n));
            });
        } else {
            // находим значение
            var id = obj.attr('id');
            var ch = obj.attr('checked');
            var pos = ch ? '-22px 0' : '0 0';
            var tid = 'ts_'+(new Number(new Date()));
			
            var code = '<span class="jmagic-fake-radio'+(ch?' checked':'')+'" id="jmagic_fake_radio_'+id+'" style="display:inline-block;height:18px;width:18px;background:url(/img/jmagic-radio.gif) no-repeat '+pos+';">&nbsp;</span>';
            obj.after(code).hide();
            if(c !== 1) return false;
        }
		
        obj.change(function() {
            var o = $(this);
            if(!o.attr('name').match(/(\[|\])+/)) {
                $('input[name='+o.attr('name')+']').each(function() {
                    var io = $(this);
                    if(io != o) {
                        io.removeAttr('checked');
                        var cio = $('#jmagic_fake_radio_'+io.attr('id'));
                        cio.removeClass('checked').css('background-position', '0 0');
                    }
                });
            }
            var id = o.attr('id');
            var co = $('#jmagic_fake_radio_'+id);
            if(o.attr('checked')) {
                co.addClass('checked').css('background-position', '-22px 0');
            } else {
                co.removeClass('checked').css('background-position', '0 0');
            }
        });
		
        $('span.jmagic-fake-radio').live('click', function() {
            var o = $(this);
            var p = o.prev();
            if(!p.attr('name').match(/(\[|\])+/)) {
                $('input[name='+p.attr('name')+']').each(function() {
                    var io = $(this);
                    if(io != o) {
                        io.removeAttr('checked');
                        var cio = $('#jmagic_fake_radio_'+io.attr('id'));
                        cio.removeClass('checked').css('background-position', '0 0');
                    }
                });
            }
            if(o.hasClass('checked')) {
                o.removeClass('checked').css('background-position', '0 0');
                p.removeAttr('checked');
            } else {
                o.addClass('checked').css('background-position', '-22px 0');
                p.attr('checked', true);
            }
            //p.change();
            return false;
        });
    }, 
    
    file: function(obj, c) {
        if(obj[0].tagName.toLowerCase() != 'input') return false;
        if(c === undefined) c = obj.length; 
        
        if(obj.length > 1) {
            $.each(obj, function(i, n) {
                jmagic.file($(n), obj.length);
            });
        } else {
            var tid = new Number(new Date());
            obj.data('jmagic_tid', tid.toString());
            obj.parent().css('position', 'relative');
            var code = '<span id="jmagic_fake_file_'+tid+'" style="position:absolute;width:100%;z-index:-1;"><span class="'+(jmagic.file_options.button_class ? jmagic.file_options.button_class : 'jmagic-button')+'" style="margin-right:1%;width:9% !important;display:inline-block;text-align:center;">'+(jmagic.file_options.button_title ? jmagic.file_options.button_title : 'Выбрать файл')+'</span><input type="text" value="'+obj.val()+'" id="jmagic_fake_file_value_'+tid+'" class="'+obj.attr('class')+'" style="width:88% !important;"/></span>';
            obj.attr('size', '1').attr('class', '').css({
                cursor: 'pointer', 
                opacity: '0', 
                marginLeft: '-32px'
            });
            
            if($.browser.msie) obj.css('width', '9%');
            obj.before(code);
            if(!$.browser.msie) obj.after('<span style="position:absolute;display:block;width:32px;height:23px;margin-top:-23px;margin-left:-32px;">&nbsp;</span>');
            
            obj.change(function() {
                var o = $(this);
                $('#jmagic_fake_file_value_'+o.data('jmagic_tid')).val(this.value);
            });
        }
    }
    
}
