/*!
	Copyright 2008 Whapps/ Online-Rewards
*/

var ORFormUtils = new Class
({
	getParams: function(location)
	{
		var self = this;
		
		var uri_hash = {};
	
		//alert('getting params from: ' + location);
	
		var uri_pairs = location.split("&");

		for (i = 0; i < uri_pairs.length; i++)
		{
			var uri_pair = uri_pairs[i].split("=");
			uri_hash[uri_pair[0]] = uri_pair[1];
		}
	
		return uri_hash;
	}
});
var FormUtils = new ORFormUtils();

/*
ORPager (Class)

Usage          : var pager = new ORPager({ current_page: 2, last_page: 12 });
Required Args  : current_page, last_page
Optional Args  : page_span 
                   the number of pages to show in the page navigation bar
	               defaults to 11
*/
var ORPager = new Class
({
	initialize: function(args) 
	{
		var self = this;
		
		self.current_page  = Number.toInt( args['current_page'] );
		self.first_page    = Number.toInt( 1 );
		self.last_page     = Number.toInt( args['last_page'] );
		self.page_span     = ( args['page_span'] ) ? Number.toInt( args['page_span'] ) : 11;
		self.previous_page = ( self.current_page > 1 ) ? ( self.current_page - 1 ) : 0;
		self.next_page     = ( self.current_page < self.last_page ) ? ( self.current_page + 1 ) : 0;

		// calculate the start and end pages for the page links

		var start_page = self.current_page - 5;
		if (start_page < 1)
			start_page = 1;

		var end_page = self.current_page + 5;
		if (end_page > self.last_page)
			end_page = self.last_page;

		var page_diff = end_page - start_page + 1;
		if (page_diff < self.page_span)
			end_page = end_page + (self.page_span - page_diff);

		if (end_page > self.last_page)
			end_page = self.last_page;

		page_diff = end_page - start_page + 1;
		if (page_diff < self.page_span)
			start_page = start_page - (self.page_span - page_diff);

		if (start_page < 1)
			start_page = 1;

		self.start_page = Number.toInt( start_page );
		self.end_page = Number.toInt( end_page );
	},
/*
refreshPagerBar (function)

Usage          : pager.refreshPagerBar:()
Args           : none
Returns        : null
*/
	refreshPagerBar: function()
	{
		var self = this;
		
		if ( self.last_page > 0 )
		{
			$('pager').setStyle('visibility', 'visible');
			
			// "First" page link
			$('pager_first').innerHTML = '<a href="#p=1" onclick="return paged_results.refreshResults(1)">&nbsp;First Page</a>';

			// "Last" page link
			$('pager_last').innerHTML = '<a href="#p=' + self.last_page
			+ '" onclick="return paged_results.refreshResults(' + self.last_page + ')">Last Page&nbsp;</a>';
			
			// "Previous" page
			if ( self.previous_page )
			{
				$('pager_prev').innerHTML = '<a href="#p=' + self.previous_page
				+ '" onclick="return paged_results.refreshResults(' + self.previous_page + ')">&lt;&lt;&nbsp;Previous</a>';
			}
			else
			{
				$('pager_prev').innerHTML = '';
			}
			
			// "Next" page
			if ( self.next_page )
			{
				$('pager_next').innerHTML = '<a href="#p=' + self.next_page
				+ '" onclick="return paged_results.refreshResults(' + self.next_page + ')">Next&nbsp;&gt;&gt;</a>';
			}
			else
			{
				$('pager_next').innerHTML = '';
			}
			
			// individual page links:
			
			var pages = '';
			
			if ( self.start_page > 1 )
				pages += '...&nbsp;';

			for ( var p = self.start_page; p <= self.end_page; p++ )
			{
				pages += '<a href="#p=' + p + '" onclick="return paged_results.refreshResults(' + p + ')"'

				if (p == self.current_page)
					pages += ' style="font-weight: bold;"';

				pages += '>' + p + '</a>&nbsp;';
			}

			if ( self.end_page < self.last_page )
				pages += '...&nbsp;';
			
			$('pager_pages').innerHTML = pages;
		}
	}
});

/*
ORBusy (Class)

Usage          : var busy = new ORBusy({ cursor_div_id: 'pager_bar' });
Required Args  : none
Optional Args  : cursor_div_id: 
                   The id of a div that will change the cursor to a 
                   "wait" status when busy is set to true.
*/
var ORBusy = new Class
({
	initialize: function(args)
	{
		var self = this;
		
		self.busy = false;
		
		if (args['cursor_div_id'])
			self.cursor_div_id = args['cursor_div_id'];
		else
			self.cursor_div_id = null;
			
		if (args['spinner_div_id'])
			self.spinner_div_id = args['spinner_div_id'];
		else
			self.spinner_div_id = null;
	},
/*
setBusy: (function)

Usage          : busy.setBusy(true)
Args           : boolean
Returns        : null
*/
	setBusy: function(busy)
	{
		var self = this;
		
		if (busy)
		{
			self.busy = true;
			
			if (self.cursor_div_id)
			{
				$(self.cursor_div_id).getElements('a').setStyle('cursor', 'wait');
				$(self.cursor_div_id).setStyle('cursor', 'wait');
			}
			
			if (self.spinner_div_id)
			{
				$(self.spinner_div_id).setStyle('display', 'block');
			}
		}
		else
		{
			self.busy = false;
			
			if (self.cursor_div_id)
			{
				$(self.cursor_div_id).getElements('a').setStyle('cursor', 'pointer');
				$(self.cursor_div_id).setStyle('cursor', 'default');
			}
			
			if (self.spinner_div_id)
			{
				$(self.spinner_div_id).setStyle('display', 'none');
			}
		}
	},
/*
setBusy: (function)

Usage          : busy.isBusy()
Args           : none
Returns        : boolean
                   true if the object is in "busy" mode

*/
	isBusy: function()
	{
		var self = this;
		
		if (self.busy)
			return true;
		else
			return false;
	}
});

// objects based on this class MUST be stored in a global variable called "paged_results"
var ORPagedResults = new Class
({
	initialize: function(args) 
	{
		var self = this;
		
		self.isFirstLoad = true;
		self.pageless = false;
		
		self.uri = args['uri'];
		self.busy = new ORBusy({ cursor_div_id: 'pager', spinner_div_id: 'search_spinner' });
	},
	initResults: function() 
	{
		var self = paged_results;
		
		try
		{
			// initialize the DHTML History framework
			dhtmlHistory.initialize();

			// subscribe to DHTML history change events
			dhtmlHistory.addListener(self.historyListener);
		
			var page = self.getPageFromLocation(dhtmlHistory.getCurrentHash());
		
			console.log('initializing - loading page ' + page);
		
			self.refreshResults(page);
		}
		catch(e)
		{
			console.log(e);
			
			self.busy.setBusy(false);
		}
		
		self.pageless = false;
	},
	historyListener: function(new_location, history_data) 
	{
		var self = paged_results;
		
		try
		{		
			var page;

			if ( history_data )
			{
				page = history_data['page'];
		
				console.log('history change - loading page (from history): ' + page);
			}
		
			if ( ! page )
			{
				page = self.getPageFromLocation(new_location);
			
				console.log('history change - loading page (from location): ' + page);
			}
		
			try
			{
				self.refreshResults(page);
			}
			catch (e)
			{
				console.log(e);
			
				self.busy.setBusy(false);
			}
			
			self.pageless = false;
		}
		catch (e)
		{
			console.log(e);
		}
	},
	getPageFromLocation: function(location)
	{
		var self = paged_results;
		
		var params = FormUtils.getParams(location);
		var page = params['p'];
		
		if ( ! $defined(page) )
		{
			page = 1;
			self.pageless = true;
			
			console.log('getting page from location - no page was defined, defaulting to page 1');
		}
		else
		{
			console.log('getting page from location - found page ' + page);
		}
		
		return page;
	},
	updateHistory: function(current_page)
	{
		var self = paged_results;
		
		var can_add = true;
		
		if ( window.gecko || window.ie )
		{
			if ( self.pageless )
				can_add = false;

			if ( self.isFirstLoad )
				can_add = false;
		}
		
		if ( can_add )
		{
			console.log("adding page to history: " + current_page);
			dhtmlHistory.add('p='+current_page, { page: current_page });
		}
		
		if ( self.isFirstLoad )
		{
			self.isFirstLoad = false;
		}
	},
	// must be overridden:
	refreshResults: Class.empty,
	createResult: Class.empty
});

var ORItemResults = ORPagedResults.extend
({
	refreshResults: function(current_page)
	{
		var self = this;
		
		if ( self.busy.isBusy() == false )
		{
			self.busy.setBusy(true);
			
			if ( (! $defined(current_page)) || (current_page == 0) )
				current_page = 1;
			
			self.updateHistory(current_page);
			
			new Ajax(self.uri,
			{
				method: 'post',
				data: 'current_page='+current_page,
				onComplete: function(json_object)
				{
					var results_div = $('search_results');

					try
					{
						var response = Json.evaluate(json_object, true);
						
						if ($defined(response))
						{
							console.log("refreshing results with page: " + current_page);
							
							var search, results;
							if (response.acinonyx)
							{
								search = response.acinonyx.search[0];
								results = search.results[0];
							}
							else
							{
								search = response.results;
								results = search;
							}

							var pager = new ORPager({
								current_page: search['@current_page'],
								last_page: search['@last_page']
							});

							pager.refreshPagerBar();

							results_div.innerHTML = '';

							if ( results.catalogitem )
							{
								for ( var i = 0; i < results.catalogitem.length; i++ )
								{
									var result_item = self.createResult(results.catalogitem[i]);
									result_item.injectInside(results_div);
									result_item.setStyles({ display: 'block' });
								}
							}
							else
							{
								results_div.innerHTML = 'Sorry, but no matches were found.';
							}
						}
						else
						{
							results_div.innerHTML = 'There was a problem completing your search. Please try again.';
						}
					}
					catch (e)
					{
						console.log(e);
						
						results_div.innerHTML = 'A problem was encountered during the request.'
						 	+ ' Please start a new search.'
							+ '<br/><br/>javascript error: ' + e;
					}
					finally
					{
						self.busy.setBusy(false);
					}
				},
				onFailure: function()
				{
					self.busy.setBusy(false);
				}
			}).request();
		}

		return;
	},
	createResult: function(result_data)
	{
		var self = this;
		
		var item_div = $('item_skeleton');

		var image_link = $('item_image_link');
		image_link.href = '/item/' + result_data['@catalogitemid'] + '/';
		image_link.innerHTML = '<img src="' + result_data['@thumburi'] + '"/>';

		var brand_link = $('item_brand_link');
		brand_link.href = '/brand/' + result_data['@brandid'] + '/';
		brand_link.innerHTML = result_data['@brandname'];

		var name_div = $('item_name');
		name_div.innerHTML = result_data['@name'];

		var points_div = $('item_points');
		if ( result_data['@is_master'] == 1 )
		{
			points_div.innerHTML = 'View Item for Price';
		}
		else
		{
			points_div.innerHTML = result_data['@points'];
		}

		var item_link = $('item_text_link');
		item_link.href = '/item/' + result_data['@catalogitemid'] + '/';

		var result_item = item_div.safeClone();
		
		return result_item;
	}
});

var ORDynamicItem = new Class
({
	initialize: function(args) 
	{
		var self = this;
		
		self.uri = '/dynamic-item/';
		self.busy = new ORBusy({ cursor_div_id: 'dynamic_item_box' });
		self.last_id = 0;
		self.featured = 0;
	},
	refreshDynamicItem: function()
	{
		var self = this;
		
		if ( self.busy.isBusy() == false )
		{
			self.busy.setBusy(true);

			var heading_div = $('dynamic_item_heading');
			var thumb_div   = $('dynamic_item_thumb');
			var name_div    = $('dynamic_item_name');
			var links_div   = $('dynamic_item_links');

			new Ajax(self.uri, 
			{
				method: 'post',
				data: 'last_id=' + self.last_id + '&featured=' + self.featured,
				onComplete: function(json_object)
				{
					try
					{
						var response = Json.evaluate(json_object, true);
						
						if ($defined(response))
						{
							// add the header based on the type
							if (response.type == 'wishlist')
							{
								heading_div.innerHTML = '<img src="/images/buttons/wishlist_item.jpg" alt="Wishlist Item"/>';
							}
							else
							{
								self.featured = 1;
								heading_div.innerHTML = '<img src="/images/buttons/featured_item.jpg" alt="Featured Item"/>';
							}

							// update the image
							thumb_div.innerHTML = '<a href="' + '/item/' + response.catalogitemid + '/">'
								+ '<img src="' + response.thumburi + '"/>'
								+ '</a>';
								
							// update the item name
							name_div.innerHTML = response.name;

							// update the navigation links
							links_div.innerHTML = 
								'<a href="/item/' + response.catalogitemid + '/" style="text-decoration: underline;">View Item</a>'
								+ ' | <a href="#" onclick="dynamic_item.refreshDynamicItem()" style="text-decoration: underline;">Next Item</a>';

							// store the last item that was looked at
							self.last_id = response.catalogitemid;
						}
					}
					catch (e)
					{
						console.log(e);
					}
					finally
					{
						self.busy.setBusy(false);
					}
				},
				onFailure: function()
				{
					self.busy.setBusy(false);
				}
			}).request();
		}

		return;
	}
});

var ORValidator = new Class
({

});

var ORRegister = ORValidator.extend
({
	checkUsername: function()
	{
		var checkuser = $('username').value;
		var checkbox  = $('checkbox');
		
		if (checkuser != '')
		{
			var myAjax = new Ajax('/check-username/', 
			{
				method: 'post',
				data: 'username='+encodeURI(checkuser),
				onComplete: function(json_object)
				{
					var response = Json.evaluate(json_object, true);

					if ( (! $defined(response)) || ($defined(response.exception)) )
					{
						checkbox.innerHTML = '';
					}
					else if (response.username_check['@available'] == '1')
					{
						checkbox.innerHTML = 'Available';
						checkbox.style.color = 'green';
					}          
					else
					{
						checkbox.innerHTML = 'Not available';
						checkbox.style.color = 'red';
					}
				}
			}).request();
		}
		else
		{
			checkbox.innerHTML = '';
		}
	}
});

/* 
	Extend core Element functionality
*/
Element.extend // will be ".implement" in mootools 1.2
({
/*
safeClone: (function)

Usage          : var clone = element.safeClone()
Args           : none
Returns        : the cloned element
                   all ids of the clone will be removed
*/
	safeClone: function()	
	{
		var teh_clone = this.cloneNode(true);
		teh_clone.removeIds();
		return teh_clone;
	},
	removeIds: function(teh_element)
	{
		if ( ! $defined(teh_element) )
		{
			teh_element = this;
		}
		
		if ( teh_element.id )
		{
			//console.log('removing id: ' + teh_element.id);
			teh_element.id = '';
		}
		
		for ( var i = 0; i < teh_element.childNodes.length; i++ )
		{
			this.removeIds(teh_element.childNodes[i]);
	    }
	}
});
