/*******************************
*** Hesehus Javascript library
*** Version: 1.18
*** Last modified: 08.09.2011
*******************************/

/*************************
* jQuery plugins and extentions
**************************/
// HTML5 Placeholder 1.8.5 <http://mths.be/placeholder> @author Mathias Bynens
; (function (g, a, $) { var f = 'placeholder' in a.createElement('input'), b = 'placeholder' in a.createElement('textarea'); if (f && b) { $.fn.placeholder = function () { return this }; $.fn.placeholder.input = $.fn.placeholder.textarea = true } else { $.fn.placeholder = function () { return this.filter((f ? 'textarea' : ':input') + '[placeholder]').bind('focus.placeholder', c).bind('blur.placeholder', e).trigger('blur.placeholder').end() }; $.fn.placeholder.input = f; $.fn.placeholder.textarea = b; $(function () { $('form').bind('submit.placeholder', function () { var h = $('.placeholder', this).each(c); setTimeout(function () { h.each(e) }, 10) }) }); $(g).bind('unload.placeholder', function () { $('.placeholder').val('') }) } function d(i) { var h = {}, j = /^jQuery\d+$/; $.each(i.attributes, function (l, k) { if (k.specified && !j.test(k.name)) { h[k.name] = k.value } }); return h } function c() { var h = $(this); if (h.val() === h.attr('placeholder') && h.hasClass('placeholder')) { if (h.data('placeholder-password')) { h.hide().next().show().focus().attr('id', h.removeAttr('id').data('placeholder-id')) } else { h.val('').removeClass('placeholder') } } } function e() { var l, k = $(this), h = k, j = this.id; if (k.val() === '') { if (k.is(':password')) { if (!k.data('placeholder-textinput')) { try { l = k.clone().attr({ type: 'text' }) } catch (i) { l = $('<input>').attr($.extend(d(this), { type: 'text' })) } l.removeAttr('name').data('placeholder-password', true).data('placeholder-id', j).bind('focus.placeholder', c); k.data('placeholder-textinput', l).data('placeholder-id', j).before(l) } k = k.removeAttr('id').hide().prev().attr('id', j).show() } k.addClass('placeholder').val(k.attr('placeholder')) } else { k.removeClass('placeholder') } } } (this, document, jQuery));

// 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.0
; (function ($) { $.fn.textOverflow = function (options) { var defaults = { ellipsis: "&#8230;", wrap: "word", preserveParagraphs: true }; var options = $.extend(defaults, options); if ($("#textOverflowCalculator").length == 0) { $("body").prepend($('<div id="textOverflowCalculator"/>').css({ 'position': 'absolute', 'left': '-10000px', 'top': '0px' })); }; var calculator = $("#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); calculator.css({ "width": $this.css("width"), "height": $thisHeight + 'px', "font-size": $this.css("font-size"), "font-weight": $this.css("font-weight"), "text-decoration": $this.css("text-decoration"), "text-transform": $this.css("text-transform"), "letter-spacing": $this.css("letter-spacing"), "line-height": $this.css("line-height") }); 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 + options.ellipsis))); if (calculator.find("span").height() > $thisHeight) { var tmpNewContent = $.trim(oldTmpNewContent); newContent = tmpNewContent + options.ellipsis; calculator.find("span").html(newTmpContent); if (calculator.find("span").width() > $thisWidth) { newContent = tmpNewContent.substr(0, tmpNewContent.length - 3) + options.ellipsis; calculator.find("span").html(newTmpContent); } swapContent = true; break; } } } if (swapContent) { $this.empty(); $this.append(newContent); } calculator.empty(); } }); }; })(jQuery);

/***********************
* hLib
************************/
if (hLib == undefined) { var hLib = {}; }

jQuery.extend(hLib, {
    mouse: {},
    intPageX: 0, // old..
    intPageY: 0, // old..
    booMoseMoveRecording: false,
    booMoseUpRecording: false,
    booMoseDownRecording: false,
    zoom: {
        initiated: false,
        active: false,
        activeID: null,
        activeIndex: -1,
        instances: 0,
        vars: new Array()
    },
    arrSliderVars: new Array(),
    arrQuickSearch: new Array(),
    booSliderBtnsInitated: false,
    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()
});

// Adds support.touch for iPhone/iPad and similar devices
jQuery.extend(jQuery.support, { touch: "ontouchend" in document });

// 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 (jQuery.browser.msie) {
    hLib.booIE = true;
    var intBrowserVersion = Math.floor(jQuery.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.enableSlider(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 htmInp = jQuery(this);
        var booValid = true;
        if (htmInp.hasClass("notempty") && jQuery.trim(htmInp.val()) == "") booValid = false;
        hLib.displayValidationResult(jQuery(this), (hLib.validateEmail(jQuery(this).val()) && booValid));
    });
    htmTextInputs.filter(".validate.phone").focusout(function () { hLib.displayValidationResult(jQuery(this), hLib.validatePhone(jQuery(this).val())); });
    htmTextInputs.filter(".validate.password").focusout(function () { hLib.displayValidationResult(jQuery(this), hLib.validatePassword(jQuery(this).val(), 6, 1, 1, 1)); });
    htmTextInputs.filter(".notempty:not(.password,.phone,.email)").focusout(function () {
        var htmInp = jQuery(this);
        var booValid = false;
        if (htmInp.hasClass("notempty") && jQuery.trim(htmInp.val()) != "") booValid = true;
        hLib.displayValidationResult(jQuery(this), booValid);
    });
}

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.booMoseUpRecording) { hLib.booMoseUpRecording = true; jQuery(document).mouseup(function (e) { hLib.mouseUp(e); }); } }
hLib.recordMouseDown = function () { if (!hLib.booMoseDownRecording) { hLib.booMoseDownRecording = true; jQuery(document).mousedown(function (e) { hLib.mouseDown(e); }); } }
hLib.recordMouseMove = function () { if (!hLib.booMoseMoveRecording) { hLib.booMoseMoveRecording = true; jQuery(document).mousemove(function (e) { hLib.mouseMove(e); }); } }

/* General mouse up event */
hLib.mouseUp = function (e) {
    if (!jQuery.support.touch && hLib.rangeSlider.active != -1) { hLib.rangeSlider.finish(); }
}

/* 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++) {
            if (hLib.arrQuickSearch[s].resultvisible || hLib.arrQuickSearch[s].state != "stopped") {
                // Checking that we are not clicking on input or search result
                var htmMatch = jQuery("#" + hLib.arrQuickSearch[s].id + ", #" + hLib.arrQuickSearch[s].resultid + ", #" + hLib.arrQuickSearch[s].btnid);
                if (htmClicked.closest(htmMatch).length == 0) {
                    hLib.hideSearchResult(hLib.arrQuickSearch[s].id);
                }
            }
        }
    }

}

// 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); }

    // 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(elem) { if (!window.console) { alert(elem); } else { console.log(elem); } }
function hlog(elem) { hLog(elem); }

/*********************************
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.enableSlider = 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 = "horizontal";
            if (objSlider.hasClass("sliderVertical")) strSliderDirection = "vertical";

            var intAdjustX = 0;
            var intAdjustY = 0;
            if (hLib.booIELt8) intAdjustY = 7;

            // Custom settings
            var intAnimationTime = 250;
            var booMoveToSelectedItem = true;
            var intVisibleItems = 4; //Std visible items
            var intItemWidth = null;
            var intItemHeight = null;
            var intItemsToSlide = null;
            var fncOnAnimationComplete = null;
            var strAnimationType = "swing";
            if (objSettings != undefined) {
                intAnimationTime = (objSettings.animationTime != undefined) ? objSettings.animationTime : intAnimationTime;
                strAnimationType = (objSettings.animationType != undefined) ? objSettings.animationType : strAnimationType;
                intVisibleItems = (objSettings.visibleItems != undefined) ? objSettings.visibleItems : intVisibleItems;
                intItemsToSlide = (objSettings.itemsToSlide != undefined) ? objSettings.itemsToSlide : intItemsToSlide;
                intItemWidth = (objSettings.itemWidth != undefined) ? objSettings.itemWidth : intItemWidth;
                intItemHeight = (objSettings.itemHeight != undefined) ? objSettings.itemHeight : intItemHeight;
                intAdjustX = (objSettings.adjustX != undefined) ? objSettings.adjustX : intAdjustX;
                intAdjustY = (objSettings.adjustY != undefined) ? objSettings.adjustY : intAdjustY;
                strSliderDirection = (objSettings.direction != undefined) ? objSettings.direction : strSliderDirection;
                booMoveToSelectedItem = (objSettings.moveToSelectedItem != undefined) ? objSettings.moveToSelectedItem : booMoveToSelectedItem;
                fncOnAnimationComplete = (objSettings.onAnimationComplete != undefined) ? objSettings.onAnimationComplete : fncOnAnimationComplete;
            }
            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] = {
                    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,
                    fncOnAnimationComplete: fncOnAnimationComplete
                }

                // 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);

                // 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 (!hLib.booSliderBtnsInitated) {
                hLib.booSliderBtnsInitated = true;

                // Start
                jQuery("a.sliderStart").live("click", function (e) {
                    e.preventDefault();
                    if (!jQuery(this).hasClass("inactive")) hLib.slideItems({ intSliderIndex: hLib.getSliderIndexByID(hLib.findSliderIdForArrow(jQuery(this))), intItemsToMove: "start" });
                    return false;
                });
                // End
                jQuery("a.sliderEnd").live("click", function (e) {
                    e.preventDefault();
                    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
                jQuery("a.sliderNext").live("click", function (e) {
                    e.preventDefault();
                    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
                jQuery("a.sliderPrev").live("click", function (e) {
                    e.preventDefault();
                    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.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, intItemsToMove);
*/

hLib.slideItems = function (sC, intToIndex) {

    if (typeof (intToIndex) != 'undefined') {
        var intSliderIndex = hLib.getSliderIndexByID(sC);
        var objSlider = hLib.arrSliderVars[intSliderIndex];
        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
        }
    }

    if (hLib.isInt(sC.intItemsToMove) || sC.intItemsToMove == "start") {
        var optAnimate = {};
        var strMovePxDirection = "-=";

        hLib.arrSliderVars[sC.intSliderIndex].intCurrentItemIndex += sC.intItemsToMove;

        if (sC.intItemsToMove < 0) {
            strMovePxDirection = "+=";
            sC.intItemsToMove = Math.abs(sC.intItemsToMove);
        }
        if (sC.intAnimationTimeOverride == undefined) sC.intAnimationTimeOverride = hLib.arrSliderVars[sC.intSliderIndex].intAnimationTime;
        if (hLib.arrSliderVars[sC.intSliderIndex].strDirection == "horizontal") {
            if (sC.intItemsToMove == "start") {
                optAnimate.left = 0;
                hLib.arrSliderVars[sC.intSliderIndex].intCurrentItemIndex = hLib.arrSliderVars[sC.intSliderIndex].intVisibleItems;
            }
            else optAnimate.left = strMovePxDirection + sC.intItemsToMove * hLib.arrSliderVars[sC.intSliderIndex].intItemWidth;
        }
        else {
            if (sC.intItemsToMove == "start") {
                optAnimate.top = 0;
                hLib.arrSliderVars[sC.intSliderIndex].intCurrentItemIndex = hLib.arrSliderVars[sC.intSliderIndex].intVisibleItems;
            }
            else optAnimate.top = strMovePxDirection + (sC.intItemsToMove * (hLib.arrSliderVars[sC.intSliderIndex].intItemHeight + hLib.arrSliderVars[sC.intSliderIndex].intItemAdjustAnimateY));
        }
        jQuery("#" + hLib.arrSliderVars[sC.intSliderIndex].strID).find(".sliderItems").stop(true, true).animate(optAnimate, sC.intAnimationTimeOverride, hLib.arrSliderVars[sC.intSliderIndex].strAnimationType, function () {
            if ((sC.booInitate != undefined && !sC.booInitate) || sC.booInitate == undefined) {
                if (hLib.arrSliderVars[sC.intSliderIndex].fncOnAnimationComplete != null) {
                    hLib.arrSliderVars[sC.intSliderIndex].fncOnAnimationComplete();
                }
            }
        });
        hLib.updateSliderArrows(sC.intSliderIndex);
    }
    return;
}
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.enableQuickSearch = function (opt) {

    if (opt != undefined) {
        if (opt.input != undefined) {
            if (opt.result != undefined) {
                if (opt.datasrc != undefined) {

                    hLib.recordMouseDown();

                    // Set unique ID for instance
                    var strUniqueID = "qsbase";
                    if (opt.uniqueid != undefined) strUniqueID = opt.uniqueid;

                    // Setting up input and result
                    var objInput = jQuery(opt.input);
                    var objResult = jQuery("<div class='quickSearchResultContainer'/>");
                    jQuery(opt.result).append(objResult);

                    var objBtn = jQuery("");
                    if (opt.btn != undefined) objBtn = jQuery(opt.btn);

                    // Get/set id for input, result and button
                    var strInputID = hLib.setID(objInput, strUniqueID);
                    var strResultID = hLib.setID(objResult, strUniqueID + "result");
                    var strBtnID = hLib.setID(objBtn, strUniqueID + "btn");

                    // Removing any old instance of quick search
                    for (q = 0; q < hLib.arrQuickSearch.length; q++) {
                        if (hLib.arrQuickSearch[q].id == strInputID) {
                            hLib.arrQuickSearch[q].result.remove();
                            hLib.arrQuickSearch.splice(q, 1);
                        }
                    }

                    // Setting up quick search object
                    hLib.arrQuickSearch.push({
                        uniqueid: strUniqueID,
                        id: strInputID,
                        state: "stopped",
                        mode: (opt.mode != undefined) ? opt.mode : "onsubmit",
                        input: objInput,
                        btn: objBtn,
                        btnid: strBtnID,
                        result: objResult,
                        resultid: strResultID,
                        resultvisible: false,
                        inputpos: null,
                        datasrc: opt.datasrc,
                        dataparametername: (opt.dataparametername != undefined) ? opt.dataparametername : "s",
                        onajaxcomplete: (opt.onajaxcomplete != undefined && jQuery.isFunction(opt.onajaxcomplete)) ? opt.onajaxcomplete : null,
                        onbeforedisplay: (opt.onbeforedisplay != undefined && jQuery.isFunction(opt.onbeforedisplay)) ? opt.onbeforedisplay : null,
                        oninputsubmit: (opt.oninputsubmit != undefined && jQuery.isFunction(opt.oninputsubmit)) ? opt.oninputsubmit : null,
                        onitemsubmit: (opt.onitemsubmit != undefined && jQuery.isFunction(opt.onitemsubmit)) ? opt.onitemsubmit : null,
                        onentersubmit: (opt.onitemsubmit != undefined && jQuery.isFunction(opt.onitemsubmit)) ? opt.onitemsubmit : null,
                        hideresultonemptysearch: (opt.hideresultonemptysearch != undefined) ? opt.hideresultonemptysearch : false,
                        lastKeyPress: 0,
                        timeoutID: null,
                        timeout: (opt.mode == "onsubmit") ? 1 : 400,
                        cachedata: null,
                        forceStop: false
                    });

                    // Btn width
                    if (objBtn.length > 0) objBtn.width(objBtn.width());

                    // Events
                    var strEventType = "keydown";
                    if (hLib.booIELt7) strEventType = "keypress";

                    objInput.bind(strEventType, function (e) {
                        hLib.attemptSearch(e, jQuery(this).attr("id"));
                    }).focusin(hLib.quickSearchInputFocusIn).focusout(hLib.quickSearchInputFocusOut);

                    objBtn.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;
                    });
                }
                else hlog("Error: Quick search not initialized. Specify data source src!");
            }
            else hlog("Error: Quick search not initialized. Specify result object!");
        }
        else hlog("Error: Quick search not initialized. Specify input object!");
    }
    else hlog("Error: Quick search not initialized. Specify options!");
}

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.state = "idle";
    objSearch.input.parent().removeClass("searchTyping");
    hLib.strActiveQuickSearchID = null;
}

hLib.attemptSearch = function (e, searchID, override) {

    var objSearch = hLib.getQuickSearchByInputID(searchID);

    objSearch.lastKeyPress = new Date().getTime();
    clearTimeout(objSearch.timeoutID);

    var booRunSearch = false;
    if (objSearch.mode == "onkeypress") booRunSearch = true;

    var code = (e.keyCode ? 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";

    switch (code) {
        // Esc                                           
        case 27:
            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);
            else if (objSearch.state == "navigating" && objSearch.onitemsubmit != null) objSearch.onitemsubmit(objSearch.result.find(".searchListItem.selected"));
            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");

                    jQuery.ajax({
                        url: objSearch.datasrc,
                        data: objSearch.dataparametername + "=" + objSearch.input.val(),
                        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 (objSearch, data) {

    // Prepare data if not cached
    if (data != undefined) {

        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").addClass("searchListItem");
            else if (objMainContainer.is("table")) objListItems = objMainContainer.find("> tr, > tbody > tr").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();
                objActiveSearch.onitemsubmit(objActiveSearch.result.find(".searchListItem.selected"));
            });
        }

        objSearch.cachedata = data;
    }
    if (!objSearch.forceStop) {

        if (objSearch.onbeforedisplay != null) objSearch.cachedata = objSearch.onbeforedisplay(objSearch.cachedata);

        //        var htmTmp = objSearch.cachedata.clone().wrap("<div class='wrapHelper'/>");
        //        if (data != undefined) objSearch.result.html(htmTmp.html());

        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 intZoomInstance = hLib.zoom.instances;
        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 () {

            hLib.zoom.vars[intZoomInstance] = {
                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
            }

            // 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) {
                    hLib.zoom.vars[intZoomInstance].booLargeImageLoaded = true;
                    hLib.zoom.vars[intZoomInstance].intLargeImgWidth = dimensions.width;
                    hLib.zoom.vars[intZoomInstance].intLargeImgHeight = dimensions.height;
                });
            }

            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.zoom.instances++;
    }
}

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];
    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.instances; 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: "-1", // -1, up, down
        intRoundValue: 0, // 1, 10, 100, 1000...
        valueName: "", // Kr/$/SEK etc..
        valueType: "int", //Int, string
        arrStepsCheckpointPx: new Array(),
        intMarkers: 2
    }

    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");
        rangeSlider.objClear = rangeSlider.objSlider.parent().find(".resetRange").addClass("resetInactive");
        if (rangeSlider.objClear.length == 0) rangeSlider.objClear = jQuery("<span />");

        // Custom options
        if (opt != undefined) {
            rangeSlider.intStepsMin = (opt.minValue != undefined) ? opt.minValue : rangeSlider.intStepsMin;
            rangeSlider.intStepsMax = (opt.maxValue != undefined) ? opt.maxValue : rangeSlider.intStepsMax;
            rangeSlider.intStepsCount = (opt.steps != undefined) ? opt.steps : rangeSlider.objSlider.width();
            rangeSlider.arrSteps = (opt.arrSteps != undefined) ? opt.arrSteps : rangeSlider.arrSteps;
            rangeSlider.intInitialMinPrice = (opt.minValueInit != undefined && opt.minValueInit != null) ? opt.minValueInit : rangeSlider.intStepsMin;
            rangeSlider.intInitialMaxPrice = (opt.maxValueInit != undefined) ? opt.maxValueInit : rangeSlider.intStepsMax;
            rangeSlider.intSingleStep = (opt.stepInterval != undefined) ? opt.stepInterval : rangeSlider.intSingleStep;
            rangeSlider.onRangeSet = (opt.onRangeSet != undefined) ? opt.onRangeSet : undefined;
            rangeSlider.strRound = (opt.round != undefined) ? opt.round : 0;
            rangeSlider.intRoundValue = (opt.roundValue != undefined) ? opt.roundValue : 0;
            rangeSlider.valueName = (opt.valueName != undefined) ? opt.valueName : "";
            rangeSlider.valueType = (opt.valueType != undefined) ? opt.valueType : rangeSlider.valueType;
            rangeSlider.intMarkers = (opt.markers != undefined) ? opt.markers : 2;
        }

        // 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;
            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;

        // Num of markers (arrows)
        if (rangeSlider.intMarkers == 1) rangeSlider.objArrowMax.hide();

        // Init
        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).siblings(".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");
                hLib.rangeSlider.updatePriceAndArrowMax(rangeSlider.id, "end");
                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) {
            rangeSlider.objSlider.find("div.priceMiddle div.slider").mousedown(function (event) {

                // Stop browser image drag and drop
                event.preventDefault();

                // Saving objects and other slider parameters for more responsive slider
                var rangeSlider = hLib.rangeSlider.getSliderByID(jQuery(this).closest(".rangeSlider").attr("id"));
                if (rangeSlider.id != undefined) {
                    rangeSlider.objArrowActive = jQuery(this);
                    if (rangeSlider.objArrowActive.hasClass("minPrice")) rangeSlider.booActiveMin = true
                    else rangeSlider.booActiveMin = false

                    hLib.rangeSlider.active = rangeSlider.id;
                }
            });
        }
        // iPad /iPhone etc..
        else {

            var objSliderMiddle = rangeSlider.objArrowMin.parent();

            objSliderMiddle[0].addEventListener("touchstart", function (e) {

                var rangeSlider = hLib.rangeSlider.getSliderByID(jQuery(this).closest(".rangeSlider").attr("id"));

                // Getting closest arrow
                var posX = e.touches[0].pageX;

                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;
                }
                rangeSlider.active = rangeSlider.id;

            }, false);
            objSliderMiddle[0].addEventListener("touchmove", hLib.touchMove, false);
            objSliderMiddle[0].addEventListener("touchend", hLib.rangeSlider.finish, 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 steps (CURRENCY)
    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";

        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.round((rangeSlider.intWrapperWidth - (rangeSlider.intArrowWidth * 2)) / rangeSlider.intStepsCount);
    rangeSlider.arrStepsCheckpointPx[0] = 0;
    for (i = 1; i < rangeSlider.arrSteps.length; i++) {
        var point = parseInt(rangeSlider.intArrowWidth + (rangeSlider.intStepWidth * i));
        if (rangeSlider.intWrapperWidth >= point) rangeSlider.arrStepsCheckpointPx[i] = point;
    }

    // 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 - 2; 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;
    }

    // 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]);
        }
    }

    // Checking if we have values that differ from inital values
    if (rangeSlider.intInitialMaxPrice < rangeSlider.intStepsMax) {
        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.intWrapperWidth - rangeSlider.intArrowWidth;
    hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.intInitialMaxPrice);

    if (rangeSlider.intInitialMinPrice > rangeSlider.intStepsMin) {
        rangeSlider.intSelectedMinPx = rangeSlider.arrStepsCheckpointPx[hLib.rangeSlider.getArrayIndexForPrice(rangeSlider.id, rangeSlider.intInitialMinPrice)] - rangeSlider.intArrowWidth;
        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;
        if (rangeSlider.booActiveMin) {
            if (rangeSlider.intMarkers == 1 && intNewPosition <= (rangeSlider.intWrapperWidth)) hLib.rangeSlider.updatePriceAndArrowMin(rangeSlider.id, intNewPosition);
            else if (intNewPosition + rangeSlider.intArrowWidth <= rangeSlider.intArrowMaxPosition && intNewPosition >= 0) hLib.rangeSlider.updatePriceAndArrowMin(rangeSlider.id, intNewPosition);
        }
        else if (intNewPosition <= (rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth) && intNewPosition >= (rangeSlider.intArrowMinPosition + rangeSlider.intArrowWidth)) hLib.rangeSlider.updatePriceAndArrowMax(rangeSlider.id, intNewPosition);
    }
}

// Updating min slider and price
hLib.rangeSlider.updatePriceAndArrowMin = function (id, intNewPosition) {

    var rangeSlider = hLib.rangeSlider.getSliderByID(id);
    var intPxFromLeft = intNewPosition + rangeSlider.intArrowWidth;

    // At first price item
    if (intNewPosition == "start" || intPxFromLeft <= rangeSlider.intArrowWidth) {
        hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[0]);
        rangeSlider.intArrowMinPosition = 0;
        intNewPosition = 0;
    }
    // At end
    else if (rangeSlider.intMarkers == 1 && intNewPosition == "end" || intPxFromLeft >= (rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth)) {
        hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]);
        intNewPosition = rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth;
    }
    // At meet with max slide (selecting a single price)
    else if ((intNewPosition + rangeSlider.intArrowWidth) >= (rangeSlider.intArrowMaxPosition - 1)) {
        hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.intCurrentMaxPrice);
        intNewPosition = rangeSlider.intArrowMaxPosition - rangeSlider.intArrowWidth;
    }
    // At all other price items
    else {
        for (i = 0; i < rangeSlider.arrStepsCheckpointPx.length; i++) {
            if (intPxFromLeft == rangeSlider.arrStepsCheckpointPx[i]) {
                hLib.rangeSlider.updateMinPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[i]);
                i = rangeSlider.arrStepsCheckpointPx.length;
            }
        }
    }
    rangeSlider.intArrowMinPosition = intNewPosition;
    hLib.rangeSlider.updateMinArrow(rangeSlider.id, intNewPosition);
    return true;
}

// Updating max slider and price
hLib.rangeSlider.updatePriceAndArrowMax = function (id, intNewPosition) {

    var rangeSlider = hLib.rangeSlider.getSliderByID(id);
    var intPxFromLeft = intNewPosition;

    // At end
    if (intNewPosition == "end" || intPxFromLeft >= (rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth)) {
        hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.arrSteps[rangeSlider.arrSteps.length - 1]);
        intNewPosition = rangeSlider.intWrapperWidth - rangeSlider.intArrowWidth;
    }
    // At meet with min slide (selecting a single price)
    else if (intNewPosition <= (rangeSlider.intArrowMinPosition + rangeSlider.intArrowWidth + 1)) {
        hLib.rangeSlider.updateMaxPriceDisplay(rangeSlider.id, rangeSlider.intCurrentMinPrice);
    }
    // All other price items
    else {
        for (i = 0; i < rangeSlider.arrStepsCheckpointPx.length; i++) {
            if (intPxFromLeft == rangeSlider.arrStepsCheckpointPx[i]) {
                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 });
    }
}

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); 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 {} }

/* 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 = 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;

        if (!jQuery.isFunction(objSettings.onComplete)) {
            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.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; });
            }
        }

        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,
    "onLoad": function () {
        hLib.modal.visible = true;
    },
    "onClosed": function () {
        hLib.modal.visible = false;
    }
};
hLib.modal.visible = false;
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 opt = { "href": jQuery(this).attr("href") };
            if (typeof (customOpt) != 'undefined') jQuery.extend(opt, customOpt);
            hLib.modal(opt);
            return false;
        });
    });
}
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.loading = {
    show: function (strLoading) {

        // If loading is not already shown
        if (hLib.loading.state == "hidden") {

            var strLoadingText = "<div class='hLib-loading'><span class='loadingicon'/></div>";
            if (typeof (strLoading) == "string") strLoadingText = "<div class='hLib-loading'><span class='loadingicon'/><p>" + strLoading + "</p></div>";
            hlog(hLib.modal.visible);

            // If modal is already shown
            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.loading.state = "visibleInSeperate";
                if (htmModalOverlay.css("cursor") == "pointer") {
                    var htmOverlayClone = htmModalOverlay.clone();
                    htmOverlayClone.attr("id", "hLib-overlay").css("cursor", "default");
                    htmOverlayClone.insertAfter(htmModalOverlay);
                }
            }
            else {
                var objSettings = {
                    html: "<div class='hLib-loading'><span class='loadingicon'/></div>",
                    overlayClose: false,
                    escKey: false,
                    hideCloseBtn: true,
                    speed: 0
                };

                if (jQuery.isPlainObject(strLoading)) jQuery.extend(objSettings, strLoading);
                else if (typeof (strLoading) == "string") objSettings.html = strLoadingText;

                hLib.modal(objSettings);
                hLib.loading.state = "visibleInModal";
            }
        }
    },
    hide: function () {
        if (hLib.loading.state == "visibleInModal") hLib.modal.close();
        else jQuery("#hLib-loading-seperate, #hLib-overlay").fadeOut(400).remove();
        hLib.loading.state = "hidden";
    },
    state: "hidden"
}

// 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();
        hlog(intPrevOffsetBottom);
        hlog(jQuery(window).height() - intFooterHeight);
        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) {

    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();
    if (objInputWrap.css("position") != "absolute" && objInputWrap.css("position") != "fixed") objInputWrap.css("position", "relative");
    var 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) {
        objResult.removeClass("loading " + strErrorClasses).addClass("ok");
        objInput.removeClass(strErrorClasses).addClass("ok");
    }
    else {
        objResult.removeClass("loading ok").addClass(strErrorClasses);
        objInput.addClass(strErrorClasses).removeClass("ok");
    }
}
/*********************************/

/*********************************
Various Helper functions
**********************************/

// Clone object and make the clone visible outside the viewport
hLib.cloneToVisibleItem = function (objElem, booKeepDomTreePosition) {
    var objNew = jQuery(objElem).clone();

    // Insert new object directly under body as the original does not have a place in the DOM
    if (booKeepDomTreePosition != undefined && !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 {
        if (booKeepDomTreePosition != undefined && booKeepDomTreePosition) 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;
}
