jmagic = {
    objects: {'select': {}, 'checkbox': {}},

    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 scode =  jmagic.construct_options(options);
            $('#jmagic_fake_select_'+jmagic.objects[type][id]).html(scode);

            $('li.jmagic_fake_option').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': '#C7E7FF'});
                },
                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;" id="jmagic_option_value_'+o.attr('value')+'">'+o.text()+'</li>';
            }
        });
        return scode;
    },

    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*26;
                        var width = obj.width();
                        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;" />');
			var scode = '<ul id="jmagic_fake_select_'+tid+'" class="jmagic_fake_select" style="position:absolute;list-style:none;width:'+width+'px;background:#fff;border:1px solid #CDCCCC;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();
				} else {
					o.hide();
				}
			});
			$('#jmagic_select_input_'+id).blur(function() {
				var o = $(this).next();
				setTimeout(function() {o.hide();}, 200);

			});
			if(loop === true) return false;
		}


        $('li.jmagic_fake_option').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': '#C7E7FF'});
            },
            function() {
                $(this).css({'padding':'3px', 'background': 'transparent'});
            }
        );
    },
	
	checkbox: function(obj, c) {
		if(obj[0].tagName.toLowerCase() != 'input') return false;
        
		if(obj.length > 1) {
			$.each(obj, function(i, n) {
				jmagic.checkbox($(n));
			});
		} else {
			// находим значение
			var id = obj.attr('id');
			var ch = obj.attr('checked');
			var pos = ch ? '-31px 0' : '0 0';
			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:33px;width:31px;background:url(/img/jmagic-checkbox.gif) no-repeat '+pos+';">&nbsp;</span>';
			obj.after(code).hide();
			if(c !== 1) return false;
		}
		
		obj.change(function() {
			var o = $(this);
    if(o.attr('type') == 'radio') {
        $('input[name='+o.attr('name')+']').each(function() {
            var io = $(this);
            if(io != o) {
                io.removeAttr('checked');
                var cio = $('#jmagic_fake_checkbox_'+io.attr('id'));
                cio.removeClass('checked').css('background-position', '0 0');
            }
        });
    }
			var id = o.attr('id');
			var co = $('#jmagic_fake_checkbox_'+id);
			if(o.attr('checked')) {
				co.addClass('checked').css('background-position', '-31px 0');
			} else {
				co.removeClass('checked').css('background-position', '0 0');
			}
		});
		
		$('span.jmagic-fake-checkbox').live('click', function() {
			var o = $(this);
			var p = o.prev();
                            if(p.attr('type') == 'radio') {
                                $('input[name='+p.attr('name')+']').each(function() {
                                    var io = $(this);
                                    if(io != o) {
                                        io.removeAttr('checked');
                                        var cio = $('#jmagic_fake_checkbox_'+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', '-31px 0');
				p.attr('checked', true);
			}
			return false;
		});
	}
}
