var ProductLinkCreator = Class.create({
	initialize: function() {
		this.delay = null;
		this.options = Object.extend({
			offsetX: 12,
			offsetY: 12,
			delay: 0.5
		}, arguments[0] || {});
	},
	
	mark: function(node, text) {
		if ($('plcinfolayer')) {
			this.infolayer = $('plcinfolayer');
		} else {
			this.infolayer = $(document.body.appendChild(document.createElement('div')));
			this.infolayer.hide();
			this.infolayer.id = 'plcinfolayer';
			this.infolayer.style.position = 'absolute';
			this.infolayer.style.zIndex = 50000;
		}
		if (Prototype.Browser.IE) {
			if (node.parentNode.nodeName.toUpperCase() == 'A') {
				node.parentNode.onmouseover = function(event) {
					ProductLinkCreator.plc.popup(this, event || window.event);
				};
				node.parentNode.onmouseout = function(event) {
					ProductLinkCreator.plc.popdown(this, event || window.event);
				};
			} else {
				var r = document.body.createTextRange();
				r.moveToElementText(node.parentNode);
				while (r.findText(text)) {
					r.pasteHTML('<a href="/shop/produkte/detail/index.html?t_ProduktNr=' + r.text.strip().replace(/\s/, '') + '" onmouseover="plc.popup(this, event || window.event);" onmouseout="plc.popdown(this, event || window.event);" onclick="return plc.go_to(this, event || window.event);">' +  r.text + '<\/a>');
					r.collapse(false);
				}
			}
		} else {
			if (node.parentNode.nodeName.toUpperCase() == 'A') {
				node.parentNode.onmouseover = function(event) {
					ProductLinkCreator.plc.popup(this, event || window.event);
				};
				node.parentNode.onmouseout = function(event) {
					ProductLinkCreator.plc.popdown(this, event || window.event);
				};
			} else {
				var pos, skip, anode, middlebit, endbit, middleclone;
				skip = 0;
				pos = node.data.toUpperCase().indexOf(text);
				if (pos >= 0) {
					anode = document.createElement('a');
					anode.onmouseover = plc.popup.curry(anode).bindAsEventListener(plc);
					anode.onmouseout = plc.popdown.curry(anode).bindAsEventListener(plc);
					anode.click = plc.go_to.curry(anode).bindAsEventListener(plc);
					middlebit = node.splitText(pos);
					endbit = middlebit.splitText(text.length);
					middleclone = middlebit.cloneNode(true);
					anode.appendChild(middleclone);
					anode.href = '/shop/produkte/detail/index.html?t_ProduktNr=' + middleclone.nodeValue.strip().replace(/\s/, '');
					middlebit.parentNode.replaceChild(anode, middlebit);
					skip = 1;
				}
			}
		}
	},
	
	go_to: function(a, event) {
		document.location.href = '/shop/produkte/detail/index.html?t_ProduktNr=' + a.innerHTML.replace(/\s/, '');
	},
	
	popup: function(a, event) {
		try {
			this.infolayer.style.left = Event.pointerX(event) + this.options.offsetX + 'px';
			this.infolayer.style.top = Event.pointerY(event) + this.options.offsetY + 'px';
			new Ajax.Request('/ajax/productlink/index.html?t_ProduktNr=' +  a.innerHTML.replace(/\s/, ''), {
				onSuccess: function(tp) {
					var data = tp.responseText;
					var wert = data.split("§");
					this.infolayer.innerHTML = '<table border="0" cellpadding="0" cellspacing="0"><tr><td style="line-height: 1px;"><img class="box_topleft" src="/images/tp.gif" /></td><td style="line-height: 1px;" class="box_topmid"></td><td style="line-height: 1px;"><img class="box_topright" src="/images/tp.gif" /></td></tr><tr><td class="box_left"></td><td><div class="panel_inner_1" style="background-color: #fff;"><table width="" border="0" cellpadding="0" cellspacing="0"><tr><td rowspan="2" ><img src="/i2cmsdata/brw/images50x50/' + wert[0] + '" border="0" style="margin-right:8px;" class="pic"/></td><td><strong>' + a.innerHTML + '</strong></td></tr><tr><td style="font-size:10px">' + wert[1] + '</td></tr></table></div></td><td class="box_right"></td></tr><tr><td style="line-height: 1px;"><img class="box_botleft" src="/images/tp.gif" /></td><td style="line-height: 1px;" class="box_botmid"></td><td style="line-height: 1px;"><img class="box_botright"src="/images/tp.gif" /></td></tr></table>';
				}.bind(this)
			});
		
			this.delay = function() {
				this.infolayer.show();
				if (document.viewport.getWidth() + document.viewport.getScrollOffsets().left < this.infolayer.cumulativeOffset().left + this.infolayer.offsetWidth) {
					this.infolayer.style.left = (parseInt(this.infolayer.style.left, 10) - (this.infolayer.offsetWidth + 4 * this.options.offsetX)) + 'px';
				}
			}.bind(this).delay(this.options.delay);
		} catch (e) {
			console.log(e);
		}
	},
	
	popdown: function(a, event) {
		clearTimeout(this.delay);
		this.infolayer.hide();
	},
	
	findRecursive: function(node) {
		var results = [];
		var child, i = 0;
		while (child = node.childNodes[i++]) {
			if (child.nodeType == 3) {
				results[results.length] = child;
			} else if (child.nodeType == 1) {
				var subresults = this.findRecursive(child);
				var subresult, j = 0;
				while (subresult = subresults[j++]) {
					results[results.length] = subresult;
				}
			}
		}
		
		return results;
	},
	
	findByClassName: function(clazz) {
		var productlinks = [];
		var rx = [];
		rx[0] = /\s[0-9][0-9][0-9]\s?[0-9][0-9][0-9]\s/g;
		rx[1] = /^[0-9][0-9][0-9]\s?[0-9][0-9][0-9]\s/g;
		rx[2] = /\s[0-9][0-9][0-9]\s?[0-9][0-9][0-9]$/g;
		rx[3] = /^[0-9][0-9][0-9]\s?[0-9][0-9][0-9]$/g;
		rx[4] = /\s[0-9][0-9][0-9]\s?[0-9][0-9][0-9]\.[0-9][0-9][0-9][0-9]\s/g;
		rx[5] = /^[0-9][0-9][0-9]\s?[0-9][0-9][0-9]\.[0-9][0-9][0-9][0-9]\s/g;
		rx[6] = /\s[0-9][0-9][0-9]\s?[0-9][0-9][0-9]\.[0-9][0-9][0-9][0-9]$/g;
		rx[7] = /^[0-9][0-9][0-9]\s?[0-9][0-9][0-9]\.[0-9][0-9][0-9][0-9]$/g;
		$$('.' + clazz).each(function(element) {
			var node, i = 0;
			var matchables = this.findRecursive(element);
			while (node = matchables[i++]) {
				for (x=0; x < rx.length; x++) {
					var match, j = 0, matches = node.nodeValue.match(rx[x]);
					if (matches) while (match = matches[j++]) {
						productlinks[productlinks.length] = [node, match.strip()];
					}
				}
			}
		}.bind(this));
		
		this.validateAndMark(productlinks);
	},
	
	validateAndMark: function(productlinks) {
		var link, i = 0, products = [];
		while (link = productlinks[i++]) products[products.length] = link[1].replace(/\s/, '');
		if ( products.length > 0 ) {
			new Ajax.Request('/ajax/validateproducts/index.html?t_Products=' + products.join(','), {
				onSuccess: function(tp) {
					var data = tp.responseText.evalJSON();
					var i = 0;
					while (link = productlinks[i++]) {
						if (data[link[1].replace(/\s/, '')]) {
							this.mark(link[0], link[1]);
						}
					}
				}.bind(this)
			});
		}
	}
});

var plc = new ProductLinkCreator();
ProductLinkCreator.plc = plc;
Event.observe(document, 'dom:loaded', plc.findByClassName.curry('productLinks').bind(plc));
