jQuery("document").ready(function(){
        // register ajax gallery-navigation listeners
        jQuery("a.page-numbers").click(function(e) {
                return ngg_ajax_navigation(e, this);
        });
        jQuery("a.prev").click(function(e) {
                return ngg_ajax_navigation(e, this);
        });
        jQuery("a.next").click(function(e) {
                return ngg_ajax_navigation(e, this);
        });
        
        // register ajax browser-navigation listeners
        jQuery("a.ngg-browser-next").click(function(e) {
                return ngg_ajax_browser_navigation(e, this);
        });
        jQuery("a.ngg-browser-prev").click(function(e) {
                return ngg_ajax_browser_navigation(e, this);
        });
});

function ngg_ajax_navigation(e, obj) {
        // try to find page number
        var pageNumber = 0;
        if (jQuery(obj).hasClass("page-numbers")) {
                pageNumber = jQuery(obj).contents()[0].data;
        } else if (jQuery(obj).hasClass("prev")) {
                pageNumber = jQuery(obj).attr("id").substr(9);
        } else if (jQuery(obj).hasClass("next")) {
                pageNumber = jQuery(obj).attr("id").substr(9);
        }
        
        // try to find gallery number by checking the parents ID until we find a matching one
        var currentNode = obj;
        while (null != currentNode.parentNode && !jQuery.nodeName(currentNode.parentNode, "body") && "ngg-gallery-" != jQuery(currentNode.parentNode).attr("id").substring(0, 12)) {
                currentNode = currentNode.parentNode;
        }
        
        if (jQuery(currentNode.parentNode).attr("id")) {
                var gallery = jQuery(currentNode.parentNode);

                // we found a gallery, let's extract the post id & gallery id
                var payload = gallery.attr("id").substring(12);
                var separatorPosition = parseInt(payload.indexOf("-"));
                
                var galleryId = payload.substr(0, separatorPosition);
                var postId = payload.substr(separatorPosition + 1);

                if ( (galleryId.length == 0) || (postId.length == 0) ) {
                        return true;
                }
                                
                ngg_show_loading(e);
                
                // load gallery content
                jQuery.get(ngg_ajax.path + "nggajax.php", {p: postId, galleryid: galleryId, nggpage: pageNumber, type: "gallery"}, function (data, textStatus) {
                        
                        // delete old content
                        gallery.children().remove();
                        
                        // add new content
                        gallery.replaceWith(data);
                        
                        // add ajax-navigation, again
                        jQuery("document").ready(function(){
                                // remove old listeners to avoid double-clicks
                                jQuery("a.page-numbers").unbind("click");
                                jQuery("a.prev").unbind("click");
                                jQuery("a.next").unbind("click");
                                
                                // add shutter-listeners again
                                shutterReloaded.init('sh');
                                
                                jQuery("a.page-numbers").click(function(e) {
                                        return ngg_ajax_navigation(e, this);
                                });
                                jQuery("a.prev").click(function(e) {
                                        return ngg_ajax_navigation(e, this);
                                });
                                jQuery("a.next").click(function(e) {
                                        return ngg_ajax_navigation(e, this);
                                });
                                
                                ngg_remove_loading();
                        });
                });
                
                // deactivate HTML link
                return false;
        }
        
        // an error occurred, use traditional HTML link
        return true;
};

function ngg_ajax_browser_navigation(e, obj) {
        

        // try to find gallery number
        if ("ngg-prev-" == jQuery(obj).attr("id").substr(0, 9) || "ngg-next-" == jQuery(obj).attr("id").substr(0, 9)) {
                
                // extract the image-id
                var imageNumber = jQuery(obj).attr("id").substr(9);

                // find the image-browser-container
                var currentNode = obj;
                while (null != currentNode.parentNode && !jQuery.nodeName(currentNode.parentNode, "body") && !jQuery(currentNode.parentNode).hasClass("ngg-imagebrowser")) {
                        currentNode = currentNode.parentNode;
                }
                
                if (jQuery(currentNode.parentNode).hasClass("ngg-imagebrowser")) {
                        var gallery = jQuery(currentNode.parentNode);

                        // let's extract the post id & gallery id
                        var payload = gallery.attr("id").substring(17);
                        var separatorPosition = parseInt(payload.indexOf("-"));
                        
                        var galleryId = payload.substr(0, separatorPosition);
                        var postId = payload.substr(separatorPosition + 1);
                        
                        if ( (galleryId.length == 0) || (postId.length == 0) ) {
                                return true;
                        }
                        
                        ngg_show_loading(e);
                        
                        // get content
                        jQuery.get(ngg_ajax.path + "nggajax.php", {p: postId, galleryid: galleryId, pid: imageNumber, type: "browser"}, function (data, textStatus) {
                                // delete old content
                                gallery.children().remove();
                                
                                // add new content
                                gallery.replaceWith(data);
                                
                                // add ajax-navigation, again
                                jQuery("document").ready(function(){
                                        // remove old listeners to avoid double-clicks
                                        jQuery("a.ngg-browser-next").unbind("click");
                                        jQuery("a.ngg-browser-prev").unbind("click");
                                        
                                        // add shutter-listeners again
                                        shutterReloaded.init('sh');
                                        
                                        // register ajax browser-navigation listeners
                                        jQuery("a.ngg-browser-next").click(function(e) {
                                                return ngg_ajax_browser_navigation(e, this);
                                        });
                                        jQuery("a.ngg-browser-prev").click(function(e) {
                                                return ngg_ajax_browser_navigation(e, this);
                                        });
                                        
                                        ngg_remove_loading();
                                });
                        });
        
                        // deactivate HTML link
                        return false;
                }
        }
        
        return true;
}

var loadingImage;
function ngg_show_loading(obj) {
        loadingImage = jQuery(document.createElement("img")).attr("src", ngg_ajax.path + "images/ajax-loader.gif").attr("alt", ngg_ajax.loading);

        jQuery("body").append(loadingImage);
        
        jQuery(loadingImage).css({
                position: "absolute",
                top: (obj.pageY + 15) + "px",
                left: (obj.pageX + 15) + "px"
        });
        
        jQuery(document).mousemove(function(e) {
                loadingImage.css({
                        top: (e.pageY + 15) + "px",
                        left: (e.pageX + 15) + "px"
                });
        });
}

function ngg_remove_loading() {
        jQuery(document).unbind("mousemove");
        
        jQuery(loadingImage).remove();
}
