/**
 * Interface Elements for jQuery
 * ImageBox
 *
 * http://interface.eyecon.ro
 *
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 */

/**
 * This a jQuery equivalent for Lightbox2. Alternative to image popups that will display images in an overlay. All links that have attribute 'rel' starting with 'imagebox' and link to an image will display the image inside the page. Galleries can by build buy giving the value 'imagebox-galname' to attribute 'rel'. Attribute 'title' will be used as caption.
 * Keyboard navigation:
 *  -  next image: arrow right, page down, 'n' key, space
 *  -  previous image: arrow left, page up, 'p' key, backspace
 *  -  close: escape
 *
 * CSS
 *    #ImageBoxOverlay
 *    {
 *        background-color: #000;
 *    }
 *    #ImageBoxCaption
 *    {
 *        background-color: #F4F4EC;
 *    }
 *    #ImageBoxContainer
 *    {
 *        width: 250px;
 *        height: 250px;
 *        background-color: #F4F4EC;
 *    }
 *    #ImageBoxCaptionText
 *    {
 *        font-weight: bold;
 *        padding-bottom: 5px;
 *        font-size: 13px;
 *        color: #000;
 *    }
 *    #ImageBoxCaptionImages
 *    {
 *        margin: 0;
 *    }
 *    #ImageBoxNextImage
 *    {
 *        background-image: url(images/imagebox/spacer.gif);
 *        background-color: transparent;
 *    }
 *    #ImageBoxPrevImage
 *    {
 *        background-image: url(images/imagebox/spacer.gif);
 *        background-color: transparent;
 *    }
 *    #ImageBoxNextImage:hover
 *    {
 *        background-image: url(images/imagebox/next_image.jpg);
 *        background-repeat:    no-repeat;
 *        background-position: right top;
 *    }
 *    #ImageBoxPrevImage:hover
 *    {
 *        background-image: url(images/imagebox/prev_image.jpg);
 *        background-repeat:    no-repeat;
 *        background-position: left bottom;
 *    }
 *
 * @name Imagebox
 * @description This a jQuery equivalent for Lightbox2. Alternative to image popups that will display images in an overlay. All links that have attribute 'rel' starting with 'imagebox' and link to an image will display the image inside the page. Galleries can by build buy giving the value 'imagebox-galname' to attribute 'rel'. Attribute 'title' will be used as caption.
 * @param Hash hash A hash of parameters
 * @option Integer border border width
 * @option String loaderSRC path to loading image
 * @option String closeHTML path to close overlay image
 * @option Float overlayOpacity opacity for overlay
 * @option String textImage when a galalry it is build then the iteration is displayed
 * @option String textImageFrom when a galalry it is build then the iteration is displayed
 * @option Integer fadeDuration fade duration in miliseconds
 * @option Integer showTextImage 0/1 : show or not the text 'image n from z'
 *
 * @type jQuery
 * @cat Plugins/Interface
 * @author Stefan Petre
 */

var jQImageBox_imageEl=""; //rustine pour Safari

jQuery.ImageBox = {
    
    options : {
        border                : 10,
        loaderSRC            : 'images/loading.gif',
        closeHTML            : '<img src="images/close.jpg" />',
        overlayOpacity        : 0.8,
        textImage            : 'Showing image',
        textImageFrom        : 'from',
        fadeDuration        : 400,
        showTextImage        : true
    },
    imageLoaded : false,
    firstResize : false,
    currentRel : null,
    animationInProgress : false,
    opened : false,
    minWidth : 0,
    heightClose : 0,

    keyPressed : function(event)
    {
        if(!jQuery.ImageBox.opened || jQuery.ImageBox.animationInProgress)
            return;
        var pressedKey = event.charCode || event.keyCode || -1;
        switch (pressedKey)
        {
            //end
            case 35:
                if (jQuery.ImageBox.currentRel)
                    jQuery.ImageBox.start(null, jQuery('a[rel=' + jQuery.ImageBox.currentRel+ ']:last').get(0));
            break;
            //home
            case 36:
                if (jQuery.ImageBox.currentRel)
                    jQuery.ImageBox.start(null, jQuery('a[rel=' + jQuery.ImageBox.currentRel+ ']:first').get(0));
            break;
            //left
            case 37:
            //backspace
            case 8:
            //page up
            case 33:
            //p
            case 80:
            case 112:
                var prevEl = jQuery('#ImageBoxPrevImage');
                if(prevEl.get(0).onclick != null) {
                    prevEl.get(0).onclick.apply(prevEl.get(0));
                }
            break;
            //up
            case 38:
            break;
            //right
            case 39:
            //page down
            case 34:
            //space
            case 32:
            //n
            case 110:
            case 78:
                var nextEl = jQuery('#ImageBoxNextImage');
                if(nextEl.get(0).onclick != null) {
                    nextEl.get(0).onclick.apply(nextEl.get(0));
                }
            break;
            //down;
            case 40:
            break;
            //escape
            case 27:
                jQuery.ImageBox.hideImage();
            break;
        }
    },

    init : function(options)
    {                
        if (options)
            jQuery.extend(jQuery.ImageBox.options, options);
        if (window.event) {
            jQuery('body',document).bind('keyup', jQuery.ImageBox.keyPressed);
        } else {
            jQuery(document).bind('keyup', jQuery.ImageBox.keyPressed);
        }
        jQuery('a').each(
            function()
            {
                el                 = jQuery(this);
                relAttr         = el.attr('rel')||'';
                hrefAttr         = el.attr('href')||'';
                imageTypes         = /\.jpg|\.jpeg|\.png|\.gif|\.bmp/g;
                if (hrefAttr.toLowerCase().match(imageTypes) != null && relAttr.toLowerCase().indexOf('imagebox') == 0) {
                    el.bind('click', jQuery.ImageBox.start);
                }
            }
        );
        jQuery('area').each(
            function()
            {
                el                 = jQuery(this);
                relAttr         = el.attr('rel')||'';
                hrefAttr         = el.attr('href')||'';
                imageTypes         = /\.jpg|\.jpeg|\.png|\.gif|\.bmp/g;
                if (hrefAttr.toLowerCase().match(imageTypes) != null && relAttr.toLowerCase().indexOf('imagebox') == 0) {
                    el.bind('click', jQuery.ImageBox.start);
                }
            }
        );
        
        if (jQuery.browser.msie) {
            iframe = document.createElement('iframe');
            jQuery(iframe)
                .attr(
                    {
                        id            : 'ImageBoxIframe',
                        src            : 'javascript:false;',
                        frameborder    : 'no',
                        scrolling    : 'no'
                    }
                )
                .css (
                    {
                        display        : 'none',
                        position    : 'absolute',
                        top            : '0',
                        left        : '0',
                        filter        : 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
                    }
                );
            jQuery('body').append(iframe);
        }

        overlay    = document.createElement('div');
        jQuery(overlay)
            .attr('id', 'ImageBoxOverlay')
            .css(
                {
                    position    : 'absolute',
                    display        : 'none',
                    top            : '0',
                    left        : '0',
                    opacity        : 0
                }
            )
			.css('z-index','900')
            .append(document.createTextNode(' '))
            .bind('click', jQuery.ImageBox.hideImage);

        captionText = document.createElement('div');
        jQuery(captionText)
            .attr('id', 'ImageBoxCaptionText')
            .css(
                {
                    paddingLeft        : jQuery.ImageBox.options.border + 'px'
                }
            )
            .append(document.createTextNode(' '));

        captionImages = document.createElement('div');
        jQuery(captionImages)
            .attr('id', 'ImageBoxCaptionImages')
            .css(
                {
                    paddingLeft        : jQuery.ImageBox.options.border + 'px',
                    paddingBottom    : jQuery.ImageBox.options.border + 'px'
                }
            )
            .append(document.createTextNode(' '));

        closeEl = document.createElement('a');
        jQuery(closeEl)
            .attr(
                {
                    id            : 'ImageBoxClose',
                    href        : '#'
                }
            )
            .css(
                {
                    position    : 'absolute',
                    right        : jQuery.ImageBox.options.border + 'px',
                    top            : '0'
                }
            )
            .append(jQuery.ImageBox.options.closeHTML)
            .bind('click', jQuery.ImageBox.hideImage);

        captionEl = document.createElement('div');
        jQuery(captionEl)
            .attr('id', 'ImageBoxCaption')
            .css(
                {
                    position    : 'relative',
                    textAlign    : 'left',
                    margin        : '0 auto',
                    zIndex        : 1
                }
            )
            //.append(captionText)
            .append(captionImages)
            .append(closeEl);

        loader = document.createElement('img');
        loader.src = jQuery.ImageBox.options.loaderSRC;
        jQuery(loader)
            .attr('id', 'ImageBoxLoader')
            .css(
                {
                    position    : 'absolute'
                }
            );

        prevImage = document.createElement('a');
        jQuery(prevImage)
            .attr(
                {
                    id            : 'ImageBoxPrevImage',
                    href        : '#'
                }
            )
            .css(
                {
                    position        : 'absolute',
                    display            : 'none',
                    overflow        : 'hidden',
                    textDecoration    : 'none'
                }
            )
            .append(document.createTextNode(' '));

        nextImage = document.createElement('a');
        jQuery(nextImage)
            .attr(
                {
                    id            : 'ImageBoxNextImage',
                    href        : '#'
                }
            )
            .css(
                {
                    position        : 'absolute',
                    overflow        : 'hidden',
                    textDecoration    : 'none'
                }
            )
            .append(document.createTextNode(' '));

        container = document.createElement('div');
        jQuery(container)
            .attr('id', 'ImageBoxContainer')
            .css(
                {
                    display        : 'none',
                    position    : 'relative',
                    overflow    : 'hidden',
                    textAlign    : 'left',
                    margin        : '0 auto',
                    top            : '0',
                    left        : '0',
                    zIndex        : 2
                }
            )
            .append([prevImage, nextImage, loader]);

        td11 = document.createElement('td');
jQuery(td11)
	.addClass('l');
	
td12 = document.createElement('td');
jQuery(td12)
	.addClass('c');
	
td13 = document.createElement('td');
jQuery(td13)
	.addClass('r');
	
tr1 = document.createElement('tr');
jQuery(tr1)
	.addClass('bl-t')
	.append([td11,td12,td13]);

td21 = document.createElement('td');
jQuery(td21)
	.addClass('l');
	
td22 = document.createElement('td');
jQuery(td22)
	.addClass('c')
	.append([captionEl,container]);
	
td23 = document.createElement('td');
jQuery(td23)
	.addClass('r');
	
tr2 = document.createElement('tr');
jQuery(tr2)
	.addClass('bl-c')
	.append([td21,td22,td23]);

td31 = document.createElement('td');
jQuery(td31)
	.addClass('l');
	
td32 = document.createElement('td');
jQuery(td32)
	.addClass('c');
	
td33 = document.createElement('td');
jQuery(td33)
	.addClass('r');
	
tr3 = document.createElement('tr');
jQuery(tr3)
	.addClass('bl-b')
	.append([td31,td32,td33]);
	
tbl = document.createElement('table');
jQuery(tbl)
	.attr('id', 'ImageBoxOuterTable')
	.attr('align', 'center')
/*	.css(
        {
            display        : 'block'
		})
*/
	.append([tr1,tr2,tr3]);
		
		outerContainer = document.createElement('div');
        jQuery(outerContainer)
            .attr('id', 'ImageBoxOuterContainer')
            .css(
                {
                    display        : 'none',
					position    : 'absolute',
                    overflow    : 'hidden',
                    top            : '0',
                    left        : '0',
                    textAlign    : 'center',
                    backgroundColor : 'transparent',
                    lineHeigt    : '0'
                }
            )
			.css('z-index','1000')
			.addClass('popupimg')
			.addClass('bl')
            .append(tbl);
		

        jQuery('body')
            .append(overlay)
            .append(outerContainer);


        //minimum width :
        prevImageEl = jQuery('#ImageBoxPrevImage');
        prevWidth = prevImageEl.css("width");
        if (!prevWidth) {
            prevWidth='';
        }
        else{
            if(prevWidth!=''){
                prevWidth = prevWidth.replace(/px/g,''); //on eleve le texte 'px' pour pouvoir faire des calculs
            }
        }
        nextImageEl = jQuery('#ImageBoxNextImage');
        nextWidth = nextImageEl.css("width");
        if (!nextWidth) {
            nextWidth='';
        }
        else{
            if(nextWidth!=''){
                nextWidth = nextWidth.replace(/px/g,''); //on eleve le texte 'px' pour pouvoir faire des calculs
            }
        }

        jQuery.ImageBox.minWidth=-(-(jQuery.ImageBox.options.border * 2)-nextWidth-prevWidth); //2*border+nextWidth+prevWidth

    },

    start : function(e, elm)
    {
        //$(document.body).css({overflow: 'hidden'});
		/*$('html').css({overflow: 'hidden'});*/
        el = elm ? jQuery(elm) : jQuery(this);
        linkRel =  el.attr('rel');
        var totalImages, iteration, prevImage, nextImage;
        if (linkRel == 'imagebox') {
            jQuery.ImageBox.currentRel = linkRel;
            gallery = jQuery('a[rel=' + linkRel + ']'); //
            totalImages = gallery.size();
            iteration = gallery.index(elm ? elm : this);
            prevImage = gallery.get(iteration - 1);
            nextImage = gallery.get(iteration + 1);
        }
        
        imageSrc =  el.attr('href');
        captionText = el.attr('title');
        caption2 = el.attr('content') || "";
        if (caption2!="") {
            captionText+="<br>"+caption2;
        }
        pageSize = jQuery.iUtil.getScroll();
        overlay = jQuery('#ImageBoxOverlay');          
        if (!jQuery.ImageBox.opened) {
            jQuery.ImageBox.opened = true;
            if (jQuery.browser.msie) {
                jQuery('#ImageBoxIframe')
                    .css ('height', Math.max(pageSize.ih,pageSize.h) + 'px')
                    .css ('width', Math.max(pageSize.iw,pageSize.w) + 'px')
                    .show();
            }
            overlay
                .css ('height', Math.max(pageSize.ih,pageSize.h) + 'px')
                .css ('width', Math.max(pageSize.iw,pageSize.w) + 'px')
                .show()
                .fadeTo(
                    300,
                    jQuery.ImageBox.options.overlayOpacity,
                    function()
                    {
                        jQuery.ImageBox.loadImage(
                            imageSrc,
                            captionText,
                            pageSize,
                            totalImages,
                            iteration,
                            prevImage,
                            nextImage
                        );
                    }
                );
            jQuery('#ImageBoxOuterContainer').css ('width', Math.max(pageSize.iw,pageSize.w) + 'px');
        } else {
            jQuery('#ImageBoxPrevImage').get(0).onclick = null;
            jQuery('#ImageBoxNextImage').get(0).onclick = null;
            jQuery.ImageBox.loadImage(
                imageSrc,
                captionText,
                pageSize,
                totalImages,
                iteration,
                prevImage,
                nextImage
            );
        }
        return false;
    },

    loadImage : function(imageSrc, captiontext, pageSize, totalImages, iteration, prevImage, nextImage)
    {
        jQuery('#ImageBoxCurrentImage').remove();
        prevImageEl = jQuery('#ImageBoxPrevImage');
        prevImageEl.hide();
        nextImageEl = jQuery('#ImageBoxNextImage');
        nextImageEl.hide();
        loader = jQuery('#ImageBoxLoader');
        container = jQuery('#ImageBoxContainer');
        outerContainer = jQuery('#ImageBoxOuterContainer');
        captionEl = jQuery('#ImageBoxCaption').css('visibility', 'hidden');
        //Avoid safari Bug :
        //jQuery('#ImageBoxCaptionText').html(captionText);
        jQuery('#ImageBoxCaptionText').html("<div id='ImageBoxCaptextcontainer' style='padding-right:4px'>"+captionText+"</div>");
        jQuery.ImageBox.animationInProgress = true;
        if (totalImages && jQuery.ImageBox.options.showTextImage)
            jQuery('#ImageBoxCaptionImages').html(
                jQuery.ImageBox.options.textImage
                + ' ' + (iteration + 1) + ' '
                + jQuery.ImageBox.options.textImageFrom
                + ' ' + totalImages
            );
        if (prevImage) {
            prevImageEl.get(0).onclick = function()
            {
                this.blur();
                jQuery.ImageBox.start(null, prevImage);
                return false;
            };
        }
        if (nextImage) {
            nextImageEl.get(0).onclick =function()
            {
                this.blur();
                jQuery.ImageBox.start(null, nextImage);
                return false;
            };
        }
        loader.show();
        containerSize = jQuery.iUtil.getSize(container.get(0));
        containerW = Math.max(containerSize.wb, loader.get(0).width + jQuery.ImageBox.options.border * 2);
        containerH = Math.max(containerSize.hb, loader.get(0).height + jQuery.ImageBox.options.border * 2);
        loader
            .css(
                {
                    left    : (containerW - loader.get(0).width)/2 + 'px',
                    top        : (containerH - loader.get(0).height)/2 + 'px'
                }
            );
        container
            .css(
                {
                    width    : containerW + 'px',
                    height    : containerH + 'px'
                }
            )
            .show();
		//outerTable = jQuery('#ImageBoxOuterTable');
		//alert (outerContainer.width() + ' ' + outerTable.width());
		clientSize = jQuery.iUtil.getClient();
        /*outerContainer
            .css('top', pageSize.t +  (clientSize.h / 15) + 'px');*/
        outerContainer
            .css('top', pageSize.t +  ((clientSize.h - containerH)/2) + 'px');
        if (outerContainer.css('display') == 'none') {
            outerContainer
                .show()
                .fadeIn(
                    jQuery.ImageBox.options.fadeDuration
                );
        }
        imageEl = new Image;
        // avoid Safari bug :
        imageEl.id='ImageBoxCurrentImage';
        imageEl.onload = function(){

                if (jQuery.browser.safari) {
                    containerW = (jQImageBox_imageEl.width > 800 ? 800 : jQImageBox_imageEl.width) + jQuery.ImageBox.options.border * 2;
                    containerH = (jQImageBox_imageEl.height > 600 ? 600 : jQImageBox_imageEl.height) + jQuery.ImageBox.options.border * 2;
                }

                containerW = imageEl.width + jQuery.ImageBox.options.border * 2;
                containerH = imageEl.height + jQuery.ImageBox.options.border * 2;

                //min width :
                if (jQuery.ImageBox.minWidth > containerW ) {
                    containerW = jQuery.ImageBox.minWidth + jQuery.ImageBox.options.border * 2;
                }

                loader.hide();
            
            outerContainer
                .animate({'top': pageSize.t +  ((clientSize.h - containerH)/2) + 'px'}, 200);
                
            container.animate(
                    {
                        height        : containerH
                    },
                    containerSize.hb != containerH ? jQuery.ImageBox.options.fadeDuration : 1,
                    function()
                    {
                        container.animate(
                            {
                                width        : containerW
                            },
                            containerSize.wb != containerW ? jQuery.ImageBox.options.fadeDuration : 1,
                            function()
                            {


                                if (jQuery.browser.safari) {
                                    var imgtoprepend="<img src='"+jQImageBox_imageEl.src+"' id='imgboxtmp' style='display:none' >";
                                    container.prepend(imgtoprepend);
                                    var jqi_width = jQuery('#imgboxtmp').width();
                                    while(jqi_width==0){
                                        jqi_width = jQuery('#imgboxtmp').width();
                                    }
                                    jqi_height = jQuery('#imgboxtmp').height();
                                    jQuery('#imgboxtmp').remove();

                                    jqi_width = jqi_width - 2* jQuery.ImageBox.options.border;

                                    var imgtoprepend="<img src='"+jQImageBox_imageEl.src+"' id='"+jQImageBox_imageEl.id+"' >";
                                    container.prepend(imgtoprepend); //pour safari...

                                }
                                else{
                                    container.prepend(imageEl);
                                }


                                jQuery('#ImageBoxCurrentImage')
                                    .css(
                                        {
                                            position    : 'absolute',
                                            left        : (containerW-jQuery('#ImageBoxCurrentImage').width())/2+'px', //jQuery.ImageBox.options.border + 'px',
                                            top            : jQuery.ImageBox.options.border + 'px'
                                        }
                                    )
                                    .fadeIn(
                                        jQuery.ImageBox.options.fadeDuration,
                                        function()
                                        {
                                            captionSize = jQuery.iUtil.getSize(captionEl.get(0));

                                            //min width :
                                            if (jQuery.ImageBox.minWidth > containerW ) {
                                                 containerW = jQuery.ImageBox.minWidth;
                                            }

                                            if (prevImage) {
                                                prevImageEl
                                                    .css(
                                                        {
                                                            left    : jQuery.ImageBox.options.border + 'px',
                                                            top        : jQuery.ImageBox.options.border + 'px',
                                                            width    : containerW/2 ,//- jQuery.ImageBox.options.border * 3 + 'px',
                                                            height    : containerH - jQuery.ImageBox.options.border * 2 + 'px'
                                                        }
                                                    )
                                                    .show();
                                            }
                                            if (nextImage) {
                                                nextImageEl
                                                    .css(
                                                        {
                                                            left    : containerW/2 + jQuery.ImageBox.options.border * 2 + 1 + 'px',
                                                            top        : jQuery.ImageBox.options.border + 'px',
                                                            width    : containerW/2 - jQuery.ImageBox.options.border * 3 + 'px',
                                                            height    : containerH - jQuery.ImageBox.options.border * 2 + 'px'
                                                        }
                                                    )
                                                    .show();
                                            }

                                            jQuery("#ImageBoxCaptextcontainer").css('padding-top',jQuery("#ImageBoxClose").height());

                                            captionEl
                                                .css(
                                                    {
                                                        width        : containerW + 'px',
                                                        top            : - captionSize.hb + 'px',
                                                        visibility    : 'visible',
														 top        : 0
                                                    }
                                                )
                                              /*  .animate(
                                                    {
                                                        top        : 0
                                                    },
                                                    jQuery.ImageBox.options.fadeDuration,
                                                    function()
                                                    {
                                                        jQuery.ImageBox.animationInProgress = false;
                                                    }
                                                );*/
                                        }
                                    );
                            }
                        );
                    }
                );
            }
        imageEl.src = imageSrc;

        jQImageBox_imageEl = imageEl;
    },

    hideImage : function()
    {
        //$(document.body).css({overflow: 'auto'});
		$('html').css({overflow: 'auto'});
        jQuery('#ImageBoxCurrentImage').remove();
        jQuery('#ImageBoxOuterContainer').hide();
        jQuery('#ImageBoxCaption').css('visibility', 'hidden');
        jQuery('#ImageBoxOverlay').fadeTo(
            300,
            0,
            function(){
                jQuery(this).hide();
                if (jQuery.browser.msie) {
                    jQuery('#ImageBoxIframe').hide();
                }
            }
        );
        jQuery('#ImageBoxPrevImage').get(0).onclick = null;
        jQuery('#ImageBoxNextImage').get(0).onclick = null;
        jQuery.ImageBox.currentRel = null;
        jQuery.ImageBox.opened = false;
        jQuery.ImageBox.animationInProgress = false;
        return false;
    }
};

jQuery.iUtil = {
	getPosition : function(e)
	{
		var x = 0;
		var y = 0;
		var es = e.style;
		var restoreStyles = false;
		if (jQuery(e).css('display') == 'none') {
			var oldVisibility = es.visibility;
			var oldPosition = es.position;
			restoreStyles = true;
			es.visibility = 'hidden';
			es.display = 'block';
			es.position = 'absolute';
		}
		var el = e;
		while (el){
			x += el.offsetLeft + (el.currentStyle && !jQuery.browser.opera ?parseInt(el.currentStyle.borderLeftWidth)||0:0);
			y += el.offsetTop + (el.currentStyle && !jQuery.browser.opera ?parseInt(el.currentStyle.borderTopWidth)||0:0);
			el = el.offsetParent;
		}
		el = e;
		while (el && el.tagName  && el.tagName.toLowerCase() != 'body')
		{
			x -= el.scrollLeft||0;
			y -= el.scrollTop||0;
			el = el.parentNode;
		}
		if (restoreStyles == true) {
			es.display = 'none';
			es.position = oldPosition;
			es.visibility = oldVisibility;
		}
		return {x:x, y:y};
	},
	getPositionLite : function(el)
	{
		var x = 0, y = 0;
		while(el) {
			x += el.offsetLeft || 0;
			y += el.offsetTop || 0;
			el = el.offsetParent;
		}
		return {x:x, y:y};
	},
	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};
	},
	getSizeLite : function(el)
	{
		return {
			wb:el.offsetWidth||0,
			hb:el.offsetHeight||0
		};
	},
	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};
	},
	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 };
	},
	getMargins : function(e, toInteger)
	{
		var el = jQuery(e);
		var t = el.css('marginTop') || '';
		var r = el.css('marginRight') || '';
		var b = el.css('marginBottom') || '';
		var l = el.css('marginLeft') || '';
		if (toInteger)
			return {
				t: parseInt(t)||0,
				r: parseInt(r)||0,
				b: parseInt(b)||0,
				l: parseInt(l)
			};
		else
			return {t: t, r: r,	b: b, l: l};
	},
	getPadding : function(e, toInteger)
	{
		var el = jQuery(e);
		var t = el.css('paddingTop') || '';
		var r = el.css('paddingRight') || '';
		var b = el.css('paddingBottom') || '';
		var l = el.css('paddingLeft') || '';
		if (toInteger)
			return {
				t: parseInt(t)||0,
				r: parseInt(r)||0,
				b: parseInt(b)||0,
				l: parseInt(l)
			};
		else
			return {t: t, r: r,	b: b, l: l};
	},
	getBorder : function(e, toInteger)
	{
		var el = jQuery(e);
		var t = el.css('borderTopWidth') || '';
		var r = el.css('borderRightWidth') || '';
		var b = el.css('borderBottomWidth') || '';
		var l = el.css('borderLeftWidth') || '';
		if (toInteger)
			return {
				t: parseInt(t)||0,
				r: parseInt(r)||0,
				b: parseInt(b)||0,
				l: parseInt(l)||0
			};
		else
			return {t: t, r: r,	b: b, l: l};
	},
	getPointer : function(event)
	{
		var x = event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)) || 0;
		var y = event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)) || 0;
		return {x:x, y:y};
	},
	traverseDOM : function(nodeEl, func)
	{
		func(nodeEl);
		nodeEl = nodeEl.firstChild;
		while(nodeEl){
			jQuery.iUtil.traverseDOM(nodeEl, func);
			nodeEl = nodeEl.nextSibling;
		}
	},
	purgeEvents : function(nodeEl)
	{
		jQuery.iUtil.traverseDOM(
			nodeEl,
			function(el)
			{
				for(var attr in el){
					if(typeof el[attr] === 'function') {
						el[attr] = null;
					}
				}
			}
		);
	},
	centerEl : function(el, axis)
	{
		var clientScroll = jQuery.iUtil.getScroll();
		var windowSize = jQuery.iUtil.getSize(el);
		if (!axis || axis == 'vertically')
			jQuery(el).css(
				{
					top: clientScroll.t + ((Math.max(clientScroll.h,clientScroll.ih) - clientScroll.t - windowSize.hb)/2) + 'px'
				}
			);
		if (!axis || axis == 'horizontally')
			jQuery(el).css(
				{
					left:	clientScroll.l + ((Math.max(clientScroll.w,clientScroll.iw) - clientScroll.l - windowSize.wb)/2) + 'px'
				}
			);
	},
	fixPNG : function (el, emptyGIF) {
		var images = jQuery('img[@src*="png"]', el||document), png;
		images.each( function() {
			png = this.src;				
			this.src = emptyGIF;
			this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + png + "')";
		});
	}
};

// Helper function to support older browsers!
[].indexOf || (Array.prototype.indexOf = function(v, n){
	n = (n == null) ? 0 : n;
	var m = this.length;
	for (var i=n; i<m; i++)
		if (this[i] == v)
			return i;
	return -1;
});

   
