var Cookies = Class.create( {
	initialize : function(path, domain) {
		this.path = path || '/';
		this.domain = domain || null;
	},

	// Returns a cookie value or false
	get : function(key) {
		var keyEquals = key + "=";
		var value = false;
		document.cookie.split(';').invoke('strip').each(function(s) {
			if (s.startsWith(keyEquals)) {
				value = unescape(s.substring(keyEquals.length, s.length));
				throw $break;
			}
		});
		return value;
	},

	set : function(key, value, days) {
		if (typeof key != 'string') {
			throw "Invalid key";
		}
		if (typeof value != 'string' && typeof value != 'number') {
			throw "Invalid value";
		}
		if (days && typeof days != 'number') {
			throw "Invalid expiration time";
		}
		var setValue = key + '=' + escape(new String(value));
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days * 86400000));
			var setExpiration = "; expires=" + date.toGMTString();
		} else
			var setExpiration = "";
		var setPath = '; path=' + escape(this.path);
		var setDomain = (this.domain) ? '; domain=' + escape(this.domain) : '';
		var cookieString = setValue + setExpiration + setPath + setDomain;
		document.cookie = cookieString;
	}
});

var Recommendation = Class.create( {

	initialize : function(userid, cookiename, user2sessionUrl, controlGroupUrl, context) {
		this.userid = userid;
		this.cookiename = cookiename;
		this.user2sessionUrl = user2sessionUrl;
		this.controlGroupUrl = controlGroupUrl;
		this.context = context;
		if ((element = $('products'))) element.setStyle('display: none');
	},

	detailview : function(url) {
		this.ensureControlGroup(this.doDetailviewRequest, url);
	},

	basketview : function(url) {
		this.ensureControlGroup(this.doBasketViewRequest, url);
	},

	ensureControlGroup : function(finalMethod, finalUrl) {
		this.controlGroupId = new Cookies().get(this.cookiename);
		var user2sessionUrl = this.user2sessionUrl;
		if(typeof this.controlGroupId != 'string') 	{
			new Ajax.Request(user2sessionUrl, {
				method : 'get',
				onComplete : function() {
					this.doControlgroupRequest(finalMethod, finalUrl);
				}.bind(this)
			});
		} else {
			finalMethod.apply(this, [finalUrl]);
		}
	},

	doDetailviewRequest : function(url) {
		if (this.controlGroupId != "0") {
			$('products').setStyle('display: block');
			return;
		};

		// we need this variable in local scope
		var context = this.context;

		new Ajax.Request(url, {
			method : 'get',
			onSuccess : function(transport) {
				var element = $("recommendationlist");
				var html = "";
				transport.responseJSON.each(function(item, n) {
					if (n > 3) throw $break;
					var url = (item.URL.match(/^http/) != null) ? item.URL : context + item.URL;
					html += "<li><a href=\""+ url +"\"><img src=\"" + item.imageURL + "\"/></a></li>";
				}.bind(this));
				element.update(html);
				$('recommendations').setStyle({display: 'block', visibility: 'visible'});
				$('products').setStyle({display: 'none', visibility: 'hidden'});
				$('compactDirectory').setStyle({display: 'none', visibility: 'hidden'});
			},
			onFailure : function() {
				$('products').setStyle({display: 'block', visibility: 'visible'});
				$('compactDirectory').setStyle({display: 'block', visibility: 'visible'});
				$('recommendations').setStyle({display: 'none', visibility:'hidden'});
			}
		});
	},

	doBasketViewRequest : function(url) {

		new Ajax.Request(url, {
			method : 'get',
			onSuccess : function(transport) {
				var element = $("overlay-recommendationlist");
				var html = "";
				if (transport.responseJSON.size()>0) {
					transport.responseJSON.each(function(item, n) {
						if (n > 2) throw $break;
						html += "<div class=\"recBasketResult\">";
						html += "	<a href=\""+item.URL+"\"><img src=\"" + item.imageURL + "\"/></a>";
						html += "	<span class=\"productname\">" + item.name + "&nbsp;</span>";
						html += "	<span class=\"textdeco\">" + item.param1 + "&#8364;&nbsp;</span>";
						html += "	<span class=\"new\">" + item.param2 + "&#8364;*&nbsp;</span>";
						html += "</div>";
					});
					element.update(html);
					$("overlay-recommendations").setStyle("display:block");
				}
			}
		});
	},


	doControlgroupRequest : function(finalMethod, finalUrl) {
		new Ajax.Request(this.controlGroupUrl, {
			method : 'get',
			onComplete : function(transport) {
				this.controlGroupId = transport.responseText;
				if(this.controlGroupId != '0' && this.controlGroupId != '1') {
					this.controlGroupId = '1';
				}
				var c = new Cookies();
				c.set(this.cookiename, this.controlGroupId, 0);

				finalMethod.apply(this, [finalUrl]);
			}.bind(this)
		});
	},

	basket : function(url) {
		this.ensureControlGroup(this.doBasketRequest, url);
	},

	doBasketRequest : function(url) {
		new Ajax.Request(url, { method : 'get' });
	},

	order : function(url) {
		this.ensureControlGroup(this.doOrderRequest, url);
	},

	doOrderRequest : function(url) {
		new Ajax.Request(url, { method : 'get' });
	},

	soldOut : function(url) {
		this.ensureControlGroup(this.doSoldOutRequest, url);
	},

	doSoldOutRequest : function(url) {
		new Ajax.Request(url, { method : 'get' });
	}
});