1. Делаем предзагрузку, например этим
$.preloadImagesS = function () {
if (typeof arguments[arguments.length - 1] == 'function') {
var callback = arguments[arguments.length - 1];
} else {
var callback = false;
}
var Img = arguments[0]
$(new Image()).load(function(){
if (typeof callback == 'function') {
callback();
}
}).attr('src', Img);
}
Вызывается так
$.preloadImagesS (IMG_URL, function(){
//тут выводим большую картинку картинку, т.к. она уже подгрузилась
});
А по клику сначала показываем спинер .gif
2. имхо обязателен и "так" не справиться