Yourchance.namespace('Yourchance.Tags');

var a, b, c, d, e;

Yourchance.Tags.Box = Class.create({
	
	domElement: null,
	
	options: {},
	
	container: null,
	
	inProgress: false,
	
	initialize: function(element, config) {
		this.domElement = $(element);
		if(this.domElement !== null) {
			this.options = Object.extend(this.options, config);
			this.container = this.domElement.down('div.box-content');
			this.initPager();
		}
	},
	
	initPager: function() {
		this.container.select('.js-box-pager li a')
			.each(function(a) {
				var entry = lib.Helper.extractObject(a.href);
				if (entry && entry.href) {
					a.writeAttribute('href', entry.href);
				}
			})
			.invoke('observe', 'click', function(event) {
				event.stop();
				var a = event.findElement('a');
				this.setContentFromUrl(a.href);
			}.bind(this));
	},
	
	setContentFromUrl: function(url) {
		if (this.inProgress === true) {
			return;
		}
		
		this.inProgress = true;
		
		var ajaxRequest = new Ajax.Request(url, {
			method: "get",
			requestHeaders: {x_yourchance_box_ajax_updater_mode: 'content'},
			onComplete: function(transport) {
				var oldNode = this.container;
				this.container.insert({after: transport.responseText});
				this.container = this.container.next();
				oldNode.remove();
				this.initPager();
				this.inProgress = false;
				modules.Master.registerGlobalEvents();
				modules.Master.loadInlineScriptTags(transport.responseText, this.container);
			}.bind(this)
		});
	}
});


Yourchance.Tags.TabBox = Class.create({
	
	domElement: null,
	
	options: {},
	
	tabs: [],
	
	activeTab: null,
	
	lastActiveTab: null,
	
	inProgress: false,
	
	initialize: function(element, config) {
		this.domElement = $(element);
		this.options = Object.extend(this.options, config);
		this.tabs = [];
		this.lastActiveTab = null;
		this.activeTab = null;
		
		var tabElements = this.domElement.select(".tag-box-tabs-" + this.domElement.id + " li")
		var tabContents = this.domElement.select(".ui-box-tab-content-" + this.domElement.id);
		
		if (tabElements.length != tabContents.length) {
		//	throw 'Tab label count and tab content count must be equal';
			return;
		}
		
		tabElements.each(function(element, i) {
			var tabOptions = this.options.tabOptions[i] || null;
			
			if (tabOptions && tabOptions.js === true) {
				var a = element.down('a');
				var active = element.hasClassName('active');
				
				var entry = lib.Helper.extractObject(a.href);
				if (entry.href) {
					a.writeAttribute('href', entry.href);
				}
				
				var tab = {
					active: active,
					label: element,
					link: a,
					content: tabContents[i]
				};
				
				element.observe('click', this.handleTabClickEvent.bindAsEventListener(this, tab));
				
				this.tabs.push(tab);
				
				if (active) {
					this.lastActiveTab = tab;
					this.activeTab = tab;
					if(tabOptions.pager === true) {
						this.initPager(tab);
					}
				}
			}
		}, this);
		
		tabContents = null;
		tabElements = null;
	},
	
	handleTabClickEvent: function(event, tab) {
		event.stop();

		if ((typeof tab.link.confirm != 'undefined') && (tab.link.confirm == true) && (typeof tab.link.confirmFunction == 'function')) {
			var c = tab.link.confirmFunction();
			if (!c) {
				tab.link.blur();
				return false;
			}
		}

		var retrieveContentFromUrl = true;
		retrieveContentFromUrl = retrieveContentFromUrl && tab.content.down() == null;
		retrieveContentFromUrl = retrieveContentFromUrl && tab.link.href;
		
		this.container = tab.content;
		
		if (retrieveContentFromUrl) {
			this.setContentFromUrl(tab.link.href, tab);
		} else {
			this.enableTab(tab)
		}
	},
	
	enableTab: function(tabToActivate) {
		
		this.activeTab = tabToActivate;
		
		if (this.lastActiveTab && this.lastActiveTab != this.activeTab) {
			this.lastActiveTab.content.hide();
			this.lastActiveTab = tabToActivate;
		}
		
		this.tabs.each(function(tab) {
			tab.label.removeClassName("active");
			tab.label.removeClassName("first-active");
			tab.label.removeClassName("last-active");
			tab.label.removeClassName("before-active");
		});
		
		this.tabs.each(function(tab, i) {
			
			if (tab.label == tabToActivate.label) {
				tab.content.show();
				tab.label.addClassName("active");
				
				if (i > 0) {
					this.tabs[i-1].label.addClassName("before-active");
				}
				
				if (this.tabs.first() == tab) {
					tab.label.addClassName("first-active");
				}
				
				if (this.tabs.last() == tab) {
					tab.label.addClassName("last-active");
				}
				
			} else {
				tab.content.hide();
			}
		}, this);
		
	},
	
	setContentFromUrl: function(url, tab, events) {
		
		if (this.inProgress === true) {
			return;
		}
		
		this.inProgress = true;

		var events = events || {};
		var ajaxRequest = new Ajax.Request(url, {
			method: "get",
			requestHeaders: {x_yourchance_box_ajax_updater_mode: 'content'},
			onComplete: function(transport) {
				var oldNode = tab.content;
				tab.content.insert({after: transport.responseText});
				tab.content = tab.content.next();
				oldNode.remove();
				if (typeof events.onComplete == 'function') {
					events.onComplete.call(this);
				}
				this.enableTab(tab);
				this.initPager(tab);
				this.inProgress = false;
				modules.Master.registerGlobalEvents();
				modules.Master.loadInlineScriptTags(transport.responseText, tab.content);
			}.bind(this),
			onException: function() {
				Logger.warn(arguments);
			}
		});
	},
	
	initPager: function(tab) {
		
		tab.content.select('.js-box-pager li a').each(function(a) {
			var entry = lib.Helper.extractObject(a.href);
			if (entry && entry.href) {
				a.writeAttribute('href', entry.href);
			}
		}).invoke('observe', 'click', function(event) {
			event.stop();
			var a = event.findElement('a');
			this.setContentFromUrl(a.href, tab);
		}.bind(this));
	}
});