/* framework.js
	(c) Polynorm Software AG ( nicolas.keller@polynorm.ch, marcel.tschopp@polynorm.ch )
*/

/*********************************
 *********************************
 ******* HELPER FUNCTIONS ********
 *********************************
 *********************************/

var CursorExchanger = Class.create();
Object.extend(CursorExchanger.prototype, {
	initialize: function() {
		this.isset = false;
		try {
			if (document.styleSheets[0].imports) {
				this.crossrule = document.styleSheets[0].imports[0];
			} else {
				if (document.styleSheets[0]) {
					this.crossrule = document.styleSheets[0];
				} else {
					this.crossrule = false;
				}

				if (this.crossrule.cssRules && this.crossrule.cssRules[0].styleSheet) {
					this.crossrule = this.crossrule.cssRules[0].styleSheet;
				}
			}
		} catch (e) {
			this.crossrule = false;
		}
	},

	setCursor: function(cursor) {
		if (this.crossrule) {
			if (this.isset) this.resetCursor();
			this.isset = true;
			if (this.crossrule.addRule) {
				this.crossrule.addRule('*', 'cursor: ' + cursor);
			} else if (this.crossrule.insertRule) {
				this.crossrule.insertRule('* {cursor: ' + cursor + '}', 0);
			}
		}
	},

	resetCursor: function() {
		if (this.crossrule && this.isset) {
			this.isset = false;
			if (this.crossrule.deleteRule) {
				this.crossrule.deleteRule(0);
			} else if (this.crossrule.removeRule) {
				this.crossrule.removeRule(this.crossrule.rules.length - 1);
			}
		}
	}
});

var cursorExchanger = new CursorExchanger();

Ajax.Responders.register({
	onCreate: function() {
		cursorExchanger.setCursor('progress');
	},

	onComplete: function() {
		cursorExchanger.resetCursor();
	}
});

Element.addMethods({
	popup: function(element, param, onFinish) {
		//$$('select').invoke('hide');
		element = $(element);
		if (element.getAttribute('src')) {
			var src = element.getAttribute('src');
			if (param) src += param;
			new Ajax.Updater(element, src, {
				evalScripts: true,
				parameters: arguments[1] || {},
				onComplete: function() {
					element.show();
					element.center();
					if (onFinish) onFinish();
				}
			});
		} else {
			element.show();
			element.center();
			if (onFinish) onFinish();
		}
	},

	center: function(element) {
		element = $(element);
		element.absolutize();
		var img = element.down('#artimg');
		if (img) {
			if (!img.loaded) {
				element.center.bind(element).delay(0.1);
			}
		}
		var center = arguments.length > 1 ? arguments[1] : true;
		var d = element.getDimensions();
		var offset = document.viewport.getScrollOffsets();
		var left = parseInt((document.viewport.getWidth() - d.width) / 2, 10) + offset.left;
		element.setStyle({ 'left' : left + 'px'});
		if (center) {
			var top = parseInt((document.viewport.getHeight() - d.height) / 2, 10) + offset.top;
			if ( top < 40 ) top = 40;
			element.setStyle({ 'top' : top + 'px'});
		}
	},

	getParent: function(element, n) {
		element = $(element);
		while (element.parentNode && n > 0) {
			element = element.parentNode;
			n--;
		}

		return element;
	}

});

var ActionInput = Class.create();
Object.extend(ActionInput.prototype, {
	initialize: function(element, options) {
		this.element = $(element);
		this.element.ai = this;
		this.options = {
			onEnter: Prototype.emptyFunction,
			onUp: Prototype.emptyFunction,
			onDown: Prototype.emptyFunction
		};
		Object.extend(this.options, options || {});

		this.keys = {
			13:  'onEnter',
			38:  'onUp',
			40:  'onDown',
			43:  'onPlus',
			107: 'onPlus',
			45:  'onMinus',
			109: 'onMinus'
		};

		if (Prototype.Browser.IE) {
			this.element.observe('keydown', this.keypress.bindAsEventListener(this));
		} else {
			this.element.observe('keypress', this.keypress.bindAsEventListener(this));
		}
		//Event.observe(window, 'unload', this.destroy.bind(this));
	},


	keypress: function(event) {
		var key = event.keyCode || event.charCode;
		if (this.keys[key]) {
			if (typeof this.keys[key] == 'function') {
				this.keys[key](event);
			} else {
				if (this.options[this.keys[key]]) {
					this.options[this.keys[key]](event);
				}
			}
			Event.stop(event);
		}
	},

	destroy: function() {
		this.element.ai = null;
	}
});

var CountingInput = Class.create(ActionInput, {
	initialize: function($super, element) {
		var options = {
			step: 1,
			min: 0,
			max: false,
			onUp: this.up.bindAsEventListener(this),
			onDown: this.down.bindAsEventListener(this)
		};
		Object.extend(options, arguments[2] || {});
		$super(element, options);
	},

	down: function(event) {
		if (this.options.min !== false) {
			this.element.value = Math.max(parseInt(this.getValue(), 10) - this.options.step, this.options.min);
		} else {
			this.element.value = parseInt(this.getValue(), 10) - this.options.step;
		}
	},

	up: function(event) {
		if (this.options.max !== false) {
			this.element.value = Math.min(parseInt(this.getValue(), 10) + this.options.step, this.options.max);
		} else {
			this.element.value = parseInt(this.getValue(), 10) + this.options.step;
		}
	},

	getValue: function() {
		var value = parseInt(this.element.value, 10);
		if (isNaN(value)) return 0;
		return value;
	}
});

var NiceCheckbox = Class.create();
Object.extend(NiceCheckbox.prototype, {
	initialize: function(element) {
		element = (typeof element == 'string') ? document.getElementById(element) : element;
		if (element.nicer) return false;
		this.element = element;
		this.element.nicer = this;
		this.options = Object.extend({
			imgUnchecked: '/images/shop/btn_check.gif',
			imgChecked: '/images/shop/btn_check_on.gif',
			imgUncheckedOver: '/images/shop/btn_check_over.gif',
			imgCheckedOver: '/images/shop/btn_check_on.gif'
		}, arguments[1] || {});

		this.input = $(document.createElement('img'));
		this.input.title = this.element.title;
		var id = this.element.id; this.element.id = ''; this.input.id = id;
		if (this.element.checked) {
			this.input.src = this.options.imgChecked;
		} else {
			this.input.src = this.options.imgUnchecked;
		}
		this.element.parentNode.insertBefore(this.input, this.element);
		this.element.style.display = 'none';

		this.input.observe('mouseover', this.over.bindAsEventListener(this));
		this.input.observe('mouseout', this.out.bindAsEventListener(this));
		this.input.observe('click', this.toggle.bindAsEventListener(this));
		this.input.check = this.check.bind(this);
		this.input.uncheck = this.uncheck.bind(this);
		this.input.toggle = this.toggle.bind(this);
		this.element.check = this.check.bind(this);
		this.element.uncheck = this.uncheck.bind(this);
		this.element.toggle = this.toggle.bind(this);

		return true;
	},

	destroy: function() {
		this.input.check     = null;
		this.input.uncheck   = null;
		this.input.toggle    = null;
		this.element.check   = null;
		this.element.uncheck = null;
		this.element.toggle  = null;
		this.element.nicer   = null;
	},

	check: function(event) {
		if (this.element.checked) return;
		this.element.checked = true;

		if (this.input.src.indexOf(this.options.imgUnchecked) > 0) {
			this.input.src = this.options.imgChecked;
		}

		if (this.input.src.indexOf(this.options.imgUncheckedOver) > 0) {
			this.input.src = this.options.imgCheckedOver;
		}

		if (event) this.input.fire('poly:check', event);
	},

	uncheck: function(event) {
		if (!this.element.checked) return;
		this.element.checked = false;

		if (this.input.src.indexOf(this.options.imgChecked) > 0) {
			this.input.src = this.options.imgUnchecked;
		}

		if (this.input.src.indexOf(this.options.imgCheckedOver) > 0) {
			this.input.src = this.options.imgUncheckedOver;
		}

		if (event) this.input.fire('poly:uncheck', event);
	},

	toggle: function() {
		if (this.element.checked) {
			this.uncheck(arguments[0] || null);
		} else {
			this.check(arguments[0] || null);
		}
	},

	over: function() {
		if (this.element.checked) {
			this.input.src = this.options.imgCheckedOver;
		} else {
			this.input.src = this.options.imgUncheckedOver;
		}
	},

	out: function() {
		if (this.element.checked) {
			this.input.src = this.options.imgChecked;
		} else {
			this.input.src = this.options.imgUnchecked;
		}
	}
});

var Confirmation = Class.create({
	initialize: function(txt, okCallback, cancelCallback, title) {
		$('confirmtxt').innerHTML = txt;
		if (title) $('confirmtitle').innerHTML = title;
		$('confirmok').onclick = function() {
			$('layer_confirm').hide();
			if (okCallback) okCallback();
			return false;
		};
		$('confirmcancel').onclick = function() {
			$('layer_confirm').hide();
			if (cancelCallback) cancelCallback();
			return false;
		};
		if (!okCallback) {
			$('confirmcancel').style.display = 'none';
		} else {
			$('confirmcancel').style.display = '';
		}
		$('layer_confirm').popup();
	}
});

/*********************************
 **** LOAD BALANCING SESSION *****
 *********************************/
var _lbs = setInterval(function() {
	var datum = new Date();
	var param = Date.UTC(datum.getFullYear(), datum.getMonth(), datum.getDay(), datum.getHours(), datum.getMinutes(), datum.getSeconds());
	new Ajax.Request('/ajax/index.html?t_timestamp=' + param , {method: 'get'});
}, 15 * 60 * 1000);

/*********************************
 ***** AJAX WITHOUT ACTIVEX ******
 *********************************/
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
	var test = new XMLHttpRequest();
} catch (e) {
	try {
		var test = new ActiveXObject('Msxml2.XMLHTTP');
	} catch (e) {
		try {
			var test = new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e) {
			document.write('<script type="text/javascript" src="/jscripts/poly/iframeajax.js"></script>');
		}
	}
}
@end @*/

function alterHref(link, field, value) {
	var url  = link.href.slice(0, link.href.search(/\?/));
	var opts = link.href.slice(link.href.search(/\?/) + 1);
	var hash = $H(opts.toQueryParams());
	hash.set(field, value);

	link.href = url + '?' + hash.toQueryString();
}

function combineQuerys(query1, query2, zero){
	// combineQuerys: Kombiniert zwei Parameter String zu einem.
	// zero = false Sollte ein Key in beiden Strings vorkommen,
	//              wird der Erste behalten, dessen Value ungleich '' ist.
	// zero = true  Sollte ein Key in beiden Strings vorkommen,
	//              wird der Erste behalten, dessen Value gleich '' ist.
	// (Vergl. Hash.merge(), wo immer das letzte Feld behalten wid.)

	var hash1  = $H(query1.toQueryParams());
	var hash2  = $H(query2.toQueryParams());
	var result = $H({});

	hash1.each(function(element) {
		if (result.get(element.key) == null || ( result.get(element.key) == '' && zero == false )) {
			result.set(element.key, element.value);
		}
	});
	hash2.each(function(element) {
		if (result.get(element.key) == null || ( result.get(element.key) == '' && zero == false )) {
			result.set(element.key, element.value);
		}
	});

	return result.toQueryString();

}

function handleEnter(event) {
  var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if (keyCode == 13) {
      return true;
    }
  else return false;
}

function productSwitchTab(tabid) {
	for (var i = 1; i <= 4; i++) {
		if (!$('prd_tab_' + i.toString())) continue;
		if (i == tabid) {
			$('prd_tab_' + i.toString()).className = 'current';
			$('prd_box_' + i.toString()).show();
		} else {
			$('prd_tab_' + i.toString()).className = '';
			$('prd_box_' + i.toString()).hide();
		}
	}
}

/*********************************
 *********************************
 ******** AJAX FUNCTIONS *********
 *********************************
 *********************************/

function loadMainContent (link, onComplete) {
	// Setzt einen Ajax Request ab und lädt das Ergebnis in den Main Content Bereich.
	var url = link.href.replace(/\/shop\//g, '/ajax/');

	new Ajax.Updater('content', url, {
		parameters: 't_ajax=1',
		evalScripts: true,
		onComplete: function() {
			(onComplete || Prototype.emptyFunction)();
		},
		onFailure: function() {
			// Wenn ein Fehler auftritt, den Get normal ausführen.
			document.location.href = link.href;
		}
	});

	return false;
}

function postMainContent (form, onComplete) {
	// Sendet ein Formular ab und lädt das Ergebnis in den Main Content Bereich.

	var opts1 = Form.serialize(form);
	var opts2 = form.action.slice(form.action.search(/\?/));
	var url   = form.action.replace(/\/shop\//g, '/ajax/').slice(0, form.action.search(/\?/)) + "?" + combineQuerys(opts1, opts2, false);

	new Ajax.Updater('content', url, {
		evalScripts: true,
		onComplete: function() {
			(onComplete || Prototype.emptyFunction);
		},
		onFailure: function() {
			// Wenn ein Fehler auftritt, den Post normal ausführen.
			form.submit();
		}
	});

	return false;
}

/*********************************
 *********************************
 ********* Artikelfilter *********
 *********************************
 *********************************/

function dimToggleBis () {
	var i;
	if ($('tr_dim_bis').style.display == 'none') {
		$('tr_dim_bis').style.display = '';
		$('dim_bis').value = "YES";
		for (i = 1; i <= 4; i++) {
			if ($('dim_bis_' + i)) $('dim_bis_' + i).selectedIndex = 0;
		}
	} else {
		$('tr_dim_bis').style.display = 'none';
		$('dim_bis').value = "";
		for (i = 1; i <= 4; i++) {
			if ($('dim_bis_' + i)) $('dim_bis_' + i).selectedIndex = 0;
		}
	}
}

function dimFilterNone () {
	$('tr_dim_bis').style.display = 'none';
	for (var i = 1; i <= 4; i++) {
		if ($('dim_' + i)) $('dim_' + i).selectedIndex = 0;
		if ($('dim_bis_' + i)) $('dim_bis_' + i).selectedIndex = 0;
	}
	$('dim_produkt').value = '';
}

/*********************************
 *********************************
 ******** BreadcrumbMenue ********
 *********************************
 *********************************/

function breadcrumbsPath(treeID, cid) {
	var url = '/ajax/bcpath/index.html?t_Node=' + treeID;
	if (cid) url = url + '&t_CID=' + cid;
	new Ajax.Updater('path', url, {evalScripts: true});
	return false;
}

function breadcrumbsHide () {
	$('bcmenue').hide();
	Event.stopObserving(document, 'click', breadcrumbsHide);
}

function breadcrumbsShow(treeID, cid) {
	Event.stopObserving(document, 'click', breadcrumbsHide);
	var url = '/ajax/bcmenue/index.html?t_bcmenue=' + treeID;
	if (cid) url = url + '&t_CID=' + cid;
	new Ajax.Updater('bcmenue', url, {
		evalScripts: true,
		onComplete: function() {
			var bcmenue = $('bcmenue');
			bcmenue.show();
			var pos = Position.cumulativeOffset($('bcmenueIcon' + treeID));
			var left = pos[0] + 'px';
			var top  = (pos[1] + 16) + 'px';
			bcmenue.style.left = left;
			bcmenue.style.top  = top;
			Event.observe(document, 'click', breadcrumbsHide);
		}
	});

	return false;
}

function historyHide () {
	$('bchistory').hide();
	$('bchistorysub').hide();
	Event.stopObserving(document, 'click', breadcrumbsHide);
}

function historyShow() {
	Event.stopObserving(document, 'click', historyHide);

	new Ajax.Updater('bchistory', '/ajax/bchistory/index.html', {
		evalScripts: true,
		onComplete: function() {
			var bchistory = $('bchistory');
			bchistory.show();
			var pos = Position.cumulativeOffset($('bchistoryIcon'));
			var left = pos[0] + 'px';
			var top  = (pos[1] + 16) + 'px';
			bchistory.style.left = left;
			bchistory.style.top  = top;
			Event.observe(document, 'click', historyHide);
		}
	});

	return false;
}

function historyShowSub(module) {

}

function setTreePath(path) {
	// Input setzen
	if (path == '99999999') {
		$('exp_TreePath').value = '';
	} else {
		$('exp_TreePath').value = path;
	}

	if (path.length == 8) {

		$$('ul.tp_sub').each(function(ul) {
			if (ul.id == 'tp_' + path) {
				ul.style.display = '';
			} else {
				ul.style.display = 'none';
			}
		});

		$$('a.optionen_list_current').each(function(a) {
			a.className = 'optionen_list';
		});
		$('tplink_' + path).className = 'optionen_list_current';

	}

	if (path.length == 12) {

		$$('a.optionen_list_current').each(function(a) {
			a.className = 'optionen_list';
		});
		$('tplink_' + path).className = 'optionen_list_current';

	}

}


Effect.HScroll = Class.create(Effect.Base, {
	initialize: function(element) {
		this.element = $(element);
		if (!this.element) throw(Effect._elementDoesNotExistError);
		var options = Object.extend({
			from: 0,
			to:   100
		}, arguments[1] || { });
		this.start(options);
	},

	update: function(position) {
		this.element.scrollLeft = position;
	}
});

Effect.VScroll = Class.create(Effect.Base, {
	initialize: function(element) {
		this.element = $(element);
		if (!this.element) throw(Effect._elementDoesNotExistError);
		var options = Object.extend({
			from: 0,
			to:   100
		}, arguments[1] || { });
		this.start(options);
	},

	update: function(position) {
		this.element.scrollTop = position;
	}
});

var Scroller = Class.create();
Object.extend(Scroller.prototype, {
	initialize: function(scrollview) {
		this.options = Object.extend({
			clsNextBtn: 'scrollview_next',
			clsPrevBtn: 'scrollview_prev',
			clsEntry:   'scrollview_entry',
			direction:  'H',
			numVisible: 3,
			entryWidth: 140
		}, arguments[1] || {});
		this.scrollview = $(scrollview);
		this.nextBtn = $(this.options.clsNextBtn);
		this.prevBtn = $(this.options.clsPrevBtn);
		this.numEntries = this.scrollview.select('.' + this.options.clsEntry).length;
		this.numVisible = this.options.numVisible;
		this.pos = 0;
		this.entryWidth = this.options.entryWidth;

		this.prevBtn.observe('click', this.prev.bindAsEventListener(this));
		this.nextBtn.observe('click', this.next.bindAsEventListener(this));

		this.fx = this.options.direction == 'H' ? Effect.HScroll : Effect.VScroll;
	},

	next: function(event) {
		Event.stop(event);
		if (this.inprogress) return false;
		this.inprogress = true;
		return this.go(1);
	},

	prev: function(event) {
		Event.stop(event);
		if (this.inprogress) return false;
		this.inprogress = true;
		return this.go(-1);
	},

	go: function(step) {
		var oldPos = this.pos;

		if (this.pos + step < 0) {
			this.pos = this.numEntries + step - this.numVisible;
		} else if (this.pos + step + this.numVisible > this.numEntries) {
			this.pos = 0;
		} else {
			this.pos += step;
		}

		new this.fx(this.scrollview, {
			from: oldPos * this.entryWidth,
			to: this.pos * this.entryWidth,
			duration: 0.8,
			afterFinish: (function() {
				this.inprogress = false;
			}).bind(this)
		});
	}
});

