﻿/**
 * Megnyit egy kép nagyobb méretű változatát.
 * A cél vagy egy új ablak, vagy egy saját ablakban megjelenő imitált ablak lehet.
 * Az eseményt kétfajta elem kezdeményezheti: egy kép, vagy egy link:
 *           összeállítás       cél meghatározása,         cím meghatározáa
 *           --------------------------------------------------------------     
 * nType 0 = <img />         :  config.sPath + img.src     img.alt/img.title
 * nType 1 = <a>textNode</a> :  a.href                     a.title
 * nType 2 = <a><img /></a>  :  a.href,                    img.alt/title || a.alt/title
 * @package  pictureViewer
 * @author   Gyuris Gellért
 * @since    3.01
 * @see      prototype_A, browserCheck, attribute, className, createFullOffset, getViewport 
 */
var pictureViewer = {
	VERSION : '3.01',
	config : {
		initClassName : 'pictureviewer',
		mode : 'window',                               // window, panel
		sPath : 'big/',                                // általános nagy kép elérési útvonal
		pending : {                                    // folyamat-felirat
			className : 'pictureviewer-pending',
			text : 'töltés...',
			show : true
		},
		window : {                                     // window mód
			title : '',
			CSSfileURL : 'ui/skin/_pictureviewer.css',
			showH1 : true,                             // mutassa-e a kép címét
			resize: false                              // engedélyezett-e az ablak átméretezése a képernyőnél nagyobb kép esetén
		},
		panel : {                                      // panel mód
			panelClassName : 'pictureviewer-panel',
			text : 'bezĂˇr'
		}
	},
	/**
	 * Konfigurációs beállítások
	 * @param sConfig String  A beállítani kivánt váltotó
	 * @param sValue String   A beállítani kivánt váltotó új értéke
	 */
	setConfig: function( sConfig, sValue ) {
		this.config[sConfig] = sValue;
	},
	/**
	 * Letölti a megnyitni kívánt képet és feliratot helyez el a töltés elindításáról
	 * @param elRoot Element  3 eset lehetséges: lásd a központi kommentet.
	 * @return Boolean  mindig false
	 */
	view : function( elRoot ) { // elRoot 3 A, vagy IMG
		var sSrc, sTitle, i, oOffset, nType, oImage = null, elImage;
		//__toplevel__
		if ( !is.min || 
		     elRoot.bPending || // ha folyamatban van a letöltés
		     !( elRoot.nodeName.toLowerCase() == 'img' || elRoot.nodeName.toLowerCase() == 'a' ) ) { // nem megfelelő inicializáció
			return false;
		};
		// adatok átvétele és lekezelése
		elRoot.bPending = true;
		nType = elRoot.nodeName.toLowerCase() == 'img' ? 0 : ( elRoot.firstChild && elRoot.firstChild.nodeName.toLowerCase() == 'img' ) ? 2 : 1;
		sTitle = nType == 2 ? elRoot.firstChild.getAttribute( 'alt' ) || elRoot.firstChild.getAttribute( 'title' ) || elRoot.getAttribute( 'alt' ) || elRoot.getAttribute( 'title' ) || ''  : elRoot.getAttribute( 'alt' ) || elRoot.getAttribute( 'title' ) || '';
		sSrc = nType == 0 ? elRoot.src.substr( 0, elRoot.src.lastIndexOf('/') + 1 ) + pictureViewer.config.sPath + elRoot.src.substr( elRoot.src.lastIndexOf('/') + 1 ) : elRoot.href;
		// kép letöltése
		oImage = new Image();
		oImage.src = sSrc;
		if ( is.saf ) {
			elImage = document.createElement('img');
			elImage.src = sSrc;
			elImage.style.visibility = 'hidden';
			elImage.style.position = 'absolute';
			elImage.style.top = '0px';
			elImage.style.left = '0px';
			document.body.appendChild( elImage );
			elImage.onload = function () {
				oImage = { width : elImage.width, height : elImage.height, src : elImage.src };
				document.body.removeChild( elImage );
				pictureViewer.openWindow( oImage, sTitle, elRoot );
			};
		};
		// folyamat-felirat készítése
		elRoot.nodePending = document.createElement( 'span' );
		elRoot.nodePending.className = pictureViewer.config.pending.className;
		if ( !pictureViewer.config.pending.show ) {
			elRoot.nodePending.style.display = 'none';
		};
		if ( nType == 0 || nType == 2 ) {
			oOffset = ( nType == 0 ) ? createFullOffset( elRoot, document.body ) : createFullOffset( elRoot.firstChild, document.body );
			elRoot.nodePending.style.left = oOffset.offsetX + 'px';
			elRoot.nodePending.style.top = oOffset.offsetY + 'px';
			elRoot.nodePending.appendChild( document.createTextNode( pictureViewer.config.pending.text + ' ' + sTitle ) );
			document.body.appendChild( elRoot.nodePending );
		}
		else if ( nType == 1 ) {
			elRoot.nodePending.appendChild( document.createTextNode( pictureViewer.config.pending.text ) );
			elRoot.parentNode.insertBefore( elRoot.nodePending, elRoot.nextSibling );
		};
		pictureViewer.open = pictureViewer.config.mode == 'window' ? pictureViewer.openWindow : pictureViewer.openPanel;
		// inicializáció indítása
		window.setTimeout( function() { // opera7.5 miatt van időzítés - majd meglátjuk...
			if ( oImage.complete ) {
				pictureViewer.open( oImage, sTitle, elRoot, oOffset );
			}
			else {
				oImage.onload = function () {
					pictureViewer.open( this, sTitle, elRoot, oOffset );
				};
			};
		}, 100 );
		return false;
	},
	/**
	 * Csak belülről hívható! Megnyitja a képet nagyobb méretben egy új ablakban, melynek ismerjük a méreteit.
	 * @param oImage  A kép, amelyet megnyit
	 * @param sTitle  A kép címe
	 * @param elRoot  A megnyitást kérő objektum
	 */
	openWindow : function( oImage, sH1, elRoot ) {
		var winImage = null, aXHTML = [], nLeft = 0, nTop = 0, nWidth, nHeight, nInnerWidth, nInnerHeight, sScrollbars, sResizable, sSettings, bRealResize, i; 
		// HTML kód összeállítása
		aXHTML.push( '<?xml version="1.0" encoding="utf-8"?>' );
		aXHTML.push( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' );
		aXHTML.push( '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="hu" lang="hu">' );
		aXHTML.push( '<head><title>' + sH1 + '</title>' );
		aXHTML.push( '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' );
		aXHTML.push( '<link rel="stylesheet" type="text/css" href="' + pictureViewer.config.window.CSSfileURL + '" />' );
		aXHTML.push( '<body id="pictureviewer">' );
		aXHTML.push( ( pictureViewer.config.window.showH1 && sH1 != '' ) ? '<h1>' + sH1 + '</h1>' : '' );
		aXHTML.push( '<img src="' + oImage.src + '" onclick="window.close(); return false;" />' );
		aXHTML.push( '</body></html>' );
		// ablak beállításai és nyitása
		bRealResize = ( pictureViewer.config.window.resize && (( window.screen.width <= oImage.width * 1.1 ) || ( window.screen.height <= oImage.height * 1.1 )) ) ? true : false;
		if ( is.ie5mac ) { // hibásan adja vissza minden esetben a kép méreteinek értékét (1px) 
		 	oImage.width = 400;
		 	oImage.height = 400;
		};
		// XXX unsupported ie5mac
		nLeft = ( !bRealResize ) ? Math.round( ( window.screen.width - oImage.width ) / 2 ) : 0;
		nTop = ( !bRealResize ) ? Math.round( ( window.screen.height - oImage.height ) / 2 ) : 0;
		nInnerWidth = parseInt( oImage.width );
		nInnerHeight = parseInt( oImage.height );
		sScrollbars = 'no';
		sResizable = 'no';
		if ( bRealResize ) {
			sScrollbars = 'yes';
			sResizable = 'yes';
			nInnerWidth =  Math.round( window.screen.width * 0.97 ); // 0.9
			nInnerHeight = Math.round( window.screen.height * 0.90 ); // 0.9
		};
		if ( is.ie5mac ) { 
			sScrollbars = 'yes';
			sResizable = 'yes';
		};
		nWidth = nInnerWidth; // + 12;
		nHeight = nInnerHeight; // + 30;
		sSettings = 'height=' + nHeight +',width=' + nWidth + ',innerWidth=' + nInnerWidth + ',innerHeight=' + nInnerHeight + ',top=' + nTop + ',left=' + nLeft + ',scrollbars=' + sScrollbars +  ',resizable=' + sResizable;
		winImage = window.open( '', '', sSettings);
		winImage.document.open( 'text/html' );
		winImage.document.write( aXHTML.join('\n') );
		winImage.document.close();
		// folyamat-felirat eltávolítása		
		elRoot.bPending = false;
		elRoot.nodePending.parentNode.removeChild( elRoot.nodePending );
		return true;
	},
	openPanel : function( oImage, sHead, elRoot, oOffset ) {
		var elPanel, elHead, elImg, elClose, oViewport;
		elPanel = document.createElement('div');
		elPanel.className = pictureViewer.config.panel.panelClassName;
		elClose = document.createElement('em');
		elClose.setAttribute('title', pictureViewer.config.panel.text );
		elClose.onclick = function() {
			this.parentNode.parentNode.parentNode.removeChild( this.parentNode.parentNode );
		}
		elClose.appendChild( document.createTextNode( '×' ) );
		elHead = document.createElement('span');
		elHead.appendChild( document.createTextNode( sHead ) );
		elHead.appendChild( elClose );
		elPanel.appendChild( elHead );
		elImg = document.createElement('img');
		elImg.src = oImage.src;
		elImg.onclick = function() { 
			this.parentNode.parentNode.removeChild( this.parentNode );
		};
		elPanel.appendChild( elImg );
		oViewport = getViewport();
		elPanel.style.left = oOffset.offsetX + oImage.width >= oViewport.width ? ( oViewport.width - oImage.width ) / 2 + 'px' : oOffset.offsetX + 'px';
		elPanel.style.top = oOffset.offsetY + 'px';
		elPanel.style.width = oImage.width + 'px';
		document.body.appendChild( elPanel );
		// folyamat-felirat eltávolítása		
		elRoot.bPending = false;
		elRoot.nodePending.parentNode.removeChild( elRoot.nodePending );
	},
	init : function() {
		function createViewer( els ) {
			var i;
			for ( i = 0; i < els.length; i++ ) {
				if ( hasClass( els[i], pictureViewer.config.initClassName ) ) {
					els[i].onclick = function() { 
						pictureViewer.view( this ); 
						return false;
					};
				};
			};
		};
		createViewer( document.getElementsByTagName('a') );
		createViewer( document.getElementsByTagName('img') );
	}
};
