UKTV.GalleryScroller = new function() {	
	this.NS = 'UKTV.GalleryScroller';
	var _self = this;
	var YD = YAHOO.util.Dom;
	var YE = YAHOO.util.Event;
	var YS = YAHOO.util.Selector;
	var YC = YAHOO.util.Connect;
	var JSON = YAHOO.lang.JSON;
	var _slide_width = false;
	var _tween_speed = 1;
	var _memo = [];
	
	var _start_url = false;
	var _slider = false;
	var _con = false;
	var _current_position = false;
	var _start_position = false;
	var _current_slide = false;
	var _pagination;
	var _prev_link;
	var _next_link;
	var _current;

	var _setLink = function(link, loc, pos) {
		if(loc) {
			YD.removeClass(link, 'disabled')
			link.setAttribute('href', loc);		
			link.setAttribute('rel', 'position-' + pos);		
		} else {			
			YD.addClass(link, 'disabled')
			link.removeAttribute('href');
			link.setAttribute('rel', 'position-false');		
		}		
	}
	
	var _updatePrevLink = function(loc, pos) {
		_setLink(_prev_link, loc, pos);
	};
	
	var _updateNextLink = function(loc, pos) {
		_setLink(_next_link, loc, pos);
	};

	var _updatePagination = function(obj) {
		_pagination.innerHTML = obj.pagination;
	}
	
	var _tweenSlide = function(obj) {
		var jump = (obj.position > (_current_position + 1) || obj.position < (_current_position - 1)) ? true : false;
		var end_x = -1 * ((obj.position - 1) * _slide_width);
		
		if(!jump) {
			var tween_conf = { 'left': { 'to': end_x }};
			var tween = new YAHOO.util.Anim(_slider, tween_conf, _tween_speed, YAHOO.util.Easing.easeOut);
			tween.animate(); 
		} else {
			var start_x = -1 * ((jump - _start_position) * _slide_width);
			YD.setStyle(_slider, 'left', start_x + 'px');

			var clone = _current_slide.cloneNode(true);
			_con.appendChild(clone);

			YD.setStyle(clone, 'width', _slide_width + 'px');
			YD.setStyle(clone, 'left', 0 + 'px');
			YD.setStyle(clone, 'opacity', 1);
			YD.setStyle(_slider, 'left', end_x + 'px');
			YD.setStyle(_slider, 'opacity', 0);

			var tween_in_conf = { 'opacity': { 'to': 1}};
			var tween_in = new YAHOO.util.Anim(_slider, tween_in_conf, _tween_speed, YAHOO.util.Easing.easeOut);

			var _removeElement = function() {
				var el = this.getEl(); 
				el.parentNode.removeChild(el);
			}

			var tween_out_conf = { 'opacity': { 'to': 0}};
			var tween_out = new YAHOO.util.Anim(clone, tween_out_conf, _tween_speed, YAHOO.util.Easing.easeOut);
			tween_out.onComplete.subscribe(_removeElement);

			tween_in.animate();
			tween_out.animate(); 
		}
		
		_current_position = obj.position;
		_current_slide = obj.slide;
		
		_updateNextLink(obj.next_link, (obj.position + 1));
		_updatePrevLink(obj.prev_link, (obj.position - 1));
	};
	
	var _insertSlide = function(html, position) {
		var ul = document.createElement('ul');
		ul.innerHTML = html;
		_slider.appendChild(ul);
		YD.setStyle(ul, 'top', '0px');
		var x = (position - 1) * _slide_width;
		YD.setStyle(ul, 'left', x + 'px');
		return ul;
	};
	
	var _getSlide = function(url) {
		var _loadSuccess = function(o) {
			if(o.responseText && o.responseText != "") {
				var json_str = o.responseText;
				var obj = YAHOO.lang.JSON.parse(json_str);

				var slide = _insertSlide(obj.markup, obj.position);
				obj.slide = slide;
				_memo[url] = obj;
				_tweenSlide(obj);
				_updatePagination(obj);
			}
		};

		var _callback = {
			success: _loadSuccess,
			failure: function() {},
			args: []
		};

		ajax_suffix = (url.indexOf('?') > -1) ? '&ajax=true' : '?ajax=true';
		var cObj = YAHOO.util.Connect.asyncRequest('GET', url + ajax_suffix, _callback);
	};
	
	var _clickAction = function(e) {
		var ev = YE.getEvent(e);
		var node = YE.getTarget(ev);
		YE.stopEvent(ev);

		if(node.nodeName.toLowerCase() == 'a' && node.getAttribute('href')) {
			var url = node.getAttribute('href');

			if(_memo[url]) {
				_updatePagination(_memo[url]);
				_tweenSlide(_memo[url]);
			} else {
				_getSlide(url);
			}		
		}
	};		
	
	this.init = function() {
		var ul = YS.query("div.gallery-nav ul[class!='gallery-pagination'][class!='next-previous'][class!='pageNum']");		
		
		if(ul[0]) {
			_current_slide = ul[0];
			
			var reg = /slide-width-([0-9]+)/i;
			_slide_width = reg.exec(_current_slide.className)[1];
					
			_con = document.createElement('div');
			YD.addClass(_con, 'slider-container');

			_slider = document.createElement('div');
			YD.addClass(_slider, 'slider-inner');
			
			YD.insertAfter(_con, YD.getPreviousSibling(_current_slide));
			_con.appendChild(_slider);
			_slider.appendChild(_current_slide);

			_pagination = YS.query('div.gallery-nav ul.gallery-pagination')[0];
			_prev_link = YS.query('div.gallery-nav p.prev-link a')[0];
			_next_link = YS.query('div.gallery-nav p.next-link a')[0];
			var current_link = YS.query('div.gallery-nav p.current-link a')[0];

			_start_url = current_link.getAttribute('href');
			_start_position = parseInt(current_link.getAttribute('rel').replace('position-', '')); 
			_current_position = _start_position;

			YD.setStyle(_slider, 'width', '10000px');
			YD.setStyle(_slider, 'left', (-1 * ((_start_position - 1) * _slide_width)) + 'px');
			YD.setStyle(_current_slide, 'left', ((_start_position - 1) * _slide_width) + 'px');
			
			_memo[_start_url] = {
				'position': _current_position,
				'next_link': _next_link.getAttribute('href'),
				'prev_link': _prev_link.getAttribute('href'),
				'slide': _current_slide,
				'pagination': _pagination.innerHTML
			};

			YE.on(_prev_link, 'click', _clickAction);
			YE.on(_next_link, 'click', _clickAction);
			YE.on(_pagination, 'click', _clickAction);
		}
	};

	UKTV.loader.registerObj(this);
};