/*-----------------------------------------------------------------*
 | LOADER                                                          |
 *-----------------------------------------------------------------*/

var Loader = function() {
	/*
	setList(list)
	getList()
	setIndex(index)
	getIndex()
	getCurrent()
	start()
	pause()
	resume()
	stop()
	isLoading()
	
	@complete
	*/
	
	var _this;
	var _list;
	var _index;
	var _offset;
	var _loadindex;
	var _loadoffset;
	var _forward;
	var _loading;
	var _timer;
	
    {
		_this = this;
		_index = 0;
		_offset = 0;
		_loadindex = _index;
		_loadoffset = _offset;
		_forward = true;
		_loading = false;
	}
	
	_this.setList = function(list) {
		_this.stop();
		_list = list;
	};
	
	_this.getList = function() {
		return _list;
	};
	
	_this.setIndex = function(index) {
		_index = index;
		_offset = 0;
		if(_list && _index > _list.length/2) _forward = false;
		else _forward = true;
	};
	
	_this.getIndex = function() {
		return _loadindex;
	};
	
	_this.start = function() {
		if(_list) {
			if(_loading) _this.stop();
			_loading = true;
			process();
		}
	};
	
	_this.pause = function() {
		if(_timer) {
			clearTimeout(_timer);
			_timer = null;
		}
		if(_list) {
			var item = _list[_index];
			//if(item.obj) item.obj.children("img").unbind("error load", loadHandler);
			if(item.obj) item.obj.unbind("error load", loadHandler);
		}
		_loading = false;
	};
	
	_this.resume = _this.start;
	
	_this.stop = function() {
		if(_loading) {
			_this.pause();
			_this.setIndex(0);
		}
	};
	
	_this.isLoading = function() {
		return _loading;
	};
	
	function process() {
		_loadindex = _index;
		_loadoffset = _offset;
		var item = _list[_loadindex];
		if(item.obj) {
			next();
		}
		else {
			//var image = jQuery("<img></img>").one("error load", loadHandler);
			//item["~obj"] = jQuery("<a></a>").attr("href", item.url).append(image);
			//image.attr("src", "/"+item.galleryImage);
			item["~obj"] = jQuery("<img></img>").one("error load", loadHandler);
			item["~obj"].attr("src", "/"+item.galleryImage);
		}
	}
	
	function loadHandler(event) {
		var item = _list[_loadindex];
		if(event.type.match(/load/i)) item.obj = item["~obj"];
		delete item["~obj"];
		jQuery(_this).triggerHandler("complete", [_loadindex]);
		_timer = setTimeout(next, 50);
	}
	
	function next() {
		_timer = null;
		if(_index == _loadindex && _offset == _loadoffset) {
			_offset++;
			if(_offset < _list.length) {
				if(_forward) {
					if(_offset >= _list.length-_index) {
						_index--;
					}
					else {
						_index += _offset;
						_forward = !_forward;
					}
				}
				else {
					if(_offset > _index) {
						_index++;
					}
					else {
						_index -= _offset;
						_forward = !_forward;
					}
				}
				process();
			}
			else {
				_this.stop();
			}
		}
		else {
			process();
		}
	}
};

/*-----------------------------------------------------------------*
 | Slideshow                                                       |
 *-----------------------------------------------------------------*/

var Slideshow = function(id, siteaccess, ids, galleryname, loading) {
	/*
	setIndex(value)
	getIndex()
	previous()
	next()
	*/
	
	var _this;
	var _width;
	var _height;
	var _imagebox;
	var _textbox;
	var _textcontainer;
	var _overlaybox;
	var _loading;
	var _loader;
	var _index;
	var _paused;
	var _timer;
	var _currentLinkUrl;
	
    {
		_this = this;
		var obj = jQuery("#"+id).empty().bind("click", clickHandler);
		_width = obj.width();
		_height = obj.height();
		_imagebox = jQuery("<div></div>").css({position: "relative", width: "100%", height: _height+"px"}).appendTo(obj);
		_textbox = _imagebox.clone(false).css({top: (-_height)+"px", opacity: "0"}).appendTo(obj);
		_backgroundbox = jQuery("<div></div>").addClass("backgroundcontainer").appendTo(obj);
		_textcontainer = jQuery("<div></div>").addClass("textcontainer").appendTo(_textbox);
		//_overlaybox = _imagebox.clone(false).css("top", (-_height*3)+"px").appendTo(obj);
		_overlaybox = _imagebox.clone(false).css("top", (-_height*3)+"px").appendTo(obj).bind("click", linkClickHandler);
		_loading = jQuery("<img></img>").attr("src", loading).css({position: "absolute", left: "50%", top: "50%"}).load(loadingLoadHandler).appendTo(_overlaybox);
		_navigationouterwrapper = jQuery("<div></div>").addClass("navigationouterwrapper").appendTo(_overlaybox);
		_navigationwrapper = jQuery("<div></div>").addClass("navigationwrapper").appendTo(_navigationouterwrapper);
		_navigationcenter = jQuery("<div></div>").addClass("navigationcenter").appendTo(_navigationwrapper);
		_navigationleft = jQuery("<div></div>").addClass("navigationleft").appendTo(_navigationcenter);
		_navigation = jQuery("<div></div>").addClass("navigation").appendTo(_navigationcenter);		
		_navigationright = jQuery("<div></div>").addClass("navigationright").appendTo(_navigationcenter);
		_leftbutton = jQuery("<a></a>").attr({href: "#"}).addClass("leftbutton").appendTo(_overlaybox).bind("click", leftClickHandler);
		_rightbutton = jQuery("<a></a>").attr({href: "#"}).addClass("rightbutton").appendTo(_overlaybox).bind("click", rightClickHandler);
		jQuery.getJSON(siteaccess+"/em_amfphp/ajax/["+ids+", \""+galleryname+"\"]/Extension_Em_Amfphp_Classes_Lib_Services/getMediaGalleryElements", ajaxCompleteHandler);
	}
	
	_this.setIndex = function(value) {
		clearTimeout(_timer);
		var list = _loader.getList();
		if(list && value >= 0 && value < list.length) {
			_navigation.children("#item-"+_index).removeClass("selected");
			_index = value;
			_navigation.children("#item-"+_index).addClass("selected");
			var item = list[_index];
			if(item.obj) {
				_loading.css("display", "none");
				if(item.caption && item.caption.length > 0) {
					_textcontainer.html(item.caption);
					if(!_textbox.data("visible")) _textbox.data("visible", true).animate({opacity: "1"}, 1000);
				}
				else {
					if(_textbox.data("visible")) _textbox.data("visible", false).animate({opacity: "0"}, 1000);
				}
				item.obj.css("opacity", "0").appendTo(_imagebox).animate({opacity: "1"}, 1000, fadeCompleteHandler);
				if(item.url) {
					_currentLinkUrl = item.url;
					_overlaybox.css('cursor', 'pointer');
				}
				else {
					_currentLinkUrl = null;
					_overlaybox.css('cursor', 'auto');
				}
			}
			else {
				_loading.css("display", "block");
				_loader.setIndex(_index);
			}
		}
	};
	
	_this.getIndex = function() {
		return _index;
	};
	
	_this.previous = function(event) {
		var index = _index-1;
		if(index < 0) index = _loader.getList().length;
		_this.setIndex(index);
	};
	
	_this.next = function(event) {
		var index = _index+1;
		if(index >= _loader.getList().length) index = 0;
		_this.setIndex(index);
	};
	
	function ajaxCompleteHandler(result) {
		if(result && result.length > 0) {
			for(var i = 0; i < result.length; i++) {
				jQuery("<a></a>").attr({href: "#", id: "item-"+i}).addClass("navigationitem").bind("click", i, navClickHandler).appendTo(_navigation);
			}
			_loader = new Loader();
			jQuery(_loader).bind("complete", loadCompleteHandler);
			_loader.setList(result);
			_index = 0;
			_paused = false;
			_loader.start();
		}
	}
	
	function loadingLoadHandler(event) {
		_loading.css({marginLeft: (-_loading.width()/2)+"px", marginTop: (-_loading.height()/2)+"px"});
	}
	
	function loadCompleteHandler(event, index) {
		var item = _loader.getList()[index];
		if(item.obj) {
			item.obj.css({position: "absolute", MsInterpolationMode: "bicubic", width: _width+"px", height: _height+"px"});
			
			//item.obj.wrap('<a href="#"/>');
			//item.obj.html('<a href="">Test</a>');
			//alert(item.toSource());
			//alert(item.obj.html());
			
			if(index == _index) _this.setIndex(_index);
		}
	}
	
	function fadeCompleteHandler() {
		jQuery(this).prevAll().remove();
		if(!_paused) timerCompleteHandler();
	}
	
	function clickHandler(event) {
		clearTimeout(_timer);
		_paused = true;
		_timer = setTimeout(timerCompleteHandler, 12000);
	}
	
	function leftClickHandler(event) {
		_this.previous();
	}
	
	function rightClickHandler(event) {
		_this.next();
	}
	
	function linkClickHandler(event) {
		var $target = $(event.target);
		if(!$target.is("a") && _currentLinkUrl) {
			window.location = _currentLinkUrl;
		}
	}	
	
	function timerCompleteHandler() {
		clearTimeout(_timer);
		_paused = false;
		_timer = setTimeout(_this.next, 6000);
	}
	
	function navClickHandler(event) {
		if(event.data != _index) _this.setIndex(event.data);
		return false;
	}
};
