
jQuery.jImage = {
    options : {
		border				: 10,
		closeHTML			: 'Close',
		overlayOpacity		: 0.8,
		fadeDuration		: 400
	},
    currentRel : null,
    opened : false,
    animationInProgress : false,
    flash: false,
    init: function(options)
    {
        if (options)
			jQuery.extend(jQuery.jImage.options, options);

        //Set HTML Links
        jQuery("a[rel^=\'jImage\']").each(
            function()
            {
                var el         = jQuery(this);
                var relAttr    = el.attr('rel') || '';
                var hrefAttr   = el.attr('href') || '';
                var imageTypes = /\.jpg|\.jpeg|\.png|\.gif|.php/g;

               if (hrefAttr.toLowerCase().match(imageTypes) != null && relAttr.toLowerCase().indexOf('jimage') == 0)
                {
                    
					el.click(jQuery.jImage.start);
				}
            }
        );
        //Create all nesscary html
        //Overlay Div
        var jImageOverlay = document.createElement('div');
        jQuery(jImageOverlay)
        .attr('id', 'jImageOverlay')
        .css(
            {
                position: 'absolute',
                top     : '0',
                left    : '0',
                opacity : 0,
                display : 'none'
            }
        )
        .click(jQuery.jImage.hideImage);

        //Create image title paragraph
        var titleParagraph = document.createElement('p');
        jQuery(titleParagraph).addClass('title')
        .append(document.createTextNode(' '));

        //Create Previous Image Link
        var prevImage = document.createElement('a');
        jQuery(prevImage)
        .attr(
                {
                    id   : 'jImagePrevious',
                    href : '#',
                    title: 'Previous Image'
                }
             )
        .append(document.createTextNode('Previous'));

        //Create Next Image Link
        var nextImage = document.createElement('a');
        jQuery(nextImage)
        .attr(
                {
                    id   : 'jImageNext',
                    href : '#',
                    title: 'Next Image'
                }
              )
        .append(document.createTextNode('Next'));

        // Create the span for the title text
        var titleTextSpan = document.createElement('span');
        jQuery(titleTextSpan)
        .attr('id', 'jImageTitleText');

        //Create Stats Paragraph
        var statsParagraph = document.createElement('p');
        jQuery(statsParagraph).addClass('stats')
        .append([titleTextSpan, prevImage, nextImage]);

        //Create Image title div
        var jImageTitle = document.createElement('div');
        jQuery(jImageTitle)
        .attr('id', 'jImageTitle')
        .append([titleParagraph, statsParagraph]);

        //Create close link
        var jImageClose = document.createElement('a');
        jQuery(jImageClose)
        .attr(
                {
                    id   : 'jImageClose',
                    href : '#',
                    title: 'Close window'
                }
              )
         .html(jQuery.jImage.options.closeHTML)
         .click(jQuery.jImage.hideImage);

        //Create Image Text Container
        var jImageTextContainer = document.createElement('div');
        jQuery(jImageTextContainer)
        .attr('id', 'jImageTextContainer')
        .append([jImageTitle, jImageClose]);

         //Image Container Div
        var jImageContainer = document.createElement('div');
        jQuery(jImageContainer)
        .attr('id', 'jImageContainer')
        .append(jImageTextContainer);

        //Create Outer Image Container
        var jImageOuterContainer = document.createElement('div');
        jQuery(jImageOuterContainer)
        .attr('id', 'jImageOuterContainer')
        .css(
                {
                    display : 'none',
                    position: 'absolute'
                }
             )
         .append(jImageContainer);

        //Add to Body
        jQuery('body')
        .append(jImageOverlay)
        .append(jImageOuterContainer);
    },
    start: function(e, elm)
    {
        var el = elm ? jQuery(elm) : jQuery(this);
        var objects, linkRel, totalImages, iteration, prevImage, nextImage;
        
        
        
        objects = jQuery('object');
        if(objects)
        {
            jQuery.jImage.flash = true;
            jQuery.jImage.setFlash('hidden');
        }
        linkRel = el.attr('rel');
        if(linkRel !='jImage')
        {
            jQuery.jImage.currentRel = linkRel;
            var gallery = jQuery('a[rel=' + linkRel + ']');
            totalImages = gallery.length;
            iteration = gallery.index(elm ? elm : this);
			prevImage = gallery.get(iteration - 1);
			nextImage = gallery.get(iteration + 1);
        }

        var imageSrc    = el.attr('href');
        var captionText = el.attr('title');
        var pageSize = jQuery.jImage.getScroll();
        var overlay = jQuery('#jImageOverlay');
        if(!jQuery.jImage.opened)
        {

            jQuery.jImage.opened = true;
            //IE iframe stuff goes here
            if(jQuery.browser.msie)
            {

            }
            var containerWidth = Math.min(pageSize.iw, pageSize.w)
            overlay
            .css('width', containerWidth + 'px')
            .css('height', Math.max(pageSize.ih, pageSize.h) + 'px')
            .show()
            .fadeTo(
                     jQuery.jImage.options.fadeDuration,
                     jQuery.jImage.options.overlayOpacity,
                     function()
                     {
                         jQuery.jImage.loadImage(
                            imageSrc,
                            captionText,
                            pageSize,
                            totalImages,
                            iteration,
                            prevImage,
                            nextImage
                         )
                     }
                   );
              jQuery('#jImageOuterContainer').css ('width', containerWidth + 'px');

        }
        else
        {
            jQuery('#jImagePrevious').get(0).onclick = null;
			jQuery('#jImageNext').get(0).onclick = null;
			jQuery.jImage.loadImage(
				imageSrc,
				captionText,
				pageSize,
				totalImages,
				iteration,
				prevImage,
				nextImage
			);
        }
        return false;
    },
    loadImage: function(imageSrc, captionText, pageSize, totalImages, iteration, prevImage, nextImage)
    {
        jQuery('#jImageCurrentImage').remove();
        var prevEl = jQuery('#jImagePrevious');
        var nextEl = jQuery('#jImageNext');
        var jImageOuterContainer = jQuery('#jImageOuterContainer');
        var jImageTextContainer = jQuery('#jImageTextContainer');
        var jImageContainer = jQuery('#jImageContainer');
        var jImageStats = jQuery('p.stats');
        prevEl.hide();
        nextEl.hide();
        jImageTextContainer.css('visibility', 'hidden');
        jQuery('#jImageTitle p.title').html(captionText);
        jQuery.jImage.animationInProgress = true;

        //If more than one image
        if(totalImages)
        {
            jQuery('#jImageTitleText')
            .html('Image ' + (iteration + 1 ) + ' of ' + totalImages);
        }
        if(prevImage)
        {
            prevEl.get(0).onclick = function()
            {
                this.blur();
                jQuery.jImage.start(null, prevImage);
				return false;
            }
        }
        if(nextImage)
        {
            nextEl.get(0).onclick = function()
            {
                this.blur();
                jQuery.jImage.start(null, nextImage);
				return false;
            }
        }

        //Setup outer image container div
        var clientSize = jQuery.jImage.getClient();
        jImageOuterContainer
		.css('top', Math.round(pageSize.t + (clientSize.h / 15)) + 'px');
        if(jImageOuterContainer.css('display') == 'none')
        {
            jImageOuterContainer
			.show()
			.fadeIn(jQuery.jImage.options.fadeDuration);
        }

        //Create Image element
        var imageEl = new Image;
        jQuery(imageEl)
        .attr('id', 'jImageCurrentImage')
        .bind('load', function()
            {
                var jImageContainerWidth  = imageEl.width;
                var jImageContainerHeight = imageEl.height;
                jImageContainer
                .animate(
                        {
                            height : jImageContainerHeight
                        },
                        jQuery.jImage.options.fadeDuration,
                        function()
                        {
                            jImageContainer
                            .animate(
                                    {
                                        width : jImageContainerWidth
                                    },
                                    jQuery.jImage.options.fadeDuration,
                                    function()
                                    {
                                        jImageContainer.prepend(imageEl);
                                        jQuery(imageEl)
                                        .attr(
                                                {
                                                    width : jImageContainerWidth,
                                                    height: jImageContainerHeight,
                                                    alt   : captionText
                                                }
                                             )
                                        .fadeIn(
                                            jQuery.jImage.options.fadeDuration,
                                            function()
                                            {
                                                var jImageTextContainerSize = jQuery.jImage.getSize(jImageTextContainer.get(0));
                                                jImageTextContainer
                                                .css(
                                                    {
                                                        width     : Math.round(jImageContainerWidth + (jQuery.jImage.options.border * 2)) + 'px',
                                                        height    : 0,
                                                        visibility: 'visible'
                                                    }
                                                 )
                                                .animate(
                                                        {
                                                            height: jImageTextContainerSize.h
                                                        },
                                                        jQuery.jImage.options.fadeDuration,
                                                        function()
                                                        {
                                                            jQuery.jImage.animationInProgress = false;
                                                        }
                                                      );
                                                (totalImages)? jImageStats.show() :  jImageStats.hide();
                                                if(prevImage)
                                                {
                                                    prevEl.show();
                                                }
                                                if(nextImage)
                                                {
                                                    nextEl.show();
                                                }
                                            }
                                        );
                                    }
                             );
                        }
                );
            }
        );
        imageEl.src = imageSrc;
    },
    hideImage: function()
    {
        jQuery('#jImageCurrentImage').remove();
        jQuery('#jImageOuterContainer').hide();
        jQuery('#jImageTextContainer').css('visibility', 'hidden');
        jQuery('#jImageOverlay').fadeOut(jQuery.jImage.options.fadeDuration);
        jQuery('p.stats').hide();
        jQuery('#jImagePrevious').get(0).onclick = null;
		jQuery('#jImageNext').get(0).onclick = null;
        jQuery.jImage.currentRel = null;
        jQuery.jImage.opened = false;
        jQuery.jImage.animationInProgress = false;
        if(jQuery.jImage.flash == true)
        {
            jQuery.jImage.setFlash('visible');
            jQuery.jImage.flash = false;
        }
        return false;
    },
    setFlash: function(visibility)
    {
        jQuery('object').each(function()
        {
            jQuery(this).css('visibility', visibility);
        });
    },
    getScroll : function (e)
	{
		var t=0, l=0, w=0, h=0, iw=0, ih=0;
		if (e && e.nodeName.toLowerCase() != 'body') {
			t = e.scrollTop;
			l = e.scrollLeft;
			w = e.scrollWidth;
			h = e.scrollHeight;
			iw = 0;
			ih = 0;
		} else  {
			if (document.documentElement) {
				t = document.documentElement.scrollTop;
				l = document.documentElement.scrollLeft;
				w = document.documentElement.scrollWidth;
				h = document.documentElement.scrollHeight;
			} else if (document.body) {
				t = document.body.scrollTop;
				l = document.body.scrollLeft;
				w = document.body.scrollWidth;
				h = document.body.scrollHeight;
			}
			iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
			ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
		}
		return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
	},
	getClient : function(e)
	{
		var h, w, de;
		if (e) {
			w = e.clientWidth;
			h = e.clientHeight;
		} else {
			de = document.documentElement;
			w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
			h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
		}
		return {w:w,h:h};
	},
	getSize : function(e)
	{
		var w = jQuery.css(e,'width');
		var h = jQuery.css(e,'height');
		var wb = 0;
		var hb = 0;
		var es = e.style;
		if (jQuery(e).css('display') != 'none') {
			wb = e.offsetWidth;
			hb = e.offsetHeight;
		} else {
			var oldVisibility = es.visibility;
			var oldPosition = es.position;
			es.visibility = 'hidden';
			es.display = 'block';
			es.position = 'absolute';
			wb = e.offsetWidth;
			hb = e.offsetHeight;
			es.display = 'none';
			es.position = oldPosition;
			es.visibility = oldVisibility;
		}
		return {w:w, h:h, wb:wb, hb:hb};
	}
};

