// Verzio 1.03
(function( $ ){
	var methods =
	{
	    // Szimpla kép
	    simple : function( options )
	    {
			gal_setts = {
	        'percent': 70,
	        'gallery': false
			};

			if ( options ) { $.extend( gal_setts, options ); }

	         _setImageArray($(this));
	        _start($(this));
	    },
	    // Galéria
	    gallery : function( options )
	    {
			gal_setts = {
	        'percent': 70,
			'gallery': true
			};

			if ( options ) { $.extend( gal_setts, options ); }

            _setImageArray($(this));
	        _start($(this));
		}
	};
    // Beállítás
    function _init()
    {
        Opacity = (jQuery.browser.msie == true) ? ['filter','alpha(opacity=30)'] : ['opacity',0.3],
        BrwLoad = (jQuery.browser.opera == true || jQuery.browser.msie == true) ? 'ready' : 'load',
	   	screen_w	= $(window).width(),
	   	screen_h	= $(window).height(),
	   	centertop	= $(window).height() / 2,
	   	centerleft	= $(window).width() / 2,
		EventsID 	= { "Next"	: "KeViewerNextImg",
						"Prev"	: "KeViewerPrevImg",
						"DisBg"	: "KeViewerDisableBg",
						"Close" : "KeViewerClose",
						"Resize": "KeviewerResize" },
	    SetActImage = 'null',
	    SetActTitle = 'null',
	    ViewImg		= false,
	    ContView	= false,
	    AllowNext	= true,
	    AllowPrev	= true,

		$(document).bind('click.'+EventsID['DisBg'], function(event) {
			if(event.target.id==EventsID['DisBg'])
				_close(event);
		});
   	};
   	// Kép tömb feltöltése
   	function _setImageArray(obj)
   	{
		arr = $('a[rel='+ obj.attr('rel') +']');

		ImageArray = new Array();
		ImgCount = arr.size();

		$.each(arr, function(index, value)
		{
			ImageArray[$(this).index()] = {'index' : index, 'href' : $(this).attr('href'), 'title' : $(this).attr('title') };
		});
   	};
   	// Pozíció lekérdezés
	function _get_scroll()
	{
		if (self.pageYOffset)
		{
			return {scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};
		} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6
			return {scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};
		} else if (document.body) {// Explorers
			return {scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};
		};
	};
	// Események
	function _events()
	{
		var Timer = null;
		$(window).bind('resize.'+EventsID['resize'], function(event) {
		    if(Container)
		    {
		        if (Timer) clearTimeout(Timer);
		    		Timer = setTimeout(_changesize, 200);
			}
			else
				return false;
		});
        $(window).bind('scroll', function(event)
        {
	        if (Timer) clearTimeout(Timer);
		    		Timer = setTimeout(_reposition, 200);
        });

		$('a').bind({
				'click.KeV': function(event)
				{
					event.stopPropagation();
                	var id = event.target.id
					if(id == EventsID['Next'] || id == EventsID['Prev'])
					{
						NextImg.hide();
						PrevImg.hide();
						_changeImage($(this));
					}
					if(id == EventsID['Close'])
						_close(event);
					return false;
				},
				'mouseover.KeV': function(event) {
                	var id = event.target.id
					if(id == EventsID['Next'] || id == EventsID['Prev'])
			        	$(this).css('opacity', 1);
				},
				'mouseout.KeV' : function (event) {
                	var id = event.target.id
					if(id == EventsID['Next'] || id == EventsID['Prev'])
			        	$(this).css('opacity', 0);
				}
			});

	};
   	// Indítás
	function _start(obj)
	{
		_init();
        ImgHref		= obj.attr('href');

        StartImg	= ImageArray[obj.index()]['index'];
        StartTitle	= (obj.attr('title')!="") ? obj.attr('title') : "";

		DisableBg	= $("<div/>", {'id' : "KeViewerDisableBg",
								   'css': { 'height': $(document).height(),
											'width': $(document).width()} }).appendTo("body");
		Container 	= $("<div/>", {'id': "KeViewerContainer",
								   'css': { 'top':centertop-20,
								   			'left':centerleft-20,
								   			'display': 'block'} }).appendTo("body");

        DisableBg.css(Opacity[0], Opacity[1]);

		if(gal_setts.gallery)
		{
	        NavBar 		= $("<div/>", {'id': "KeViewerContainerNavBar" }).appendTo(Container);
	        NextImg		= $("<a/>", {'id' : "KeViewerNextImg",
	        			 			 'rel': (StartImg < (ImgCount-1)) ? obj.next().index() : StartImg,
	        			 			 'class' : 'KeViewerArrow ArrowRight',
	        			 			 'title' : 'Következő',
	        			 			 'css'	 : (StartImg >= (ImgCount-1)) ? {'display': 'none'} : ''
	        			 			}).appendTo(NavBar);
	        PrevImg		= $("<a/>",	{'id' : "KeViewerPrevImg",
				        			 'rel': (StartImg > 0) ? obj.prev().index() : 0,
	        						 'class' : 'KeViewerArrow ArrowLeft',
	        						 'title' : 'Előző',
	        						 'css'	 : (StartImg == 0) ? {'display': 'none'} : ''
	        						}).appendTo(NavBar);

			AllowNext = ((StartImg+1) == ImgCount) ? false : true;
			AllowPrev = (StartImg==0) ? false : true;
		}
		InfoBar 	= $("<div/>", {'id': "KeViewerContainerInfoBar" }).appendTo(Container);
					  $("<span/>", {'id': "InfoBarTitle"}).appendTo(InfoBar);
					  $("<span/>", {'id': "InfoBarCount"}).appendTo(InfoBar);
		CloseBtn	= $("<a/>", {'id': "KeViewerClose",
								 'href': '#',
								 'title': 'Bezárás'}).appendTo(InfoBar);

		_imgLoader(ImgHref);

		ImgTemp.load(function()
		{
				_resize(ImgTemp);
				_animation([ ImgTemp.width(), ImgTemp.height() ]);
				_events();
		});
	};
	function _imgLoader(src)
	{
		var img = new Image();
		ImgTemp = $(img).load(function ()
		{
			$('body').append(this);
			return true;
		}).error(function ()
		{
	      return false;
		}).attr({'src':src, 'id':'Temp'}).css('display', 'none');
	}
	// Újra pozícionálás
	function _reposition()
	{
		scroll_pos = _get_scroll();
  		projectedTop = (jQuery.browser.msie == true) ? centertop - (Container.height()/2) + scroll_pos['scrollTop'] : centertop - (Container.height()/2);
		Container.animate({'top':projectedTop}, 'fast');
	};
	// Animált megjelenítés
	function _animation(size)
	{
		scroll_pos = _get_scroll();
  		projectedTop = (jQuery.browser.msie == true) ? centertop - (size[1]/2) + scroll_pos['scrollTop'] : centertop - (size[1]/2);

		var Left = centerleft - (size[0]/2);
		var Top  = projectedTop;

		if(gal_setts.gallery)
		{
			NextImg.css({'opacity':0});
			PrevImg.css({'opacity':0});
		}

		if(ViewImg)
			ViewImg.remove();

		ViewImg = ImgTemp.clone().appendTo(Container).attr('id', "KeViewerImage");

        Container.animate({'left': Left, 'width':(size[0]+5)}, function()
		{
			$(this).animate({'top': (Top-30), 'height':(size[1]+10)}, function()
			{
				ImgTemp.remove();

				_setinfobar($(this), size[1]);

				ViewImg.fadeIn();
				ContView = true;
			});
        });

	};
	// Kép Átméretezés
	function _resize(obj)
	{
	  var img_w = obj.width(); // kép szélessége (eredeti)
	  var img_h = obj.height(); // kép magasága (eredeti)
      var max_width		= Math.ceil( (screen_w/100) * gal_setts.percent) - 50;
      var max_height 	= Math.ceil( (screen_h/100) * gal_setts.percent) - 50;
		// Ha kissebb mint a maximum engedélyezett méret
		if( img_w < max_width && img_h < max_height )
			obj.height(img_h).width(img_w);
	    else if(img_h > max_height)
	    {
			var ratio = (img_h / img_w );
			var new_height = max_height;
			var new_width = Math.ceil(new_height / ratio);
			obj.height(new_height).width(new_width);
	    }
	    else if (img_w > img_h)
		{
		   	// ha nagyobb, mint a böngészőablak szélessége
		   	var ratio = (img_h / img_w ); 					// Arány
			var new_width = max_width 						// kép méret szélesség, 70%-os kicsinyítés
			var new_height = Math.ceil(new_width * ratio); 	// kép méret magasság
            obj.height(new_height).width(new_width);
		}
		// Állókép
		else
		{
			var ratio =(img_h / img_w );
			var new_height = max_height;
			var new_width = Math.ceil(new_height / ratio);
			obj.height(new_height).width(new_width);
		}
		return false;
	};
	// Méretváltás ablakméret változáskor
	function _changesize()
	{
		InfoBar.hide();

		screen_w	= $(window).width(),
		screen_h	= $(window).height(),
		centertop	= $(window).height() / 2,
		centerleft	= $(window).width() / 2,

	    _imgLoader(ViewImg.attr('src'));

		ImgTemp.load(function()
		{
			_resize(ImgTemp);
			_animation([ ImgTemp.width(), ImgTemp.height() ]);
		});
		return false;
	};
	// Infóbár
	function _setinfobar(obj, height)
	{
		obj.delay(800).animate({'height':(height+55)}, function()
		{
			var ActTitle = (SetActTitle=='null') ? StartTitle : SetActTitle;
			if (gal_setts.gallery)
				var ActImage = 'Képek: '+ ((SetActImage=='null') ? (StartImg+1) : (ImageArray[SetActImage]['index']+1) ) +' / '+ ImgCount;
			else
				var ActImage = 'Kép: 1 / 1';

			InfoBar.find('span:first').html(ActTitle);
			InfoBar.find('span:last').html(ActImage);
			//InfoBar.append(ActTitle);
			InfoBar.show();
			if(gal_setts.gallery)
			{
				if(AllowNext) NextImg.delay(1000).show().css('height', (height+15));
				if(AllowPrev) PrevImg.delay(1000).show().css('height', (height+15));
			}
		});
		return false;
	};
	// Kép váltás (Előző, Következő)
	function _changeImage(obj)
	{
		SetActImage = parseInt( obj.attr('rel') );
		SetActTitle = ImageArray[SetActImage]['title'];

		var Next = SetActImage+1;
		var Prev = SetActImage-1;

		InfoBar.hide();
		ViewImg.hide();

		NextImg.attr('rel', SetActImage+1);
        PrevImg.attr('rel', Prev);

		AllowNext = (typeof ImageArray[Next]=="undefined") ? false : true;
		AllowPrev = (typeof ImageArray[Prev]=="undefined") ? false : true;

        if(ImgTemp)
        	ImgTemp.remove();

        _imgLoader(ImageArray[SetActImage]['href']);

		ImgTemp.load(function()
		{
			_resize(ImgTemp);
			var width	 = ImgTemp.width();
			var height	 = ImgTemp.height();
			_animation([width, height]);
		});
	};
	// Bezárás
	function _close(event)
	{
	    event.preventDefault()
	    event.isDefaultPrevented()
	    event.stopPropagation()
	    event.isPropagationStopped()
	    event.stopImmediatePropagation()
	    event.isImmediatePropagationStopped()

        $(window).unbind('resize.'+EventsID['resize']);
		$(document).unbind('click.'+EventsID['DisBg']);
		$('a').unbind('click.KeV'); $('a').unbind('mouseover.KeV');	$('a').unbind('mouseout.KeV');

		DisableBg.remove();
		Container.remove();
	};

	$.fn.KeViewer = function( method )
	{
	    // Method calling logic
	    if ( methods[method] ) {
	      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	      return methods.init.apply( this, arguments );
	    } else {
	      $.error( 'Method ' +  method + ' does not exist on jQuery.KeViewer' );
	    }
	};
})( jQuery );
