/*******************************
*** Hesehus Javascript library - hLib
*** Version: 1.49.7
*** Last modified: 26.01.2012
*******************************/

/*************************
* jQuery plugins and extentions
**************************/
// jQuery.ScrollTo 1.4.2 <http://flesler.blogspot.com> - Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com
; (function (d) { var k = d.scrollTo = function (a, i, e) { d(window).scrollTo(a, i, e) }; k.defaults = { axis: 'xy', duration: parseFloat(d.fn.jquery) >= 1.3 ? 0 : 1 }; k.window = function (a) { return d(window)._scrollable() }; d.fn._scrollable = function () { return this.map(function () { var a = this, i = !a.nodeName || d.inArray(a.nodeName.toLowerCase(), ['iframe', '#document', 'html', 'body']) != -1; if (!i) return a; var e = (a.contentWindow || a).document || a.ownerDocument || a; return d.browser.safari || e.compatMode == 'BackCompat' ? e.body : e.documentElement }) }; d.fn.scrollTo = function (n, j, b) { if (typeof j == 'object') { b = j; j = 0 } if (typeof b == 'function') b = { onAfter: b }; if (n == 'max') n = 9e9; b = d.extend({}, k.defaults, b); j = j || b.speed || b.duration; b.queue = b.queue && b.axis.length > 1; if (b.queue) j /= 2; b.offset = p(b.offset); b.over = p(b.over); return this._scrollable().each(function () { var q = this, r = d(q), f = n, s, g = {}, u = r.is('html,body'); switch (typeof f) { case 'number': case 'string': if (/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)) { f = p(f); break } f = d(f, this); case 'object': if (f.is || f.style) s = (f = d(f)).offset() } d.each(b.axis.split(''), function (a, i) { var e = i == 'x' ? 'Left' : 'Top', h = e.toLowerCase(), c = 'scroll' + e, l = q[c], m = k.max(q, i); if (s) { g[c] = s[h] + (u ? 0 : l - r.offset()[h]); if (b.margin) { g[c] -= parseInt(f.css('margin' + e)) || 0; g[c] -= parseInt(f.css('border' + e + 'Width')) || 0 } g[c] += b.offset[h] || 0; if (b.over[h]) g[c] += f[i == 'x' ? 'width' : 'height']() * b.over[h] } else { var o = f[h]; g[c] = o.slice && o.slice(-1) == '%' ? parseFloat(o) / 100 * m : o } if (/^\d+$/.test(g[c])) g[c] = g[c] <= 0 ? 0 : Math.min(g[c], m); if (!a && b.queue) { if (l != g[c]) t(b.onAfterFirst); delete g[c] } }); t(b.onAfter); function t(a) { r.animate(g, j, b.easing, a && function () { a.call(this, n, b) }) } }).end() }; k.max = function (a, i) { var e = i == 'x' ? 'Width' : 'Height', h = 'scroll' + e; if (!d(a).is('html,body')) return a[h] - d(a)[e.toLowerCase()](); var c = 'client' + e, l = a.ownerDocument.documentElement, m = a.ownerDocument.body; return Math.max(l[h], m[h]) - Math.min(l[c], m[c]) }; function p(a) { return typeof a == 'object' ? a : { top: a, left: a} } })(jQuery);

// jQuery hoverIntent r5 <http://cherne.net/brian/resources/jquery.hoverIntent.html>
; (function ($) { $.fn.hoverIntent = function (f, g) { var cfg = { sensitivity: 7, interval: 100, timeout: 0 }; cfg = $.extend(cfg, g ? { over: f, out: g} : f); var cX, cY, pX, pY; var track = function (ev) { cX = ev.pageX; cY = ev.pageY; }; var compare = function (ev, ob) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); if ((Math.abs(pX - cX) + Math.abs(pY - cY)) < cfg.sensitivity) { $(ob).unbind("mousemove", track); ob.hoverIntent_s = 1; return cfg.over.apply(ob, [ev]); } else { pX = cX; pY = cY; ob.hoverIntent_t = setTimeout(function () { compare(ev, ob); }, cfg.interval); } }; var delay = function (ev, ob) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); ob.hoverIntent_s = 0; return cfg.out.apply(ob, [ev]); }; var handleHover = function (e) { var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; while (p && p != this) { try { p = p.parentNode; } catch (e) { p = this; } } if (p == this) { return false; } var ev = jQuery.extend({}, e); var ob = this; if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); } if (e.type == "mouseover") { pX = ev.pageX; pY = ev.pageY; $(ob).bind("mousemove", track); if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout(function () { compare(ev, ob); }, cfg.interval); } } else { $(ob).unbind("mousemove", track); if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout(function () { delay(ev, ob); }, cfg.timeout); } } }; return this.mouseover(handleHover).mouseout(handleHover); }; })(jQuery);

// jQuery mousewheel v. 3.0.4
; (function ($) { var types = ['DOMMouseScroll', 'mousewheel']; $.event.special.mousewheel = { setup: function () { if (this.addEventListener) { for (var i = types.length; i; ) { this.addEventListener(types[--i], handler, false); } } else { this.onmousewheel = handler; } }, teardown: function () { if (this.removeEventListener) { for (var i = types.length; i; ) { this.removeEventListener(types[--i], handler, false); } } else { this.onmousewheel = null; } } }; $.fn.extend({ mousewheel: function (fn) { return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); }, unmousewheel: function (fn) { return this.unbind("mousewheel", fn); } }); function handler(event) { var orgEvent = event || window.event, args = [].slice.call(arguments, 1), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; event = $.event.fix(orgEvent); event.type = "mousewheel"; if (event.wheelDelta) { delta = event.wheelDelta / 120; } if (event.detail) { delta = -event.detail / 3; } deltaY = delta; if (orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) { deltaY = 0; deltaX = -1 * delta; } if (orgEvent.wheelDeltaY !== undefined) { deltaY = orgEvent.wheelDeltaY / 120; } if (orgEvent.wheelDeltaX !== undefined) { deltaX = -1 * orgEvent.wheelDeltaX / 120; } args.unshift(event, delta, deltaX, deltaY); return $.event.handle.apply(this, args); } })(jQuery);

// jQuery ColorBox v1.3.17.2 - Copyright (c) 2011 Jack Moore - jack@colorpowered.com - Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
; (function (a, b, c) { function bc(b) { if (!U) { P = b, _(), y = a(P), Q = 0, K.rel !== "nofollow" && (y = a("." + g).filter(function () { var b = a.data(this, e).rel || this.rel; return b === K.rel }), Q = y.index(P), Q === -1 && (y = y.add(P), Q = y.length - 1)); if (!S) { S = T = !0, r.show(); if (K.returnFocus) try { P.blur(), a(P).one(l, function () { try { this.focus() } catch (a) { } }) } catch (c) { } q.css({ opacity: +K.opacity, cursor: K.overlayClose ? "pointer" : "auto" }).show(), K.w = Z(K.initialWidth, "x"), K.h = Z(K.initialHeight, "y"), X.position(), o && z.bind("resize." + p + " scroll." + p, function () { q.css({ width: z.width(), height: z.height(), top: z.scrollTop(), left: z.scrollLeft() }) }).trigger("resize." + p), ba(h, K.onOpen), J.add(D).hide(), I.html(K.close).show() } X.load(!0) } } function bb() { var a, b = f + "Slideshow_", c = "click." + f, d, e, g; K.slideshow && y[1] ? (d = function () { F.text(K.slideshowStop).unbind(c).bind(j, function () { if (Q < y.length - 1 || K.loop) a = setTimeout(X.next, K.slideshowSpeed) }).bind(i, function () { clearTimeout(a) }).one(c + " " + k, e), r.removeClass(b + "off").addClass(b + "on"), a = setTimeout(X.next, K.slideshowSpeed) }, e = function () { clearTimeout(a), F.text(K.slideshowStart).unbind([j, i, k, c].join(" ")).one(c, d), r.removeClass(b + "on").addClass(b + "off") }, K.slideshowAuto ? d() : e()) : r.removeClass(b + "off " + b + "on") } function ba(b, c) { c && c.call(P), a.event.trigger(b) } function _(b) { K = a.extend({}, a.data(P, e)); for (b in K) a.isFunction(K[b]) && b.substring(0, 2) !== "on" && (K[b] = K[b].call(P)); K.rel = K.rel || P.rel || "nofollow", K.href = K.href || a(P).attr("href"), K.title = K.title || P.title, typeof K.href == "string" && (K.href = a.trim(K.href)) } function $(a) { return K.photo || /\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i.test(a) } function Z(a, b) { return Math.round((/%/.test(a) ? (b === "x" ? z.width() : z.height()) / 100 : 1) * parseInt(a, 10)) } function Y(c, d, e) { e = b.createElement("div"), c && (e.id = f + c), e.style.cssText = d || ""; return a(e) } var d = { transition: "elastic", speed: 300, width: !1, initialWidth: "600", innerWidth: !1, maxWidth: !1, height: !1, initialHeight: "450", innerHeight: !1, maxHeight: !1, scalePhotos: !0, scrolling: !0, inline: !1, html: !1, iframe: !1, fastIframe: !0, photo: !1, href: !1, title: !1, rel: !1, opacity: .9, preloading: !0, current: "image {current} of {total}", previous: "previous", next: "next", close: "close", open: !1, returnFocus: !0, loop: !0, slideshow: !1, slideshowAuto: !0, slideshowSpeed: 2500, slideshowStart: "start slideshow", slideshowStop: "stop slideshow", onOpen: !1, onLoad: !1, onComplete: !1, onCleanup: !1, onClosed: !1, overlayClose: !0, escKey: !0, arrowKey: !0, top: !1, bottom: !1, left: !1, right: !1, fixed: !1, data: !1 }, e = "colorbox", f = "cbox", g = f + "Element", h = f + "_open", i = f + "_load", j = f + "_complete", k = f + "_cleanup", l = f + "_closed", m = f + "_purge", n = a.browser.msie && !a.support.opacity, o = n && a.browser.version < 7, p = f + "_IE6", q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X; X = a.fn[e] = a[e] = function (b, c) { var f = this; b = b || {}; if (!f[0]) { if (f.selector) return f; f = a("<a/>"), b.open = !0 } c && (b.onComplete = c), f.each(function () { a.data(this, e, a.extend({}, a.data(this, e) || d, b)), a(this).addClass(g) }), (a.isFunction(b.open) && b.open.call(f) || b.open) && bc(f[0]); return f }, X.init = function () { z = a(c), r = Y().attr({ id: e, "class": n ? f + (o ? "IE6" : "IE") : "" }), q = Y("Overlay", o ? "position:absolute" : "").hide(), s = Y("Wrapper"), t = Y("Content").append(A = Y("LoadedContent", "width:0; height:0; overflow:hidden"), C = Y("LoadingOverlay").add(Y("LoadingGraphic")), D = Y("Title"), E = Y("Current"), G = Y("Next"), H = Y("Previous"), F = Y("Slideshow").bind(h, bb), I = Y("Close")), s.append(Y().append(Y("TopLeft"), u = Y("TopCenter"), Y("TopRight")), Y(!1, "clear:left").append(v = Y("MiddleLeft"), t, w = Y("MiddleRight")), Y(!1, "clear:left").append(Y("BottomLeft"), x = Y("BottomCenter"), Y("BottomRight"))).children().children().css({ "float": "left" }), B = Y(!1, "position:absolute; width:9999px; visibility:hidden; display:none"), a("body").prepend(q, r.append(s, B)), t.children().hover(function () { a(this).addClass("hover") }, function () { a(this).removeClass("hover") }).addClass("hover"), L = u.height() + x.height() + t.outerHeight(!0) - t.height(), M = v.width() + w.width() + t.outerWidth(!0) - t.width(), N = A.outerHeight(!0), O = A.outerWidth(!0), r.css({ "padding-bottom": L, "padding-right": M }).hide(), G.click(function () { X.next() }), H.click(function () { X.prev() }), I.click(function () { X.close() }), J = G.add(H).add(E).add(F), t.children().removeClass("hover"), q.click(function () { K.overlayClose && X.close() }), a(b).bind("keydown." + f, function (a) { var b = a.keyCode; S && K.escKey && b === 27 && (a.preventDefault(), X.close()), S && K.arrowKey && y[1] && (b === 37 ? (a.preventDefault(), H.click()) : b === 39 && (a.preventDefault(), G.click())) }) }, X.remove = function () { r.add(q).remove(), a("." + g).removeData(e).removeClass(g) }, X.position = function (a, c) { function g(a) { u[0].style.width = x[0].style.width = t[0].style.width = a.style.width, C[0].style.height = C[1].style.height = t[0].style.height = v[0].style.height = w[0].style.height = a.style.height } var d = 0, e = 0; z.unbind("resize." + f), r.hide(), K.fixed && !o ? r.css({ position: "fixed" }) : (d = z.scrollTop(), e = z.scrollLeft(), r.css({ position: "absolute" })), K.right !== !1 ? e += Math.max(z.width() - K.w - O - M - Z(K.right, "x"), 0) : K.left !== !1 ? e += Z(K.left, "x") : e += Math.round(Math.max(z.width() - K.w - O - M, 0) / 2), K.bottom !== !1 ? d += Math.max(b.documentElement.clientHeight - K.h - N - L - Z(K.bottom, "y"), 0) : K.top !== !1 ? d += Z(K.top, "y") : d += Math.round(Math.max(b.documentElement.clientHeight - K.h - N - L, 0) / 2), r.show(), a = r.width() === K.w + O && r.height() === K.h + N ? 0 : a || 0, s[0].style.width = s[0].style.height = "9999px", r.dequeue().animate({ width: K.w + O, height: K.h + N, top: d, left: e }, { duration: a, complete: function () { g(this), T = !1, s[0].style.width = K.w + O + M + "px", s[0].style.height = K.h + N + L + "px", c && c(), setTimeout(function () { z.bind("resize." + f, X.position) }, 1) }, step: function () { g(this) } }) }, X.resize = function (a) { if (S) { a = a || {}, a.width && (K.w = Z(a.width, "x") - O - M), a.innerWidth && (K.w = Z(a.innerWidth, "x")), A.css({ width: K.w }), a.height && (K.h = Z(a.height, "y") - N - L), a.innerHeight && (K.h = Z(a.innerHeight, "y")); if (!a.innerHeight && !a.height) { var b = A.wrapInner("<div style='overflow:auto'></div>").children(); K.h = b.height(), b.replaceWith(b.children()) } A.css({ height: K.h }), X.position(K.transition === "none" ? 0 : K.speed) } }, X.prep = function (b) { function h() { K.h = K.h || A.height(), K.h = K.mh && K.mh < K.h ? K.mh : K.h; return K.h } function g() { K.w = K.w || A.width(), K.w = K.mw && K.mw < K.w ? K.mw : K.w; return K.w } if (!!S) { var c, d = K.transition === "none" ? 0 : K.speed; A.remove(), A = Y("LoadedContent").append(b), A.hide().appendTo(B.show()).css({ width: g(), overflow: K.scrolling ? "auto" : "hidden" }).css({ height: h() }).prependTo(t), B.hide(), a(R).css({ "float": "none" }), o && a("select").not(r.find("select")).filter(function () { return this.style.visibility !== "hidden" }).css({ visibility: "hidden" }).one(k, function () { this.style.visibility = "inherit" }), c = function () { function o() { n && r[0].style.removeAttribute("filter") } var b, c, g, h, i = y.length, k, l; !S || (l = function () { clearTimeout(W), C.hide(), ba(j, K.onComplete) }, n && R && A.fadeIn(100), D.html(K.title).add(A).show(), i > 1 ? (typeof K.current == "string" && E.html(K.current.replace("{current}", Q + 1).replace("{total}", i)).show(), G[K.loop || Q < i - 1 ? "show" : "hide"]().html(K.next), H[K.loop || Q ? "show" : "hide"]().html(K.previous), b = Q ? y[Q - 1] : y[i - 1], g = Q < i - 1 ? y[Q + 1] : y[0], K.slideshow && F.show(), K.preloading && (h = a.data(g, e).href || g.href, c = a.data(b, e).href || b.href, h = a.isFunction(h) ? h.call(g) : h, c = a.isFunction(c) ? c.call(b) : c, $(h) && (a("<img/>")[0].src = h), $(c) && (a("<img/>")[0].src = c))) : J.hide(), K.iframe ? (k = a("<iframe/>").addClass(f + "Iframe")[0], K.fastIframe ? l() : a(k).one("load", l), k.name = f + +(new Date), k.src = K.href, K.scrolling || (k.scrolling = "no"), n && (k.frameBorder = 0, k.allowTransparency = "true"), a(k).appendTo(A).one(m, function () { k.src = "//about:blank" })) : l(), K.transition === "fade" ? r.fadeTo(d, 1, o) : o()) }, K.transition === "fade" ? r.fadeTo(d, 0, function () { X.position(0, c) }) : X.position(d, c) } }, X.load = function (b) { var c, d, e = X.prep; T = !0, R = !1, P = y[Q], b || _(), ba(m), ba(i, K.onLoad), K.h = K.height ? Z(K.height, "y") - N - L : K.innerHeight && Z(K.innerHeight, "y"), K.w = K.width ? Z(K.width, "x") - O - M : K.innerWidth && Z(K.innerWidth, "x"), K.mw = K.w, K.mh = K.h, K.maxWidth && (K.mw = Z(K.maxWidth, "x") - O - M, K.mw = K.w && K.w < K.mw ? K.w : K.mw), K.maxHeight && (K.mh = Z(K.maxHeight, "y") - N - L, K.mh = K.h && K.h < K.mh ? K.h : K.mh), c = K.href, W = setTimeout(function () { C.show() }, 100), K.inline ? (Y().hide().insertBefore(a(c)[0]).one(m, function () { a(this).replaceWith(A.children()) }), e(a(c))) : K.iframe ? e(" ") : K.html ? e(K.html) : $(c) ? (a(R = new Image).addClass(f + "Photo").error(function () { K.title = !1, e(Y("Error").text("This image could not be loaded")) }).load(function () { var a; R.onload = null, K.scalePhotos && (d = function () { R.height -= R.height * a, R.width -= R.width * a }, K.mw && R.width > K.mw && (a = (R.width - K.mw) / R.width, d()), K.mh && R.height > K.mh && (a = (R.height - K.mh) / R.height, d())), K.h && (R.style.marginTop = Math.max(K.h - R.height, 0) / 2 + "px"), y[1] && (Q < y.length - 1 || K.loop) && (R.style.cursor = "pointer", R.onclick = function () { X.next() }), n && (R.style.msInterpolationMode = "bicubic"), setTimeout(function () { e(R) }, 1) }), setTimeout(function () { R.src = c }, 1)) : c && B.load(c, K.data, function (b, c, d) { e(c === "error" ? Y("Error").text("Request unsuccessful: " + d.statusText) : a(this).contents()) }) }, X.next = function () { !T && y[1] && (Q < y.length - 1 || K.loop) && (Q = Q < y.length - 1 ? Q + 1 : 0, X.load()) }, X.prev = function () { !T && y[1] && (Q || K.loop) && (Q = Q ? Q - 1 : y.length - 1, X.load()) }, X.close = function () { S && !U && (U = !0, S = !1, ba(k, K.onCleanup), z.unbind("." + f + " ." + p), q.fadeTo(200, 0), r.stop().fadeTo(300, 0, function () { r.add(q).css({ opacity: 1, cursor: "auto" }).hide(), ba(m), A.remove(), setTimeout(function () { U = !1, ba(l, K.onClosed) }, 1) })) }, X.element = function () { return a(P) }, X.settings = d, V = function (a) { a.button !== 0 && typeof a.button != "undefined" || a.ctrlKey || a.shiftKey || a.altKey || (a.preventDefault(), bc(this)) }, a.fn.delegate ? a(b).delegate("." + g, "click", V) : a("." + g).live("click", V), a(X.init) })(jQuery, document, this);

// jQuery Easing v1.3 - <http://gsgd.co.uk/sandbox/jquery/easing/>
jQuery.easing['jswing'] = jQuery.easing['swing']; jQuery.extend(jQuery.easing, { def: 'easeOutQuad', swing: function (x, t, b, c, d) { return jQuery.easing[jQuery.easing.def](x, t, b, c, d); }, easeInQuad: function (x, t, b, c, d) { return c * (t /= d) * t + b; }, easeOutQuad: function (x, t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, easeInOutQuad: function (x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t + b; return -c / 2 * ((--t) * (t - 2) - 1) + b; }, easeInCubic: function (x, t, b, c, d) { return c * (t /= d) * t * t + b; }, easeOutCubic: function (x, t, b, c, d) { return c * ((t = t / d - 1) * t * t + 1) + b; }, easeInOutCubic: function (x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; return c / 2 * ((t -= 2) * t * t + 2) + b; }, easeInQuart: function (x, t, b, c, d) { return c * (t /= d) * t * t * t + b; }, easeOutQuart: function (x, t, b, c, d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b; }, easeInOutQuart: function (x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; return -c / 2 * ((t -= 2) * t * t * t - 2) + b; }, easeInQuint: function (x, t, b, c, d) { return c * (t /= d) * t * t * t * t + b; }, easeOutQuint: function (x, t, b, c, d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b; }, easeInOutQuint: function (x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; }, easeInSine: function (x, t, b, c, d) { return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; }, easeOutSine: function (x, t, b, c, d) { return c * Math.sin(t / d * (Math.PI / 2)) + b; }, easeInOutSine: function (x, t, b, c, d) { return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; }, easeInExpo: function (x, t, b, c, d) { return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; }, easeOutExpo: function (x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; }, easeInOutExpo: function (x, t, b, c, d) { if (t == 0) return b; if (t == d) return b + c; if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInCirc: function (x, t, b, c, d) { return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; }, easeOutCirc: function (x, t, b, c, d) { return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; }, easeInOutCirc: function (x, t, b, c, d) { if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; }, easeInElastic: function (x, t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; }, easeOutElastic: function (x, t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; }, easeInOutElastic: function (x, t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) p = d * (.3 * 1.5); if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; }, easeInBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b; }, easeOutBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; }, easeInOutBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; }, easeInBounce: function (x, t, b, c, d) { return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b; }, easeOutBounce: function (x, t, b, c, d) { if ((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b; } else if (t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; } else if (t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; } else { return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; } }, easeInOutBounce: function (x, t, b, c, d) { if (t < d / 2) return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b; return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b; } });

// jQuery imageLoaded - Checks if image is loaded (ex: jQuery(elem).imageLoaded(myFunction)) instead of original jquery.load() function
jQuery.fn.imageLoaded = function (callback) { var elems = this.filter('img'); var len = elems.length; elems.bind('load', function () { if (--len <= 0) { callback.call(elems, this); } }).each(function () { if (this.complete || this.complete === undefined) { var src = this.src; this.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; this.src = src; } }); return this; };

// jQuery textOverflow v1.04
; (function ($) { $.fn.textOverflow = function (options) { var defaults = { ellipsis: "&#8230;", wrap: "word", preserveParagraphs: true, addTitle: false }; var options = $.extend(defaults, options); if ($("#textOverflowCalculator").length == 0) { $("body").prepend($('<div id="textOverflowCalculator"/>').css({ 'position': 'absolute', 'left': '-10000px', 'top': '0px' })); }; var calculator = $("body>#textOverflowCalculator"); return this.each(function () { var $this = $(this); if ($this.css("overflow") == 'hidden') { var $thisHeight = $this.height(); var $thisWidth = $this.width(); var $thisMaxHeight = $this.css("max-height"); if ($thisMaxHeight != "" && $thisMaxHeight != "none" && parseInt($thisMaxHeight) != "NaN") $thisHeight = parseInt($thisMaxHeight); var $thisMaxWidth = $this.css("max-width"); if ($thisMaxWidth != "" && $thisMaxWidth != "none" && parseInt($thisMaxWidth) != "NaN") $thisWidth = parseInt($thisMaxWidth); calculator.css({ "width": (options.width) ? (options.width + "px") : $thisWidth + "px", "height": $thisHeight + "px", "font-size": $this.css("font-size"), "font-weight": $this.css("font-weight"), "font-family": $this.css("font-family"), "text-decoration": $this.css("text-decoration"), "text-transform": $this.css("text-transform"), "letter-spacing": $this.css("letter-spacing"), "line-height": $this.css("line-height"), "word-wrap": "break-word" }); var swapContent = false; var newContent = ''; var shortenContent = ""; var newTmpContent = ''; var oldTmpNewContent = ''; if (options.preserveParagraphs && $this.children("p").length > 0) { var paragraphContent = ''; newTmpContent = ''; oldTmpNewContent = ''; $($this.clone()).children("p").each(function (index) { oldTmpNewContent = newTmpContent; calculator.empty(); paragraphContent = String($(this).wrapInner("<p/>").html()); newTmpContent = oldTmpNewContent + paragraphContent; calculator.append($('<div class="theContentToMeasure"/>').append(newTmpContent)); if (calculator.children("div.theContentToMeasure").height() > $thisHeight) { newContent = oldTmpNewContent; shortenContent = paragraphContent; return false; } }); } shortenContent = (shortenContent != '') ? $.trim($(shortenContent).text()).replace(/\s+/gi, ' ') : $.trim($this.text()).replace(/\s+/gi, ' '); var shortenContentArr; if (options.wrap == 'word') { shortenContentArr = shortenContent.split(' '); } else { shortenContentArr = shortenContent.split(''); } newTmpContent = ''; oldTmpNewContent = ''; for (i = 0; i < shortenContentArr.length; i++) { oldTmpNewContent = newTmpContent; calculator.empty(); newTmpContent = (options.wrap == 'word') ? newTmpContent + ' ' + shortenContentArr[i] : newTmpContent + shortenContentArr[i]; if (newContent != "") { calculator.append(newContent); calculator.append('<p>' + $.trim(newTmpContent) + options.ellipsis + '</p>'); if (calculator.wrapInner("<div/>").find("div").height() > $thisHeight) { var tmpContent = $.trim(oldTmpNewContent) + options.ellipsis; if (tmpContent == options.ellipsis) { newContent = String('<p>' + String($(newContent).html()) + options.ellipsis + '</p>'); } else { newContent += '<p>' + tmpContent + '</p>'; } swapContent = true; break; } } else { calculator.append($('<span/>').append($.trim(newTmpContent))); if (calculator.find("span").height() > $thisHeight) { var tmpNewContent = $.trim(oldTmpNewContent); newContent = tmpNewContent + options.ellipsis; calculator.find("span").html(newTmpContent); if (calculator.find("span").height() > $thisHeight) { newContent = tmpNewContent.substr(0, tmpNewContent.length - 3) + options.ellipsis; calculator.find("span").html(newTmpContent); } swapContent = true; break; } } } if (swapContent) { if (options.addTitle) $this.attr("title", $this.text()); $this.empty().append(newContent); } calculator.empty(); } }); }; })(jQuery);

/***********************
* hLib
************************/
if (hLib == undefined) { var hLib = {}; }

jQuery.extend(hLib, {
    mouse: {},
    intPageX: 0, // old..
    intPageY: 0, // old..
    booMouseMoveRecording: false,
    booMouseUpRecording: false,
    booMouseDownRecording: false,
    zoom: {
        initiated: false,
        active: false,
        activeID: null,
        activeIndex: -1,
        vars: new Array()
    },
    arrSliderVars: new Array(),
    arrQuickSearch: new Array(),
    objFooter: null,
    booFooterActive: false,
    regex: {
        phone: /([0-9+\s])$/,
        email: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
        uppercase: /[A-Z]/,
        numeric: /[0-9]/,
        special: /[^0-9^A-Z^a-z]/
    },
    arrCreatedIDs: new Array(),
    dropdown: {
        list: new Array(),
        listenerActive: false,
        focusInTriggered: false,
        keyDownRecording: false,
        activeId: ""
    }
});

// Adds support.touch for iPhone/iPad and similar devices
jQuery.extend(jQuery.support, { touch: "ontouchend" in document });

// Adds support.placeholder
var p_a = 'placeholder' in document.createElement('input'),
    p_b = 'placeholder' in document.createElement('textarea');
jQuery.extend(jQuery.support, { placeholder: (p_a && p_b) });

// Browser detection
hLib.browser = {
    init: function () {
        this.name = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i = 0; i < data.length; i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) { if (dataString.indexOf(data[i].subString) != -1) { return data[i].identity; } }
            else if (dataProp) { return data[i].identity; }
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    },
    dataBrowser: [
		{ string: navigator.userAgent, subString: "Chrome", identity: "Chrome" },
		{ string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb" },
		{ string: navigator.vendor, subString: "Apple", identity: "Safari", versionSearch: "Version" },
		{ prop: window.opera, identity: "Opera", versionSearch: "Version" },
		{ string: navigator.vendor, subString: "iCab", identity: "iCab" },
		{ string: navigator.vendor, subString: "KDE", identity: "Konqueror" },
		{ string: navigator.userAgent, subString: "Firefox", identity: "Firefox" },
		{ string: navigator.vendor, subString: "Camino", identity: "Camino" },
		{ string: navigator.userAgent, subString: "Netscape", identity: "Netscape" }, // for newer Netscapes (6+)
		{string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE" },
		{ string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv" },
		{ string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla"} // for older Netscapes (4-)
	],
    dataOS: [
		{ string: navigator.platform, subString: "Win", identity: "Windows" },
		{ string: navigator.platform, subString: "Mac", identity: "Mac" },
		{ string: navigator.userAgent, subString: "iPhone", identity: "iPhone/iPod" },
		{ string: navigator.platform, subString: "Linux", identity: "Linux" }
	]

};
hLib.browser.init();

// Detecting browser version using deprecated jQuery function
hLib.booIE = false; hLib.booIELt6 = false; hLib.booIELt7 = false; hLib.booIELt8 = false; hLib.booIELt9 = false; hLib.booIELt10 = false; hLib.booIE6 = false; hLib.booIE7 = false; hLib.booIE8 = false; hLib.booIE9 = false; hLib.booIE10 = false; hLib.booIEGt6 = false; hLib.booIEGt7 = false; hLib.booIEGt8 = false; hLib.booIEGt9 = false; hLib.booIEGt10 = false;
if (hLib.browser.name == "Explorer") {
    hLib.booIE = true;
    var intBrowserVersion = Math.floor(hLib.browser.version);
    if (intBrowserVersion < 6) {
        hLib.booIELt6 = true; hLib.booIELt7 = true; hLib.booIELt8 = true; hLib.booIELt9 = true; hLib.booIELt10 = true;
    } else if (intBrowserVersion == 6) {
        hLib.booIELt7 = true; hLib.booIELt8 = true; hLib.booIELt9 = true; hLib.booIELt10 = true; hLib.booIE6 = true;
    } else if (intBrowserVersion == 7) {
        hLib.booIEGt6 = true; hLib.booIELt8 = true; hLib.booIELt9 = true; hLib.booIELt10 = true; hLib.booIE7 = true;
    } else if (intBrowserVersion == 8) {
        hLib.booIEGt6 = true; hLib.booIEGt7 = true; hLib.booIELt9 = true; hLib.booIELt10 = true; hLib.booIE8 = true;
    } else if (intBrowserVersion == 9) {
        hLib.booIEGt6 = true; hLib.booIEGt7 = true; hLib.booIEGt8 = true; hLib.booIELt10 = true; hLib.booIE9 = true;
    } else if (intBrowserVersion == 10) {
        hLib.booIEGt6 = true; hLib.booIEGt7 = true; hLib.booIEGt8 = true; hLib.booIEGt9 = true; hLib.booIE10 = true;
    } else if (intBrowserVersion > 10) {
        hLib.booIEGt6 = true; hLib.booIEGt7 = true; hLib.booIEGt8 = true; hLib.booIEGt9 = true; hLib.booIEGt10 = true;
    }
}

/*********************************
Events start
**********************************/

// Page load
jQuery(function () {

    // Validations and limitations
    var htmTextInputs = jQuery('input[type=text],input[type=password], textarea');
    hLib.bindValidation(htmTextInputs);
    hLib.bindLimitation(htmTextInputs);

    // Placeholder
    htmTextInputs.placeholder();

    // Slider
    jQuery(".sliderHorizontal, .sliderVertical").each(function () { hLib.slider(this); });

    // Slideshow
    jQuery(".imagePlaceholder").each(function () { hLib.enableSlideshow(this, 250); });

    // Zoom
    jQuery(".zoom, .inlineZoom, .overlayZoom").each(function () { hLib.enableZoom(this); });

    // Std buttons code
    if (hLib.booIE) {

        var htmHButton = jQuery("a.hButton");

        // General IE bug. Fix to make active state go away after click
        htmHButton.live("click", function (e) {
            this.blur();
        });

        //Bug fix for IE8 and IE9, to make activestate work correctly
        if (hLib.booIEGt7 && hLib.booIELt10) {
            htmHButton.live({
                mousedown: function () { jQuery(this).addClass('IEActiveStateBugfix'); },
                mouseup: function () { jQuery(this).removeClass('IEActiveStateBugfix'); },
                mouseleave: function () { jQuery(this).removeClass('IEActiveStateBugfix'); }
            });
        }
    }

    // General Live event for submit links. Link must reside inside a form tag. If that is the case the button will submit that form 
    jQuery("a.hButtonSubmit").live("click", function (e) {
        e.preventDefault();
        jQuery(this).closest("form").submit();
    });

});

hLib.bindValidation = function (obj) {
    var htmTextInputs = jQuery(obj);
    htmTextInputs.filter(".validate.email").focusout(function () {
        var $this = jQuery(this);
        var booValid = ($this.hasClass("notempty") && jQuery.trim($this.val()) == "") ? false : true;
        var booShowOutsideResult = ($this.hasClass("hideOutsideResult")) ? false : true;
        hLib.displayValidationResult($this, (hLib.validateEmail($this.val()) && booValid), booShowOutsideResult);
    });
    htmTextInputs.filter(".validate.phone").focusout(function () {
        var $this = jQuery(this);
        var booShowOutsideResult = ($this.hasClass("hideOutsideResult")) ? false : true;
        hLib.displayValidationResult($this, hLib.validatePhone($this.val()), booShowOutsideResult);
    });
    htmTextInputs.filter(".validate.password").focusout(function () {
        var $this = jQuery(this);
        var booShowOutsideResult = ($this.hasClass("hideOutsideResult")) ? false : true;
        hLib.displayValidationResult($this, hLib.validatePassword($this.val(), 6, 1, 1, 1), booShowOutsideResult);
    });
    htmTextInputs.filter(".validate.notempty:not(.password,.phone,.email)").focusout(function () {
        var $this = jQuery(this);
        var booValid = ($this.hasClass("notempty") && jQuery.trim($this.val()) != "") ? true : false;
        var booShowOutsideResult = ($this.hasClass("hideOutsideResult")) ? false : true;
        hLib.displayValidationResult($this, booValid, booShowOutsideResult);
    });
}

hLib.bindLimitation = function (obj) {
    var htmTextInputs = jQuery(obj);
    hLib.limitPhone(htmTextInputs.filter(".limit.phone"));
    hLib.limitNumeric(htmTextInputs.filter(".limit.numeric"));
}

// Functions to initiate record mouse events
hLib.recordMouseUp = function () { if (!hLib.booMouseUpRecording) { hLib.booMouseUpRecording = true; jQuery(document).mouseup(function (e) { hLib.mouseUp(e); hLib.recordMouseDown.active = false; }); } }
hLib.recordMouseDown = function (e) { if (!hLib.booMouseDownRecording) { hLib.booMouseDownRecording = true; jQuery(document).mousedown(function (e) { hLib.mouseDown(e); hLib.recordMouseDown.active = true; }); } }
hLib.recordMouseMove = function () { if (!hLib.booMouseMoveRecording) { hLib.booMouseMoveRecording = true; jQuery(document).mousemove(function (e) { hLib.mouseMove(e); }); } }
hLib.recordMouseDown.active = false;

/* General mouse up event */
hLib.mouseUp = function (e) {
    if (!jQuery.support.touch && hLib.rangeSlider.active != -1) { hLib.rangeSlider.finish(); }

    if (hLib.slider.itemmove.obj != null) { hLib.slider.itemmoveend(); }
}

/* General mouse down event */
hLib.mouseDown = function (e) {

    var htmClicked = jQuery(e.target);

    // Quick search
    if (hLib.arrQuickSearch.length > 0) {
        for (s = 0; s < hLib.arrQuickSearch.length; s++) {
            var qs = hLib.arrQuickSearch[s];
            if (qs.resultvisible || qs.state != "stopped") {
                // Checking that we are not clicking on input or search result
                if (htmClicked.closest(qs.input).length == 0 && htmClicked.closest(qs.result).length == 0) {
                    hLib.hideSearchResult(qs.id);
                }
            }
        }
    }

    // Custom dropdown
    if (hLib.dropdown.list.length > 0) {
        if (hLib.dropdown.activeId != "") {
            if (htmClicked.closest("ul.hDropdownResult, li.hDropdown").length == 0) hLib.dropdown.hide(hLib.dropdown.activeId);
        }
    }

}

// Mouse move
hLib.mouseMove = function (e) {
    hLib.mouse.x = e.pageX;
    hLib.mouse.y = e.pageY;
    hLib.intPageX = e.pageX; // Old
    hLib.intPageY = e.pageY; // Old
    hLib.genericMove();
}

// Touch move
hLib.touchMove = function (e) {
    e.preventDefault();
    hLib.mouse.x = e.touches[0].pageX;
    hLib.mouse.y = e.touches[0].pageY;
    hLib.intPageX = e.touches[0].pageX; // Old
    hLib.intPageY = e.touches[0].pageY; // Old
    hLib.genericMove();
}

// Generic move. Does not support multiple touch entries
hLib.genericMove = function () {

    // Range slider
    if (hLib.rangeSlider.active != -1) { hLib.rangeSlider.moveArrow(hLib.rangeSlider.active, hLib.mouse.x); }

    // Slider
    if (hLib.slider.itemmove.obj != null) { hLib.slider.itemmoveactive(); }

    // Zoom
    if (hLib.zoom.active) {

        // Get active zoom instance
        var arrZoom = hLib.zoom.vars[hLib.zoom.activeIndex];

        // Getting position of curser relative to the image
        var curRelPosX = (hLib.mouse.x - arrZoom.intSmallImgOffsetLeft) + arrZoom.intSmallImgBorderLeft;
        var curRelPosY = (hLib.mouse.y - arrZoom.intSmallImgOffsetTop) + arrZoom.intSmallImgBorderTop;

        // Hide zoom if the cursor is no longer over image
        var booCurserOverImageBorder = false;
        if ((curRelPosX + arrZoom.intSmallImgBorderLeft < 0) || (curRelPosX > arrZoom.intSmallImgWidth + arrZoom.intSmallImgBorderRight) || (curRelPosY < 0) || (curRelPosY > arrZoom.intSmallImgHeight + arrZoom.intSmallImgBorderBottom)) {
            booCurserOverImageBorder = true;
            if (arrZoom.booZoomType != "overlay") { hLib.hideZoom(); return; }
        }

        // Hide zoom if cursor is not over zoom overlay
        if (arrZoom.booZoomType == "overlay" && booCurserOverImageBorder && arrZoom.zoomAreaVisible) {
            if (!jQuery(".zoomArea." + hLib.zoom.activeID).hasClass("hover")) { hLib.hideZoom(); return; }
        }

        var objZoomAreaActive = jQuery(".zoomArea." + hLib.zoom.activeID);
        if (arrZoom.booZoomType == "inline") {
            var intCurPctLeft = curRelPosX / arrZoom.intSmallImgWidth * 100;
            var intCurPctTop = curRelPosY / arrZoom.intSmallImgHeight * 100;
            objZoomAreaActive.stop(true, true).css({ "background-position": intCurPctLeft + "% " + intCurPctTop + "%" });
        }
        else {
            var intMagnifierWidthHalf = Math.floor(arrZoom.intMagnifierWidth / 2);
            var intMagnifierHeightHalf = Math.floor(arrZoom.intMagnifierHeight / 2);
            var booCanMoveHor = true, booCanMoveVer = true;

            // Making sure the magnifier stays within its allowed limits
            if (arrZoom.booZoomType != "overlay") {

                if (curRelPosX < (intMagnifierWidthHalf + arrZoom.intSmallImgBorderLeft)) curRelPosX = intMagnifierWidthHalf + arrZoom.intSmallImgBorderLeft;
                else if (curRelPosX > (arrZoom.intSmallImgWidth - intMagnifierWidthHalf) - arrZoom.intSmallImgBorderLeft) curRelPosX = (arrZoom.intSmallImgWidth - intMagnifierWidthHalf) - arrZoom.intSmallImgBorderLeft;
                if (curRelPosY < intMagnifierHeightHalf) curRelPosY = intMagnifierHeightHalf;
                else if (curRelPosY > (arrZoom.intSmallImgHeight - intMagnifierHeightHalf) - (arrZoom.intSmallImgBorderTop * 2)) curRelPosY = (arrZoom.intSmallImgHeight - intMagnifierHeightHalf) - (arrZoom.intSmallImgBorderTop * 2);

                arrZoom.objMagnifier.css({
                    "display": "block",
                    "left": (curRelPosX + arrZoom.intSmallImgOffsetLeft) - intMagnifierWidthHalf + jQuery(document).scrollLeft(),
                    "top": (curRelPosY + arrZoom.intSmallImgOffsetTop) - intMagnifierHeightHalf - jQuery(document).scrollTop() + arrZoom.intSmallImgBorderTop
                });

                // Getting top left magnifier position relative to the image
                var intBgPxFromLeft = Math.floor(((curRelPosX - intMagnifierWidthHalf) / arrZoom.intSmallImgWidth) * arrZoom.intLargeImgWidth);
                var intBgPxFromTop = Math.floor(((curRelPosY - intMagnifierHeightHalf) / (arrZoom.intSmallImgHeight - (arrZoom.intSmallImgBorderTop * 2))) * arrZoom.intLargeImgHeight);
                if (intBgPxFromLeft > (arrZoom.intLargeImgWidth - arrZoom.intZoomAreaWidth)) { intBgPxFromLeft = arrZoom.intLargeImgWidth - arrZoom.intZoomAreaWidth; booCanMoveHor = false; }
                else if (intBgPxFromLeft < 0) { intBgPxFromLeft = 0; booCanMoveHor = false; }
                if (intBgPxFromTop > (arrZoom.intLargeImgHeight - arrZoom.intZoomAreaHeight)) { intBgPxFromTop = arrZoom.intLargeImgHeight - arrZoom.intZoomAreaHeight; booCanMoveVer = false; }
                else if (intBgPxFromTop < 0) { intBgPxFromTop = 0; booCanMoveVer = false; }

                objZoomAreaActive.css("background-position", "-" + intBgPxFromLeft + "px -" + intBgPxFromTop + "px");

            }
            else if (arrZoom.booZoomType == "overlay") {

                if (curRelPosX < 0) { curRelPosX = 0; booCanMoveHor = false; }
                else if (curRelPosX > arrZoom.intSmallImgWidth) { curRelPosX = arrZoom.intSmallImgWidth; booCanMoveHor = false; }
                if (curRelPosY < 0) { curRelPosY = 0; booCanMoveVer = false; }
                else if (curRelPosY > arrZoom.intSmallImgHeight) { curRelPosY = arrZoom.intSmallImgHeight; booCanMoveVer = false; }

                var pctX = (curRelPosX / arrZoom.intSmallImgWidth) * 100;
                var pctY = (curRelPosY / arrZoom.intSmallImgHeight) * 100;

                var objZoomAreaCss = { "background-position": pctX + "% " + pctY + "%", "display": "block" };
                if (booCanMoveHor) objZoomAreaCss.left = curRelPosX - (arrZoom.intZoomAreaWidth / 2) + arrZoom.intSmallImgPosLeft;
                if (booCanMoveVer) objZoomAreaCss.top = curRelPosY - (arrZoom.intZoomAreaHeight / 2) + arrZoom.intSmallImgPosTop;
                objZoomAreaActive.css(objZoomAreaCss);

                arrZoom.zoomAreaVisible = true;
            }
        }
    }
}

/*********************************
Functions
**********************************/
hLib.resolveUrl = function (strRelativeFromRoot) { return hLib.strSiteRoot + strRelativeFromRoot; };
hLib.isInt = function (x) { var y = parseInt(x); if (isNaN(y)) { return false; } return x == y && x.toString() == y.toString(); }
hLib.isEven = function (x) { return (x % 2 == 0) ? true : false; };
hLib.isOdd = function (x) { return (x % 2 > 0) ? true : false; };
hLib.sortNumberAsc = function (a, b) { return a - b; } // Function to help the array.sort() method sort numerical asc
hLib.sortNumberDesc = function (a, b) { return b - a; } // Function to help the array.sort() method sort numerical desc
function hLog(args) { if (!window.console) { alert(args); } else { console.log(args); } }
function hlog(args) { hLog(args); }

/*********************************
Slideshow
**********************************/
hLib.enableSlideshow = function (objElem, intAnimationTime) {
    var objImgPlaceholder = jQuery(objElem);
    if (objImgPlaceholder.length > 0) {
        var strSlideshowID = hLib.setID(objImgPlaceholder, "slideshow");

        var objThumbs = jQuery(".slideshowThumbs." + strSlideshowID);
        if (objThumbs.length == 0) objThumbs = objImgPlaceholder.parent().parent().find(".slideshowThumbs");
        if (objThumbs.length > 0) {

            // Connecting container and thumbs
            objThumbs.addClass(strSlideshowID);

            objThumbs.find("li:first").addClass("selected");

            // Adding all images
            var intMaxHeight = 0, intMaxWidth = 0;
            objThumbs.find("img").each(function () {
                var arrImgDef = jQuery(this).attr("longdesc").split(";");
                var strImgLarge = arrImgDef[0];
                var strImgZoomOriginal = arrImgDef[1];
                var strImgZoom = "";
                if (arrImgDef.length > 1) strImgZoom = " longdesc='" + strImgZoomOriginal + "'";
                var objImg = objImgPlaceholder.find("img[src='" + strImgLarge + "']");

                var strClassDefinition = "";
                if (objImgPlaceholder.hasClass("activeOnHover")) strClassDefinition += " activeOnHover";
                if (objImgPlaceholder.hasClass("inlineZoom")) strClassDefinition += " inlineZoom";
                else if (objImgPlaceholder.hasClass("overlayZoom")) strClassDefinition += " overlayZoom";

                if (objImg.length == 0) objImgPlaceholder.append("<img src='" + strImgLarge + "' alt='' " + strImgZoom + " class='" + strClassDefinition + "' />");
            });
            objImgPlaceholder.find("img:first").addClass("selected");

            jQuery(".slideshowThumbs." + strSlideshowID + " li a").click(function () {
                var arrImgDef = jQuery(this).find("img").attr("longdesc").split(";");
                var strNewSrc = arrImgDef[0];
                var objLi = jQuery(this).closest("li");
                objLi.addClass("selected").siblings().removeClass("selected");
                if (jQuery("#" + strSlideshowID).find("img[src*='" + strNewSrc + "']:visible").length == 0) {
                    var objActiveImg = jQuery("#" + strSlideshowID + " img:visible");
                    var objNewImg = jQuery("#" + strSlideshowID).find("img[src*='" + strNewSrc.substr(strNewSrc.lastIndexOf("/"), strNewSrc.length) + "']");
                    objActiveImg.fadeOut(intAnimationTime, function () { jQuery(this).removeClass("selected"); });
                    objNewImg.fadeIn(intAnimationTime).addClass("selected");
                }
                return false;
            });
        }
    }
}

/*********************************
Image/paging (etc..) slider
**********************************/
hLib.slider = function (objElem, objSettings) {

    // Getting slider
    var objSlider = jQuery(objElem);

    if (objSlider.length > 0) {

        var objInner = objSlider.find(".sliderInner");
        var objItems = objInner.find(".sliderItems > li");

        if (objItems.length > 0) {

            // Make sure the slider has an ID
            var strSliderID = hLib.setID(objSlider, "slider");

            // Checking if there are old sliders existing with the same ID
            var intSliderIndex = hLib.arrSliderVars.length;
            var intCachedItemIndex = -1;
            if (hLib.getSliderIndexByID(strSliderID) != -1) {
                intSliderIndex = hLib.getSliderIndexByID(strSliderID);
                // Update of slider
                if (objSlider.hasClass("sliderInitated")) {

                    // Check item count
                    if (hLib.arrSliderVars[intSliderIndex].intTotItems != objItems.length) {
                        // Adjust position
                        if (hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex > objItems.length) {
                            var intItemsToMove = objItems.length - hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex;
                            if (objItems.length < hLib.arrSliderVars[intSliderIndex].intVisibleItems) intItemsToMove = "start";
                            hLib.slideItems({ intSliderIndex: intSliderIndex, intItemsToMove: intItemsToMove, intAnimationTimeOverride: 0 });
                        }
                        // Update number of items
                        hLib.arrSliderVars[intSliderIndex].intTotItems = objItems.length;
                        hLib.updateSliderArrows(intSliderIndex);
                        return
                    }
                }
                // New slider (ajax scenario)
                else {
                    // Get last known position for slider
                    intCachedItemIndex = hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex;
                    // Resetting
                    hLib.arrSliderVars[intSliderIndex] = null;
                }
            }

            var strSliderDirection = (objSlider.hasClass("sliderVertical")) ? "vertical" : "horizontal";

            var intAdjustX = 0;
            var intAdjustY = 0;
            if (hLib.booIELt8) intAdjustY = 7;

            // Custom settings
            var intAnimationTime,
                booMoveToSelectedItem,
                intVisibleItems = 4,
                intItemWidth = null,
                intItemHeight = null,
                intItemsToSlide,
                strAnimationType,
                onAnimationComplete = null,
                onReady = null,
                draggable = false,
                scrollbar = false,
                btnScope = objSlider;

            if (objSettings != undefined) {
                intAnimationTime = objSettings.animationTime || 650;
                strAnimationType = objSettings.animationType || "swing";
                intVisibleItems = objSettings.visibleItems || 4;
                intItemsToSlide = objSettings.itemsToSlide || null;
                intItemWidth = objSettings.itemWidth || intItemWidth;
                intItemHeight = objSettings.itemHeight || intItemHeight;
                intAdjustX = objSettings.adjustX || intAdjustX;
                intAdjustY = objSettings.adjustY || intAdjustY;
                strSliderDirection = objSettings.direction || strSliderDirection;
                booMoveToSelectedItem = objSettings.moveToSelectedItem || true;
                onReady = objSettings.onReady || null;
                onAnimationComplete = objSettings.onAnimationComplete || null;
                draggable = objSettings.draggable || false;
                scrollbar = objSettings.scrollbar || false;
                btnScope = objSettings.btnScope || objSlider;
            }
            intVisibleItems = (objItems.length < intVisibleItems) ? objItems.length : intVisibleItems;
            intItemsToSlide = (intVisibleItems < intItemsToSlide) ? intVisibleItems : intItemsToSlide;

            objSlider.addClass("slider sliderInitated clearfix");
            if (strSliderDirection == "vertical") objSlider.addClass("sliderVertical");
            else objSlider.addClass("sliderHorizontal");

            // Getting dimensions
            var intMaxWidth = 0, intMaxHeight = 0, intTotWidth = 0, intTotHeight = 0, intMarginHorizontal = 0, intMarginVertical = 0, intPaddingHorizontal = 0, intPaddingVertical = 0;
            if (intItemHeight != null) { intTotHeight = intItemHeight * objItems.length; intMaxHeight = intItemHeight; }
            if (intItemWidth != null) { intTotWidth = intItemWidth * objItems.length; intMaxWidth = intItemWidth; }
            if (intItemWidth == null || intItemHeight == null) {
                objItems.each(function () {
                    var objItem = jQuery(this);
                    if (objItem.width() == 0) objItem = hLib.cloneToVisibleItem(jQuery(this));

                    if (intMaxWidth < objItem.width() && intItemWidth == null) { intMaxWidth = objItem.width(); }
                    if (intMaxHeight < objItem.height() && intItemHeight == null) { intMaxHeight = objItem.height(); }
                    if (intItemWidth == null) intTotWidth += parseInt(objItem.outerWidth());
                    if (intItemHeight == null) intTotHeight += parseInt(objItem.outerHeight());
                });
            }

            var intMarginLeft = parseInt(objItems.eq(0).css("margin-left"));
            var intMarginRight = parseInt(objItems.eq(0).css("margin-right"));
            var intMarginTop = parseInt(objItems.eq(0).css("margin-top"));
            var intMarginBottom = parseInt(objItems.eq(0).css("margin-bottom"));
            intMarginHorizontal = intMarginRight + intMarginLeft;
            intMarginVertical = intMarginTop + intMarginBottom;
            intPaddingHorizontal = parseInt(objItems.eq(0).css("padding-left")) + parseInt(objItems.eq(0).css("padding-right"));
            intPaddingVertical = parseInt(objItems.eq(0).css("padding-top")) + parseInt(objItems.eq(0).css("padding-bottom"));

            var intAdjustAnimateX = 0;
            var intAdjustAnimateY = 0;
            if ((intMarginRight > 0) && (intMarginLeft > 0)) intAdjustAnimateX -= (intMarginLeft + intMarginRight) / 2;
            if ((intMarginTop > 0) && (intMarginBottom > 0)) intAdjustAnimateY -= (intMarginTop + intMarginBottom) / 2;
            intAdjustX += Math.floor(intAdjustAnimateX);
            intAdjustY += Math.floor(intAdjustAnimateY);

            if (intTotWidth > 0 && intTotHeight > 0) {

                if (intItemsToSlide == null) intItemsToSlide = intVisibleItems;

                // Saving items
                hLib.arrSliderVars[intSliderIndex] = {
                    htm: objSlider,
                    strID: strSliderID,
                    strDirection: strSliderDirection,
                    strAnimationType: strAnimationType,
                    intTotItems: objItems.length,
                    intVisibleItems: intVisibleItems,
                    intItemsToSlide: intItemsToSlide,
                    intCurrentItemIndex: intVisibleItems,
                    intAnimationTime: intAnimationTime,
                    intItemWidth: intMaxWidth + intMarginHorizontal + intPaddingHorizontal,
                    intItemHeight: intMaxHeight + intMarginVertical + intPaddingVertical,
                    intItemAdjustX: intAdjustX,
                    intItemAdjustY: intAdjustY,
                    intItemAdjustAnimateX: intAdjustAnimateX,
                    intItemAdjustAnimateY: intAdjustAnimateY,
                    onAnimationComplete: onAnimationComplete,
                    onReady: onReady,
                    draggable: draggable,
                    scrollbar: scrollbar,
                    scroll: {
                        htm: null
                    }
                }

                // Adjusting slider width and height
                if (strSliderDirection == "horizontal") {
                    objItems.width(intMaxWidth);
                    objInner.find(".sliderItems").width(intTotWidth * 2);
                    if (intVisibleItems == null) { for (intVisibleItems = 0; intVisibleItems * (hLib.arrSliderVars[intSliderIndex].intItemWidth) < objInner.width(); intVisibleItems++) { } }
                    objInner.width((intVisibleItems * hLib.arrSliderVars[intSliderIndex].intItemWidth + intPaddingHorizontal)).height(hLib.arrSliderVars[intSliderIndex].intItemHeight);
                }
                else if (strSliderDirection == "vertical") {
                    objItems.height(intMaxHeight);
                    if (intVisibleItems == null) { for (intVisibleItems = 0; intVisibleItems * (hLib.arrSliderVars[intSliderIndex].intItemHeight) < objInner.height(); intVisibleItems++) { } }
                    objInner.height((intVisibleItems * (hLib.arrSliderVars[intSliderIndex].intItemHeight + intAdjustAnimateY) - intAdjustAnimateY)).width(hLib.arrSliderVars[intSliderIndex].intItemWidth);
                }

                hLib.updateSliderArrows(intSliderIndex);

                // Touch type drag and move
                if (draggable) {
                    hLib.recordMouseMove();
                    hLib.recordMouseUp();
                    var htmDraggable = objItems.parent();
                    hLib.disableDraggingFor(htmDraggable);

                    if (!jQuery.support.touch) {
                        htmDraggable.mousedown(function (e) {
                            e.preventDefault();
                            hLib.slider.itemmovestart(jQuery(this), jQuery(this).closest(".slider").attr("id"));
                        });
                    }
                    else {
                        htmDraggable[0].addEventListener("touchstart", function (e) { hLib.slider.itemmovestart(jQuery(this), jQuery(this).closest(".slider").attr("id"), false, e); }, false);
                        htmDraggable[0].addEventListener("touchmove", hLib.touchMove, false);
                        htmDraggable[0].addEventListener("touchend", hLib.slider.itemmoveend, false);
                    }
                }

                // Show scrollbar
                if (scrollbar) {

                    if (objItems.length > intVisibleItems) {
                        hLib.recordMouseMove();
                        hLib.recordMouseUp();
                        hLib.recordMouseDown();

                        var floScrollFactor = 1.4;
                        var intScrollBarWidth = Math.floor(objInner.width() * 10 / floScrollFactor / objItems.length);
                        if (intScrollBarWidth < 10) intScrollBarWidth = 10;
                        else if (intScrollBarWidth > (objInner.width() / floScrollFactor)) intScrollBarWidth = objInner.width() / floScrollFactor;

                        hLib.arrSliderVars[intSliderIndex].scroll = {
                            scrollmaxx: objInner.width() - intScrollBarWidth - 2,
                            scrollmaxy: objInner.height() - 16 + 2
                        }

                        objSlider.find(".sliderScroll").remove(); // Remove old
                        hLib.arrSliderVars[intSliderIndex].scroll.htm = jQuery("<div class='sliderScroll' style='width: " + objInner.width() + "px;'><div class='scrollbar' style='width: " + intScrollBarWidth + "px' /></div>").appendTo(objSlider).children();
                        hLib.arrSliderVars[intSliderIndex].scroll.htm.attr("data-sliderid", strSliderID);

                        if (!jQuery.support.touch) {
                            hLib.arrSliderVars[intSliderIndex].scroll.htm.mousedown(function (e) {
                                hLib.slider.scrollstart(e, this);
                            }).mouseup(hLib.slider.itemmoveend);

                            hLib.disableDraggingFor(hLib.arrSliderVars[intSliderIndex].scroll.htm);
                        }
                        else {
                            hLib.arrSliderVars[intSliderIndex].scroll.htm[0].addEventListener("touchstart", hLib.slider.scrollstart, false);
                            hLib.arrSliderVars[intSliderIndex].scroll.htm[0].addEventListener("touchmove", hLib.touchMove, false);
                            hLib.arrSliderVars[intSliderIndex].scroll.htm[0].addEventListener("touchend", hLib.slider.itemmoveend, false);
                        }
                    }

                }

                // Move to last known index (ajax scenario)
                if (intCachedItemIndex != -1) {
                    var intItemsToSlide = 0;
                    // Move to last known item
                    if (intCachedItemIndex <= objItems.length) intItemsToSlide = intCachedItemIndex - intVisibleItems;
                    // Move to end
                    else intItemsToSlide = objItems.length - intVisibleItems;
                    if (intItemsToSlide > 0) hLib.slideItems({ intSliderIndex: intSliderIndex, intItemsToMove: intItemsToSlide, intAnimationTimeOverride: 0 });
                }
                // Moving to display selected item on initate
                else if (booMoveToSelectedItem) {
                    var objSelected = objSlider.find("li.selected");
                    var intSelectedNr = ((objItems.index(objSelected) + 2) > objItems.length) ? objItems.length : objItems.index(objSelected) + 2;
                    var intItemsToSlide = (intSelectedNr > intVisibleItems) ? intSelectedNr - intVisibleItems : 0;
                    if (intItemsToSlide > 0) hLib.slideItems({ intSliderIndex: intSliderIndex, intItemsToMove: intItemsToSlide, intAnimationTimeOverride: 0, booInitate: true });
                }

                if (onReady != null) onReady();
            }


            var htmScope = jQuery(btnScope);

            // Start
            htmScope.find("a.sliderStart").click(function (e) {
                if (!jQuery(this).hasClass("inactive")) {
                    if (!jQuery(this).hasClass("inactive")) hLib.slideItems({ intSliderIndex: hLib.getSliderIndexByID(hLib.findSliderIdForArrow(jQuery(this))), intItemsToMove: "start" });
                    return false;
                }
            });
            // End
            htmScope.find("a.sliderEnd").click(function () {
                if (!jQuery(this).hasClass("inactive")) {
                    var intIndex = hLib.getSliderIndexByID(hLib.findSliderIdForArrow(jQuery(this)));
                    var intItemsToMove = hLib.arrSliderVars[intIndex].intTotItems - hLib.arrSliderVars[intIndex].intCurrentItemIndex;
                    if (intItemsToMove > 0) hLib.slideItems({ intSliderIndex: intIndex, intItemsToMove: intItemsToMove });
                }
                return false;
            });
            // Next
            htmScope.find("a.sliderNext").click(function () {
                if (!jQuery(this).hasClass("inactive")) {
                    var intIndex = hLib.getSliderIndexByID(hLib.findSliderIdForArrow(jQuery(this)));
                    var intRemaining = hLib.arrSliderVars[intIndex].intTotItems - hLib.arrSliderVars[intIndex].intCurrentItemIndex;
                    if (intRemaining > 0) {
                        var intItemsToMoveNext = (intRemaining < hLib.arrSliderVars[intIndex].intItemsToSlide) ? intRemaining : hLib.arrSliderVars[intIndex].intItemsToSlide;
                        hLib.slideItems({ intSliderIndex: intIndex, intItemsToMove: intItemsToMoveNext });
                    }
                }
                return false;
            });
            // Prev
            htmScope.find("a.sliderPrev").click(function () {
                if (!jQuery(this).hasClass("inactive")) {
                    var intIndex = hLib.getSliderIndexByID(hLib.findSliderIdForArrow(jQuery(this)));
                    var intRemaining = hLib.arrSliderVars[intIndex].intCurrentItemIndex - hLib.arrSliderVars[intIndex].intVisibleItems;
                    if (intRemaining > 0) {
                        var intItemsToMove = (intRemaining < hLib.arrSliderVars[intIndex].intItemsToSlide) ? intRemaining : hLib.arrSliderVars[intIndex].intItemsToSlide;
                        hLib.slideItems({ intSliderIndex: intIndex, intItemsToMove: (intItemsToMove * -1) });
                    }
                }
                return false;
            });
        }
    }
}

hLib.slider.itemmove = {
    id: "",
    obj: null,
    direction: "",
    mousex: 0,
    mousey: 0,
    sliderx: 0,
    slidery: 0,
    scroll: null,
    scrollactive: false,
    scrollx: 0,
    scrolly: 0,
    width: 0,
    height: 0,
    innerwidth: 0,
    innerheight: 0,
    records: new Array()
}

hLib.slider.scrollstart = function (e, obj) {

    var htmScroll = obj ? jQuery(obj) : jQuery(e.target);
    var slider = hLib.getSliderByID(htmScroll.attr("data-sliderid"));

    hLib.slider.itemmove.scroll = htmScroll;
    hLib.slider.itemmove.scrollactive = true;

    if (jQuery.support.touch && typeof (e) != 'undefined') {
        hLib.mouse.x = e.touches[0].pageX;
        hLib.mouse.y = e.touches[0].pageY;
    }

    hLib.slider.itemmovestart(slider.htm.find(".sliderItems"), slider.strID, true);
}

hLib.slider.itemmovestart = function (obj, id, isScrollBar, e) {
    var slider = hLib.getSliderByID(id);

    if (jQuery.support.touch && typeof (e) != 'undefined') {
        hLib.mouse.x = e.touches[0].pageX;
        hLib.mouse.y = e.touches[0].pageY;
    }

    var posX = hLib.mouse.x;
    var posY = hLib.mouse.y;

    hLib.slider.itemmove.id = id;
    hLib.slider.itemmove.obj = obj;
    hLib.slider.itemmove.width = obj.width();
    hLib.slider.itemmove.height = obj.height();
    hLib.slider.itemmove.innerwidth = obj.parent().width();
    hLib.slider.itemmove.innerheight = obj.parent().height();
    hLib.slider.itemmove.direction = slider.strDirection;

    hLib.slider.itemmove.sliderx = parseInt(obj.css("left"));
    hLib.slider.itemmove.slidery = parseInt(obj.css("top"));
    hLib.slider.itemmove.records.length = 0;

    if (typeof (isScrollBar) != 'undefined' && isScrollBar) {
        hLib.slider.itemmove.scrollx = parseInt(hLib.slider.itemmove.scroll.css("left"));
        hLib.slider.itemmove.scrolly = parseInt(hLib.slider.itemmove.scroll.css("top"));

    }
    else {
        hLib.slider.itemmove.scroll = slider.htm.find(".sliderScroll .scrollbar");
        if (hLib.slider.itemmove.scroll.length == 0) hLib.slider.itemmove.scroll = null;
    }

    hLib.slider.itemmove.mousex = posX;
    hLib.slider.itemmove.mousey = posY;

    // Stopping any current animation for slider and scrollbar
    hLib.slider.itemmove.obj.stop(true, false);
    if (hLib.slider.itemmove.scroll != null) hLib.slider.itemmove.scroll.stop(true, false);

    if (hLib.booIELt9) { document.onmousemove = function (event) { return false; } }
}

hLib.slider.itemmoveactive = function () {

    var moveX = hLib.mouse.x,
        moveY = hLib.mouse.y,
        pctX = 0,
        pctY = 0;

    var sliderIndex = hLib.getSliderIndexByID(hLib.slider.itemmove.id);
    var slider = hLib.arrSliderVars[sliderIndex];

    if (slider.scroll.htm != null) {
        if (hLib.slider.itemmove.direction == "horizontal") {

            var diffX = hLib.slider.itemmove.mousex - moveX;
            var newLeft = hLib.slider.itemmove.scrollx - diffX;
            if (newLeft < 0) newLeft = 0;
            else if (newLeft > slider.scroll.scrollmaxx) newLeft = slider.scroll.scrollmaxx;

            hLib.slider.itemmove.scroll.css("left", newLeft + "px");
            hLib.slider.itemmove.scrollx = newLeft;

            pctX = newLeft / slider.scroll.scrollmaxx * -1;
        }
        else {
            // No support for vertical slider yet...
        }
    }

    // Record
    hLib.slider.itemmove.records.unshift({ x: moveX, y: moveY, time: hLib.getTime() });
    if (hLib.slider.itemmove.records.length > 100) hLib.slider.itemmove.records.length = 50;

    // Move slider
    if (hLib.slider.itemmove.direction == "horizontal") {
        if (hLib.slider.itemmove.scrollactive) {
            hLib.slider.itemmove.sliderx = ((slider.intTotItems * slider.intItemWidth) - hLib.slider.itemmove.innerwidth) * pctX;
        }
        else {
            hLib.slider.itemmove.sliderx += (hLib.slider.itemmove.mousex - moveX) * -1;

            if (slider.scroll.htm != null) {
                var scrollLeft = 0;
                if (hLib.slider.itemmove.sliderx < 0) {
                    scrollLeft = Math.floor((Math.abs(hLib.slider.itemmove.sliderx) / ((slider.intTotItems - slider.intVisibleItems) * slider.intItemWidth)) * slider.scroll.scrollmaxx);
                    if (scrollLeft > slider.scroll.scrollmaxx) scrollLeft = slider.scroll.scrollmaxx;
                }
                slider.scroll.htm.stop(true, false).css({ "left": scrollLeft + "px" });
            }
        }

        hLib.slider.itemmove.obj.css("left", hLib.slider.itemmove.sliderx + "px");
        hLib.slider.itemmove.mousex = moveX;
    }
    else {
        hLib.slider.itemmove.slidery += ((hLib.slider.itemmove.mousey - moveY) * -1);
        hLib.slider.itemmove.obj.css("top", hLib.slider.itemmove.slidery + "px");
        hLib.slider.itemmove.mousey = moveY;
    }
}

hLib.slider.itemmoveend = function () {

    if (hLib.slider.itemmove.records.length > 0) {
        var intLastI, time;
        var sliderIndex = hLib.getSliderIndexByID(hLib.slider.itemmove.id);
        var slider = hLib.arrSliderVars[sliderIndex];

        if (!hLib.slider.itemmove.scrollactive) {
            intLastI = (hLib.slider.itemmove.records.length > 3) ? 2 : hLib.slider.itemmove.records.length - 1;
            time = hLib.slider.itemmove.records[0].time - hLib.slider.itemmove.records[intLastI].time;
        }

        // Reset
        hLib.slider.itemmove.obj = null;
        if (hLib.slider.itemmove.direction == "horizontal") {
            if (!hLib.slider.itemmove.scrollactive && hLib.slider.itemmove.records.length > 10) {
                var dist = hLib.slider.itemmove.records[0].x - hLib.slider.itemmove.records[intLastI].x;
                hLib.slider.itemmove.sliderx += Math.floor((dist / time) * 400);
                hLib.slideItems({ intSliderIndex: sliderIndex, intToClosest: hLib.slider.itemmove.sliderx });
            }
            else hLib.slideItems({ intSliderIndex: sliderIndex, intToClosest: hLib.slider.itemmove.sliderx });

        }
        else {
            if (hLib.slider.itemmove.scroll == null) {
                var dist = hLib.slider.itemmove.records[0].y - hLib.slider.itemmove.records[intLastI].y;
                hLib.slider.itemmove.slidery += Math.floor(dist / time * 200);
            }
            hLib.slideItems({ intSliderIndex: sliderIndex, intToClosest: hLib.slider.itemmove.slidery });
        }
        if (hLib.booIELt9) { document.onmousemove = null; }

        // More reset
        hLib.slider.itemmove.scroll = null;
        hLib.slider.itemmove.scrollactive = false;
    }
    else {
        // Reset
        hLib.slider.itemmove.obj = null;
        hLib.slider.itemmove.scroll = null;
        hLib.slider.itemmove.scrollactive = false;
    }
}

jQuery.fn.hSlider = function (opts) { return this.each(function () { hLib.slider(this, opts); }); }

// Old naming convention
hLib.enableSlider = hLib.slider;

hLib.findSliderIdForArrow = function (obj) {
    do { obj = obj.parent() }
    while (obj.find(".sliderInner").length == 0 || obj.parent().is("body"));
    return obj.find(".sliderInner").parent().attr("id");
}

/*** Slide items
* hLib.slideItems(intSliderIndex, intToIndex);
***/

hLib.slideItems = function (sC, intToIndex) {

    if (typeof (intToIndex) != 'undefined') {
        var intSliderIndex = hLib.getSliderIndexByID(sC);
        var objSlider = hLib.arrSliderVars[intSliderIndex];

        if (intToIndex == "++") intToIndex = objSlider.intCurrentItemIndex;
        else if (intToIndex == "--") intToIndex = objSlider.intCurrentItemIndex - 2;

        if (intToIndex < 0) intToIndex = 0;
        if (intToIndex < objSlider.intVisibleItems) intToIndex = objSlider.intVisibleItems - 1;
        else if (intToIndex >= objSlider.intTotItems) intToIndex = objSlider.intTotItems - 1;
        var intItemsToMove = (intToIndex + 1) - objSlider.intCurrentItemIndex; // intToIndex is 0-based

        sC = {
            "intSliderIndex": intSliderIndex,
            "intItemsToMove": intItemsToMove
        }
    }

    // Getting closest item at position
    if (typeof (sC.intToClosest) != 'undefined') {
        var slider = hLib.arrSliderVars[sC.intSliderIndex];
        if (slider.strDirection == "horizontal" && hLib.slider.itemmove.sliderx > 0) sC.intItemsToMove = "start";
        else if (slider.strDirection == "vertical" && hLib.slider.itemmove.slidery > 0) sC.intItemsToMove = "start";
        else {
            var distance = 999999999;
            var closestItemIndex = 0;
            for (si = 0; si < slider.intTotItems; si++) {

                var tmpDistance = Math.abs((si * slider.intItemWidth) - Math.abs(hLib.slider.itemmove.sliderx));
                if (slider.strDirection == "vertical") tmpDistance = Math.abs((si * slider.intItemHeight) - Math.abs(hLib.slider.itemmove.slidery));

                if (tmpDistance < distance) {
                    distance = tmpDistance;
                    closestItemIndex = si;
                }
            }
            if (closestItemIndex > (slider.intTotItems - slider.intVisibleItems)) closestItemIndex = slider.intTotItems - slider.intVisibleItems;

            sC.toPosition = (closestItemIndex * hLib.arrSliderVars[sC.intSliderIndex].intItemWidth) * -1;
            if (slider.strDirection == "vertical") sC.toPosition = (closestItemIndex * hLib.arrSliderVars[sC.intSliderIndex].intItemHeight) * -1;
            sC.closestItemIndex = closestItemIndex;
        }
    }

    if (hLib.isInt(sC.intItemsToMove) || sC.intItemsToMove == "start" || typeof (sC.toPosition) != 'undefined') {
        var optAnimate = {};
        var optAnimateScroll = 0;
        var strMovePxDirection = "-=";
        var slider = hLib.arrSliderVars[sC.intSliderIndex];
        var htmSlider = slider.htm;
        var htmSliderItems = htmSlider.find(".sliderItems").stop(true, true);

        slider.intCurrentItemIndex += sC.intItemsToMove;

        if (typeof (sC.intAnimationTimeOverride) == 'undefined') sC.intAnimationTimeOverride = slider.intAnimationTime;

        if (sC.intItemsToMove < 0) {
            strMovePxDirection = "+=";
            sC.intItemsToMove = Math.abs(sC.intItemsToMove);
        }
        if (slider.strDirection == "horizontal") {
            if (sC.intItemsToMove == "start") {
                optAnimate.left = 0;
                optAnimateScroll = optAnimate.left;
                slider.intCurrentItemIndex = slider.intVisibleItems;
            }
            else if (typeof (sC.toPosition) != 'undefined') {
                optAnimate.left = sC.toPosition;
                optAnimateScroll = optAnimate.left;
                slider.intCurrentItemIndex = sC.closestItemIndex + slider.intVisibleItems;
            }
            else {
                optAnimate.left = strMovePxDirection + sC.intItemsToMove * slider.intItemWidth;
                if (slider.scroll.htm != null) {
                    var intNewLeft = parseInt(htmSliderItems.css("left")) + (sC.intItemsToMove * slider.intItemWidth);
                    if (strMovePxDirection == "-=") intNewLeft = parseInt(htmSliderItems.css("left")) - (sC.intItemsToMove * slider.intItemWidth);
                    optAnimateScroll = intNewLeft;
                }
            }
        }
        else {
            if (sC.intItemsToMove == "start") {
                optAnimate.top = 0;
                slider.intCurrentItemIndex = slider.intVisibleItems;
            }
            else if (typeof (sC.toPosition) != 'undefined') {
                optAnimate.top = sC.toPosition;
                slider.intCurrentItemIndex = sC.closestItemIndex + slider.intVisibleItems;
            }
            else optAnimate.top = strMovePxDirection + (sC.intItemsToMove * (slider.intItemHeight + slider.intItemAdjustAnimateY));
        }

        // Animate slider
        htmSliderItems.animate(optAnimate, sC.intAnimationTimeOverride, slider.strAnimationType, function () {
            if ((sC.booInitate != undefined && !sC.booInitate) || sC.booInitate == undefined) {
                if (slider.onAnimationComplete != null) {
                    slider.onAnimationComplete();
                }
            }
        });

        // Animate scrollbar
        if (slider.scroll.htm != null) {
            var scrollLeft = (Math.abs(optAnimateScroll) / ((slider.intTotItems - slider.intVisibleItems) * slider.intItemWidth)) * slider.scroll.scrollmaxx;
            slider.scroll.htm.stop(true, false).animate({ "left": scrollLeft }, sC.intAnimationTimeOverride, slider.strAnimationType);
        }

        hLib.updateSliderArrows(sC.intSliderIndex);
    }
    return;
}
hLib.getSliderByID = function (strSliderID) { for (i = 0; i < hLib.arrSliderVars.length; i++) { if (hLib.arrSliderVars[i] != null && hLib.arrSliderVars[i].strID == strSliderID) { return hLib.arrSliderVars[i]; } } return -1; }
hLib.getSliderIndexByID = function (strSliderID) { for (i = 0; i < hLib.arrSliderVars.length; i++) { if (hLib.arrSliderVars[i] != null && hLib.arrSliderVars[i].strID == strSliderID) { return i; } } return -1; }
hLib.getVisibleSliderItemsByID = function (strSliderID) { var intSliderIndex = hLib.getSliderIndexByID(strSliderID); return jQuery("#" + hLib.arrSliderVars[intSliderIndex].strID).find(".sliderItems li").slice(hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex - hLib.arrSliderVars[intSliderIndex].intVisibleItems, hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex); }
hLib.updateSliderArrows = function (intSliderIndex) {

    var arrSlidersBack = null, arrSlidersForw = null, objSlider = null;

    // Get arrows
    objSlider = jQuery("#" + hLib.arrSliderVars[intSliderIndex].strID);
    do { arrSlidersBack = objSlider.find(".sliderStart, .sliderPrev"); objSlider = objSlider.parent(); }
    while (!objSlider.is("body") && arrSlidersBack.length == 0);

    objSlider = jQuery("#" + hLib.arrSliderVars[intSliderIndex].strID);
    do { arrSlidersForw = objSlider.find(".sliderNext, .sliderEnd"); objSlider = objSlider.parent(); }
    while (!objSlider.is("body") && arrSlidersForw.length == 0);

    // Less or equal items as visible
    if (hLib.arrSliderVars[intSliderIndex].intTotItems <= hLib.arrSliderVars[intSliderIndex].intVisibleItems) {
        arrSlidersBack.addClass("useless");
        arrSlidersForw.addClass("useless");
    }

    // At start
    if (hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex <= hLib.arrSliderVars[intSliderIndex].intVisibleItems) arrSlidersBack.addClass("inactive");
    else arrSlidersBack.removeClass("inactive");

    // At end
    if ((hLib.arrSliderVars[intSliderIndex].intTotItems - hLib.arrSliderVars[intSliderIndex].intCurrentItemIndex) == 0) arrSlidersForw.addClass("inactive");
    else arrSlidersForw.removeClass("inactive");
}

/*********************************
Quick search
**********************************/
hLib.quickSearch = function (opt) {

    if (opt != undefined) {
        if (opt.input != undefined) {
            if (opt.result != undefined) {
                if (opt.datasrc != undefined) {

                    hLib.recordMouseDown();

                    var qs = {
                        uniqueid: "qsbase",
                        id: "",
                        state: "stopped",
                        mode: "onsubmit",
                        input: "",
                        btn: "",
                        btnid: "",
                        result: "",
                        resultid: "",
                        resultvisible: false,
                        datasrc: opt.datasrc,
                        dataparametername: "s",
                        onajaxcomplete: null,
                        onbeforedisplay: null,
                        oninputsubmit: null,
                        onitemsubmit: null,
                        onentersubmit: null,
                        hideresultonemptysearch: false,
                        ajaxType: "GET",
                        lastKeyPress: 0,
                        timeoutID: null,
                        timeout: 400,
                        cachedata: null,
                        forceStop: false,
                        keepResultIfRefresh: false,
                        injectScript: false,
                        resultJSON: false,
                        minSearchLength: 1
                    };

                    jQuery.extend(qs, opt);
                    if (qs.mode == "onsubmit" && qs.timeout == 400) qs.timeout = 1;

                    // Setting up input and result
                    qs.input = jQuery(qs.input);
                    qs.btn = jQuery(qs.btn);
                    qs.result = jQuery(qs.result).append(jQuery("<div class='quickSearchResultContainer'/>")); ;

                    // Get/set id for input, result and button
                    qs.id = hLib.setID(qs.input, qs.uniqueid);
                    qs.btnid = hLib.setID(qs.btn, qs.uniqueid + "btn");
                    qs.resultid = hLib.setID(qs.result.find(".quickSearchResultContainer"), qs.uniqueid + "result");
                    if (typeof (qs.uniqueid) == 'undefined' || qs.uniqueid == "qsbase") qs.uniqueid = qs.btnid;

                    // Removing any old instance of quick search
                    for (q = 0; q < hLib.arrQuickSearch.length; q++) {
                        if (hLib.arrQuickSearch[q].id == qs.id) {
                            if (!qs.keepResultIfRefresh) hLib.arrQuickSearch[q].result.remove();
                            hLib.arrQuickSearch.splice(q, 1);
                        }
                    }

                    // Setting up quick search object
                    hLib.arrQuickSearch.push(qs);

                    // Btn width
                    if (qs.length > 0) qs.width(qs.width());

                    // Events
                    var strEventType = (hLib.booIELt7) ? "keypress" : "keyup";
                    qs.input.bind(strEventType, function (e) {

                        hLib.quickSearch.current.event = e;
                        hLib.quickSearch.current.id = jQuery(this).attr("id");

                        // Stop all other quick searches
                        for (x = 0; x < hLib.arrQuickSearch.length; x++) {
                            if (hLib.quickSearch.current.id != hLib.arrQuickSearch[x].id) {
                                hLib.arrQuickSearch[x].state = "stopped"
                                hLib.arrQuickSearch[x].result.hide();
                            }
                        }

                        hLib.attemptSearch(e, hLib.quickSearch.current.id);
                    }).focusin(hLib.quickSearchInputFocusIn).focusout(hLib.quickSearchInputFocusOut);

                    qs.btn.click(function (e) {
                        objBtn = jQuery(this);
                        if (!objBtn.parent().hasClass("searching")) {
                            var objSearch = hLib.getQuickSearchByBtnID(objBtn.attr("id"));
                            if (objSearch.oninputsubmit != null) objSearch.oninputsubmit(objSearch);
                            else hLib.attemptSearch(e, objSearch.id, "btnsubmit");
                        }
                        return false;
                    });
                }
            }
        }
    }
}
hLib.enableQuickSearch = hLib.quickSearch; // Legacy support
hLib.quickSearch.current = {
    event: null,
    id: null
}

jQuery.fn.quickSearch = function (opt) {
    return this.each(function () {
        opt.input = this;
        hLib.quickSearch(opt);
    });
}

hLib.quickSearchInputFocusIn = function () {
    var objSearch = hLib.getQuickSearchByInputID(jQuery(this).attr("id"));
    objSearch.state = "typing";
    objSearch.input.parent().addClass("searchTyping");
    hLib.strActiveQuickSearchID = objSearch.id;
}

hLib.quickSearchInputFocusOut = function () {
    var objSearch = hLib.getQuickSearchByInputID(jQuery(this).attr("id"));
    objSearch.input.parent().removeClass("searchTyping");
    hLib.strActiveQuickSearchID = null;
}

hLib.attemptSearch = function (e, searchID, override) {

    var objSearch = hLib.getQuickSearchByInputID(searchID);
    if (objSearch != -1) {
        objSearch.lastKeyPress = new Date().getTime();
        clearTimeout(objSearch.timeoutID);

        var booRunSearch = false;
        if (objSearch.mode == "onkeypress") booRunSearch = true;

        var code = e.keyCode || e.which;
        if (hLib.booIE6) code = (code == 0) ? 13 : code;
        if (override != undefined) code = override;

        // Back space or del
        if (code == 8 || code == 26) code = "backOrDel";
        // Esc or tab
        if (code == 27 || code == 9) code = "escOrTab";

        switch (code) {
            // Esc                
            case "escOrTab":
                hLib.hideSearchResult(searchID);
                objSearch.state = "typing";
                booRunSearch = false;
                break;
            // Back space                                   
            case "backOrDel":
                objSearch.state = "typing";
                if (objSearch.mode == "onkeypress") objSearch.result.find(".searchListItem.selected").removeClass("selected");
                else {
                    booRunSearch = false;
                    hLib.stopSearching(objSearch.id);
                }

                if (objSearch.hideresultonemptysearch && objSearch.input.val().length <= 1) hLib.hideSearchResult(objSearch.id);

                break;
            // Arrow down                                   
            case 40:
                booRunSearch = false;
                objSearch.state = "navigating";
                var objItems = objSearch.result.find(".searchListItem");
                if (objItems.length > 0) {
                    var index = -1;
                    for (x = 0; x < objItems.length; x++) {
                        if (objItems.eq(x).hasClass("selected")) {
                            objItems.removeClass("selected");
                            index = x;
                        }
                    }
                    objItems.eq(index + 1).addClass("selected");
                }
                break;
            // Arrow up                                                                                                               
            case 38:
                booRunSearch = false;
                objSearch.state = "navigating";
                var objItems = objSearch.result.find(".searchListItem");
                if (objItems.length > 0) {
                    var index = objItems.length;
                    for (x = 0; x < objItems.length; x++) {
                        if (objItems.eq(x).hasClass("selected")) {
                            objItems.removeClass("selected");
                            index = x;
                        }
                    }
                    if (index != 0) objItems.eq(index - 1).addClass("selected");
                }
                break;
            // Enter                                                                                                               
            case 13:
                e.preventDefault();
                booRunSearch = false;
                if (objSearch.mode == "onsubmit" && objSearch.state == "typing") booRunSearch = true;
                else if (objSearch.mode == "onkeypress" && objSearch.state == "typing" && objSearch.oninputsubmit != null) objSearch.oninputsubmit(objSearch.input, objSearch);
                else if (objSearch.state == "navigating" && objSearch.onitemsubmit != null) objSearch.onitemsubmit(objSearch.result.find(".searchListItem.selected"), objSearch);
                break;
            // Submit                                                                                                               
            case "btnsubmit":
                booRunSearch = true;
                break;
            default:
                objSearch.state = "typing";
                objSearch.result.find(".searchListItem.selected").removeClass("selected");
                break;
        }

        if (booRunSearch) {

            hLib.strActiveQuickSearchID = objSearch.id;
            objSearch.timeoutID = setTimeout(function () {

                if (objSearch.mode == "onsubmit" || (objSearch.mode == "onkeypress" && (new Date().getTime() - objSearch.lastKeyPress) >= (objSearch.timeout - 50))) {
                    objSearch.forceStop = false;
                    if (jQuery.trim(objSearch.input.val()) != "") {

                        objSearch.btn.addClass("searching");
                        objSearch.input.parent().addClass("searching");

                        if (objSearch.injectScript) {
                            jQuery.getScript(objSearch.datasrc + "&" + objSearch.dataparametername + "=" + objSearch.input.val());
                        }
                        else {
                            var objSData = {};
                            objSData[objSearch.dataparametername] = objSearch.input.val();

                            jQuery.ajax({
                                url: objSearch.datasrc,
                                data: objSData,
                                type: objSearch.ajaxType,
                                cache: false,
                                success: function (data) {
                                    hLib.prepareAndDisplayQuickSearchResult(objSearch, data);
                                }
                            });
                        }
                    }
                }
            }, objSearch.timeout);
        }
    }
}
hLib.hideSearchResult = function (searchID) {
    var objSearch = hLib.getQuickSearchByInputID(searchID);
    hLib.stopSearching(searchID);
    objSearch.result.hide(0);
    objSearch.resultvisible = false;
    objSearch.input.parent().removeClass("searchResultVisible");

}
hLib.stopSearching = function (searchID) {
    var objSearch = hLib.getQuickSearchByInputID(searchID);
    objSearch.input.parent().removeClass("searching");
    objSearch.btn.removeClass("searching");
    objSearch.forceStop = true;
}
hLib.prepareAndDisplayQuickSearchResult = function (qs_objSearch, qs_data) {

    var objSearchActive = hLib.getActiveQuickSearch();

    var objSearch = null,
        data = null;

    // Assume injectScript is run
    if (objSearchActive.injectScript && typeof (qs_data) == "undefined") {
        data = qs_objSearch;
        objSearch = objSearchActive;
    }
    else {
        data = qs_data;
        objSearch = qs_objSearch;
    }

    // Prepare data if not cached
    if (data != null) {

        if (!objSearch.resultJSON) data = jQuery(data);

        // Modify result
        if (jQuery.isFunction(objSearch.onajaxcomplete)) data = jQuery(objSearch.onajaxcomplete(data, objSearch));

        // Get navigation container and children
        var objMainContainer = null;
        if (data.is("ul") || data.is("table")) objMainContainer = data;
        else {

            var objFindMainContainer = data;
            var booFoundMainContainer = false;
            do {
                objFindMainContainer = objFindMainContainer.children("table, ul");
                if (objFindMainContainer.length > 0) {
                    objMainContainer = objFindMainContainer.eq(0);
                    booFoundMainContainer = true;
                }
            }
            while (!booFoundMainContainer && objFindMainContainer.length > 0);
        }
        if (objMainContainer != null) {
            objMainContainer.addClass("mainContainer");
            var objListItems = jQuery("");
            if (objMainContainer.is("ul")) objListItems = objMainContainer.find("> li:not(.searchListItemInactive)").addClass("searchListItem");
            else if (objMainContainer.is("table")) objListItems = objMainContainer.find("> tr, > tbody > tr:not(.searchListItemInactive)").addClass("searchListItem");

            // Navigation on result list
            objListItems.mouseenter(function () {
                var objListItem = jQuery(this);
                objListItem.siblings().removeClass("selected");
                objListItem.addClass("selected");
                var objActiveSearch = hLib.getActiveQuickSearch();
                objActiveSearch.state = "navigating";
            }).click(function (e) {
                var objActiveSearch = hLib.getActiveQuickSearch();
                return objActiveSearch.onitemsubmit(objActiveSearch.result.find(".searchListItem.selected"), objActiveSearch);
            });
        }

        objSearch.cachedata = data;
    }
    if (!objSearch.forceStop) {

        if (objSearch.onbeforedisplay != null) {
            var htmTmp = objSearch.onbeforedisplay(objSearch.cachedata, objSearch);
            if (typeof (htmTmp) != 'undefined') objSearch.cachedata = htmTmp;
        }

        if (data != undefined) objSearch.result.html(objSearch.cachedata);

        objSearch.result.show().parent().show();
        objSearch.resultvisible = true;
        objSearch.btn.removeClass("searching");
        objSearch.input.parent().removeClass("searching");
        objSearch.input.parent().addClass("searchResultVisible");
    }
}
hLib.getQuickSearchByInputID = function (searchID) { for (x = 0; x < hLib.arrQuickSearch.length; x++) { if (hLib.arrQuickSearch[x].id == searchID) { return hLib.arrQuickSearch[x]; } } return "-1"; }
hLib.getQuickSearchByResultID = function (searchID) { for (x = 0; x < hLib.arrQuickSearch.length; x++) { if (hLib.arrQuickSearch[x].resultid == searchID) { return hLib.arrQuickSearch[x]; } } return "-1"; }
hLib.getQuickSearchByBtnID = function (searchID) { for (x = 0; x < hLib.arrQuickSearch.length; x++) { if (hLib.arrQuickSearch[x].btnid == searchID) { return hLib.arrQuickSearch[x]; } } return "-1"; }
hLib.getActiveQuickSearch = function () { for (x = 0; x < hLib.arrQuickSearch.length; x++) { if (hLib.arrQuickSearch[x].state != "stopped") { return hLib.arrQuickSearch[x]; } } return "-1"; }

/*********************************
Image zoom
**********************************/
hLib.enableZoom = function (objElem) {

    var objImg = jQuery(objElem);
    if (objImg.attr("longdesc") != undefined && objImg.attr("longdesc").length > 0) {

        hLib.recordMouseMove();

        var objParent = objImg.parent();

        // Make sure the slider has an ID
        var strZoomID = hLib.setID(objImg, "zoom");

        // Waiting for image to be loaded
        objImg.imageLoaded(function () {

            var intZoomInstance = hLib.zoom.vars.push({
                objSmallImg: objImg,
                strSmallImgSrc: objImg.attr("src"),
                strInstanceID: strZoomID,
                strLargeImageSrc: objImg.attr("longdesc"),
                booLargeImageLoaded: false,
                booZoomType: "normal", // normal, overlay
                booZoomActivationType: "click", // click, hover
                intLargeImgWidth: 0,
                intLargeImgHeight: 0,
                intSmallImgWidth: 0,
                intSmallImgHeight: 0,
                intSmallImgOffsetLeft: 0,
                intSmallImgOffsetTop: 0,
                intSmallImgPosLeft: 0,
                intSmallImgPosTop: 0,
                intSmallImgBorderTop: 0,
                intSmallImgBorderRight: 0,
                intSmallImgBorderBottom: 0,
                intSmallImgBorderLeft: 0,
                intMagnifierWidth: 0,
                intMagnifierHeight: 0,
                intZoomAreaWidth: 0,
                intZoomAreaHeight: 0,
                intDiffLargeSmallX: 0,
                intDiffLargeSmallY: 0,
                intLastActivateTime: 0,
                objMagnifier: null,
                strActiveQuickSearchID: null,
                useless: false
            }) - 1;

            // Preload large images
            if (jQuery(".hLibPreloadArea").find("img." + strZoomID).length == 0) {
                var objLargeImg = hLib.cloneToVisibleItem(jQuery("<img src='" + objImg.attr("longdesc") + "' class='" + strZoomID + "' alt='Image preload for zoom' />"));
                hLib.getHiddenImageDimensions(objLargeImg, function (dimensions) {
                    var zoom = hLib.zoom.vars[intZoomInstance];
                    zoom.booLargeImageLoaded = true;
                    zoom.intLargeImgWidth = dimensions.width;
                    zoom.intLargeImgHeight = dimensions.height;
                    if (dimensions.width <= zoom.intSmallImgWidth) zoom.useless = true;
                });
            }

            if (objImg.hasClass("overlayZoom")) hLib.zoom.vars[intZoomInstance].booZoomType = "overlay";
            else if (objImg.hasClass("inlineZoom")) hLib.zoom.vars[intZoomInstance].booZoomType = "inline";

            // Add zoom area (if not created)
            var strZoomAreaAdditionals = "";
            if (hLib.zoom.vars[intZoomInstance].booZoomType == "inline") strZoomAreaAdditionals += " zoomAreaInline ";
            if (objImg.attr("zoomTargetArea") != undefined && objImg.siblings(".zoomArea").length == 0) objParent.append("<div class='zoomArea " + strZoomID + "'></div>");
            else if (jQuery(".zoomArea." + strZoomID).length == 0) objParent.append("<div class='zoomArea " + strZoomAreaAdditionals + strZoomID + "'></div>");

            // Activation type of zoom
            if (objImg.hasClass("activeOnHover")) {
                hLib.zoom.vars[intZoomInstance].booZoomActivationType = "hover";
                objImg.mouseenter(function () {
                    if ((new Date().getTime() - hLib.zoom.vars[intZoomInstance].intLastActivateTime) > 500) {
                        hLib.hideZoom();
                        hLib.showZoom(strZoomID);
                    }
                });
            }
            else objImg.click(function () { hLib.showZoom(strZoomID); });
        });

        // Make sure parent of image has correct position set
        if (objParent.css("position") != "absolute" && objParent.css("position") != "fixed") objParent.css("position", "relative");
    }
}

hLib.showZoom = function (strZoomID) {

    hLib.zoom.initated = true;

    // Getting zoom instance id and array index
    if (strZoomID == undefined) strZoomID = hLib.zoom.activeID;
    if (strZoomID != hLib.zoom.activeID && hLib.zoom.activeID != null) hLib.hideZoom(); // Close all other instances before starting new
    if (hLib.zoom.activeIndex == -1) hLib.zoom.activeIndex = hLib.getZoomInstanceIndex(strZoomID);

    var arrZoom = hLib.zoom.vars[hLib.zoom.activeIndex];

    // Will not zoom, the large image is not larger than the original
    if (arrZoom.useless) {
        return;
    }

    var objZoom = jQuery("#" + strZoomID);
    var objParent = objZoom.parent();

    arrZoom.intLastActivateTime = new Date().getTime();

    // Displaying zoom area
    var objZoomArea = jQuery(".zoomArea." + strZoomID);
    if (!objZoomArea.is(":visible") && arrZoom.booZoomType == "normal") objZoomArea.fadeIn(250);

    // Checking if image is loaded
    if (arrZoom.booLargeImageLoaded) {

        // Save zoom instance variables
        arrZoom.intSmallImgWidth = objZoom.outerWidth();
        arrZoom.intSmallImgHeight = objZoom.outerHeight();
        arrZoom.intSmallImgOffsetLeft = Math.ceil(objZoom.offset().left);
        arrZoom.intSmallImgOffsetTop = Math.ceil(objZoom.offset().top);
        arrZoom.intSmallImgPosLeft = Math.ceil(objZoom.position().left);
        arrZoom.intSmallImgPosTop = Math.ceil(objZoom.position().top);
        arrZoom.intSmallImgBorderTop = parseInt(objZoom.css("border-top-width"));
        arrZoom.intSmallImgBorderRight = parseInt(objZoom.css("border-right-width"));
        arrZoom.intSmallImgBorderBottom = parseInt(objZoom.css("border-bottom-width"));
        arrZoom.intSmallImgBorderLeft = parseInt(objZoom.css("border-left-width"));
        arrZoom.zoomAreaVisible = false;

        // Add magnifier (if not created)
        if (jQuery(".zoomMagnifier." + strZoomID).length == 0) objParent.append("<div class='zoomMagnifier " + strZoomID + "'></div>");
        arrZoom.objMagnifier = jQuery(".zoomMagnifier." + strZoomID);

        if (arrZoom.booZoomType == "overlay") {
            objZoomArea.addClass("zoomAreaOverlay");

            // Overlay zoom cannot be bigger than 1/2 than thumb size
            if (objZoomArea.width() > (arrZoom.intSmallImgWidth / 2) || objZoomArea.height() > (arrZoom.intSmallImgHeight / 2)) {
                objZoomArea.width((arrZoom.intSmallImgWidth / 2));
                objZoomArea.height((arrZoom.intSmallImgHeight / 2));
            }

            objZoomArea.hover(
                function () { jQuery(this).addClass("hover"); },
                function () { jQuery(this).removeClass("hover"); }
            );

            arrZoom.objMagnifier.hide();
        }

        arrZoom.intZoomAreaWidth = objZoomArea.width();
        arrZoom.intZoomAreaHeight = objZoomArea.height();

        var objMagnifier = arrZoom.objMagnifier;

        objZoomArea.css("background-image", "url('" + arrZoom.strLargeImageSrc + "')");

        // Inline zoom area setup
        if (arrZoom.booZoomType == "inline") {
            objZoomArea.css({
                top: arrZoom.intSmallImgPosTop + arrZoom.intSmallImgBorderTop,
                left: arrZoom.intSmallImgPosLeft + arrZoom.intSmallImgBorderLeft,
                width: arrZoom.intSmallImgWidth - arrZoom.intSmallImgBorderLeft - arrZoom.intSmallImgBorderRight,
                height: arrZoom.intSmallImgHeight - arrZoom.intSmallImgBorderTop - arrZoom.intSmallImgBorderBottom,
                background: "url(" + arrZoom.strLargeImageSrc + ") no-repeat 0 0 transparent"
            }).show();
        }

        // Adjusting size of magnifier
        arrZoom.intMagnifierWidth = Math.ceil(arrZoom.intSmallImgWidth / (arrZoom.intLargeImgWidth / objZoomArea.innerWidth()));
        arrZoom.intMagnifierHeight = Math.ceil(arrZoom.intSmallImgHeight / (arrZoom.intLargeImgHeight / objZoomArea.innerHeight()));
        var intBorderWidth = parseInt(objMagnifier.css("border-left-width")) + parseInt(objMagnifier.css("border-right-width"));
        var intBorderHeight = parseInt(objMagnifier.css("border-top-width")) + parseInt(objMagnifier.css("border-bottom-width"));

        objMagnifier.width(arrZoom.intMagnifierWidth - intBorderWidth).height(arrZoom.intMagnifierHeight - intBorderHeight);

        // The difference between small image and large image
        arrZoom.intDiffLargeSmallX = arrZoom.intLargeImgWidth / arrZoom.intSmallImgWidth;
        arrZoom.intDiffLargeSmallY = arrZoom.intLargeImgHeight / arrZoom.intSmallImgHeight;

        hLib.zoom.vars[hLib.zoom.activeIndex] = arrZoom;
        hLib.zoom.active = true;
    }
    else setTimeout("hLib.showZoom();", 100); // Wait for large image to load

    hLib.zoom.activeID = strZoomID;
}

hLib.hideZoom = function () {
    hLib.zoom.initated = false;
    hLib.zoom.active = false;
    hLib.zoom.activeID = null;
    hLib.zoom.activeIndex = -1;
    jQuery(".zoomArea").fadeOut(250);
    jQuery(".zoomMagnifier").fadeOut(250);
}

hLib.getZoomInstanceIndex = function (strZoomID) {
    for (i = 0; i < hLib.zoom.vars.length; i++) {
        if (hLib.zoom.vars[i].strInstanceID == strZoomID) return i;
    }
    return 0;
}

/***********************************************************
Generic Range (price) slider
***********************************************************/
// Slider json object
hLib.rangeSlider = {
    "sliders": new Array(),
    "active": -1
}

// Initiating slider
hLib.initRangeSlider = function (objRef, opt) {

    var rangeSlider = {
        booActiveMin: false,
        objSlider: jQuery(objRef),
        objArrowActive: null,
        objArrowMin: null,
        objArrowMax: null,
        objMinPrice: null,
        objMaxPrice: null,
        objInactiveMin: null,
        objInactiveMax: null,
        intInitialMinPrice: null,
        intInitialMaxPrice: null,
        intSelectedMinPx: null,
        intSelectedMaxPx: null,
        intArrowWidth: null,
        intWrapperWidth: null,
        intArrowMinPosition: null,
        intArrowMaxPosition: null,
        intArrowActiveAdjustLeft: null,
        intOffsetLeft: null,
        intOffsetRight: null,
        intStepWidth: null,
        intStepsMin: -1,
        intStepsMax: -1,
        intStepsCount: 100,
        intSingleStep: -1,
        intCurrentMinPrice: null,
        intCurrentMaxPrice: null,
        onRangeSet: null,
        arrSteps: new Array(),
        strRound: "none", // -1, up, down, none
        intRoundValue: 0, // 1, 10, 100, 1000...
        valueName: "", // Kr/$/SEK etc..
        valueType: "int", //Int, string
        arrStepsCheckpointPx: new Array(),
        intMarkers: 2,
        smoothMove: false,
        canSelectSingleValue: false
    }

    if (rangeSlider.objSlider.length > 0) {

        hLib.recordMouseMove();
        hLib.recordMouseUp();

        rangeSlider.id = hLib.setID(rangeSlider.objSlider);

        // Getting objects
        rangeSlider.objArrowMin = rangeSlider.objSlider.find(".slider.minPrice");
        rangeSlider.objArrowMax = rangeSlider.objSlider.find(".slider.maxPrice");
        rangeSlider.objInactiveMin = rangeSlider.objSlider.find(".inactiveMin");
        rangeSlider.objInactiveMax = rangeSlider.objSlider.find(".inactiveMax");
        rangeSlider.objMinPrice = rangeSlider.objSlider.parent().find(".priceBottom .minPrice");
        rangeSlider.objMaxPrice = rangeSlider.objSlider.parent().find(".priceBottom .maxPrice");

        // Custom options
        if (opt != undefined) {
            rangeSlider.intStepsMin = opt.minValue || rangeSlider.intStepsMin;
            rangeSlider.intStepsMax = opt.maxValue || rangeSlider.intStepsMax;
            rangeSlider.intStepsCount = opt.steps || rangeSlider.objSlider.width();
            rangeSlider.arrSteps = opt.arrSteps || rangeSlider.arrSteps;
            rangeSlider.intInitialMinPrice = opt.minValueInit || rangeSlider.intStepsMin;
            rangeSlider.intInitialMaxPrice = opt.maxValueInit || rangeSlider.intStepsMax;
            rangeSlider.intSingleStep = opt.stepInterval || rangeSlider.intSingleStep;
            rangeSlider.onRangeSet = opt.onRangeSet || undefined;
            rangeSlider.onReset = opt.onReset || undefined;
            rangeSlider.strRound = opt.round || 0;
            rangeSlider.intRoundValue = opt.roundValue || 0;
            rangeSlider.valueName = opt.valueName || "";
            rangeSlider.valueType = opt.valueType || rangeSlider.valueType;
            rangeSlider.intMarkers = opt.markers || 2;
            rangeSlider.thousandSeparator = opt.thousandSeparator || null;
            rangeSlider.objClear = opt.htmReset || rangeSlider.objSlider.parent().find(".resetRange").addClass("resetInactive");
            rangeSlider.smoothMove = opt.smoothMove || rangeSlider.smoothMove;
            rangeSlider.canSelectSingleValue = opt.canSelectSingleValue || rangeSlider.canSelectSingleValue;
        }

        if (rangeSlider.intMarkers == 1) rangeSlider.canSelectSingleValue = true;
        rangeSlider.objSlider.addClass("markers" + rangeSlider.intMarkers);

        // Custom set array of values
        if (rangeSlider.arrSteps.length > 0) {
            if (rangeSlider.intStepsMin == -1) rangeSlider.intStepsMin = rangeSlider.arrSteps[0];
            if (rangeSlider.intStepsMax == -1) rangeSlider.intStepsMax = rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1];
            rangeSlider.intStepsCount = rangeSlider.arrSteps.length;
        }

        // Num of markers (arrows)
        if (rangeSlider.intMarkers == 1) rangeSlider.objArrowMax.hide();

        // Init
        var intOldIndex = hLib.rangeSlider.getSliderIByID(rangeSlider.id);
        if (intOldIndex != -1) hLib.rangeSlider.sliders[intOldIndex] = rangeSlider;
        else hLib.rangeSlider.sliders.push(rangeSlider);
        if (rangeSlider.objSlider.is(":visible")) hLib.rangeSlider.init(rangeSlider.id);

        // Clear range
        rangeSlider.objClear.click(function () {
            var rangeSliderObj = jQuery(this).parent().find(".rangeSlider");
            if (rangeSliderObj.length == 0) rangeSliderObj = jQuery(this).closest(".rangeSlider");
            if (rangeSliderObj.length > 0) {
                rangeSlider = hLib.rangeSlider.getSliderByID(rangeSliderObj.attr("id"));
                hLib.rangeSlider.updatePriceAndArrowMin(rangeSlider.id, "start", true);
                hLib.rangeSlider.updatePriceAndArrowMax(rangeSlider.id, "end", true);
                if (rangeSlider.onReset != undefined) rangeSlider.onReset({ min: rangeSlider.intCurrentMinPrice, max: rangeSlider.intCurrentMaxPrice, values: rangeSlider.arrSteps });
                else if (rangeSlider.onRangeSet != null) rangeSlider.onRangeSet({ min: rangeSlider.intCurrentMinPrice, max: rangeSlider.intCurrentMaxPrice, values: rangeSlider.arrSteps });
                jQuery(this).addClass("resetInactive");
            }
            return false;
        });

        // Regular non-touch browsers
        if (!jQuery.support.touch) {
            var objSliderMiddle = rangeSlider.objArrowMin.parent();
            hLib.disableDraggingFor(objSliderMiddle);
            objSliderMiddle.mousedown(function (e) {
                hLib.rangeSlider.mousemove(jQuery(this).closest(".rangeSlider").attr("id"), e.pageX);
            });
        }
        // iPad /iPhone etc..
        else {

            var objSliderMiddle = rangeSlider.objArrowMin.parent();
            objSliderMiddle[0].addEventListener("touchstart", function (e) {
                hLib.rangeSlider.mousemove(jQuery(this).closest(".rangeSlider").attr("id"), e.touches[0].pageX);
            }, false);

            objSliderMiddle[0].addEventListener("touchmove", hLib.touchMove, false);
            objSliderMiddle[0].addEventListener("touchend", hLib.rangeSlider.finish, false);
        }
    }
}

hLib.rangeSlider.mousemove = function (id, posX) {

    var rangeSlider = hLib.rangeSlider.getSliderByID(id);

    var intMinDiff = Math.abs(rangeSlider.objArrowMin.offset().left - posX);
    var intMaxDiff = Math.abs(rangeSlider.objArrowMax.offset().left - posX);

    if (intMinDiff < intMaxDiff) {
        rangeSlider.objArrowActive = rangeSlider.objArrowMin;
        rangeSlider.booActiveMin = true;
        rangeSlider.booActiveMax = false;
    }
    else {
        rangeSlider.objArrowActive = rangeSlider.objArrowMax;
        rangeSlider.booActiveMin = false;
        rangeSlider.booActiveMax = true;
    }

    hLib.rangeSlider.active = rangeSlider.id;
    if (hLib.booIELt9) { document.onmousemove = function (event) { return false; } }
}

hLib.rangeSlider.init = function (id) {

    var rangeSlider = hLib.rangeSlider.getSliderByID(id);

    // Getting dimensions
    var objSliderWrapper = rangeSlider.objSlider.find("div.priceMiddle");
    rangeSlider.intWrapperWidth = objSliderWrapper.width();
    rangeSlider.intOffsetLeft = rangeSlider.objSlider.offset().left;
    rangeSlider.intOffsetRight = rangeSlider.intOffsetLeft + rangeSlider.intWrapperWidth;
    rangeSlider.intArrowWidth = rangeSlider.objSlider.find(".slider").eq(0).width();
    rangeSlider.intArrowMinPosition = 0;
    rangeSlider.intArrowMaxPosition = objSliderWrapper.width() - rangeSlider.intArrowWidth;

    // Creating the (value) steps if only min and max value is set
    if (rangeSlider.arrSteps.length == 0) {
        if (rangeSlider.intSingleStep == -1) rangeSlider.intSingleStep = (rangeSlider.intStepsMax - rangeSlider.intStepsMin) / rangeSlider.intStepsCount;
        var intSteps = rangeSlider.intStepsMin - rangeSlider.intSingleStep;
        while (intSteps <= rangeSlider.intStepsMax) { rangeSlider.arrSteps.push(intSteps += rangeSlider.intSingleStep); }
    }

    // Setting round values
    if (rangeSlider.valueType != "string" && rangeSlider.intRoundValue != 0 && rangeSlider.strRound != "none") {
        if (rangeSlider.strRound != "up" && rangeSlider.strRound != "down") rangeSlider.strRound = "down";

        // Removing any . or ,
        for (x = 0; x < rangeSlider.arrSteps.length; x++) { rangeSlider.arrSteps[x] = hLib.commasRemove(rangeSlider.arrSteps[x].toString()); }

        var booUpdateInitMin = false, booUpdateInitMax = false;
        if (rangeSlider.intInitialMinPrice == rangeSlider.arrSteps[0]) booUpdateInintMin = true;
        if (rangeSlider.intInitialMaxPrice == rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]) booUpdateInitMax = true;

        // Rounding down first value
        rangeSlider.intStepsMin = Math.floor(rangeSlider.arrSteps[0] / rangeSlider.intRoundValue) * rangeSlider.intRoundValue;
        rangeSlider.arrSteps[0] = rangeSlider.intStepsMin;
        if (booUpdateInitMin) rangeSlider.intInitialMinPrice = rangeSlider.intStepsMin;
        hLib.rangeSlider.updateMinPriceDisplay(id, rangeSlider.intStepsMin);

        // Rounding up last value
        rangeSlider.intStepsMax = Math.ceil(rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1] / rangeSlider.intRoundValue) * rangeSlider.intRoundValue;
        rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1] = rangeSlider.intStepsMax;
        if (booUpdateInitMax) rangeSlider.intInitialMaxPrice = rangeSlider.intStepsMax;
        hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.intStepsMax);

        // Rounding all other values
        for (x = 1; x < rangeSlider.arrSteps.length - 1; x++) {
            var val = rangeSlider.arrSteps[x];
            if (rangeSlider.strRound == "up") rangeSlider.arrSteps[x] = Math.ceil(rangeSlider.arrSteps[x] / rangeSlider.intRoundValue) * rangeSlider.intRoundValue;
            else if (rangeSlider.strRound == "down") rangeSlider.arrSteps[x] = Math.floor(rangeSlider.arrSteps[x] / rangeSlider.intRoundValue) * rangeSlider.intRoundValue;
        }

        rangeSlider.arrSteps = hLib.unique(rangeSlider.arrSteps);
        rangeSlider.intStepsCount = rangeSlider.arrSteps.length;
    }

    // Creating slider steps checkpoints (in px)
    rangeSlider.intStepWidth = Math.ceil((rangeSlider.intWrapperWidth - (rangeSlider.intArrowWidth * rangeSlider.intMarkers)) / (rangeSlider.arrSteps.length - 1));
    for (i = 0; i < rangeSlider.arrSteps.length; i++) {
        var point = (i == 0) ? 0 : rangeSlider.intStepWidth * i;
        if (point <= rangeSlider.intWrapperWidth) rangeSlider.arrStepsCheckpointPx.push(point);
    }

    rangeSlider.arrStepsCheckpointPx[rangeSlider.arrStepsCheckpointPx.length - 1] = rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth;
    var intDiff = rangeSlider.arrStepsCheckpointPx[rangeSlider.arrStepsCheckpointPx.length - 1] - rangeSlider.arrStepsCheckpointPx[rangeSlider.arrStepsCheckpointPx.length - 2] - rangeSlider.intStepWidth;
    if (intDiff > (rangeSlider.intStepWidth / 2)) {
        rangeSlider.arrStepsCheckpointPx[rangeSlider.arrStepsCheckpointPx.length - 2] += Math.floor(rangeSlider.intStepWidth / 2);
    }

    // Adjusting nr of values to px
    if (rangeSlider.arrSteps.length > rangeSlider.arrStepsCheckpointPx.length) {
        var arrNew = [rangeSlider.arrSteps[0], rangeSlider.arrSteps[1]];
        for (aa = 2; aa < rangeSlider.arrStepsCheckpointPx.length - 3; aa++) {
            arrNew.push(rangeSlider.arrSteps[aa]);
        }
        arrNew.push(rangeSlider.arrSteps[rangeSlider.arrSteps.length - 2]);
        arrNew.push(rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]);
        rangeSlider.arrSteps = arrNew;
    }

    while (rangeSlider.arrStepsCheckpointPx.length > rangeSlider.arrSteps.length) {
        rangeSlider.arrStepsCheckpointPx.splice(rangeSlider.arrStepsCheckpointPx.length - 2, 1);
    }

    // Making sure values are without decimals
    if (rangeSlider.valueType != "string") {
        for (i = 0; i < rangeSlider.arrSteps.length; i++) {
            if (i == (rangeSlider.arrSteps.length - 1)) rangeSlider.arrSteps[i] = rangeSlider.intStepsMax;
            else rangeSlider.arrSteps[i] = Math.ceil(rangeSlider.arrSteps[i]);
        }
    }

    // Add thousand seperator
    if (rangeSlider.thousandSeparator != null) {
        for (x = 0; x < rangeSlider.arrSteps.length; x++) { rangeSlider.arrSteps[x] = hLib.commasAdd(rangeSlider.arrSteps[x], rangeSlider.thousandSeparator); }
        if (rangeSlider.intInitialMinPrice != null || rangeSlider.intInitialMinPrice != -1) rangeSlider.intInitialMinPrice = hLib.commasAdd(rangeSlider.intInitialMinPrice, rangeSlider.thousandSeparator);
        if (rangeSlider.intInitialMaxPrice != null || rangeSlider.intInitialMaxPrice != -1) rangeSlider.intInitialMaxPrice = hLib.commasAdd(rangeSlider.intInitialMaxPrice, rangeSlider.thousandSeparator);
    }

    // Set init max price
    if (rangeSlider.intInitialMinPrice == null || rangeSlider.intInitialMinPrice == -1) rangeSlider.intInitialMinPrice = rangeSlider.intStepsMin;
    if (rangeSlider.intInitialMaxPrice == null || rangeSlider.intInitialMaxPrice == -1) rangeSlider.intInitialMaxPrice = rangeSlider.intStepsMax;
    rangeSlider.intCurrentMinPrice = rangeSlider.intInitialMinPrice;
    rangeSlider.intCurrentMaxPrice = rangeSlider.intInitialMaxPrice;

    // Checking if we have values that differ from inital values
    if (rangeSlider.intInitialMaxPrice != rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]) {
        rangeSlider.intSelectedMaxPx = rangeSlider.arrStepsCheckpointPx[hLib.rangeSlider.getArrayIndexForPrice(rangeSlider.id, rangeSlider.intInitialMaxPrice)];
        rangeSlider.intArrowMaxPosition = rangeSlider.intSelectedMaxPx;
        hLib.rangeSlider.updateMaxArrow(rangeSlider.id, rangeSlider.intSelectedMaxPx);
    }
    else rangeSlider.intSelectedMaxPx = rangeSlider.intArrowMaxPosition;
    hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.intInitialMaxPrice);

    // Set init min price
    if (rangeSlider.intInitialMinPrice != rangeSlider.arrSteps[0]) {
        rangeSlider.intSelectedMinPx = rangeSlider.arrStepsCheckpointPx[hLib.rangeSlider.getArrayIndexForPrice(rangeSlider.id, rangeSlider.intInitialMinPrice)];
        if (rangeSlider.intSelectedMinPx < 0 || !rangeSlider.intSelectedMinPx) rangeSlider.intSelectedMinPx = 0;
        rangeSlider.intArrowMinPosition = rangeSlider.intSelectedMinPx;
        hLib.rangeSlider.updateMinArrow(rangeSlider.id, rangeSlider.intSelectedMinPx);
    }
    else rangeSlider.intSelectedMinPx = rangeSlider.intArrowWidth;

    var booOverrideFirstValueDisplay = false;
    if (rangeSlider.intInitialMinPrice == rangeSlider.arrSteps[0]) booOverrideFirstValueDisplay = true;
    hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.intInitialMinPrice);
}

// Moving the slider button accoring to mouse pos
hLib.rangeSlider.moveArrow = function (id, intPosX) {

    if (id != undefined) {
        var rangeSlider = hLib.rangeSlider.getSliderByID(id);

        if (rangeSlider.intWrapperWidth == null) hLib.rangeSlider.init(id);

        // Adjusting for position clicked on the arrow
        if (rangeSlider.intArrowActiveAdjustLeft == null) rangeSlider.intArrowActiveAdjustLeft = (intPosX - rangeSlider.objArrowActive.offset().left);
        // Moving slider
        var intNewPosition = intPosX - rangeSlider.intOffsetLeft - rangeSlider.intArrowActiveAdjustLeft;

        // Get closest checkpoint
        if (!rangeSlider.smoothMove) {
            var intClosest = 999999;
            var intClosestI = 0;
            for (c = 0; c < rangeSlider.arrStepsCheckpointPx.length; c++) {
                if (Math.abs(intNewPosition - rangeSlider.arrStepsCheckpointPx[c]) < intClosest) {
                    intClosest = Math.abs(intNewPosition - rangeSlider.arrStepsCheckpointPx[c]);
                    intClosestI = c;
                }
            }
            intNewPosition = rangeSlider.arrStepsCheckpointPx[intClosestI];
        }

        if (rangeSlider.booActiveMin) {
            if (rangeSlider.intMarkers == 1 && intNewPosition <= (rangeSlider.intWrapperWidth)) hLib.rangeSlider.updatePriceAndArrowMin(rangeSlider.id, intNewPosition);
            else if ((intNewPosition + rangeSlider.intArrowWidth - rangeSlider.intArrowMaxPosition) <= (rangeSlider.intStepWidth + 1) && intNewPosition >= 0) hLib.rangeSlider.updatePriceAndArrowMin(rangeSlider.id, intNewPosition);
        }
        else if (intNewPosition <= (rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth) && (intNewPosition + rangeSlider.intStepWidth) >= (rangeSlider.intArrowMinPosition + rangeSlider.intArrowWidth)) hLib.rangeSlider.updatePriceAndArrowMax(rangeSlider.id, intNewPosition);
    }
}

// Updating min slider and price
hLib.rangeSlider.updatePriceAndArrowMin = function (id, intNewPosition, reset) {

    var rangeSlider = hLib.rangeSlider.getSliderByID(id),
        booNewPositionSet = false,
        booReset = reset || false;

    if (rangeSlider.smoothMove || booReset) {

        // At first price item
        if (intNewPosition == "start" || intNewPosition < rangeSlider.intArrowWidth) {
            hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[0]);
            rangeSlider.intArrowMinPosition = 0;
            intNewPosition = 0;
            booNewPositionSet = true;
        }
        // At end (with single marker)
        else if (rangeSlider.intMarkers == 1 && intNewPosition == "end" || intNewPosition >= (rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth)) {
            hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]);
            intNewPosition = rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth;
            booNewPositionSet = true;
        }

    }
    if (!booNewPositionSet) {
        for (i = 0; i < rangeSlider.arrStepsCheckpointPx.length; i++) {
            if (intNewPosition == rangeSlider.arrStepsCheckpointPx[i]) {

                if (!rangeSlider.canSelectSingleValue && rangeSlider.intCurrentMaxPrice == rangeSlider.arrSteps[i]) {
                    intNewPosition = rangeSlider.arrStepsCheckpointPx[i - 1];
                    hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[i - 1]);
                }
                else hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[i]);

                i = rangeSlider.arrStepsCheckpointPx.length;
            }
        }
    }

    // At meet with max slide (selecting a single price)
    if (rangeSlider.canSelectSingleValue && rangeSlider.intMarkers != 1 && (intNewPosition + rangeSlider.intArrowWidth) >= (rangeSlider.intArrowMaxPosition - 2)) {
        hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.intCurrentMaxPrice);
        intNewPosition = rangeSlider.intArrowMaxPosition - rangeSlider.intArrowWidth;
    }

    rangeSlider.intArrowMinPosition = intNewPosition;
    hLib.rangeSlider.updateMinArrow(rangeSlider.id, intNewPosition);
    return true;
}

// Updating max slider and price
hLib.rangeSlider.updatePriceAndArrowMax = function (id, intNewPosition, reset) {

    var rangeSlider = hLib.rangeSlider.getSliderByID(id),
        booNewPositionSet = false;

    if (rangeSlider.smoothMove || reset) {

        // At end
        if (intNewPosition == "end" || intNewPosition >= (rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth - 3)) {
            hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]);
            intNewPosition = rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth;
            booNewPositionSet = true;
        }
        // At meet with min slide (selecting a single price)
        else if (intNewPosition <= (rangeSlider.intArrowMinPosition + rangeSlider.intArrowWidth)) {
            hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.intCurrentMinPrice);
            intNewPosition = rangeSlider.intArrowMinPosition + rangeSlider.intArrowWidth;
            booNewPositionSet = true;
        }
    }
    if (!booNewPositionSet) {
        for (i = 0; i < rangeSlider.arrStepsCheckpointPx.length; i++) {
            if (intNewPosition == rangeSlider.arrStepsCheckpointPx[i]) {

                if (!rangeSlider.canSelectSingleValue && rangeSlider.intCurrentMinPrice == rangeSlider.arrSteps[i]) {
                    intNewPosition = rangeSlider.arrStepsCheckpointPx[i + 1];
                    hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[i + 1]);
                }
                else hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[i]);

                i = rangeSlider.arrStepsCheckpointPx.length;
            }
        }
    }

    rangeSlider.intArrowMaxPosition = intNewPosition;
    hLib.rangeSlider.updateMaxArrow(rangeSlider.id, intNewPosition);

    return true;
}

// Mouse up event on slider arrow
hLib.rangeSlider.finish = function () {
    if (hLib.rangeSlider.active != undefined && hLib.rangeSlider.active != -1) {

        // Updating text fields
        var rangeSlider = hLib.rangeSlider.getSliderByID(hLib.rangeSlider.active);

        var strInputSelector = ".SelectedMaxPrice";
        var intInputValue = rangeSlider.intCurrentMaxPrice;
        if (rangeSlider.booActiveMin) {
            strInputSelector = ".SelectedMinPrice";
            intInputValue = rangeSlider.intCurrentMinPrice;
        }
        rangeSlider.objSlider.find(strInputSelector).val(intInputValue);

        // Hide / show clear range button
        if (rangeSlider.intMarkers == 1 && rangeSlider.intCurrentMinPrice == rangeSlider.arrSteps[0]) rangeSlider.objClear.addClass("resetInactive");
        else if (rangeSlider.intMarkers == 2 && rangeSlider.intCurrentMinPrice == rangeSlider.arrSteps[0] && rangeSlider.intCurrentMaxPrice == rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]) rangeSlider.objClear.addClass("resetInactive");
        else rangeSlider.objClear.removeClass("resetInactive");

        hLib.rangeSlider.active = -1;
        rangeSlider.intArrowActiveAdjustLeft = null;

        // Do ajax/postback/etc...
        if (rangeSlider.onRangeSet != null) rangeSlider.onRangeSet({ min: rangeSlider.intCurrentMinPrice, max: rangeSlider.intCurrentMaxPrice, values: rangeSlider.arrSteps });
    }
    if (hLib.booIELt9) { document.onmousemove = null; }
}

hLib.rangeSlider.updateMinPriceDisplay = function (id, strNewValue, booAddValueName) {
    var rangeSlider = hLib.rangeSlider.getSliderByID(id);
    var strValueToDisplay = strNewValue + rangeSlider.valueName;
    if (typeof (booAddValueName) != 'undefined' && !booAddValueName) strValueToDisplay = strNewValue;
    if (strValueToDisplay != -1) {
        rangeSlider.objMinPrice.html(strValueToDisplay);
        rangeSlider.intCurrentMinPrice = strNewValue;
    }
}
hLib.rangeSlider.updateMaxPriceDisplay = function (id, strNewValue) { var rangeSlider = hLib.rangeSlider.getSliderByID(id); rangeSlider.objMaxPrice.html(strNewValue + rangeSlider.valueName); rangeSlider.intCurrentMaxPrice = strNewValue; }
hLib.rangeSlider.updateMinArrow = function (id, intNewPosition) { var rangeSlider = hLib.rangeSlider.getSliderByID(id); rangeSlider.objArrowMin.css("left", intNewPosition); rangeSlider.objInactiveMin.width(intNewPosition + "px"); }
hLib.rangeSlider.updateMaxArrow = function (id, intNewPosition) { var rangeSlider = hLib.rangeSlider.getSliderByID(id); rangeSlider.objArrowMax.css({ "left": intNewPosition, "right": "auto" }); rangeSlider.objInactiveMax.width((rangeSlider.intWrapperWidth - (intNewPosition + rangeSlider.intArrowWidth)) + "px"); }
hLib.rangeSlider.getArrayIndexForPrice = function (id, intPrice) { var rangeSlider = hLib.rangeSlider.getSliderByID(id); for (i = 0; i < rangeSlider.arrSteps.length; i++) { if (intPrice == rangeSlider.arrSteps[i]) { return i; } } return 0; }
hLib.rangeSlider.getSliderByID = function (id) { for (pr = 0; pr < hLib.rangeSlider.sliders.length; pr++) { if (hLib.rangeSlider.sliders[pr].id == id) { return hLib.rangeSlider.sliders[pr]; } } return {} }
hLib.rangeSlider.getSliderIByID = function (id) { for (pr = 0; pr < hLib.rangeSlider.sliders.length; pr++) { if (hLib.rangeSlider.sliders[pr].id == id) { return pr; } } return -1 }

/* Standard modal box to display regular modals small alert-like message boxes */
hLib.modal = function (opt) {
    if (typeof (opt) != 'undefined') {

        // Get default settings
        var objSettings = jQuery.extend(true, {}, hLib.modal.defaults);

        // No animations on IE6
        if (hLib.booIELt7) {
            objSettings.speed = 0;
            // Hack to make colorbox stay hidden on close
            objSettings.onClosed = function () { jQuery("#colorbox").addClass("forceHide"); }
            jQuery("#colorbox").removeClass("forceHide");
        }

        // Applying user settings
        if (jQuery.isPlainObject(opt)) jQuery.extend(objSettings, opt);
        else if (typeof (opt) == "string") objSettings.html = opt;

        var btns = jQuery("<div><div class='btns clearfix'></div></div>");
        jQuery("body").removeClass("hLib-modal-alert hLib-modal-confirm hLib-modal-modal hLib-modal-round hLib-modal-noclose").addClass("hLib-modal hLib-modal-" + objSettings.type);

        if (objSettings.hideOverlay) jQuery("body").addClass("hLib-modal-hideOverlay");

        if (objSettings.roundCorners) jQuery("body").addClass("hLib-modal-round");

        if (objSettings.type == "confirm") {
            btns.find(".btns").append("<a id='hLib-modal-btn-cancel' class='btn cancel' href='#'>" + objSettings.cancelText + "</a>");
            objSettings.initialWidth = 500;
        }
        if (objSettings.type == "confirm" || objSettings.type == "alert") {
            btns.find(".btns").append("<a id='hLib-modal-btn-ok' class='btn ok' href='#'>" + objSettings.confirmText + "</a>");
            objSettings.html = "<div class='alert-confirm-wrap'>" + objSettings.html + btns.html() + "</div>";
        }

        if (objSettings.hideCloseBtn != undefined && objSettings.hideCloseBtn) jQuery("body").addClass("hLib-modal-noclose");

        // Binding function to OK and Cancel button
        objSettings.onComplete = function () {

            var btnOK = jQuery("#colorbox #hLib-modal-btn-ok");
            var btnCancel = jQuery("#colorbox #hLib-modal-btn-cancel");

            if (objSettings.onConfirm != -1 && jQuery.isFunction(objSettings.onConfirm)) btnOK.click(function () { jQuery.colorbox.close(); objSettings.onConfirm(); return false; });
            else btnOK.click(function () { jQuery.colorbox.close(); return false; });

            if (objSettings.onCancel != -1 && jQuery.isFunction(objSettings.onCancel)) btnCancel.click(function () { jQuery.colorbox.close(); objSettings.onCancel(); return false; });
            else btnCancel.click(function () { jQuery.colorbox.close(); return false; });

            if (jQuery.isFunction(objSettings.onModalComplete)) objSettings.onModalComplete();
        }

        jQuery.colorbox(objSettings);
    }
}
hLib.modal.defaults = {
    type: "modal",
    opacity: 0.6,
    speed: 400,
    transition: "easeOutExpo",
    overlayClose: true,
    fixed: true,
    onConfirm: -1,
    onCancel: -1,
    confirmText: "Ok",
    cancelText: "Cancel",
    maxWidth: 960,
    hideCloseBtn: false,
    hideOverlay: false,
    onLoad: function () {
        hLib.modal.visible = true;
    },
    onClosed: function () {
        hLib.modal.visible = false;

        // Check for detached objects
        if (typeof (hLib.modal.detachedObject) != 'undefined' && hLib.modal.detachedObject != null) jQuery("span.placeholderForModal." + hLib.modal.detachedObject.attr("id")).replaceWith(hLib.modal.detachedObject);

    },
    onModalOpen: function () { },
    onModalComplete: function () { },
    onModalClosed: function () { }
};
hLib.modal.visible = false;
hLib.modal.detachedObject = null;

hLib.modal.resize = function (opt) { jQuery.colorbox.resize(opt) };
jQuery.fn.modal = function (customOpt) {
    return this.each(function () {
        $this = jQuery(this);
        $this.click(function () {
            var strHref = jQuery(this).attr("href"),
                opt = {};

            if (strHref.indexOf("www") == 0 || strHref.indexOf("http") == 0 || strHref.indexOf("\/") != -1) opt.href = strHref;
            else {
                var htmObj = jQuery(strHref);
                if (htmObj.length == 0) opt.html = strHref;
                else {
                    var strOldID = hLib.setID(htmObj);
                    jQuery("<span class='placeholderForModal " + strOldID + "' />").insertAfter(htmObj);
                    hLib.modal.detachedObject = htmObj.detach().addClass("hLibObjectDetached").wrap("<div />");
                    opt.html = hLib.modal.detachedObject.parent().html();
                }
            }

            // Fallback on href
            if (opt.html == undefined && opt.href == undefined) opt.href = strHref;

            if (typeof (customOpt) != 'undefined') jQuery.extend(opt, customOpt);
            hLib.modal(opt);
            return false;
        });
    });
}
jQuery.fn.hModal = jQuery.fn.modal; // Old naming convention

hLib.confirm = function (opt) {
    var objSettings = {};
    if (jQuery.isPlainObject(opt)) jQuery.extend(objSettings, opt);
    else if (typeof (opt) == "string") objSettings.html = opt;
    objSettings.type = "confirm";
    hLib.modal(objSettings);
}
hLib.alert = function (opt) {
    var objSettings = {};
    if (jQuery.isPlainObject(opt)) jQuery.extend(objSettings, opt);
    else if (typeof (opt) == "string") objSettings.html = opt;
    objSettings.type = "alert";
    hLib.modal(objSettings);
}
hLib.modal.close = function () { jQuery.colorbox.close(); }
hLib.alert.close = function () { hLib.modal.close(); }
hLib.confirm.close = function () { hLib.modal.close(); }

hLib.blockUI = function (opt) { hLib.blockUI.show(opt); }
hLib.blockUI.state = "hidden";
hLib.blockUI.current = null;
hLib.blockUI.show = function (opt) {

    // If loading is not already shown
    if (hLib.blockUI.state == "hidden") {
        var strLoadingText = "<div class='hLib-loading'><span class='loadingicon'/></div>";
        if (typeof (opt) == "string") strLoadingText = "<div class='hLib-loading'><span class='loadingicon'/><p>" + opt + "</p></div>";

        var htmScope = null;
        if (jQuery.isPlainObject(opt)) {
            if (opt.scope) {
                if (opt.scope instanceof jQuery) {
                    htmScope = opt.scope;
                }
            }
        }
        else if (opt instanceof jQuery) htmScope = opt;

        // Block a specific element
        if (htmScope != null) {

            var strScopePos = htmScope.css("position");
            if (strScopePos != "absolute" && strScopePos != "fixed" && strScopePos != "absolute") htmScope.css("position", "relative");
            hLib.blockUI.current = jQuery("<div class='hLib-loading hLib-loading-blockSingleElement" + (opt.loadingclass ? " " + opt.loadingclass : "") + "' style='width: " + htmScope.innerWidth() + "px; height: " + htmScope.innerHeight() + "px;'>" + (opt.message ? "<p>" + opt.message + "</p>" : "") + "</div>");
            htmScope.append(hLib.blockUI.current);
        }
        // Block modal
        else if (hLib.modal.visible) {

            var htmModal = jQuery("body > #colorbox");
            var htmModalOverlay = jQuery("body > #cboxOverlay");
            var htmLoading = htmModal.clone().removeAttr("class").attr("id", "hLib-loading-seperate");

            htmLoading.html(strLoadingText);
            htmLoading.insertBefore(htmModal);

            hLib.blockUI.state = "visibleInSeperate";
            if (htmModalOverlay.css("cursor") == "pointer") {
                var htmOverlayClone = htmModalOverlay.clone();
                htmOverlayClone.attr("id", "hLib-overlay").css("cursor", "default");
                htmOverlayClone.insertAfter(htmModalOverlay);
            }
        }
        // Block page
        else {
            var objSettings = {
                html: "<div class='hLib-loading'><span class='loadingicon'/></div>",
                overlayClose: false,
                escKey: false,
                hideCloseBtn: true,
                speed: 0
            }

            if (jQuery.isPlainObject(opt)) jQuery.extend(objSettings, opt);
            else if (typeof (opt) == "string") objSettings.html = strLoadingText;

            hLib.modal(objSettings);
            hLib.blockUI.state = "visibleInModal";
        }
    }
}
hLib.blockUI.hide = function () {
    if (hLib.blockUI.state == "visibleInModal") hLib.modal.close();
    else {
        if (hLib.blockUI.current != null) hLib.blockUI.current.fadeOut(400).remove();
        else jQuery("#hLib-loading-seperate, #hLib-overlay").fadeOut(400).remove();
    }
    hLib.blockUI.state = "hidden";
    hLib.blockUI.current = null;
}
hLib.loading = hLib.blockUI; // Old naming convention

jQuery.fn.hBlock = function (opt) {
    return this.each(function () {
        if (typeof (opt) == "string") {
            hLib.blockUI({
                scope: asd,
                message: opt
            });
        }
        else hLib.blockUI(jQuery(this));
    });
}

jQuery.fn.hUnBlock = function (opt) {
    return this.each(function () {
        hLib.blockUI.hide();
    });
}

// Placeholder
hLib.placeholder = function (obj, customOpts) {
    return jQuery(obj).each(function () {

        var $this = jQuery(this);

        // Refresh++
        if (typeof (obj) == 'String') {
            if (ojb == "refresh") {
                hLib.placeholder.refreshPlain($this);
                return;
            }
        }

        // Default settings
        var settings = jQuery.extend({}, hLib.placeholder.defaults);
        if ($this.attr("data-placeholder-fancy")) {
            settings.overrideBrowserDefault = true;
            settings.fancy = true;
        }
        var strText = $this.attr("data-placeholder") || $this.attr("placeholder") || "";

        if (strText != "" && ($this.is("input") || $this.is("textarea"))) {

            var strID = hLib.setID($this);

            // Apply user settings
            if (typeof (customOpts) != 'undefined') jQuery.extend(settings, customOpts);

            // Stop native browser behaviour
            if (!jQuery.support.placeholder || settings.overrideBrowserDefault) {

                // Fancy fade out placeholder
                if (settings.fancy) {
                    var htmParent = $this.parent();
                    if (htmParent.css("position") != "absolute" || htmParent.css("position") != "fixed") { htmParent.css("position", "relative"); }

                    // Remove any old placeholder labels
                    $this.siblings("label[for='" + $this.attr("id") + "']").remove();

                    // Create new placeholder as label
                    var htmLabel = jQuery("<label for='" + strID + "' class='hPlaceholder'>" + strText + "</label>");
                    if (hLib.booIE6) htmLabel.attr("title", strText);
                    htmLabel.css({
                        "top": $this.position().top,
                        "left": Math.abs($this.position().left),
                        "font-size": $this.css("font-size"),
                        "font-weight": $this.css("font-weight"),
                        "line-height": Math.floor(parseInt($this.css("font-size").replace('px', '')) * 1.5) + "px",
                        "letter-spacing": $this.css("letter-spacing"),
                        "text-indent": $this.css("text-indent"),
                        "text-shadow": $this.css("text-shadow"),
                        "height": $this.css("height"),
                        "width": $this.css("width"),
                        "padding-left": $this.css("padding-left"),
                        "padding-top": $this.css("padding-top"),
                        "position": "absolute"
                    }).insertAfter($this);

                    // Label events
                    $this.focusin(function () {
                        var $this = jQuery(this);
                        var opacity = (hLib.booIELt9) ? 0 : 0.5;
                        var speed = (hLib.booIELt9) ? 0 : 250;
                        if ($this.val() == "") $this.siblings("label[for='" + $this.attr("id") + "']").stop(true, true).fadeTo(speed, opacity);
                    }).focusout(function () {
                        var $this = jQuery(this);
                        var speed = (hLib.booIELt9) ? 0 : 250;
                        if ($this.val() == "") {
                            $this.siblings("label[for='" + $this.attr("id") + "']").fadeTo(speed, 1, function () {
                                if (hLib.booIELt9) jQuery(this).css("filter", "none");
                            });
                        }
                        return false;
                    }).keypress(function (e) {
                        if ((e.keyCode ? e.keyCode : e.which) == 9) return // Tab out of container
                        var $this = jQuery(this);
                        setTimeout(function () {
                            var opacity = (hLib.booIELt9) ? 0 : 0.5;
                            var speed = (hLib.booIELt9) ? 0 : 250;
                            if ($this.val() == "") $this.siblings("label[for='" + $this.attr("id") + "']").stop(true, true).fadeTo(speed, opacity);
                            else $this.siblings("label[for='" + $this.attr("id") + "']").hide();
                        }, 10);
                    });
                }
                // Plain placeholder
                else {
                    // If not already created
                    $this.siblings("[data-for-obj='" + $this.attr("id") + "']").remove();

                    // Save original display type
                    jQuery.data($this[0], "display", ($this.css("display") == "none") ? "block" : $this.css("display"));

                    // Create new input or textarea
                    var htmInputFake = jQuery("<input type='text' class='placeholder' value='" + strText + "' />");
                    if ($this.is("textarea")) {
                        htmInputFake = jQuery("<textarea class='placeholder'>" + strText + "</textarea>");
                        if ($this.attr("cols")) htmInputFake.attr("cols", $this.attr("cols"));
                        if ($this.attr("rows")) htmInputFake.attr("rows", $this.attr("rows"));
                    }

                    if ($this.prop("class")) htmInputFake.addClass($this.prop("class"));
                    if ($this.prop("style")) htmInputFake.attr("style", $this.prop("style"));

                    // Store objects
                    hLib.placeholder.list.push({
                        orig: $this,
                        fake: htmInputFake
                    });

                    htmInputFake.hide().attr("data-for-obj", strID).insertAfter($this).focus(function (e) {
                        e.stopPropagation();
                        var $this = jQuery(this);
                        var htmReal = $this.siblings("#" + $this.attr("data-for-obj"));
                        $this.hide();
                        htmReal.css("display", jQuery.data(htmReal[0], "display"));
                        setTimeout(function () { htmReal.focus(); }, 5);
                    });

                    $this.focus(function () {
                        $this = jQuery(this).css("display", jQuery.data($this[0], "display"));
                        $this.siblings("[data-for-obj=" + $this.attr("id") + "]").hide();
                    }).blur(function () { hLib.placeholder.refreshPlain(this); });

                    // Init state
                    if ($this.val() == "") $this.hide().siblings("[data-for-obj='" + $this.attr("id") + "']:eq(0)").css("display", jQuery.data($this[0], "display"));
                    else if (!$this.is(":visible")) $this.css("display", "block");
                }

                $this.attr("data-placeholder", strText).removeAttr("placeholder");
            }

            if (!hLib.placeholder.changeListenerActive) hLib.placeholder.changeListener();
        }
    });
}

jQuery.fn.placeholder = function (customOpts) {
    return this.each(function () {
        hLib.placeholder(this, (customOpts || undefined));
    });
}
// Default placeholder settings
hLib.placeholder.defaults = {
    overrideBrowserDefault: false,
    fancy: false
};
hLib.placeholder.list = new Array();
hLib.placeholder.changeTimeoutID = 0;
hLib.placeholder.changeListenerActive = false;
hLib.placeholder.changeListener = function () {
    hLib.placeholder.changeListenerActive = true;
    for (d = 0; d < hLib.placeholder.list.length; d++) {
        var objP = hLib.placeholder.list[d];
        // Disabled
        if (objP.orig.is(":disabled") && !objP.fake.is(":disabled")) objP.fake.prop("disabled", "disabled");
        else if (!objP.orig.is(":disabled") && objP.fake.is(":disabled")) objP.fake.removeProp("disabled");
    }
    hLib.placeholder.changeTimeoutID = setTimeout("hLib.placeholder.changeListener()", 100);
}
hLib.placeholder.refreshPlain = function (htm) {
    var $this = jQuery(htm);
    var strDisplayType = jQuery.data($this[0], "display");
    if ($this.val() == "") $this.hide().siblings("[data-for-obj='" + $this.attr("id") + "']:eq(0)").css("display", strDisplayType);
}
hLib.placeholder.get = function (id) { for (d = 0; d < hLib.placeholder.list.length; d++) { if (hLib.placeholder.list[d].id == id) { return hLib.placeholder.list[d]; } } return {} }
hLib.placeholder.getI = function (id) { for (d = 0; d < hLib.placeholder.list.length; d++) { if (hLib.placeholder.list[d].id == id) { return d; } } return -1 }

// Custom drop downs
jQuery.fn.hDropdown = function (customOpt) {

    return this.each(function () {
        $this = jQuery(this);
        if ($this.is("select") && !jQuery.support.touch && jQuery.data($this[0], "dropdowninit") != "true") {
            jQuery.data($this[0], "dropdowninit", "true");

            var strID = hLib.setID($this);
            var htmNew = jQuery("<a class='hDropdown' data-for-select='" + strID + "'><span class='text'></span><span class='ico'/></a>");
            var htmResult = jQuery("<ul class='hDropdownResult' data-for-select='" + strID + "'/>");
            var strInitText = "";

            // Defaults
            var settings = {
                "id": strID,
                "html": {
                    "orig": $this,
                    "select": htmNew,
                    "result": htmResult
                },
                "type": ($this.attr("multiple") == "multiple") ? "checkbox" : "normal",
                "maxResultHeight": 320,
                "width": $this.width() - 24,
                "height": 15,
                "initText": "",
                "onChange": null
            };
            // Apply user settings
            jQuery.extend(settings, customOpt);

            if ($this.attr("disabled")) htmNew.addClass("disabled");
            if ($this.attr("tabindex")) {
                htmNew.attr("tabindex", $this.attr("tabindex"));
                $this.removeAttr("tabindex");
            }
            htmNew.height(settings.height).width(settings.width);

            // Create overlay container
            var htmOverlay = jQuery("body > #hLib-overlay-position");
            if (htmOverlay.length == 0) {
                htmOverlay = jQuery("<div id='hLib-overlay-position'/>");
                jQuery("body").prepend(htmOverlay);
            }

            // Remove any old instances of this drop down
            var intOldDD = hLib.dropdown.getI(strID);
            if (intOldDD != -1) {
                var objOldDD = hLib.dropdown.list[intOldDD];
                objOldDD.html.select.remove();
                objOldDD.html.result.remove();
                hLib.dropdown.list.splice(intOldDD, 1);
            }

            // Save settings
            hLib.dropdown.list.push(settings);
            hLib.recordMouseDown();

            // Set new options based on original options
            hLib.dropdown.setOptions(strID);

            // Insert new elements
            htmOverlay.append(htmResult);
            htmNew.insertAfter($this.hide());

            if (!hLib.dropdown.listenerActive) {
                hLib.dropdown.listenerActive = true;
                setTimeout("hLib.dropdown.changeListener()", 500);
            }

            // Show dropdown
            htmNew.click(function () {
                hLib.dropdown.toggle(this);
                return false;
            }).focusin(function () {
                hLib.dropdown.toggle(this);
            });

            if (!hLib.dropdown.keyDownRecording) {
                hLib.dropdown.keyDownRecording = true;
                jQuery(document).keydown(function (e) {
                    return hLib.dropdown.navigate(e);
                });
            }

            // Click on result row
            if (!hLib.dropdown.resultEventInit) {
                hLib.dropdown.resultEventInit = true;
                jQuery("body > div#hLib-overlay-position ul.hDropdownResult li").live("click", function (e) { hLib.dropdown.clickOnResult(jQuery(e.target)); });
            }
        }
    });
}

hLib.dropdown.resultEventInit = false;

hLib.dropdown.clickOnResult = function (htmTarget) {

    var htmLi = htmTarget.closest("li");
    var htmUl = htmLi.parent();
    var htmInput = htmLi.find("input:checkbox");
    var intIndex = htmUl.find("li").index(htmLi);

    if (!htmLi.hasClass("disabled")) {

        var objDD = hLib.dropdown.get(htmUl.attr("data-for-select"));

        // Update display value
        if (objDD.type == "normal") {

            // Update custom dd
            htmLi.addClass("selected").siblings().removeClass("selected");
            objDD.html.select.find("span.text").text(htmLi.text());

            // Update orig value
            objDD.html.orig[0].selectedIndex = intIndex;
            objDD.html.orig.find("option").removeAttr("selected");
            objDD.html.orig.find("option:eq(" + intIndex + ")").attr("selected", "selected");

            if (objDD.onChange != null) objDD.onChange(htmLi.text());

            hLib.dropdown.hide(objDD.id);
        }
        else {
            if (objDD.type == "checkbox") {

                if (!htmTarget.is(":checkbox")) {
                    if (htmInput.is(":checked")) htmInput[0].checked = false;
                    else htmInput[0].checked = true;
                }

                if (htmInput.is(":checked")) htmLi.addClass("selected");
                else htmLi.removeClass("selected");

                var strText = "";
                objDD.html.result.find("li").each(function () {
                    var htmA = jQuery(this);
                    var htmOrigOpt = objDD.html.orig.find("option:eq(" + htmA.index() + ")");
                    if (htmA.hasClass("selected")) {
                        if (strText != "") strText += ",";
                        strText += jQuery.trim(htmA.text());

                        // Update orig value
                        htmOrigOpt.attr("selected", "selected")[0].selected = true;
                    }
                    // Update orig value
                    else htmOrigOpt.removeAttr("selected");
                });
                if (objDD.onChange != null) objDD.onChange(strText);
                if (strText == "") strText = objDD.html.orig.attr("data-init-text");
                objDD.html.select.find("span.text").text(strText);
            }
        }
    }
}

hLib.dropdown.toggle = function (obj) {
    if (!hLib.dropdown.focusInTriggered) {
        hLib.dropdown.focusInTriggered = true;
        setTimeout(function () { hLib.dropdown.focusInTriggered = false; }, 250);

        $this = jQuery(obj);
        if (!$this.hasClass("disabled")) {

            // Get object
            var objDD = hLib.dropdown.get($this.attr("data-for-select"));
            var booThisActive = (hLib.dropdown.activeId == objDD.id) ? true : false;

            // Hide all custom drop downs results
            for (d = 0; d < hLib.dropdown.list.length; d++) { hLib.dropdown.hide(hLib.dropdown.list[d].id); }

            if (!booThisActive) {

                hLib.dropdown.activeId = objDD.id;

                // Set result position
                objDD.html.result.css({ "top": $this.offset().top + 20, "visibility": "hidden", "display": "block" });
                if (objDD.html.result.height() > objDD.maxResultHeight) objDD.html.result.height(objDD.maxResultHeight).width(objDD.html.result.width() + 20);

                // Scroll to chosen option
                if (objDD.type == "normal") objDD.html.result.scrollTo("li.selected", { offset: -44 });

                objDD.html.result.css({ "left": ($this.offset().left - (objDD.html.result.outerWidth() - $this.outerWidth())), "visibility": "visible" }).addClass("active");
            }
        }
    }
}

// Hide and reset dropdowns
hLib.dropdown.hide = function (id) {
    var objDD = hLib.dropdown.get(id);
    objDD.html.select.removeClass("active");
    objDD.html.result.removeClass("active").hide();
    hLib.dropdown.activeId = "";
}

// Up, down and return on result
hLib.dropdown.navigate = function (e) {

    var code = (e.keyCode ? e.keyCode : e.which);
    if (code == 40 || code == 38 || code == 13) {

        var objDD = hLib.dropdown.get(hLib.dropdown.activeId);
        if (objDD.id != undefined) {

            var htmOptions = objDD.html.result.find("li");
            var htmHover = htmOptions.filter("li.hover");
            if (htmHover.length == 0) htmHover = htmOptions.filter("li.selected");

            // Down
            if (code == 40) {
                if (htmHover.length == 0) htmHover = htmOptions.eq(0);
                else htmHover = htmHover.next();
                while (htmHover.length > 0 && htmHover.hasClass("disabled")) htmHover = htmHover.next();
            }
            // Up
            else if (code == 38) {
                if (htmHover.length == 0) htmHover = htmOptions.filter("a:last");
                else htmHover = htmHover.prev();
                while (htmHover.length > 0 && htmHover.hasClass("disabled")) htmHover = htmHover.prev();
            }
            // Return
            else if (code == 13) { hLib.dropdown.clickOnResult(htmHover); }

            htmHover.addClass("hover").siblings().removeClass("hover");
            objDD.html.result.scrollTo("li.hover", { offset: -44 });

            return false;
        }
    }
}

// Sets/updates the visible dropdown options from the original select
hLib.dropdown.setOptions = function (id, refresh) {
    var options = [],
        objDD = hLib.dropdown.get(id),
        strInitText = "",
        booRefresh = refresh || false;

    objDD.html.orig.find("option").each(function () {

        var $opt = jQuery(this);
        var $optNew = objDD.html.result.find("li:eq(" + $opt.index() + ")");

        var strClass = "class='",
            strSelected = "",
            strDisabled = "",
            strTitle = "";
        if ($opt.prop("title")) {
            if (booRefresh && (typeof ($optNew.prop("title")) == 'undefined' || $optNew.prop("title") != $opt.prop("title"))) $optNew.attr("title", $opt.attr("title"));
            else strTitle = " title='" + $opt.attr("title") + "' ";
        }
        else if (booRefresh && $optNew.attr("title")) $optNew.removeAttr("title");

        if ($opt.prop("disabled")) {
            if (booRefresh && !$optNew.hasClass("disabled")) $optNew.addClass("disabled").find("input").attr("disabled", "disabled");
            else {
                strClass += "disabled ";
                strDisabled = "disabled='disabled'";
            }
        }
        else if (booRefresh && $optNew.hasClass("disabled")) {
            $optNew.removeClass("disabled").find("input").removeAttr("disabled");
        }

        if ($opt.is(":selected")) {
            if (booRefresh && !$optNew.hasClass("selected")) $optNew.addClass("selected").find("input").attr("checked", "checked");
            else {
                strClass += "selected ";
                strSelected = "checked='checked'";
            }
            if (strInitText != "") strInitText += ",";
            strInitText += jQuery.trim($opt.text());
        }
        else if (booRefresh && $optNew.hasClass("selected")) {
            $optNew.removeClass("selected").find("input").removeAttr("checked");
        }
        strClass += "'";

        if (!booRefresh) {
            var strOption = "";
            if (objDD.type == "checkbox") strOption = "<input type='checkbox' " + strSelected + " " + strDisabled + " />";
            options.push("<li " + strClass + strTitle + ">" + strOption + "<label>" + $opt.html() + "</label></li>");
        }
    });

    // Append options
    if (!booRefresh) {
        objDD.html.result.find("li").remove();
        objDD.html.result.append(options.join(""));
    }

    // Set init value
    if (strInitText == "") {
        if (objDD.type == "normal") strInitText = objDD.html.orig.find("option:first").text();
        else strInitText = (objDD.initText != "") ? objDD.initText : objDD.html.orig.attr("data-init-text");
    }

    if (jQuery.data(objDD.html.select[0], "initText") != strInitText) {
        objDD.html.select.find("span.text").text(strInitText);
        jQuery.data(objDD.html.select[0], "initText", strInitText);
    }
}

hLib.dropdown.changeTimeoutID = 0;
hLib.dropdown.changeListener = function () {

    for (d = 0; d < hLib.dropdown.list.length; d++) {
        var objDD = hLib.dropdown.list[d];
        // Class
        if (objDD.html.select.attr("class") != ("hDropdown " + objDD.html.orig.prop("class"))) objDD.html.select.addClass("hDropdown " + ((objDD.html.orig.prop("class") || "")));
        // Options
        hLib.dropdown.setOptions(objDD.id, true);
    }
    hLib.dropdown.changeTimeoutID = setTimeout("hLib.dropdown.changeListener()", 500);
}

hLib.dropdown.get = function (id) { for (d = 0; d < hLib.dropdown.list.length; d++) { if (hLib.dropdown.list[d].id == id) { return hLib.dropdown.list[d]; } } return {} }
hLib.dropdown.getI = function (id) { for (d = 0; d < hLib.dropdown.list.length; d++) { if (hLib.dropdown.list[d].id == id) { return d; } } return -1 }

// Adjust footer to stay at the end of the page (relative to the previous element)
hLib.bottomFooter = function (booReRun) {
    var objPrev = hLib.objFooter.prevAll(":visible").eq(0);
    if (objPrev.length > 0) {
        var intPrevOffsetBottom = parseInt(objPrev.offset().top) + parseInt(objPrev.outerHeight()) + parseInt(objPrev.css("margin-bottom"));
        var intFooterHeight = (hLib.isInt(hLib.objFooter.innerHeight())) ? hLib.objFooter.innerHeight() : hLib.objFooter.innerHeight();
        if ((jQuery(window).height() - intFooterHeight) <= intPrevOffsetBottom) hLib.objFooter.css({ position: "absolute", top: intPrevOffsetBottom, left: 0 });
        else hLib.objFooter.css({ position: "absolute", bottom: 0, left: 0, top: "auto" });

        if (booReRun != undefined && booReRun && hLib.booFooterActive) setTimeout("hLib.bottomFooter(true)", 500);
    }
}
hLib.footerAtBottomInit = function (objFooter) {
    if (jQuery(objFooter).length > 0) {
        hLib.objFooter = jQuery(objFooter).eq(0);
        hLib.booFooterActive = true;
        jQuery(window).resize(function () { hLib.bottomFooter(false); });
        hLib.bottomFooter(true);
    }
}

hLib.footerAtBottomStop = function () { hLib.booFooterActive = false; }

// Getting highest z-index (WARNING: potentially extremely slow as it scans ALL DOM objects every time)
hLib.getHighestZIndex = function () { return Math.max.apply(null, jQuery.map(jQuery('body *'), function (e, n) { return parseInt(jQuery(e).css('z-index')) || 1; })); };

/*********************************** 
Limitation functions
************************************/
// Limit input/textarea to only accept numeric characters
hLib.limitNumeric = function (objInput) {
    jQuery(objInput).keydown(function (e) {
        var code = (e.keyCode ? e.keyCode : e.which);
        if ((code > 57 && code < 91) || code > 105) e.preventDefault();
    });
}
// Limit input/textarea to only accept phone numbers
hLib.limitPhone = function (objInput) {
    jQuery(objInput).keydown(function (e) {
        var code = (e.keyCode ? e.keyCode : e.which);
        if ((code > 57 && code < 91) || code > 105 && code != 107) e.preventDefault();
    });
}

/*********************************** 
Validation functions
************************************/
hLib.validatePhone = function (str) { return hLib.regex.phone.test(str); }
hLib.validateEmail = function (str) { return hLib.regex.email.test(str); }

hLib.validatePassword = function (strPassword, intLength, booUppercase, booNumeric, booSpecial) {
    if (strPassword.length < intLength) return false;
    if (booUppercase && strPassword.match(hLib.regex.uppercase) == null) return false;
    if (booNumeric && strPassword.match(hLib.regex.numeric) == null) return false;
    if (booSpecial && strPassword.match(hLib.regex.special) == null) return false;
    return true;
}

hLib.displayValidationResult = function (objInput, booResult, booShowOutsideResult) {

    var strErrorClasses = "error input-validation-error";

    var strID = hLib.setID(objInput);
    if (hLib.booIELt9 && !objInput.is(":visible")) objInput.css({ "display": "block", "visibility": "hidden" });

    // Getting result objects
    var objInputWrap = jQuery(objInput).parent();
    var objResult;
    if (booShowOutsideResult) {
        if (objInputWrap.css("position") != "absolute" && objInputWrap.css("position") != "fixed") objInputWrap.css("position", "relative");
        objResult = objInputWrap.find(".validationresult." + strID);

        // No result block is defined, create it!
        if (objResult.length == 0) {
            objInputWrap.prepend("<div class='validationresult " + strID + "'></div>");
            objResult = objInputWrap.find(".validationresult." + strID);
            objResult.css({ "left": objInput.position().left + objInput.outerWidth(), "top": objInput.position().top });
        }

        objResult.removeClass(strErrorClasses + " ok").addClass("loading");
    }

    if (booResult) {
        if (booShowOutsideResult) objResult.removeClass("loading " + strErrorClasses).addClass("ok");
        objInput.removeClass(strErrorClasses).addClass("ok");
    }
    else {
        if (booShowOutsideResult) objResult.removeClass("loading ok").addClass(strErrorClasses);
        objInput.addClass(strErrorClasses).removeClass("ok");
    }
}
/*********************************/

/*********************************
Various Helper functions
**********************************/

// Disable native drag functionality for browser
hLib.disableDraggingFor = function (element) {

    if (element instanceof jQuery) element = element[0];

    if (hLib.booIELt9) {
        element.onmousemove = function () {
            return false;
        }
    }
    else {
        // FireFox and WebKit
        element.draggable = false;
        // Older web layout engines
        element.onmousedown = function (event) {
            event.preventDefault();
            return false;
        }
    }
}

// Clone object and make the clone visible outside the viewport
hLib.cloneToVisibleItem = function (objElem, keepDomTreePosition) {
    var objNew = jQuery(objElem).clone(),
        booKeepDomTreePosition = keepDomTreePosition || false;

    // Insert new object directly under body
    if (!booKeepDomTreePosition) {
        if (jQuery("body > div.hLibPreloadArea").length == 0) jQuery("body").append("<div class='hLibPreloadArea'></div>");
        objNew.appendTo("body div.hLibPreloadArea");
    }
    // Insert new object inside same scope as original to preserve style
    else objNew.insertAfter(objElem).css({ visibility: "hidden", position: "relative", top: "-90000px" });

    return objNew;
}
hLib.cloneToVisible = hLib.cloneToVisibleItem; // Alternate function name

// Getting dimensions of image which is not visible
hLib.getHiddenImageDimensions = function (objImg, callback) {
    if (jQuery("body > div.hLibPreloadArea").length == 0) jQuery("body").append("<div class='hLibPreloadArea'></div>");
    jQuery(objImg).clone().appendTo("body > div.hLibPreloadArea").imageLoaded(function () {
        var objImgeDims = { "width": jQuery(this).width(), "height": jQuery(this).height() };
        if (typeof (callback) != 'undefined') callback(objImgeDims);
        return objImgeDims;
    });
}

// Check/set unique ID for element(s)
hLib.setID = function (objElems, strBase) {
    objElems = jQuery(objElems);
    var y = 0;
    var strIDBase = "hLibAutoGen";
    if (typeof (strBase) != 'undefined') strIDBase = "hLibAutoGen" + strBase.toString();
    for (i = 0; i < objElems.length; i++) {
        var objElem = objElems.eq(i);
        if (objElem.attr("id") == undefined || objElem.attr("id") == "") {
            while (jQuery("#" + strIDBase + y.toString()).length > 0 || jQuery.inArray(strIDBase + y.toString(), hLib.arrCreatedIDs) != -1) { y++; }
            var strNewID = strIDBase + y.toString();
            hLib.arrCreatedIDs.push(strNewID);
            objElem.attr("id", strNewID);
        }
    }
    return objElems.eq(objElems.length - 1).attr("id");
}

// Creates unique values for array (string or int)
hLib.unique = function (vals) {
    var uniques = [];
    for (var i = vals.length; i--; ) {
        var val = vals[i];
        if (jQuery.inArray(val, uniques) === -1) { uniques.unshift(val); }
    }
    return uniques;
}

// Thousand seperator
hLib.commasAdd = function (str, separator) {
    str = str.toString();
    var sep = (separator != undefined) ? separator : ".";
    var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})');
    while (sRegExp.test(str)) { str = str.replace(sRegExp, '$1' + sep + '$2'); }
    return str;
}
// Remove . or , from string
hLib.commasRemove = function (str) { return str.toString().replace(",", "").replace(".", ""); }

// Time shorthand
hLib.getTime = function () { return new Date().getTime(); }
