/**
* Provides implementation of cEasyJs.popupImg()
*	Requires jQuery
*
* @package Ceasy_Core
* @author Ralf Glaser
*
*/

//-------------------------------------------------------------------
cEasyJs.popupImg=function(src, groupClass) {

	var that=this;
	groupClass= groupClass || false;
	
	/**
	 * It's a sad story, but there were serveral hacks needed:
	 *
	 * visibility-hack:
	 * ----------------
	 * we set visibilty of _imgDiv to "hidden" to avoid showing _imgDiv before _imgObj is loaded
	 * we can't use _imgDiv.hide(), cause then we would not be able to find out width() and height()
	 * of _imgObj before we show() _imgDiv.
	 *
	 *
	 * opera-load-event-hack:
	 * ----------------------
	 * opera triggers load-event only if image is not already cached
	 *
	 *
	 * onclick-match-hack:
	 * ----------------------------
	 * In IE lower 8 and FF lower 3.5 jQuery('img[onclick^=cEasyJs.popupImg]') does not find any image (IE returns "function()"
	 * for img.onclick.) So we need to check all images with onclick again and find the cEasyJs.popupImgs by analysing
	 * img.getAttribute('onclick').toString().
	 *
	 */
	
	var shutDown=function() {
		while(jQuery('#cCore_cEasyJsPopupImgDiv').size()>0) { // there may be serveral instances
			jQuery('#cCore_cEasyJsPopupImgDiv').remove(); // do not use _imgDiv here!
		}
		jQuery(document).unbind('keydown', _keyControl);
		that.hideCurtain([{
			'type':'click.popupImg',
			'func':null
		}]);
	};

	that.showCurtain([{
		'type':'click.popupImg',
		'func':shutDown
	}]);

	var _iconsUrl=this.getUrl('icons');
	var _fileCloseImage=_iconsUrl+'/cEasyJs/p0pupImg/close.png';
	var _fileSaveImage=_iconsUrl+'/cEasyJs/p0pupImg/save.png';
	var _fileBlankImage=_iconsUrl+'/cEasyJs/p0pupImg/blank.gif';
	var _filePreviousImage=_iconsUrl+'/cEasyJs/p0pupImg/previousSmall.png';
	var _fileNextImage=_iconsUrl+'/cEasyJs/p0pupImg/nextSmall.png';
	var _filePreviousHiImage=_iconsUrl+'/cEasyJs/p0pupImg/previous.png';
	var _fileNextHiImage=_iconsUrl+'/cEasyJs/p0pupImg/next.png';
	var _fileScaleUpImage=_iconsUrl+'/cEasyJs/p0pupImg/scaleUp.png';
	var _fileScaleDownImage=_iconsUrl+'/cEasyJs/p0pupImg/scaleDown.png';
	var _imgAlign=(jQuery.browser.msie && parseFloat(jQuery.browser.version)==8 ? 'middle' : 'absmiddle'); // IE8 bugfix!
	var _previousSrc=false;
	var _nextSrc=false;
	var _current=false;
	var _imgUrls=[];
	var _imgsCounter=0;
	var _imgs=jQuery('img[onclick*=cEasy\\.popupImg],[onclick*=cEasyJs\\.popupImg]');
	
	if (groupClass!==true) {
		if (groupClass) {
			_imgs=_imgs.filter('.'+groupClass);
		} else {
			_imgs=_imgs.filter(function (index) {
				return ($(this).attr && $(this).attr('class') ? false : true);
			});
		}
	}
	
	var _checkUrl=function(imgObj, onclickLiteral) {
		var _matchExp=new RegExp('cEasy(?:Js)?\\.popupImg\\s*\\(\\s*(\'|")([^\'"]+)(\'|")', 'ig');
		var _slices=_matchExp.exec(onclickLiteral); // try to extract URL from onclick
		if (_slices[2]) { // URL extracted
			if (jQuery.inArray(_slices[2], _imgUrls)>-1) { // check wether URL already exists
				_imgs=_imgs.not(imgObj); // remove img if img with same URL already exists
				return false;
			} else {
				if (_current===false && _slices[2]==src) { // check wether URL is equal to current URL
					_current=_imgsCounter;
				}
				_imgUrls.push(_slices[2]); // add URL
				_imgsCounter++;
				return true;
			}
		} else { // not able to extract URL
			_imgs=_imgs.not(imgObj);
			return false;
		}
	};
	
	if (_imgs.size() > 0) {
		_imgs.each(function (i) {
			_checkUrl(this, this.onclick.toString());
		});
	} else if (
			(jQuery.browser.msie && parseFloat(jQuery.browser.version)<8) || 
			(jQuery.browser.mozilla && parseFloat(jQuery.browser.version)<3.5)
		) { // *) onclick-match-hack for IElower8 and FFlower3.5
		var _allOnclickImgs=jQuery('img[onclick]');
		if (groupClass!==true) {
			if (groupClass) {
				_allOnclickImgs=_allOnclickImgs.filter('.'+groupClass);
			} else {
				_allOnclickImgs=_allOnclickImgs.filter(function (index) {
					return ($(this).attr('class') ? false : true);
				});
			}
		}
		var _imgWanted=[];
		_allOnclickImgs.each(function (i) {
			var onclickLiteral=this.getAttribute('onclick').toString();
			if (onclickLiteral.match(/cEasy(Js)?\.popupImg/g)) {
				if (_checkUrl(this, onclickLiteral)) {
					_imgWanted[_imgWanted.length]=this;
				}
			}
		});
		if (_imgWanted.length>0) {
			_imgs=jQuery(_imgWanted);
		}
	}

	if (_current!==false) {
		if (_current > 0) {
			_previousSrc=_imgUrls[_current-1];
		}
		if (_current+1 < _imgs.size()) {
			_nextSrc=_imgUrls[_current+1];
		}
	}

	var _closeImgCss = {
		'position':'absolute',
		'cursor':'pointer',
		'bottom':'30px',
		'right':'20px'
	};
	var _saveImgCss = {
		'position':'absolute',
		'cursor':'pointer',
		'bottom':'30px',
		'right':'50px'
	};
	var _previousImgCss = {
		'position':'absolute',
		'padding':'3px',
		'cursor':'pointer',
		'top':'20px',
		'left':'17px',
		'height':22,
		'width':25,
		'text-align':'left'
	};
	var _nextImgCss = {
		'position':'absolute',
		'padding':'3px',
		'cursor':'pointer',
		'top':'20px',
		'right':'17px',
		'height':22,
		'width':25,
		'text-align':'right'
	};
	var _naviDivCss = {
		'position':'absolute',
		'overflow':'hidden', // hack for IElower7 if text is to wide and there is no possibility to wrap it
		'left':'0px',
		'right':'0px',
		'padding':'5px 110px 10px 20px',
		'text-align':'left',
		'background-color':'#FFFFFF',
		'white-space':'nowrap'
	};
	var _keyControl=function(event) {
		var keycode = event.keyCode;
		if (_showPrevious && (keycode==37 || keycode==38)) {
			_showPrevious();
			return false;
		} else if (_showNext && (keycode==39 || keycode==40)) {
			_showNext();
			return false;
			shutDown();
			return false;
		}
	};
	jQuery(document).keydown(_keyControl);

	var _imgDiv=jQuery('<div id="cCore_cEasyJsPopupImgDiv" style="visibility: hidden;"></div>').appendTo('body'); // *) visibility-hack + firefox-opacity-hack
	var _imgObj=jQuery('<img src="'+src+'" />').appendTo(_imgDiv);
	if (jQuery.browser.msie && parseFloat(jQuery.browser.version)<8) {
		jQuery('<br/>').appendTo(_imgDiv); // Bugfix for IE7, without this, positioning of cCore_cEasyJsPopupNaviDiv will fail
	}
	var _naviDiv=jQuery('<div id="cCore_cEasyJsPopupNaviDiv"></div>').css(_naviDivCss).appendTo(_imgDiv);
	jQuery('<div id="cCore_cEasyJsPopupNaviTextDiv">'+(_current!==false && _imgs.get(_current).getAttribute('alt') ? _imgs.get(_current).getAttribute('alt') : (_current!==false && _imgs.get(_current).getAttribute('title') ? _imgs.get(_current).getAttribute('alt') : '')).replace(/\r?\n/g, '<br />')+'</div>').css({'margin-bottom':'5px', 'white-space':'normal'}).appendTo(_naviDiv);
	var _position='fixed';
	if (jQuery.browser.msie && parseFloat(jQuery.browser.version)<7) {
		_position='absolute'; //  IE lower 7 does not support "fixed"
	}
	var _recalc=function () {
		var _imgWidth=_imgObj.width();
		var _imgHeight=_imgObj.height();
		var _scrollLeft=0;
		var _scrollTop=0;
		if (!_imgDiv.css('position')=='fixed') {
			if (jQuery.browser.safari) {
				_scrollLeft=jQuery('body').scrollLeft();
				_scrollTop=jQuery('body').scrollTop();
			} else {
				_scrollLeft=jQuery('html').scrollLeft();
				_scrollTop=jQuery('html').scrollTop();
			}
		}
		var _imgDivLeft=_scrollLeft+Math.floor((jQuery(window).width()-_imgWidth)/2)-20;
		var _imgDivTop=_scrollTop+Math.floor((jQuery(window).height()-_imgHeight-_naviDiv.height())/2)-20;
		_imgDivLeft=(_imgDivLeft>5 ? _imgDivLeft : 5);
		_imgDivTop=(_imgDivTop>5 ? _imgDivTop : 5);
		_imgDiv.css({
			'left':_imgDivLeft,
			'top':_imgDivTop
		});
		if (_previousImg) {
			var _hPadding=Math.floor((_imgDiv.width()/2)-_previousImg.width());
			var _vPadding=Math.floor((_imgDiv.height()-_previousImg.height())/2);
			_previousImg.css({
				'padding-right': (_hPadding>0 ? _hPadding : 0),
				'padding-top' : (_vPadding>0 ? _vPadding : 0),
				'padding-bottom' : (_vPadding>0 ? _vPadding : 0)
			});
		}
		if (_nextImg) {
			var _hPadding=Math.floor((_imgDiv.width()/2)-_nextImg.width());
			var _vPadding=Math.floor((_imgDiv.height()-_nextImg.height())/2);
			_nextImg.css({
				'padding-left' : (_hPadding>0 ? _hPadding : 0),
				'padding-top' : (_vPadding>0 ? _vPadding : 0),
				'padding-bottom' : (_vPadding>0 ? _vPadding : 0)
			});
		}
		if (jQuery.browser.msie && parseFloat(jQuery.browser.version)<7) {
			// bugfix for IE6 for very small images
			_naviDiv.css({'top':(_imgHeight+20)+'px', 'width':(_imgWidth-90>70 ? _imgWidth-90 : 70)+'px'});
		}
		cEasyJs.refitCurtain();
	};
			
	if (_previousSrc) {
		var _previousImg=jQuery('<img src="'+_fileBlankImage+'" title="'+cEasyJs.LANG.popupImg.previous+'" />').css(_previousImgCss).hide().appendTo(_imgDiv);
		var _showPrevious=function() {
			jQuery(document).unbind('keydown', _keyControl);
			if (_previousImg) _previousImg.hide();
			if (_nextImg) _nextImg.hide();
			_closeImg.hide();
			if (_saveImg) {
				_saveImg.hide();
			}
			_imgDiv.fadeOut(1000, function () {_imgDiv.remove();});
			that.popupImg(_previousSrc, groupClass);
		};
		_previousImg.click(_showPrevious);
	}

	if (_nextSrc) {
		var _nextImg=jQuery('<img src="'+_fileBlankImage+'" title="'+cEasyJs.LANG.popupImg.next+'" />').css(_nextImgCss).hide().appendTo(_imgDiv);
		var _showNext=function() {
			jQuery(document).unbind('keydown', _keyControl);
			if (_previousImg) _previousImg.hide();
			if (_nextImg) _nextImg.hide();
			_closeImg.hide();
			if (_saveImg) {
				_saveImg.hide();
			}
			_imgDiv.fadeOut(1000, function () {_imgDiv.remove();});
			that.popupImg(_nextSrc, groupClass);
		};
		_nextImg.click(_showNext);
	}

	if (_current!==false && _imgs.size()>1) {
		if (_current>0) {
			jQuery('<img src="'+_filePreviousImage+'" title="'+cEasyJs.LANG.popupImg.previous+'" align="'+_imgAlign+'" />').css({'cursor':'pointer', 'margin-right':'5px'}).click(_showPrevious).appendTo(_naviDiv);
		}				
		jQuery('<span>'+(_current+1)+'/'+_imgs.size()+'</span>').appendTo(_naviDiv);
		if (_current<_imgs.size()-1) {
			jQuery('<img src="'+_fileNextImage+'" title="'+cEasyJs.LANG.popupImg.next+'" align="'+_imgAlign+'" />').css({'cursor':'pointer', 'margin-left':'5px'}).click(_showNext).appendTo(_naviDiv);
		}
	}
	if (_current!==false && _imgs.get(_current).getAttribute('longDesc')) { 
		var _saveImg=jQuery('<img src="'+_fileSaveImage+'" title="'+cEasyJs.LANG.popupImg.saveFile+'" id="cCore_cEasyJsPopupDownloadLink" />').css(_saveImgCss).appendTo(_imgDiv);
		_saveImg.click(function () {
			location.href=_imgs.get(_current).getAttribute('longDesc');
		});
	}
	var _closeImg=jQuery('<img src="'+_fileCloseImage+'" title="'+cEasyJs.LANG.popupImg.close+'"/>').css(_closeImgCss).appendTo(_imgDiv);
	_closeImg.click(shutDown);
	
	var _imgLoaded=function () {
		var _imgWidth=_imgObj.width();
		var _imgHeight=_imgObj.height();
		var _scaledImgWidth=jQuery(window).width()-40;
		var _scaledImgHeight=jQuery(window).height()-_naviDiv.height()-70;
		var _scaleFactor=1;
		var _displayImgWidth=_imgWidth;
		var _displayImgHeight=_imgHeight;
		
		if (_displayImgWidth>_scaledImgWidth) {
			_scaleFactor=_scaledImgWidth/_displayImgWidth;
			_displayImgWidth=_scaledImgWidth;
			_displayImgHeight=Math.floor(_displayImgHeight*_scaleFactor);
		}
		
		if (_displayImgHeight>_scaledImgHeight) {
			_scaleFactor=_scaledImgHeight/_displayImgHeight;
			_displayImgHeight=_scaledImgHeight;
			_displayImgWidth=Math.floor(_displayImgWidth*_scaleFactor);
		}

		_imgObj.width(_displayImgWidth);
		_imgObj.height(_displayImgHeight);
				
		if (_scaleFactor<1) {
							
			var _scaleImg=jQuery('<img src="'+_fileScaleUpImage+'" title="'+cEasyJs.LANG.popupImg.showOriginalSize+'" />').appendTo(_imgDiv);
			_scaleImg.css({
				'position':'absolute',
				'cursor':'pointer',
				'right':'30px',
				'top':'30px'
			});
			var _scaleAction=function () {
				if (_scaleImg[0].src==_fileScaleUpImage) {
					_scaleImg[0].src=_fileScaleDownImage;
					_scaleImg[0].title=cEasyJs.LANG.popupImg.showFitSize;
					_imgObj.width(_imgWidth);
					_imgObj.height(_imgHeight);
					_imgDiv.css({'position':'absolute'}); // set this before recalc()! - it's for enabling scrolling
					_recalc();
					if (_previousImg) _previousImg.hide();
					if (_nextImg) _nextImg.hide();
					_imgObj.bind('click', _scaleAction);
					
				} else {
					_scaleImg[0].src=_fileScaleUpImage;
					_scaleImg[0].title=cEasyJs.LANG.popupImg.showOriginalSize;
					_imgObj.width(_displayImgWidth);
					_imgObj.height(_displayImgHeight);
					_imgDiv.css({'position':_position}); // set this before recalc()! - it's for "disabling" scrolling
					_recalc();
					if (_previousImg) _previousImg.show();
					if (_nextImg) _nextImg.show();
					_imgObj.unbind('click', _scaleAction);
				}
			};
			_scaleImg.click(_scaleAction);
			
		}
		
		if (_previousImg) {
			_previousImg.mouseover(function() {
				_previousImg[0].src=_filePreviousHiImage;
			});
			_previousImg.mouseout(function() {
				_previousImg[0].src=_fileBlankImage;
			});
			_previousImg.show();
		}
		if (_nextImg) {
			_nextImg.mouseover(function() {
				_nextImg[0].src=_fileNextHiImage;
			});
			_nextImg.mouseout(function() {
				_nextImg[0].src=_fileBlankImage;
			});
			_nextImg.show();
		}
		
		_imgDiv.css({
			'position':_position,
			'padding':'20px 20px 60px 20px',
			'background-color':'#FFFFFF',
			'z-index':1000000010,
			'min-width' : '200px',
			'text-align' : 'center'
		});
		if (jQuery.browser.msie && parseFloat(jQuery.browser.version)<7) {
			if (_imgDiv.width()<160) _imgDiv.width(160);// Bugfix for IE6, to fix missing min-width (substract padding!)
		}
		_recalc();
		_imgDiv.hide(); // *) visibility-hack
		_imgDiv.css({
			'visibility':'visible' // *) visibility-hack
		});

		_imgDiv.fadeIn(1000);
		
	};

	if (jQuery.browser.opera) { // *) opera-load-event-hack
		var _operaLoadEventBugFix=function () {
			if (_imgObj[0].complete) { 
				_imgLoaded();
			} else { // img not yet loaded
				window.setTimeout(_operaLoadEventBugFix, 100); // try again later
			}
		};
		_operaLoadEventBugFix();
	} else {
		_imgObj.load(_imgLoaded);
	}

};

//=====================================================================
if (cEasyJs.language=='en') {
	cEasyJs.addLANG('popupImg', {
		'showOriginalSize' : 'show image with original size',
		'showFitSize' : 'fit image into window',
		'saveFile' : 'download image file',
		'next' : 'next image',
		'previous' : 'previous image',
		'close' : 'close'
	});
} else if (cEasyJs.language=='fr') {
	cEasyJs.addLANG('popupImg', {
		'showOriginalSize' : 'Afficher l’image dans sa taille originale',
		'showFitSize' : 'Adapter l’image à la taille de la fenêtre',
		'saveFile' : 'enregistrer',
		'next' : 'image suivante ',
		'previous' : 'image précédente',
		'close' : 'fermer'
	});
} else {
	cEasyJs.addLANG('popupImg', {
		'showOriginalSize' : 'Bild in Originalgröße anzeigen',
		'showFitSize' : 'Bild an Fenstergröße anpassen',
		'saveFile' : 'speichern',
		'next' : 'nächstes Bild',
		'previous' : 'vorheriges Bild',
		'close' : 'schließen'
	});
}

cEasyJs.scriptLoaded('cEasyJs.popupImg', 'main', true); // make sure, cEasyJs does know, that script is loaded and parsed

