$(function(){
	$.extend($.fn.disableTextSelect = function() {
		return this.each(function(){
			if($.browser.mozilla){//Firefox
				$(this).css('MozUserSelect','none');
			}else if($.browser.msie){//IE
				$(this).bind('selectstart',function(){return false;});
			}else{//Opera, etc.
				$(this).mousedown(function(){return false;});
			}
		});
	});
});

$(function(){
	$.extend($.fn.totalWidth = function() {
		var _tW = this.width();
		if(parseInt(this.css('margin-left'))) _tW += parseInt(this.css('margin-left'));
		if(parseInt(this.css('margin-right'))) _tW += parseInt(this.css('margin-right'));
		if(parseInt(this.css('padding-left'))) _tW += parseInt(this.css('padding-left'));
		if(parseInt(this.css('padding-right'))) _tW += parseInt(this.css('padding-right'));
		if(parseInt(this.css('borderLeftWidth'))) _tW += parseInt(this.css('borderLeftWidth'));
		if(parseInt(this.css('borderRightWidth'))) _tW += parseInt(this.css('borderRightWidth'));
		if(_tW) 
			return _tW;
		else
			return this.width();
	});
});
$(function(){
	$.extend($.fn.totalHeight = function() {
		var _tH = this.height();
		if(parseInt(this.css('margin-top'))) _tH += parseInt(this.css('margin-top'));
		if(parseInt(this.css('margin-bottom'))) _tH += parseInt(this.css('margin-bottom'));
		if(parseInt(this.css('padding-top'))) _tH += parseInt(this.css('padding-top'));
		if(parseInt(this.css('padding-bottom'))) _tH += parseInt(this.css('padding-bottom'));
		if(parseInt(this.css('borderTopWidth'))) _tH += parseInt(this.css('borderTopWidth'));
		if(parseInt(this.css('borderBottomWidth'))) _tH += parseInt(this.css('borderBottomWidth'));
		if(_tH) 
			return _tH;
		else
			return this.height();
	});
});

jQuery.fn.slideGallery = function (options) {
	var defaults = { 
		HI_RES_DIR: "HI/",
		SLIDE_INTERVAL: 10,
		SLIDE_FOR: 1,
		SPEED: false,
		PH_WIDTH: false,
		PH_HEIGHT: false
	};
	
	var helpLink = $("#slidegallery-help");
	if(helpLink) helpLink.click(showHelp);
	
	var settings = $.extend(defaults, options);
	
	if(settings.SPEED) getSpeed(settings.SPEED);
	var _slider = $(this).addClass("slidegallery-slider");
	var _container = $('<div id="slidegallery-container"></div>').appendTo($(this).parent());
	var _screen = $('<div id="slidegallery-scr" align="center"></div>').appendTo(_container);
	var _screenImg = $('<img id="slidegallery-scr-img" src="" alt="" title="" width="0" height="0" />').appendTo(_screen);
	var _screenTxt = $('<div id="slidegallery-scr-txt" align="center"></div>').appendTo(_screen);
	var _cntrl_sx = $('<div id="slidegallery-cntrl-sx"></div>').appendTo(_container);
	var _sl_container = $('<div id="slidegallery-sl-container"></div>').appendTo(_container);
	_slider.appendTo(_sl_container);
	var _cntrl_dx = $('<div id="slidegallery-cntrl-dx"></div>').appendTo(_container);
	var _elems = _slider.children();
	if(settings.PH_WIDTH)
		_container.css('width', settings.PH_WIDTH);
	else
		_container.css('width', _container.parent().width());
	if(settings.PH_HEIGHT)
		_container.css('height', settings.PH_HEIGHT);
	else
		_container.css('height', _container.parent().height());
	
	var _loadStatusDiv = $('<div class="slidegallery-loading hidden"></div>').appendTo(_screen);
	
	var selected = null;
	var interval = null;
	_slider.css('margin-left','0px');
	var startFrom = parseInt(_slider.css('margin-left'));
	var totWidth = 0;
	var endAt = 0;
	
	var thinner = 100;
	var higher = 50;
	
	for(var x=0; x<_elems.length; ++x) {
		galleryElem = $(_elems[x]);
		galleryElem.click( showElemOnClick );
		galleryElem.wrap('<div class="slidegallery-img-wrapper" align="center"></div>');
		if(galleryElem.hasClass('slidegallery-selected')) {
			selected = galleryElem;
			showElem(selected);
		}
		totWidth += galleryElem.parent().totalWidth();
		if(galleryElem.parent().totalWidth() < thinner) thinner = galleryElem.parent().totalWidth();
		if(galleryElem.parent().totalHeight() > higher) higher = galleryElem.parent().totalHeight();
	}
	
	_slider.css('width',totWidth)
			.css('height',higher);
	_sl_container.css('width',_container.width()-_cntrl_sx.totalWidth()-_cntrl_dx.totalWidth()).css('height',_slider.totalHeight());
	_screen.css('height',_container.totalHeight()-_sl_container.totalHeight());
	if(!selected) $(_elems[0]).addClass('slidegallery-selected');

	endAt = parseInt(_sl_container.totalWidth())-parseInt(_slider.totalWidth());
	
	$(_cntrl_sx).mouseenter( slideSx ).mouseleave( stopSlide ).click( slideAllSx );
	$(_cntrl_dx).mouseenter( slideDx ).mouseleave( stopSlide ).click( slideAllDx );
	
	_slider.disableTextSelect();
	if(!parseInt(_slider.css('margin-left'))) _slider.css('margin-left',0);
	
	function getSpeed(spd) {
		switch(spd)	{
			case 'slow':
				settings.SLIDE_INTERVAL = 5;
				settings.SLIDE_FOR = 2;
				break;
			case 'fast':
				settings.SLIDE_INTERVAL = 3;
				settings.SLIDE_FOR = 3;
				break;
			case 'faster':
				settings.SLIDE_INTERVAL = 5;
				settings.SLIDE_FOR = 4;
				break;
			default:
				settings.SLIDE_INTERVAL = 1;
				settings.SLIDE_FOR = 2;
				break;
		}
	}
	
	function getNewSrc(oldSrc) {
		_filename = oldSrc.match(new RegExp('[a-zA-Z0-9_.-]*\.?[a-zA-Z]{3}$'));
		return settings.HI_RES_DIR+"/"+_filename;
	}
	
	function showElem(_toShow) {
		loadingDivShow();
		_toShow = $(_toShow);
		var newSrc = getNewSrc(_toShow.attr('src'));
		_newImg = new Image();
		_newImg.src = newSrc;
		_newImg.alt = _toShow.attr('alt');
		$(_newImg).load( function () {
			var _prop = _newImg.width/_newImg.height;
			var avH = getAvailableH();
			var avW = getAvailableW();
			if(_newImg.width > avW) {
				_newImg.width = avW;
				_newImg.height = avW/_prop;
			}
			if(_newImg.height > avH) {
				_newImg.height = avH;
				_newImg.width = avH*_prop;
			}
			_screenTxt.html(_toShow.attr('title'));
			_imgPar = _screenImg.parent();
			_screenImg.remove();
			_screenTxt.remove();
			_screenImg = $(_newImg).appendTo(_imgPar);
			_screenTxt.appendTo(_imgPar);
			loadingDivHide();
		} );
		if(selected) selected.removeClass('slidegallery-selected');
		selected = _toShow.addClass('slidegallery-selected');
	}
	
	function showElemOnClick() {
		showElem($(this));
	}
	
	function getAvailableH() { return _screen.height()-_screenTxt.totalHeight(); }
	function getAvailableW() { return _screen.width(); }
	
	function stopSlide() {
		clearInterval(interval);
		interval = null;
	}

	function loadingDivShow() { _loadStatusDiv.removeClass('hidden'); }
	function loadingDivHide() { _loadStatusDiv.addClass('hidden'); }

	function slideDx() {
		if( parseInt(_slider.css('margin-left')) > endAt )
			_slider.css('margin-left',parseInt(_slider.css('margin-left'))-settings.SLIDE_FOR);
		if(!interval) interval = setInterval(slideDx,settings.SLIDE_INTERVAL);
	}
	
	function slideSx() {
		if( parseInt(_slider.css('margin-left')) < startFrom )
			_slider.css('margin-left',parseInt(_slider.css('margin-left'))+settings.SLIDE_FOR);
		if(!interval) interval = setInterval(slideSx,settings.SLIDE_INTERVAL);
	}
	
	function slideAllDx() {
		stopSlide();
		_slider.css('margin-left',endAt);
	}
	
	function slideAllSx() {
		stopSlide();
		_slider.css('margin-left',startFrom);
	}
	
	function showHelp() {
		$('<div id="slidegallery-help-div" title="Photogallery Help!"><p>Passare con il mouse sopra le icone delle frecce in basso per far scorrere le immagini.</p><p>Fare click sulle immagini in formato ridotto per visualizzarle ingrandite.</p><p>In caso di ritardo prolungato della fase di caricamento della foto fare click nuovamente sulla foto selezionata.</p></div>').dialog();
	}
};
