var WatchListBuilder = Class.create();

WatchListBuilder.prototype = 
{
	panelId: '',
	messageId: 'watchlistBuilderMessage',
	listId: 'watchlistBuilderList',
	nameId: 'watchlistBuilderName',

	initialize: function(panelId, returnUrl)
	{
		this.relativeReturnUrl = returnUrl;
		this.panelId = panelId;
		this.id = null;
		
		//Event.observe(window, 'load', this.onLoad.bindAsEventListener(this));
		this.onLoad();
	},

	checkboxes: function()
	{
		return $$('input[type="checkbox"].checkSelected, input[type="checkbox"].checkSelectAll');
	},

	onLoad: function()
	{
		var ckbs = this.checkboxes();
		for (var i = 0; i < ckbs.length; ++i)
			Event.observe(ckbs[i], 'click', this.clicked.bindAsEventListener(this));
	},

	clicked: function(e)
	{
		this.id = null;
		var checked = false;
		var ckbs = this.checkboxes();
		for (var i = 0; i < ckbs.length && !checked; ++i)
			checked = ckbs[i].checked;
		if(checked)
			this.show(Position.positionedOffset(Event.element(e)));
		else
			this.hide();
	},
	
	add: function(id, element)
	{
		this.deselectAll();
		this.id = id;
		this.show(Position.positionedOffset(element));
	},

	show: function(pos)
	{
		var panel = $(this.panelId);
		panel.style.left = '' + (pos[0] + 20) + 'px';
		panel.style.top = '' + (pos[1] ) + 'px';
		
		if(!panel.visible())
		{
			if($(this.messageId))
				$(this.messageId).hide();
			
			if(!panel.visible())
				Effect.Grow(this.panelId, {
					duration:0.2,
					scaleContents:false,
					queue: 'wlb',
					afterFinish: function()
					{
						this.textBlur();
					}.bind(this)
				});	
				
			this.refreshWatchLists();
		}
	},

	hide: function()
	{
		Effect.Shrink(this.panelId, {duration:0.2, scaleContents:false, queue: 'wlb'});
	},
	
	refreshWatchLists: function()
	{
		if($(this.listId))
		{
			$(this.messageId).hide();
			if( this.isAnonymous != 0 )
			{
				$(this.listId).update('<table style="margin-top:8px;width:100%;background:white;border:solid 1px #CC9966;"><tr><td style="padding:5px;width:24px;"><img src="/img/wait.gif" alt="" /></td><td>' + 'Updating symbol lists...' + '</td></tr><table>');
				new Ajax.Updater(this.listId, '/Gallery/Default.aspx/Watchlists');
			}
		}
	},
	
	textBlur: function()
	{
		var ctrl = $(this.nameId);
		if(ctrl && ctrl.value == '')
		{
			ctrl.value = 'Type the name of the new symbol list here';
			ctrl.style.color = '#c0c0c0';
		}
	},
	
	textFocus: function()
	{
		var ctrl = $(this.nameId);
		if(ctrl.value == 'Type the name of the new symbol list here')
		{
			ctrl.value = '';
			ctrl.style.color = 'black';
		}
	},

	newWatchList: function(wlname)
	{
		if(wlname == 'Type the name of the new symbol list here')
			return;
			
		new Ajax.Request(
			'/Gallery/Default.aspx/NewWatchList', { 
			parameters: { 
				name: wlname,
				iids: this.getSelectedIds()
			},
			onSuccess: function(transport)
			{
				var obj = transport.responseText.evalJSON();
				var message = $(this.messageId);

				if(obj.success)
				{
					this.deselectAll();
					this.hide();
				}
				else
				{
					switch(obj.error)
					{
						case 'unknown':
							message.update('Add failed, unknown error.');
							break;

						case 'name':
							message.update('Add failed, invalid name.');
							break;

						case 'limit':
							message.update('Not enough space left to add the symbol list.');
							break;
					}
					
					if(!message.visible())
						message.show();
				}

			}.bind(this)
		});
	},

	addToWatchList: function(wlid)
	{
		new Ajax.Request('/Gallery/Default.aspx/AppendToWatchList', { 
			parameters: { 
				wid: wlid, 
				iids: this.getSelectedIds()
			}, 
			onSuccess: function(transport) {
				var obj = transport.responseText.evalJSON();
				var message = $(this.messageId);

				if(obj.success)
				{
					this.deselectAll();
					this.hide();
				}
				else
				{
					switch(obj.error)
					{
						case 'unknown':
							message.update('Add failed, unknown error.');
							break;

						case 'limit':
							message.update('Not enough space left to add the symbol.');
							break;
					}
					
					if(!message.visible())
						message.show();
				}
			}.bind(this)
		});
	},

	getSelectedIds: function()
	{
		var result = '';
		if(this.id == null)
		{
			var ckbs = this.checkboxes();
			for (var i = 0; i < ckbs.length; ++i)
			{
				if(ckbs[i].checked)
				{
					if(result != '')
						result += ',';
					result += ckbs[i].value.toString();
				}
			}
		}
		else
		{
			result += this.id;
		}
		return result;
	},
	
	deselectAll: function()
	{
		var ckbs = this.checkboxes();
		for (var i = 0; i < ckbs.length; ++i)
			if(ckbs[i].checked)
				ckbs[i].checked = false;
	}
}
