﻿/**************************************************************************/
/* JQUERY PLUGIN

/*-------------------json.min.js------------------------------*/

var JSON = function() { var m = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }, s = { "boolean": function(x) { return String(x) }, number: function(x) { return isFinite(x) ? String(x) : "null" }, string: function(x) { if (/["\\\x00-\x1f]/.test(x)) { x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) { var c = m[b]; if (c) { return c } c = b.charCodeAt(); return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16) }) } return '"' + x + '"' }, object: function(x) { if (x) { var a = [], b, f, i, l, v; if (x instanceof Array) { a[0] = "["; l = x.length; for (i = 0; i < l; i += 1) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == "string") { if (b) { a[a.length] = "," } a[a.length] = v; b = true } } } a[a.length] = "]" } else { if (x instanceof Date) { function p(n) { return n < 10 ? "0" + n : n } var tz = x.getTimezoneOffset(); if (tz != 0) { var tzh = Math.floor(Math.abs(tz) / 60); var tzm = Math.abs(tz) % 60; tz = (tz < 0 ? "+" : "-") + p(tzh) + ":" + p(tzm) } else { tz = "Z" } return '"' + x.getFullYear() + "-" + p(x.getMonth() + 1) + "-" + p(x.getDate()) + "T" + p(x.getHours()) + ":" + p(x.getMinutes()) + ":" + p(x.getSeconds()) + tz + '"' } else { if (x instanceof Object) { a[0] = "{"; for (i in x) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == "string") { if (b) { a[a.length] = "," } a.push(s.string(i), ":", v); b = true } } } a[a.length] = "}" } else { return } } } return a.join("") } return "null" } }; return { copyright: "(c)2005 JSON.org", license: "http://www.crockford.com/JSON/license.html", stringify: function(v) { var f = s[typeof v]; if (f) { v = f(v); if (typeof v == "string") { return v } } return null }, eval: function(text) { try { if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(text)) { return eval("(" + text + ")") } } catch (e) { } throw new SyntaxError("eval") }, parse: function(text) { var at = 0; var ch = " "; function error(m) { throw { name: "JSONError", message: m, at: at - 1, text: text} } function next() { ch = text.charAt(at); at += 1; return ch } function white() { while (ch) { if (ch <= " ") { next() } else { if (ch == "/") { switch (next()) { case "/": while (next() && ch != "\n" && ch != "\r") { } break; case "*": next(); for (; ; ) { if (ch) { if (ch == "*") { if (next() == "/") { next(); break } } else { next() } } else { error("Unterminated comment") } } break; default: error("Syntax error") } } else { break } } } } function string() { var i, s = "", t, u; if (ch == '"') { outer: while (next()) { if (ch == '"') { next(); return s } else { if (ch == "\\") { switch (next()) { case "b": s += "\b"; break; case "f": s += "\f"; break; case "n": s += "\n"; break; case "r": s += "\r"; break; case "t": s += "\t"; break; case "u": u = 0; for (i = 0; i < 4; i += 1) { t = parseInt(next(), 16); if (!isFinite(t)) { break outer } u = u * 16 + t } s += String.fromCharCode(u); break; default: s += ch } } else { s += ch } } } } error("Bad string") } function array() { var a = []; if (ch == "[") { next(); white(); if (ch == "]") { next(); return a } while (ch) { a.push(value()); white(); if (ch == "]") { next(); return a } else { if (ch != ",") { break } } next(); white() } } error("Bad array") } function object() { var k, o = {}; if (ch == "{") { next(); white(); if (ch == "}") { next(); return o } while (ch) { k = string(); white(); if (ch != ":") { break } next(); o[k] = value(); white(); if (ch == "}") { next(); return o } else { if (ch != ",") { break } } next(); white() } } error("Bad object") } function number() { var n = "", v; if (ch == "-") { n = "-"; next() } while (ch >= "0" && ch <= "9") { n += ch; next() } if (ch == ".") { n += "."; while (next() && ch >= "0" && ch <= "9") { n += ch } } if (ch == "e" || ch == "E") { n += "e"; next(); if (ch == "-" || ch == "+") { n += ch; next() } while (ch >= "0" && ch <= "9") { n += ch; next() } } v = +n; if (!isFinite(v)) { } else { return v } } function word() { switch (ch) { case "t": if (next() == "r" && next() == "u" && next() == "e") { next(); return true } break; case "f": if (next() == "a" && next() == "l" && next() == "s" && next() == "e") { next(); return false } break; case "n": if (next() == "u" && next() == "l" && next() == "l") { next(); return null } break } error("Syntax error") } function value() { white(); switch (ch) { case "{": return object(); case "[": return array(); case '"': return string(); case "-": return number(); default: return ch >= "0" && ch <= "9" ? number() : word() } } return value() } } } ();



/*--------------------------jquery.alphanumeric.pack.js-------------------------------------*/

eval(function(p, a, c, k, e, d) { e = function(c) { return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!''.replace(/^/, String)) { while (c--) { d[e(c)] = k[c] || e(c) } k = [function(e) { return d[e] } ]; e = function() { return '\\w+' }; c = 1 }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } } return p } ('(2($){$.c.f=2(p){p=$.d({g:"!@#$%^&*()+=[]\\\\\\\';,/{}|\\":<>?~`.- ",4:"",9:""},p);7 3.b(2(){5(p.G)p.4+="Q";5(p.w)p.4+="n";s=p.9.z(\'\');x(i=0;i<s.y;i++)5(p.g.h(s[i])!=-1)s[i]="\\\\"+s[i];p.9=s.O(\'|\');6 l=N M(p.9,\'E\');6 a=p.g+p.4;a=a.H(l,\'\');$(3).J(2(e){5(!e.r)k=o.q(e.K);L k=o.q(e.r);5(a.h(k)!=-1)e.j();5(e.u&&k==\'v\')e.j()});$(3).B(\'D\',2(){7 F})})};$.c.I=2(p){6 8="n";8+=8.P();p=$.d({4:8},p);7 3.b(2(){$(3).f(p)})};$.c.t=2(p){6 m="A";p=$.d({4:m},p);7 3.b(2(){$(3).f(p)})}})(C);', 53, 53, '||function|this|nchars|if|var|return|az|allow|ch|each|fn|extend||alphanumeric|ichars|indexOf||preventDefault||reg|nm|abcdefghijklmnopqrstuvwxyz|String||fromCharCode|charCode||alpha|ctrlKey||allcaps|for|length|split|1234567890|bind|jQuery|contextmenu|gi|false|nocaps|replace|numeric|keypress|which|else|RegExp|new|join|toUpperCase|ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('|'), 0, {}));

/*--------------------------jquery.maskedinput-1.2.2.min.js-------------------------------------*/

/*
Masked Input plugin for jQuery
Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(c) { var a = (c.browser.msie ? "paste" : "input") + ".mask"; var b = (window.orientation != undefined); c.mask = { definitions: { "9": "[0-9]", a: "[A-Za-z]", "*": "[A-Za-z0-9]"} }; c.fn.extend({ caret: function(f, d) { if (this.length == 0) { return } if (typeof f == "number") { d = (typeof d == "number") ? d : f; return this.each(function() { if (this.setSelectionRange) { this.focus(); this.setSelectionRange(f, d) } else { if (this.createTextRange) { var g = this.createTextRange(); g.collapse(true); g.moveEnd("character", d); g.moveStart("character", f); g.select() } } }) } else { if (this[0].setSelectionRange) { f = this[0].selectionStart; d = this[0].selectionEnd } else { if (document.selection && document.selection.createRange) { var e = document.selection.createRange(); f = 0 - e.duplicate().moveStart("character", -100000); d = f + e.text.length } } return { begin: f, end: d} } }, unmask: function() { return this.trigger("unmask") }, mask: function(f, j) { if (!f && this.length > 0) { var g = c(this[0]); var i = g.data("tests"); return c.map(g.data("buffer"), function(m, l) { return i[l] ? m : null }).join("") } j = c.extend({ placeholder: "_", completed: null }, j); var e = c.mask.definitions; var i = []; var k = f.length; var h = null; var d = f.length; c.each(f.split(""), function(l, m) { if (m == "?") { d--; k = l } else { if (e[m]) { i.push(new RegExp(e[m])); if (h == null) { h = i.length - 1 } } else { i.push(null) } } }); return this.each(function() { var u = c(this); var p = c.map(f.split(""), function(y, x) { if (y != "?") { return e[y] ? j.placeholder : y } }); var s = false; var w = u.val(); u.data("buffer", p).data("tests", i); function t(x) { while (++x <= d && !i[x]) { } return x } function o(z) { while (!i[z] && --z >= 0) { } for (var y = z; y < d; y++) { if (i[y]) { p[y] = j.placeholder; var x = t(y); if (x < d && i[y].test(p[x])) { p[y] = p[x] } else { break } } } r(); u.caret(Math.max(h, z)) } function l(B) { for (var z = B, A = j.placeholder; z < d; z++) { if (i[z]) { var x = t(z); var y = p[z]; p[z] = A; if (x < d && i[x].test(y)) { A = y } else { break } } } } function q(y) { var z = c(this).caret(); var x = y.keyCode; s = (x < 16 || (x > 16 && x < 32) || (x > 32 && x < 41)); if ((z.begin - z.end) != 0 && (!s || x == 8 || x == 46)) { m(z.begin, z.end) } if (x == 8 || x == 46 || (b && x == 127)) { o(z.begin + (x == 46 ? 0 : -1)); return false } else { if (x == 27) { u.val(w); u.caret(0, n()); return false } } } function v(A) { if (s) { s = false; return (A.keyCode == 8) ? false : null } A = A || window.event; var x = A.charCode || A.keyCode || A.which; var C = c(this).caret(); if (A.ctrlKey || A.altKey || A.metaKey) { return true } else { if ((x >= 32 && x <= 125) || x > 186) { var z = t(C.begin - 1); if (z < d) { var B = String.fromCharCode(x); if (i[z].test(B)) { l(z); p[z] = B; r(); var y = t(z); c(this).caret(y); if (j.completed && y == d) { j.completed.call(u) } } } } } return false } function m(z, x) { for (var y = z; y < x && y < d; y++) { if (i[y]) { p[y] = j.placeholder } } } function r() { return u.val(p.join("")).val() } function n(y) { var D = u.val(); var z = u.attr("title"); if (D == z) { return 0 } var C = -1; for (var x = 0, B = 0; x < d; x++) { if (i[x]) { p[x] = j.placeholder; while (B++ < D.length) { var A = D.charAt(B - 1); if (i[x].test(A)) { p[x] = A; C = x; break } } if (B > D.length) { break } } else { if (p[x] == D[B] && x != k) { B++; C = x } } } if (!y && C + 1 < k) { u.val(""); m(0, d) } else { if (y || C + 1 >= k) { r(); if (!y) { u.val(u.val().substring(0, C + 1)) } } } return (k ? x : h) } if (!u.attr("readonly")) { u.one("unmask", function() { u.unbind(".mask").removeData("buffer").removeData("tests") }).bind("focus.mask", function() { w = u.val(); var x = n(); r(); setTimeout(function() { if (x == f.length) { u.caret(0, x) } else { u.caret(x) } }, 0) }).bind("blur.mask", function() { n(); if (u.val() != w) { u.change() } }).bind("keydown.mask", q).bind("keypress.mask", v).bind(a, function() { setTimeout(function() { u.caret(n(true)) }, 0) }) } n() }) } }) })(jQuery);

/// <reference path="../../../lib/jquery-1.2.6.js" />
/*
Masked Input plugin for jQuery
Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
Version: 1.2.2 (03/09/2009 22:39:06)
*/

/*--------------------------jquery.flip.min.js-------------------------------------*/
(function(c) { var e, b, d; e = function(f) { for (var g = 0; g < f.parents().length; g++) { b = f.parents().get(g); d = c.browser.safari ? c(b).css("background") : c(b).css("background-color"); if (d != "" && d != "transparent") { return d } } }; function a(f) { f.elem.style[f.prop] = parseInt(f.now) + f.unit } jQuery.extend(jQuery.fx.step, { borderTopWidth: a, borderBottomWidth: a, borderLeftWidth: a, borderRightWidth: a }); jQuery.fn.flip = function(f) { return this.each(function() { var m, k, l, j, h, i; m = c(this); if (m.data("flipLock")) { return false } else { m.data("flipLock", 1) } k = { width: m.width(), height: m.height(), bgColor: f.bgColor || m.css("background-color"), fontSize: m.css("font-size") || "12px", direction: f.direction || "tb", toColor: f.color || "#f00", speed: f.speed || 500, top: m.offset().top, left: m.offset().left, target: f.content || null, transparent: e(m) || "#fff", onBefore: f.onBefore || function() { }, onEnd: f.onEnd || function() { }, onAnimation: f.onAnimation || function() { } }; l = "flipClone_" + (new Date()).getTime(); m.css("visibility", "hidden").clone(true).appendTo("body").html("").css({ visibility: "visible", position: "absolute", left: k.left, top: k.top, margin: 0, zIndex: 9999 }).attr("id", l); j = { tb: { start: { fontSize: "0px", lineHeight: "0px", borderTopWidth: k.height, borderLeftWidth: "0px", borderRightWidth: "0px", borderBottomWidth: "0px", borderTopColor: k.bgColor, borderBottomColor: k.transparent, borderLeftColor: k.transparent, borderRightColor: k.transparent, borderStyle: "solid", height: "0px", width: k.width }, first: { borderTopWidth: "0px", borderLeftWidth: (k.height / 100) * 15, borderRightWidth: (k.height / 100) * 15, borderBottomWidth: "0px", borderTopColor: "#999", borderBottomColor: "#999", borderLeftColor: k.transparent, borderRightColor: k.transparent, top: (k.top + (k.height / 2)), left: (k.left - (k.height / 100) * 15) }, second: { borderBottomWidth: k.height, borderTopWidth: "0px", borderLeftWidth: "0px", borderRightWidth: "0px", borderTopColor: k.transparent, borderBottomColor: k.toColor, borderLeftColor: k.transparent, borderRightColor: k.transparent, top: k.top, left: k.left} }, bt: { start: { fontSize: "0px", lineHeight: "0px", borderTopWidth: "0px", borderLeftWidth: "0px", borderRightWidth: "0px", borderBottomWidth: k.height, borderTopColor: k.transparent, borderBottomColor: k.bgColor, borderLeftColor: k.transparent, borderRightColor: k.transparent, borderStyle: "solid", height: "0px", width: k.width }, first: { borderTopWidth: "0px", borderLeftWidth: (k.height / 100) * 15, borderRightWidth: (k.height / 100) * 15, borderBottomWidth: "0px", borderTopColor: "#999", borderBottomColor: "#999", borderLeftColor: k.transparent, borderRightColor: k.transparent, top: (k.top + (k.height / 2)), left: (k.left - (k.height / 100) * 15) }, second: { borderTopWidth: k.height, borderLeftWidth: "0px", borderRightWidth: "0px", borderBottomWidth: "0px", borderTopColor: k.toColor, borderBottomColor: k.transparent, borderLeftColor: k.transparent, borderRightColor: k.transparent, top: k.top, left: k.left} }, lr: { start: { width: "0px", fontSize: "0px", lineHeight: "0px", borderTopWidth: "0px", borderLeftWidth: k.width, borderRightWidth: "0px", borderBottomWidth: "0px", borderTopColor: k.transparent, borderBottomColor: k.transparent, borderLeftColor: k.bgColor, borderRightColor: k.transparent, borderStyle: "solid", height: k.height }, first: { borderTopWidth: (k.height / 100) * 10, borderLeftWidth: "0px", borderRightWidth: "0px", borderBottomWidth: (k.height / 100) * 10, borderTopColor: k.transparent, borderBottomColor: k.transparent, borderLeftColor: "#999", borderRightColor: "#999", top: k.top - (k.height / 100) * 10, left: k.left + (k.width / 2) }, second: { borderTopWidth: "0px", borderLeftWidth: "0px", borderRightWidth: k.width, borderBottomWidth: "0px", borderTopColor: k.transparent, borderBottomColor: k.transparent, borderLeftColor: k.transparent, borderRightColor: k.toColor, top: k.top, left: k.left} }, rl: { start: { width: "0px", fontSize: "0px", lineHeight: "0px", borderTopWidth: "0px", borderLeftWidth: "0px", borderRightWidth: k.width, borderBottomWidth: "0px", borderTopColor: k.transparent, borderBottomColor: k.transparent, borderLeftColor: k.transparent, borderRightColor: k.bgColor, borderStyle: "solid", height: k.height }, first: { borderTopWidth: (k.height / 100) * 10, borderLeftWidth: "0px", borderRightWidth: "0px", borderBottomWidth: (k.height / 100) * 10, borderTopColor: k.transparent, borderBottomColor: k.transparent, borderLeftColor: "#999", borderRightColor: "#999", top: k.top - (k.height / 100) * 10, left: k.left + (k.width / 2) }, second: { borderTopWidth: "0px", borderLeftWidth: k.width, borderRightWidth: "0px", borderBottomWidth: "0px", borderTopColor: k.transparent, borderBottomColor: k.transparent, borderLeftColor: k.toColor, borderRightColor: k.transparent, top: k.top, left: k.left}} }; h = m; i = function() { var n = k.target; return n && n.jquery ? n.html() : n }; function g(o, n) { o.queue(function() { k.onBefore(); o.html("").css(j[k.direction].start); o.dequeue() }); o.animate(j[k.direction].first, k.speed); o.queue(function() { k.onAnimation(); o.dequeue() }); o.animate(j[k.direction].second, k.speed); o.queue(function() { n.css({ backgroundColor: k.toColor, visibility: "visible" }); var p = i(); if (p) { n.html(p) } o.remove(); k.onEnd(); n.removeData("flipLock"); o.dequeue() }) } g(c("#" + l), h) }) } })(jQuery);

/*
* jQuery Autocomplete plugin 1.1ct
*
* Copyright (c) 2009 JÃ¶rn Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
*/
; (function($) {
    $.fn.extend({ autocomplete: function(urlOrData, options) { var isUrl = typeof urlOrData == "string"; options = $.extend({}, $.Autocompleter.defaults, { url: isUrl ? urlOrData : null, data: isUrl ? null : urlOrData, delay: isUrl ? $.Autocompleter.defaults.delay : 10, max: options && !options.scroll ? 10 : 150 }, options); options.highlight = options.highlight || function(value) { return value; }; options.formatMatch = options.formatMatch || options.formatItem; return this.each(function() { new $.Autocompleter(this, options); }); }, result: function(handler) { return this.bind("result", handler); }, search: function(handler) { return this.trigger("search", [handler]); }, flushCache: function() { return this.trigger("flushCache"); }, setOptions: function(options) { return this.trigger("setOptions", [options]); }, unautocomplete: function() { return this.trigger("unautocomplete"); } }); $.Autocompleter = function(input, options) { var KEY = { UP: 38, DOWN: 40, DEL: 46, TAB: 9, RETURN: 13, ESC: 27, COMMA: 188, PAGEUP: 33, PAGEDOWN: 34, BACKSPACE: 8 }; var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); var timeout; var previousValue = ""; var cache = $.Autocompleter.Cache(options); var hasFocus = 0; var lastKeyPressCode; var config = { mouseDownOnSelect: false }; var select = $.Autocompleter.Select(options, input, selectCurrent, config); var blockSubmit; $.browser.opera && $(input.form).bind("submit.autocomplete", function() { if (blockSubmit) { blockSubmit = false; return false; } }); $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { hasFocus = 1; lastKeyPressCode = event.keyCode; switch (event.keyCode) { case KEY.UP: event.preventDefault(); if (select.visible()) { select.prev(); } else { onChange(0, true); } break; case KEY.DOWN: event.preventDefault(); if (select.visible()) { select.next(); } else { onChange(0, true); } break; case KEY.PAGEUP: event.preventDefault(); if (select.visible()) { select.pageUp(); } else { onChange(0, true); } break; case KEY.PAGEDOWN: event.preventDefault(); if (select.visible()) { select.pageDown(); } else { onChange(0, true); } break; case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: case KEY.TAB: case KEY.RETURN: if (selectCurrent()) { event.preventDefault(); blockSubmit = true; return false; } break; case KEY.ESC: select.hide(); break; default: clearTimeout(timeout); timeout = setTimeout(onChange, options.delay); break; } }).focus(function() { hasFocus++; }).blur(function() { hasFocus = 0; if (!config.mouseDownOnSelect) { hideResults(); } }).click(function() { if (hasFocus++ > 1 && !select.visible()) { onChange(0, true); } }).bind("search", function() { var fn = (arguments.length > 1) ? arguments[1] : null; function findValueCallback(q, data) { var result; if (data && data.length) { for (var i = 0; i < data.length; i++) { if (data[i].result.toLowerCase() == q.toLowerCase()) { result = data[i]; break; } } } if (typeof fn == "function") fn(result); else $input.trigger("result", result && [result.data, result.value]); } $.each(trimWords($input.val()), function(i, value) { request(value, findValueCallback, findValueCallback); }); }).bind("flushCache", function() { cache.flush(); }).bind("setOptions", function() { $.extend(options, arguments[1]); if ("data" in arguments[1]) cache.populate(); }).bind("unautocomplete", function() { select.unbind(); $input.unbind(); $(input.form).unbind(".autocomplete"); }); function selectCurrent() { var selected = select.selected(); if (!selected) return false; var v = selected.result; previousValue = v; if (options.multiple) { var words = trimWords($input.val()); if (words.length > 1) { var seperator = options.multipleSeparator.length; var cursorAt = $(input).selection().start; var wordAt, progress = 0; $.each(words, function(i, word) { progress += word.length; if (cursorAt <= progress) { wordAt = i; return false; } progress += seperator; }); words[wordAt] = v; v = words.join(options.multipleSeparator); } v += options.multipleSeparator; } $input.val(v); hideResultsNow(); $input.trigger("result", [selected.data, selected.value]); return true; } function onChange(crap, skipPrevCheck) { if (lastKeyPressCode == KEY.DEL) { select.hide(); return; } var currentValue = $input.val(); if (!skipPrevCheck && currentValue == previousValue) return; previousValue = currentValue; currentValue = lastWord(currentValue); if (currentValue.length >= options.minChars) { $input.addClass(options.loadingClass); if (!options.matchCase) currentValue = currentValue.toLowerCase(); request(currentValue, receiveData, hideResultsNow); } else { stopLoading(); select.hide(); } }; function trimWords(value) { if (!value) return [""]; if (!options.multiple) return [$.trim(value)]; return $.map(value.split(options.multipleSeparator), function(word) { return $.trim(value).length ? $.trim(word) : null; }); } function lastWord(value) { if (!options.multiple) return value; var words = trimWords(value); if (words.length == 1) return words[0]; var cursorAt = $(input).selection().start; if (cursorAt == value.length) { words = trimWords(value) } else { words = trimWords(value.replace(value.substring(cursorAt), "")); } return words[words.length - 1]; } function autoFill(q, sValue) { if (options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE) { $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); $(input).selection(previousValue.length, previousValue.length + sValue.length); } }; function hideResults() { clearTimeout(timeout); timeout = setTimeout(hideResultsNow, 200); }; function hideResultsNow() { var wasVisible = select.visible(); select.hide(); clearTimeout(timeout); stopLoading(); if (options.mustMatch) { $input.search(function(result) { if (!result) { if (options.multiple) { var words = trimWords($input.val()).slice(0, -1); $input.val(words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "")); } else { $input.val(""); $input.trigger("result", null); } } }); } }; function receiveData(q, data) { if (data && data.length && hasFocus) { stopLoading(); select.display(data, q); autoFill(q, data[0].value); select.show(); } else { hideResultsNow(); } }; function request(term, success, failure) { if (!options.matchCase) term = term.toLowerCase(); var data = cache.load(term); if (data && data.length) { success(term, data); } else if ((typeof options.url == "string") && (options.url.length > 0)) { var extraParams = { timestamp: +new Date() }; $.each(options.extraParams, function(key, param) { extraParams[key] = typeof param == "function" ? param() : param; }); $.ajax({ mode: "abort", port: "autocomplete" + input.name, dataType: options.dataType, url: options.url, data: $.extend({ q: lastWord(term), limit: options.max }, extraParams), success: function(data) { var parsed = options.parse && options.parse(data) || parse(data); cache.add(term, parsed); success(term, parsed); } }); } else { select.emptyList(); failure(term); } }; function parse(data) { var parsed = []; var rows = data.split("\n"); for (var i = 0; i < rows.length; i++) { var row = $.trim(rows[i]); if (row) { row = row.split("|"); parsed[parsed.length] = { data: row, value: row[0], result: options.formatResult && options.formatResult(row, row[0]) || row[0] }; } } return parsed; }; function stopLoading() { $input.removeClass(options.loadingClass); }; }; $.Autocompleter.defaults = { inputClass: "ac_input", resultsClass: "ac_results", loadingClass: "ac_loading", minChars: 1, delay: 400, matchCase: false, matchSubset: true, matchContains: false, cacheLength: 10, max: 100, mustMatch: false, extraParams: {}, selectFirst: true, formatItem: function(row) { return row[0]; }, formatMatch: null, autoFill: false, width: 0, multiple: false, multipleSeparator: ", ", highlight: function(value, term) { return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"); }, scroll: true, scrollHeight: 180 }; $.Autocompleter.Cache = function(options) {
        var data = {}; var length = 0; function matchSubset(s, sub) { if (!options.matchCase) s = s.toLowerCase(); var i = s.indexOf(sub); if (options.matchContains == "word") { i = s.toLowerCase().search("\\b" + sub.toLowerCase()); } if (i == -1) return false; return i == 0 || options.matchContains; }; function add(q, value) { if (length > options.cacheLength) { flush(); } if (!data[q]) { length++; } data[q] = value; } function populate() { if (!options.data) return false; var stMatchSets = {}, nullData = 0; if (!options.url) options.cacheLength = 1; stMatchSets[""] = []; for (var i = 0, ol = options.data.length; i < ol; i++) { var rawValue = options.data[i]; rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; var value = options.formatMatch(rawValue, i + 1, options.data.length); if (value === false) continue; var firstChar = value.charAt(0).toLowerCase(); if (!stMatchSets[firstChar]) stMatchSets[firstChar] = []; var row = { value: value, data: rawValue, result: options.formatResult && options.formatResult(rawValue) || value }; stMatchSets[firstChar].push(row); if (nullData++ < options.max) { stMatchSets[""].push(row); } }; $.each(stMatchSets, function(i, value) { options.cacheLength++; add(i, value); }); } setTimeout(populate, 25); function flush() { data = {}; length = 0; } return { flush: flush, add: add, populate: populate, load: function(q) {
            if (!options.cacheLength || !length) return null; if (!options.url && options.matchContains) { var csub = []; for (var k in data) { if (k.length > 0) { var c = data[k]; $.each(c, function(i, x) { if (matchSubset(x.value, q)) { csub.push(x); } }); } } return csub; } else
                if (data[q]) { return data[q]; } else
                if (options.matchSubset) { for (var i = q.length - 1; i >= options.minChars; i--) { var c = data[q.substr(0, i)]; if (c) { var csub = []; $.each(c, function(i, x) { if (matchSubset(x.value, q)) { csub[csub.length] = x; } }); return csub; } } } return null;
        }
        };
    }; $.Autocompleter.Select = function(options, input, select, config) { var CLASSES = { ACTIVE: "ac_over" }; var listItems, active = -1, data, term = "", needsInit = true, element, list; function init() { if (!needsInit) return; element = $("<div/>").hide().addClass(options.resultsClass).css("position", "absolute").appendTo(document.body); list = $("<ul/>").appendTo(element).mouseover(function(event) { if (target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); $(target(event)).addClass(CLASSES.ACTIVE); } }).click(function(event) { $(target(event)).addClass(CLASSES.ACTIVE); select(); input.focus(); return false; }).mousedown(function() { config.mouseDownOnSelect = true; }).mouseup(function() { config.mouseDownOnSelect = false; }); if (options.width > 0) element.css("width", options.width); needsInit = false; } function target(event) { var element = event.target; while (element && element.tagName != "LI") element = element.parentNode; if (!element) return []; return element; } function moveSelect(step) { listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); movePosition(step); var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); if (options.scroll) { var offset = 0; listItems.slice(0, active).each(function() { offset += this.offsetHeight; }); if ((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); } else if (offset < list.scrollTop()) { list.scrollTop(offset); } } }; function movePosition(step) { active += step; if (active < 0) { active = listItems.size() - 1; } else if (active >= listItems.size()) { active = 0; } } function limitNumberOfItems(available) { return options.max && options.max < available ? options.max : available; } function fillList() { list.empty(); var max = limitNumberOfItems(data.length); for (var i = 0; i < max; i++) { if (!data[i]) continue; var formatted = options.formatItem(data[i].data, i + 1, max, data[i].value, term); if (formatted === false) continue; var li = $("<li/>").html(options.highlight(formatted, term)).addClass(i % 2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; $.data(li, "ac_data", data[i]); } listItems = list.find("li"); if (options.selectFirst) { listItems.slice(0, 1).addClass(CLASSES.ACTIVE); active = 0; } if ($.fn.bgiframe) list.bgiframe(); } return { display: function(d, q) { init(); data = d; term = q; fillList(); }, next: function() { moveSelect(1); }, prev: function() { moveSelect(-1); }, pageUp: function() { if (active != 0 && active - 8 < 0) { moveSelect(-active); } else { moveSelect(-8); } }, pageDown: function() { if (active != listItems.size() - 1 && active + 8 > listItems.size()) { moveSelect(listItems.size() - 1 - active); } else { moveSelect(8); } }, hide: function() { element && element.hide(); listItems && listItems.removeClass(CLASSES.ACTIVE); active = -1; }, visible: function() { return element && element.is(":visible"); }, current: function() { return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); }, show: function() { var offset = $(input).offset(); element.css({ width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), top: offset.top + input.offsetHeight, left: offset.left }).show(); if (options.scroll) { list.scrollTop(0); list.css({ maxHeight: options.scrollHeight, overflow: 'auto' }); if ($.browser.msie && typeof document.body.style.maxHeight === "undefined") { var listHeight = 0; listItems.each(function() { listHeight += this.offsetHeight; }); var scrollbarsVisible = listHeight > options.scrollHeight; list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight); if (!scrollbarsVisible) { listItems.width(list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right"))); } } } }, selected: function() { var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); return selected && selected.length && $.data(selected[0], "ac_data"); }, emptyList: function() { list && list.empty(); }, unbind: function() { element && element.remove(); } }; }; $.fn.selection = function(start, end) { if (start !== undefined) { return this.each(function() { if (this.createTextRange) { var selRange = this.createTextRange(); if (end === undefined || start == end) { selRange.move("character", start); selRange.select(); } else { selRange.collapse(true); selRange.moveStart("character", start); selRange.moveEnd("character", end); selRange.select(); } } else if (this.setSelectionRange) { this.setSelectionRange(start, end); } else if (this.selectionStart) { this.selectionStart = start; this.selectionEnd = end; } }); } var field = this[0]; if (field.createTextRange) { var range = document.selection.createRange(), orig = field.value, teststring = "<->", textLength = range.text.length; range.text = teststring; var caretAt = field.value.indexOf(teststring); field.value = orig; this.selection(caretAt, caretAt + textLength); return { start: caretAt, end: caretAt + textLength} } else if (field.selectionStart !== undefined) { return { start: field.selectionStart, end: field.selectionEnd} } };
})(jQuery);

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "");
}
String.prototype.ltrim = function() {
    return this.replace(/^\s+/, "");
}
String.prototype.rtrim = function() {
    return this.replace(/\s+$/, "");
}


/******************************************************************************************************/

/******************************************************************************************************/
/* DESERRES FUNCTIONS */
var lang = $('html').attr('lang');

function initForgotPasswordSB() {
    $(document).ready(function() {
        $('#forgot-password-sb').validate({
            submit: false,
            postBackLink: $('#forgot-password-sb a[id$=hlSubmit]')
        });

        $('a[id$=hlClose]').click(function(e) {
            e.preventDefault();

            top.parent.Shadowbox.close();

            return false;
        });
    });
}

function initCV() {
    $(document).ready(function() {

        var $yesOptional = $('#experience-yes'),
            $kamYes = $('#kam-yes');

        $yesOptional.hide();
        $kamYes.hide();

        if (!$.browser.msie) {
            $('#cv-form .box').addClass('tl-corner');
        }

        $('#cv-form').validate({
            submit: false,
            postBackLink: $('#cv-form a[id$=lkSubmit]')
        });

        //Retail experience
        $('input[id$=radXPYes]').click(function(e) {
            $yesOptional.show();
        });

        $('input[id$=radXPNo]').click(function(e) {
            $yesOptional.hide();
        });

        //Knowledge of art materials
        $('input[id$=radYesKAM]').click(function(e) {
            $kamYes.show();
        });

        $('input[id$=radNoKAM]').click(function(e) {
            $kamYes.hide();
        });
    });
}

function replaceSpecialCharacterInUrl(value) {
    return encodeURIComponent(value.replace(/['"%\/?&\%<>:*\.]/gi, ' ').rtrim().ltrim());
}

function initFullSizeMasterPage() {
    $(document).ready(function () {

        $('input[id$=ucHeader_txtSearch]')
            .autocomplete('/search/search.aspx', {
                selectFirst: false,
                formatResult: function (item) {
                    return item[0].split(':')[1];
                }
            })
            .result(function (event, item) {

                item = replaceSpecialCharacterInUrl(item[0]);

                if (lang == 'fr') href = '/fr-ca/recherche/' + item + '/page-1/20/2/';
                else href = '/en-ca/search/' + item + '/page-1/20/2/';
                location.href = href;
            });

        //add event on enter key
        $('input[id$=ucHeader_txtSearch]').keydown(function (e) {
            var enter = 13;

            if (e.which == enter) {

                if ($(this).val() != $(this).attr('title') && $(this).val() != "") {

                    var item = replaceSpecialCharacterInUrl($(this).val());

                    if (lang == 'fr') href = '/fr-ca/recherche/' + item + '/page-1/20/2/';
                    else href = '/en-ca/search/' + item + '/page-1/20/2/';

                    location.href = href;


                }

                return false;
            }
        });

        $('#search a').click(function (e) {
            var $input = $('#search input'),
            item = replaceSpecialCharacterInUrl($input.val());

            if ($input.val() == $input.attr('title') || $input.val() == "") {
                return false;
            }
            else {
                if (lang == 'fr') href = '/fr-ca/recherche/' + item + '/page-1/20/2/';
                else href = '/en-ca/search/' + item + '/page-1/20/2/';

                location.href = href;
            }

            return false;


        });

        $('input[id$=ucHeader_txtSearch]').setOptions({
            width: 235,
            delay: 100,
            minChars: 3
        });

        $('#login-content').validate({
            submit: false,
            postBackLink: $('a[id$=lkOk]', '#login-content'),
            onSuccess: validateCredential
        });

        function validateCredential() {

            var s = new JsonCustomer(),
                email = $('input[id$=txtEmail]').val(),
                pass = $('input[id$=txtPassword]').val(),
                isCheck = $('input[id$=chkRemember]').attr('checked'),
                $loader = $('#login-content .loader'),
                $invalidCredential = $('#login-content .invalid-credential');

            $invalidCredential.hide();
            $loader.show();

            var response = s.Login(email, pass, isCheck);

            try {
                if (response.error != undefined) throw response.error;

                var result = response;

                $loader.hide();

                if (!result) {
                    $invalidCredential.show();
                }

                return response;
            }
            catch (err) {
                ajaxError(err);

                return false;
            }

        }

    });

}


/***********************************************/

/************************************************************/
/* AJAX GENERAL */
function updateNbItem(qty) {
    var $nbItems = $('#hd-nb-cart-items');
    $nbItems.html(qty);
}
/************************************************************/

/************************************************************/
/* SHOPPING BASKET */
function initShoppingBasket() {

    function showEmptyCart() {
        var $divCart = $('#shopping-cart'),
            $divEmptyCart = $('#shopping-cart-no-item');

        $divCart.fadeOut('normal', function() {
            $divEmptyCart.fadeIn();
        });
    }

    function addLoader() {
        var $subtotal = $('#subtotal');
        $subtotal.append('<img class="ajax-loader" src="/static/images/ajax-loader.gif" />');
    }

    function addItemsLoader() {
        //$('#itemsLoader').append('<img class="ajax-loader" src="/static/images/ajax-loader.gif" />');
    }

    function removeLoader() {
        $('img.ajax-loader').remove();
    }

    function localizeDollar(value, remove) {
        var formattedDollar;

        if (lang == "fr") {
            formattedDollar = value + " $";
        } else {
            formattedDollar = "$" + value.replace(" ","");
        }

        if (remove) {
            formattedDollar = formattedDollar.replace("$", "");
        }
        return formattedDollar;
        
    }

    function updateFreeShipping(amount, subtotal) {
        var $freeShippingAmount = $('#free-shipping-amount'),
            $freeShipping = $('#wrap-shipping-free');

        if (amount != '-1') {

            $freeShippingAmount.text(amount);
            $freeShipping.show();
        }
        else $freeShipping.hide();

    }

    function initRenderCart() {

        var cartArray = [],
            $cartContairner = $("#items"),
            $tableHeader = $('#itemsHeader'),
    		$tableBody = $('#itemsBody'),
    		$subTotal = $('#cart-subtotal'),
            $freeShippingContainer = $("#cart-shipping-free"),
            $freeShippingContainerCorner = $freeShippingContainer.find('.corner');
            $tr = '';

            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "/webservices/Cart.asmx/GetCart",
                data: "{}",
                dataType: "json",
                success: function (response) {
                    if (response && response.d) {

                        var cartItems = response.d.Items,
                        cartSubTotal = response.d.SubTotal.toFixed(2),
                        cartShippingDetailsTemplate = response.d.ShippingDetailsTemplate,
                        cartAmountMissingForFreeShipping = response.d.AmountMissingForFreeShipping.toFixed(2),
                        cartNumberOfItemsInCart = response.d.NumberOfItemsInCart,
                        $cartSubtotalContainer = $('#subtotal-price'),
                        $cartAmoutInRangeContainer = $('#amount-in-range'),
                        $cartAmoutUnder50Container = $('#amount-under50'),
                        $cartFreeShippingAmout = $('#free-shipping-amount');

                        $.each(cartItems, function (index) {

                            var cartItemDescription = cartItems[index].Description,
                            cartItemImageUrl = cartItems[index].ImageUrl,
                            cartItemIsFreeShipping = cartItems[index].IsFreeShipping,
                            cartItemLineTotal = cartItems[index].LineTotal.toFixed(2),
                            cartItemProductID = cartItems[index].ProductID,
                            cartItemQuantity = cartItems[index].Quantity,
                            cartItemUnitPrice = cartItems[index].UnitPrice.toFixed(2);

                            $tr += '<tr>';
                            $tr += '<td class="action">';
                            $tr += '<a href="#" class="delete">delete</a>';
                            $tr += '<input id="txtId" type="hidden" value="' + cartItemProductID + '" />';
                            $tr += '</td>';
                            $tr += '<td class="product-img">';
                            $tr += '<img src="//www.deserres.ca' + cartItemImageUrl + '" alt="' + cartItemDescription.replace('"', '') + ' />"';
                            $tr += '</td>';
                            $tr += '<td class="products">';
                            $tr += '<strong>' + cartItemDescription + '</strong>';
                            $tr += '</td>';
                            $tr += '<td class="qty">';
                            $tr += '<input type="text" class="text numeric" data-value="' + cartItemQuantity + '" value="' + cartItemQuantity + '" />';
                            $tr += '</td>';
                            $tr += '<td class="unit-price">';
                            $tr += '<span>' + localizeDollar(cartItemUnitPrice) + '</span>';
                            $tr += '</td>';
                            $tr += '<td class="subtotal">';
                            $tr += '<strong>' + localizeDollar(cartItemLineTotal) + '</strong>';
                            $tr += '</td>';
                            $tr += '</tr>';

                        });

                        updateNbItem(cartNumberOfItemsInCart);

                        //$freeShippingContainer.hide();
                        $cartAmoutUnder50Container.hide();
                        $cartAmoutInRangeContainer.hide();

                        // 0 = over 75
                        // 1 = in range between 75 and 50
                        // 2 = under 50

                        // set freeshipping messages 
                        if (cartShippingDetailsTemplate == 2) {

                            $cartAmoutUnder50Container.show();
                            $freeShippingContainerCorner.show();

                        } else if (cartShippingDetailsTemplate == 1) {

                            $cartAmoutInRangeContainer.show();
                            $freeShippingContainerCorner.show();
                            $cartFreeShippingAmout.html(localizeDollar(cartAmountMissingForFreeShipping));

                        } else {
                            $freeShippingContainerCorner.hide();
                        }

                        if (cartNumberOfItemsInCart == 0) {
                            showEmptyCart();
                        } else {
                            $tableBody.children().remove();
                            $tableHeader.fadeIn();
                            $subTotal.fadeIn();

                            $tableBody.append($tr).fadeTo('fast', 1);
                            $cartSubtotalContainer.html(localizeDollar(cartSubTotal));
                            $('#shopping-cart .proceed-ckeckout').fadeIn();
                        }

                        cartStopLoading();
                        cartShowActions();
                        removeLoader();

                        isUpdating = false;

                    }
                }
            });
    }

    function initUpdateCart() {

        var isUpdating = false;

        $('a.update-cart').click(function (e) {
            e.preventDefault();

            if (!isUpdating) {

                isUpdating = true;

                //addLoader();
                cartStartLoading();
                cartHideActions();

                var $cartContairner = $("#items"),
                cartArray = [],
                cartObj = {},
                cartData;

                $('table#items > tbody > tr').each(function (obj) {

                    var cartItemProductId = $('td.action input', this).val(),
                        cartItemQuantity = $('td.qty input', this).val();

                    // if no quantity, default to 1
                    if (cartItemQuantity === "") { cartItemQuantity = "1"; }

                    // strip dollar sign before sending info to webservice
                    var strQuantity = localizeDollar(cartItemQuantity, true);

                    cartObj = { 'ProductID': cartItemProductId, 'Quantity': parseInt(strQuantity) };
                    cartArray.push(cartObj);

                });

                cartData = { cart: cartArray };

                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "/webservices/Cart.asmx/UpdateCart",
                    data: JSON.stringify(cartData),
                    dataType: "json",
                    success: function (response) {
                        if (response && response.d) {
                            initRenderCart();
                            isUpdating = false;
                        }
                    }
                });
            }
        });

    }

    function initDeleteCart() {

        $("#items").find('a.delete').live('click', function (e) {

            e.preventDefault();

			cartStartLoading();
			cartHideActions();
            
            var $cartContairner = $("#items"),
                cartItemProductID = $(this).next().val(),
                data, newData;

            $cartContairner.find("tbody td").fadeTo('fast', 0.4);

            data = {
                productID : parseInt(cartItemProductID)
            };

            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "/webservices/Cart.asmx/DeleteProductID",
                data: JSON.stringify(data),
                dataType: "json",
                success: function (response) {
                    if (response && response.d) {

                        removeLoader();
                        initRenderCart();

                    }
                }
            });

        });
    }

    function cartStartLoading() {
	    $('#items, #cart-subtotal').fadeTo('fast', 0.2);
	    $('#itemsLoading').show();
    }

    function cartStopLoading() {
    	$('#items, #cart-subtotal').fadeTo('fast', 1.0);
    	$('#itemsLoading').hide();
    }

    function cartHideActions(){
    	$('#itemsBody').find('.delete').hide();
    	$('#subtotal').find('.update-cart').hide();
    }

    function cartShowActions(){
    	$('#itemsBody').find('.delete').show();
    	$('#subtotal').find('.update-cart').show();
    }

    $(document).ready(function () {

        if (!$.browser.msie) {
            $('#shopping-cart-no-item').addClass('tr-corner');
        }

        initDeleteCart();
        initUpdateCart();

        $("#items").delegate('input.numeric', 'focusout keydown', function (e) {

            if (e.keyCode === 13 || e.type === 'focusout') {

                var $value = $(this).val(),
        			$oldValue = $(this).attr('data-value');

                // if new and old value are the same
                // do not send the request
                if ($oldValue == $value) return;

                //comme l'event est appele avant que la reponse ajax soit termine, 
                //re-set la valeur pour ne pas appeler le WS une deuxieme fois
                $(this).attr('data-value', $value);

                // if value is empty, replace it with 
                // the old value set in the data attribute
                if (this.value === '') {
                    this.value = $oldValue;
                }

                // strip non-accepted characters with numeric only
                else if (this.value.match(/[a-zA-Z<>@#=+-._]/g)) {
                    this.value = this.value.replace(/[a-zA-Z<>@#=+-._]/g, '');
                }

                // trigger click action to process the request
                $('a.update-cart').click();
            }

        });

        $("#cart-shipping-free").fadeTo(1000, 1);

    });
}
/************************************************************/

/************************************************************/
/* CHECKOUT - CONFIRMATION */
function initCheckoutConfirmation() {
    $(document).ready(function() {
        if (!$.browser.msie) {
            $('.box').addClass('tr-corner');
        }
    });

    $('.form').validate({
        submit: false,
        postBackLink: $("#btnCreateAccount"),
        onSuccess: sendNewAccount
    });

    function sendNewAccount(){
		
		var $password = $('#txtPassword').val(),
			$passwordConfirm = $('#txtPasswordConfirm').val(),
			$addPasswordForm = $('#add-password-form'),
			$addPasswordSucess = $('#add-password-success'),
			$addPasswordSucessEmail = $('#email-success'),
			$addPasswordError = $('#add-password-error'),
			$pending = $('#confirm-add-new-account').find('.pending-request'),
			data;

		// if values are both empty, do not send to webservice
		if($password == "" && $passwordConfirm == "") return;

        // prep json object
    	data = { password : $password }
		
		// add loader
		$pending.append('<img class="ajax-loader" src="/static/images/ajax-loader.gif" />');

    	// hide password fields
    	$addPasswordForm.slideUp(1000, function(){
    		
    		$.ajax({
	            type: "POST",
	            contentType: "application/json; charset=utf-8",
	            url: "/webservices/Account.asmx/ConvertAnonymousAccount",
	            data: JSON.stringify(data),
	            dataType: "json",
	            success: function (response) {
	                if (response && response.d) {
	                	
	                	var success = response.d.Success,
	                		email = response.d.Email,
	                		delay = 1000;
	                	
	                	$pending.find('.ajax-loader').remove();

	                	if(success){
		                	$addPasswordSucessEmail.html(email);
		            		$addPasswordSucess.slideDown(delay);
		            	} else {
		            		$addPasswordError.slideDown(delay);
		            	}


	                }
	            }
	        });

    	});
    	
    	
    }
}
/************************************************************/

/************************************************************/
/* CHECKOUT - STEP 2 - ORDER REVISION */
function initCheckoutYourOrder(url) {
        
        // Modify anchors
    var $modifyAnchors = $('#order-addresses').find('a'),
        
        // Creative Club checkbox
        $cbxCreativeClub = $('#cbxIncludeCreativeClubCard'),
        $cbxCreativeClubVal = $cbxCreativeClub.val(),

        // Commercial account input
        $additionalComments = $('#txtAdditionalComments'),

        // Accept term checkbox
        $cbxAcceptTerms = $('#cbxAcceptTerms');

    
    // if back is clicked, reload page so the user 
    // is redirected to the status page.
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "/webservices/Order.asmx/ShouldRefreshPaymentPage",
        dataType: "json",
        success: function (response) {
            if (response && response.d) {
            	window.location.href=window.location.href
            }
        }
    });

    
    $cbxCreativeClub.click(function(){

    		// creative club state
		var isChecked = this.checked,
			data;		
		
		// prep json object
		data = {'isRequested' : isChecked }

		$.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "/webservices/Order.asmx/RequestCreativeClubCard",
            data: JSON.stringify(data),
            dataType: "json",
            success: function (response) {
                if (response && response.d) {
                	
                }
            }
        });

    });

    $additionalComments.blur(function(){

    		// comment text
    	var commentText = $('#txtAdditionalComments').val(),
    		// prep json object
    		data = {'comment': commentText }

    	$.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "/webservices/Order.asmx/AdditionalComments",
            data: JSON.stringify(data),
            dataType: "json",
            success: function (response) {
                if (response && response.d) {
                    
                }
            }
        });

    });

    $cbxAcceptTerms.click(function (e) {

        // deactivate possibility to edit 
        // address, comments and creative club options during transaction
        $modifyAnchors.addClass('anchor-disabled').hide();
        $cbxCreativeClub.attr('disabled', 'disabled');
        $additionalComments.attr('disabled', 'disabled');

        $('#hlkBackToCart').hide();

        $("#optimal-payments").find('#pending-request').append('<img class="ajax-loader" src="/static/images/ajax-loader.gif" />');

        // once clicked, no turning back! commit!
        $(this).attr('disabled', 'disabled');

        // append html for iframe
        var iframe = '<iframe id="iFramePayment" frameborder="0" src="'+ url +'" width="800" height="625"></iframe>'
        $('#checkout-iframe').append(iframe);

    });

    /*
    // refresh new values from the modified address
    function reloadParent() { top.parent.location.href = top.parent.location.href; }
    Shadowbox.options.onClose = reloadParent;
    */
    
}

function hideOptimalPaymentsLoader(){
	$("#optimal-payments").find('#pending-request img').fadeOut(500);
}

/************************************************************/

/************************************************************/
/* CHECKOUT - STEP 1 - COORDINATES */

function initCheckoutCoordinates() {

    $(function () {

        $('#checkout-address-billing label', this).each(function (obj) {
            $(this).html('<span class="mandatory">*</span> ' + $(this).html());
        });

        var $billingContainer = $("#checkout-address-billing"),
                $billingStateInput = $("#checkout-address").find(".checkout-billing-address-cbx input"),
                $billingInputs = $("#checkout-address-billing").find("input"),
                $billingSelects = $("#checkout-address-billing").find("select");

        function setRequired() {

            if ($billingStateInput.is(":checked")) {

                $billingInputs.attr("disabled", true);
                $billingInputs.parent().removeClass('required error');
                $billingSelects.parent().removeClass('required error');
                $billingContainer.hide();

            } else {

                $billingInputs.attr('disabled', false);
                $billingInputs.parent(":not('.address2')").addClass("required");
                $billingSelects.parent().addClass('required');
                $billingContainer.show();

            }

        }

        $billingStateInput.click(function () {
            setRequired();
        });

        setRequired();

        $(".form").validate({
            submit: false,
            postBackLink: $('a[id$=hlNextStep]')
        });

    });

}
/************************************************************/

/************************************************************/
/* CHECKOUT - STEP 2 - Payment */
function initCheckoutModifyAddress() {

    var $adressesInputs = $('.modify-form-data').find('input');

    $adressesInputs.keyup(function (e) {
        if (this.value.match(/[<>#_]/g)) {
            this.value = this.value.replace(/[<>#_]/g, '');
        }
    });
    
    $('.modify-cancel').click(function (e) {
        top.parent.Shadowbox.close();
        return false;
    });    

    $('.form').validate({
        submit: false,
        postBackLink: $("a[id$=hlSaveModifyAddress]")
    });
}


function EnableDisableForm() {

    var requiredLi = $('li.required'),
        postalCodeLi = $('li.postalcode'),
        phoneLi = $('li.phone');

    function enableForm() {
        $(requiredLi).addClass('required');
        $(postalCodeLi).addClass('postalcode');
        $(phoneLi).addClass('phone');

        $('#address').removeClass('readonly');

        //$('form').bind('submit');
        $('ul.form li').removeClass('readonly');
        //remove readonly attribute
        $('ul.form li :input').each(function(obj) {
            $(this).removeAttr('readonly');
            if ($(this).attr('type') == "select-one") this.disabled = false;
        });
    }

    function disableForm() {
        //remove error
        $('li.required').removeClass('error');
        $('ul.form li').addClass('readonly');

        $(requiredLi).removeClass('required');
        $(postalCodeLi).removeClass('postalcode');
        $(phoneLi).removeClass('phone');

        $('#address').addClass('readonly');

        //add readonly attribute
        $('ul.form li :input').each(function(obj) {
            if ($(this).attr('type') == "select-one") this.disabled = true;
            else $(this).attr('readonly', 'readonly');
        });
    }

    $("li.same-as-shipping :input").click(function(e) {
        if (this.checked) {
            disableForm();
        }
        else {
            enableForm();
        }
    });

    var checkbox = $("li.same-as-shipping :input");

    if ($(checkbox).attr('checked') == true) {
        disableForm();
    }
    else {
        enableForm();
    }


}

/************************************************************/
/* CHECKOUT - STEP 2 - Iframe */

function initIframePayment(SSLSiteLink) {

    var $encodedMessage = $('#encodedMessage').val(),
        ShouldRefreshPaymentPage = false;

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "/webservices/Order.asmx/ShouldRefreshPaymentPageIFrame",
        dataType: "json",
        data: JSON.stringify({ encodedMessage : $encodedMessage }),
        success: function (response) {
            if (response && response.d) {
                RefreshIframe();
            }
            else {
                SubmitForm();
            }
        }
    });


    function RefreshIframe() {
            window.location.href = window.location.href;
    }

    function SubmitForm() {
        if (window != window.top && window.parent.location.href.indexOf(SSLSiteLink) != -1) {
            window.parent.hideOptimalPaymentsLoader();
            document.forms[0].submit();
        }
        else {
            window.parent.location.href = SSLSiteLink;
        }
    }
   
}

/************************************************************/

/************************************************************/
/*CONTACT US*/
function initCheckoutLogin() {
    $(document).ready(function() {
        $('#existing-user').validate({
            submit: false,
            postBackLink: $('a[id$=hlExistingClient]', '#existing-user')/*,
            onSuccess: validateCredential*/
        });

        function validateCredential() {

            var s = new JsonCustomer(),
                email = $('#existing-user input[id$=txtEmail]').val(),
                pass = $('#existing-user input[id$=txtPassword]').val(),
                isCheck = $('#existing-user input[id$=chkRememberMe]').attr('checked'),
                $loader = $('#existing-user .loader'),
                $invalidCredential = $('#existing-user .invalid-credential');

            $invalidCredential.hide();
            $loader.show();

            var response = s.Login(email, pass, isCheck);

            try {
                if (response.error != undefined) throw response.error;

                var result = response;

                $loader.hide();

                if (!result) {
                    $invalidCredential.show();
                }

                return response;
            }
            catch (err) {
                ajaxError(err);

                return false;
            }

        }

    });
}
/************************************************************/

/************************************************************/
/* CATEGORIE */
function initOurStores() {
    $(document).ready(function() {

        /* Shows if all the cities are open */
        var allOpen = true;

        /* Opens only the selected city's container */
        var activateCity = function() {
            $('#addresses > div.selected').show('slow');
            $('#addresses > div:not(.selected)').hide('slow');
        }

        /* Closes all the other cities' container */
        var disableCity = function() {
            $('#addresses div').removeClass('selected');
            $('#addresses > h3').removeClass('selected');
            allOpen = false;
        }

        /* Put a city's name in bold in the top index when we click on a h3 container */
        var selectCityTopIndex = function(targetCity) {
            $('.city-per-province li').removeClass();
            $('[rel=' + targetCity + ']').parent().addClass('selected');
        }

        /* Handle the new city clicked from the top menu */
        $('.city-per-province a').click(function() {
            /* Get the city's name and strip the # */
            /* var curItem = $(this).attr('rel').replace(/#/g, ''); */
            var targetCity = "#" + $(this).attr('rel');

            /* Select the new city and apply the style */
            $('.city-per-province li').removeClass();
            $(this).parent().addClass('selected');

            disableCity();
            $(targetCity).addClass('selected');
            $(targetCity).next().addClass('selected');
            activateCity();

            setTimeout(function() {
                $.scrollTo(targetCity, 1000);
            }, 550);

            return true;
        });

        /* Handle the click directly on the city's container */
        $('#addresses h3').click(function() {
            if (allOpen) {
                disableCity();
                $(this).addClass('selected');
                $(this).next("div").addClass('selected');
                activateCity();

                /* Select the correct city in the top index */
                selectCityTopIndex($(this).text());
                return false;
            }

            if ($(this).hasClass("selected")) {
                /* If the city just clicked was already selected, we hide it */
                disableCity();
                $(this).removeClass('selected');
                $(this).next("div").removeClass('selected');
                $(this).next("div").hide('slow');

                $('.city-per-province li').removeClass();
            }
            else {
                disableCity();
                $(this).addClass('selected');
                $(this).next("div").addClass('selected');
                activateCity();

                /* Select the correct city in the top index */
                selectCityTopIndex($(this).text());
            }

            return false;
        });

        $('#current-province').click(function(e) {
            e.preventDefault();

            $('#dd-province').toggle();

            return false;
        });

        $('body').click(function(e) {

            $('#dd-province').hide();

        });

        Shadowbox.setup('.gallery a', {
            onFinish: function(item) {
                if ($('#sb-content').is('img')) {
                    $('#sb-content').css('cursor', 'pointer');
                    $('#sb-content').click(function(e) {
                        top.parent.Shadowbox.close();
                    });
                }
            }
        });

    });
}
/************************************************************/

/************************************************************/
/*CONTACT US*/
function initContactUs() {
    $(document).ready(function() {
        $('#contact-us').validate({
            submit: false,
            postBackLink: $("a[id$=lkSubmit]")
        });
    });
}
/************************************************************/

/************************************************************/
/* SPLASH */
function initProduct() {

    function removeValue($inputGlobal, valueToRemove) {

        var value = $inputGlobal.val();

        if (value.indexOf(valueToRemove) != -1 && valueToRemove != "") {
            value = value.replace(',' + valueToRemove + ',', ',');
        }

        return value;
    }

    function addValue($inputGlobal, valueToAdd) {

        var value = $inputGlobal.val();

        if (value.indexOf(valueToAdd) == -1) {
            value += valueToAdd + ',';
        }

        return value;
    }

    function initColors() {
        var $colorWrapper = $("#color"),
            $colorContainer = $colorWrapper.find('ul'),
            $colorLink = $colorContainer.find("a"),
            $colorItemsContainer = $("#color-items"),
            $colorItems = $colorItemsContainer.find(".TblColorCode"),
            $colorItemsCode = $colorItems.attr("code"),
            $defLoadedColor = $colorContainer.find("a:first"),
            $defLoadedColorCode = $defLoadedColor.attr("code"),
            $allColorsLink = $colorWrapper.find(".all-colors");

        //Add class to first swatch and
        //show the corresponding row(s)
        $colorContainer.find("*[code='02']").addClass("color-white").append("<span class='white-border'></span>");
        $colorContainer.find("*[code='00'],*[code='11']").addClass("color-none");

        // rounded corner class (first/last)
        $colorContainer.find("li:first .color span").addClass("colorRoundCornerTopLeft");
        $colorContainer.find("li:last .color span").addClass("colorRoundCornerTopRight");

        $defLoadedColor.parent().addClass("selected");
        $colorItemsContainer.find("*[code='" + $defLoadedColorCode + "']").show();

        //s'il n'y a aucun swatch de couleur, afficher toutes les variantes de produits
        if ($('#color').length === 0) {
            $colorItems.show();
        }

        $colorLink.click(function (e) {
            e.preventDefault();

            var $this = $(this),
                $parent = $this.parent(),
                $colorCode = $this.attr("code");

            if (!$parent.hasClass("selected")) {

                $parent.parent().find(".selected").removeClass("selected");
                $parent.addClass("selected");

                $colorItemsContainer.find("table").hide();
                $colorItemsContainer.find("*[code='" + $colorCode + "']").show();
            }

            $allColorsLink.find('span').removeClass('checkbox-selected');

        });

        $allColorsLink.bind("click", function () {

            var $this = $(this),
                $span = $this.find('span');

            if ($span.hasClass('checkbox-selected')) {
                //hide all colors and activate first color
                $defLoadedColor.parent().addClass("selected");
                $colorItems.hide();
                $colorItemsContainer.find("*[code='" + $defLoadedColorCode + "']").show();

            } else {
                //show all colors
                $colorContainer.find('li').removeClass('selected');
                $colorItems.show();
            }

            $span.toggleClass('checkbox-selected');

            return false;
        });


        // fadeIn colors
        $(window).load(function () {
            $colorContainer.fadeTo(500, 1);
        });

    }

    function adjustFormatHeight() {
        var $format = $('#format'),
            $color = $('#color');

        if ($format.height() < $color.height()) {
            $format.css('height', $color.height() + 'px');
        }
    }

    function initThumbnail() {

        var tabTumbs = $('#thumbnail a');
        var tabImg = $('#big-thumb a');

        for (i = 0; i < tabTumbs.length; i++) {
            $thumb = $(tabTumbs[i]);
            $img = $(tabImg[i]);

            $thumb.data('img', $img);
        }


        $('#big-thumb').click(function(e) {
            var el = e.target;

            if ($(el).is('span.zoom')) $('#big-thumb a.active').click();
        });

        $('#thumbnail a.thumbnail').click(function(e) {
            e.preventDefault();

            var $a = $(this);
            var $img = $a.data('img');
            var $activeImg = $('#big-thumb a.active');

            $activeImg.fadeOut('normal', function() {

                $(this).removeClass('active');

                $img.fadeIn();
                $img.addClass('active');
                $img.css('display', 'block');
            });

            return false;
        });

    }

    function initAddToCart() {
        
        $('a.add-to-cart').data('adding', false);

        //bubbling
        $('#color-items, #add-to-cart-no-bulk').click(function(e) {

	        var el = e.target,
	            $el = $(el),
	            $addedToCart = $el.next(), 
	            data;
            
            if ($el.is('a.add-to-cart')) {

                e.preventDefault();

                if ($el.data('adding') == false) {

                    $el.data('adding', true);

                    $el.fadeOut(function() {

                        $addedToCart.fadeIn(function() {
                            setTimeout(function() {
                                $addedToCart.fadeOut(function() {
                                    $el.fadeIn(function() {
                                        $el.data('adding', false);
                                    });

                                });
                            }, 2000)
                        });
                    });

                    data = {
	                    productID : $el.next().next().val(),
                        quantity : $('input', $el.parent().prev()).val()
                    };
                    
                    $.ajax({
		                type: "POST",
		                contentType: "application/json; charset=utf-8",
		                url: "/webservices/Cart.asmx/AddProductID",
		                data: JSON.stringify(data),
		                dataType: "json",
		                success: function (response) {
		                    if (response && response.d) {
		                		
		                		updateNbItem(response.d);
		                		// Google Conversion Tracking when item is added to cart
		                		$('body').append('<img src="//www.googleadservices.com/pagead/conversion/982278412/?label=6VPOCKSBywIQjMKx1AM&amp;guid=ON&amp;script=0" height="1" width="1" style="border-style:none;position:absolute;" alt="" />');

		                    }
		                }
		            });

                    return false;

                }

            }

        });

    }

    function initProductTabs() {

        var isAnchor = false,
            $viewDescLink = $("#shipping-description").find(".view-description"),
            $container = $("#product-tabs"),
            $tabLink = $("#product-tabs > ul > li").find("> a"),
            $targetContainer = $container.find(".product-tabs-ct");

        $viewDescLink.click(function() {
        
            $targetContainer.find("> div").hide();
            $container.find("a").removeClass("selected");
            
            $targetContainer.find(".product-tabs-desc").show();
            $container.find("a:first").addClass("selected");
            
        });

        $tabLink.bind("click", function(e) {

            var $this = $(e.target),
                $parent = $this.parent(),
                $index = $parent.prevAll().size(),
                $target = $targetContainer.find("> div").eq($index);

            $targetContainer.find("> div").hide();
            $container.find("a").removeClass("selected");
            
            $this.addClass("selected");
            $target.show();

            e.preventDefault();

        });
    }

    function trackEvent(context) {

        var pageTracker;
        
        if (document.domain.indexOf("deserres.ca") > -1) {
            pageTracker = _gat._getTracker("UA-15166628-1");
        }
        else {
            pageTracker = _gat._getTracker("UA-15166628-2");
        }

        pageTracker._trackEvent('pageproduit', context);

    }

    $(document).ready(function () {

        //hide product when there's no item
        //can happen in family products only on the first load
        var $table = $('#color-items > table');
        if ($('tbody > tr', $table).length == 0)
            $table.hide()

        adjustFormatHeight();

        /*init mask*/
        $('input.numeric').mask('9?99', { placeholder: " " });

        initThumbnail();

        // init color functionality
        initColors();

        //init add to cart
        initAddToCart();

        //init Product tabs
        initProductTabs();

        $('div.metadata').click(function (e) {

            var el = e.target;

            if ($(el).is('div.metadata') || $(el).is('div.metadata > p')) {
                location.href = $('a', el).attr('href');
            }
        });

        $('.ga-track-event').click(function () {
            var context = $(this).attr('rel');
            trackEvent(context);
        });

    });

}
/************************************************************/

/************************************************************/
/* SPLASH */
function initSplash() {

    $(document).ready(function() {

        $('#flip-client').click(function(e) {
            e.preventDefault();

            $("#splash").flip({ direction: 'lr', color: 'transparent',
                onEnd: function() {
                    $("#splash").hide();
                    $("#business-client").show();
                }
            });

            return false;
        });


        $('#flip-business').click(function(e) {
            e.preventDefault();

            $("#business-client").flip({ direction: 'rl', color: 'transparent',
                onEnd: function() {
                    $("#business-client").hide();
                    $("#splash").show();
                }
            });

            return false;
        });

        $('#business-client').hide();

        setFieldWithDefaultValue();

        $('.welcome input').onFocusClearField();

        $('#splash #fr').validate({
            submit: false,
            postBackLink: $('a[id$=lkEnterFr]')
        });

        $('#splash #en').validate({
            submit: false,
            postBackLink: $('a[id$=lkEnterEn]')
        });

        $('#business-client #fr').validate({
            submit: false,
            postBackLink: $('a[id$=lkBusinessEnterFr]')
        });

        $('#business-client #en').validate({
            submit: false,
            postBackLink: $('a[id$=lkBusinessEnterEn]')
        });

        $('a[id$=lkBusinessEnterFr]').click(function(e) {
            e.preventDefault;

            var result = true,
                $inputEmail = $('input[id$=txtBusinessEmailFr]'),
                $inputPassword = $('input[id$=txtBusinessPasswordFr]'),
                $liEmail = $inputEmail.parent(),
                $liPassword = $inputPassword.parent();

            if (!validateEmail($inputEmail.val())) {
                $liEmail.addClass('error');
                result = false;
            }
            else {
                $liEmail.removeClass('error');
            }

            if ($inputPassword.val() == "" || $inputPassword.val() == $inputPassword.attr('title')) {
                $liPassword.addClass('error');
                result = false;
            }
            else {
                $liPassword.removeClass('error');
            }

            return result;
        });

        $('a[id$=lkBusinessEnterEn]').click(function(e) {
            e.preventDefault;

            var result = true,
                $inputEmail = $('input[id$=txtBusinessEmailEn]'),
                $inputPassword = $('input[id$=txtBusinessPasswordEn]'),
                $liEmail = $inputEmail.parent(),
                $liPassword = $inputPassword.parent();

            if (!validateEmail($inputEmail.val())) {
                $liEmail.addClass('error');
                result = false;
            }
            else {
                $liEmail.removeClass('error');
            }

            if ($inputPassword.val() == "" || $inputPassword.val() == $inputPassword.attr('title')) {
                $liPassword.addClass('error');
                result = false;
            }
            else {
                $liPassword.removeClass('error');
            }

            return result;
        });
    });


}
/************************************************************/

/************************************************************/
/* CATEGORIE */
function initCategorie() {
    $(document).ready(function() {
        $('#sort-by').click(function(e) {
            e.preventDefault();
            $('#dd-sort-by').toggle();

            return false;
        });

        $('body').click(function(e) {

            $('#dd-sort-by').hide();

            var el = e.target;
            if ($(el).is('div.metadata') || $(el).is('div.metadata > p')) {
                location.href = $('a', el).attr('href');
            }

        });

        /*gestion des vue*/
        initCategorieDisplay();

    });
}

function initCategorieDisplay() {
    var cookieName = 'categorie-display',
        cookieDefaultVal = 'thumbnail',
        cookieVal = readCookie(cookieName);

    if (cookieVal == null) {
        createCookie(cookieName, cookieDefaultVal, 365);
        cookieVal = cookieDefaultVal;
    }

    $('#display > a').click(function(e) {

        e.preventDefault();

        $('#display > a').removeClass('selected');
        $(this).addClass('selected');

        var id = $(this).attr('id');
        var $items = $('#categories #items');

        $items.removeClass('items-thumbnail items-summary items-list');
        $items.addClass('items-' + id);

        createCookie(cookieName, id, 365);

        return false;
    });

    $('#' + cookieVal).click();

}
/************************************************************/

/************************************************************/
/* HOME PAGE */
function initHomePage() {
    $(document).ready(function() {
        var $tabs = $('#promo-a').tabs({ fx: { opacity: 'toggle' }, spinner: '' });
        $tabs.tabs('rotate', 6000, false);
    });
}
/************************************************************/

/************************************************************/
/*NEWSLETTER - POPUP SHADOWBOX*/
function initNewsletterShadowBox() {
    $(document).ready(function() {
        var $email = $("input[id$=txtEmail]"),
            $postalcode = $("input[id$=txtPostalCode]");

        $email.onFocusClearField();
        $postalcode.onFocusClearField();

        $("#newsletter-shadowbox").validate({
            submit: false,
            postBackLink: $('a[id$=lkSubmit]')
        });


        $("a.close").click(function(e) {
            e.preventDefault();
            parent.Shadowbox.close();
            return false;
        });

        $postalcode.blur();
    });
}
/************************************************************/

/************************************************************/
/*NEWSLETTER - POPUP SHADOWBOX*/
function initNewsletter() {
    $(document).ready(function() {
        var $email = $("input[id$=txtEmail]"),
            $postalcode = $("input[id$=txtPostalCode]");

        $("#newsletter").validate({
            submit: false,
            postBackLink: $('a[id$=lkSubmit]')
        });

        //$postalcode.blur();
    });
}
/************************************************************/

/************************************************************/
/*BREADCRUMB*/
function initBreadcrumb() {
    $(document).ready(function() {

        //the box must be displayed 
        if ($.browser.msie) {
            $('#breadcrumb a.nav').show();
            $('#breadcrumb div.sub-nav').show();


            $('#nav .sub-nav').hide();
            $('#breadcrumb div.sub-nav').hide();
        }

        $('#breadcrumb > ul > li > a.nav').parent().mouseenter(function(e) {
            //decrease z-index of next li link
            /*
            $('a.nav', $nextLi).css('z-index', '0');
            $( $nextLi).css('z-index', '0');
            
            $(this).css('zIndex', 'auto');*/

            var $nextLi = $(this).next();

            $('.sub-nav', this).show();
            $('a.nav', this).addClass('nav-mouseover');

            if ($.browser.msie) {
                $(this).append('<div class="border-fix"></div>');
            }
        });

        $('#breadcrumb > ul > li > a.nav').parent().mouseleave(function(e) {

            //increase z-index of next li link
            var $nextLi = $(this).next();
            /*$('a.nav', $nextLi).css('z-index', '9999');*/

            $('.sub-nav', this).hide();
            $('a.nav', this).removeClass('nav-mouseover');

            if ($.browser.msie) {
                $('div.border-fix').remove();
            }
        });
    });
}
/************************************************************/

/************************************************************/
/*ACCOUNT*/
function initAccount() {
    $(document).ready(function() {

        var $txtAdditionalComments = $("#txtAdditionalComments"),
            $maxlengthErrorMsg = $(".maxlength-error");

        $maxlengthErrorMsg.hide();

        $txtAdditionalComments.keyup(function () {
            limitChars(this);
        });

        $('#account').validate({
            submit: false,
            postBackLink: $("a[id$=hlSubmit]")
        });

        $("a[id$=hlCancel]").click(function(e) {
            e.preventDefault();
            history.back();
            return false;
        });
    });
}
/************************************************************/

/************************************************************/
/* Util */

function ajaxError(error) {
    alert('message: ' + error.message + '\n' + 'name: ' + error.name + '\n' + 'stackTrace: ' + error.stackTrace);
    //console.log(error); //window.location = "/en-us/connection-error/";
}

jQuery.fn.enter = function(href) {
    $(this).keydown(function(e) {
        var enter = 13;
        if (e.which == enter) {
            window.location = href;
        }
    });
}

// cookie functions http://www.quirksmode.org/js/cookies.html
function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}
function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}
function eraseCookie(name) {
    createCookie(name, "", -1);
}

function validateZipCode(zip) {
    var zipCodePattern = /^\d{5}$|^\d{5}-\d{4}$/;
    return zipCodePattern.test(zip);
}

function validatePostalCode(zip) {
    //var pattern = /^[a-zA-Z]{1}\d{1}[a-zA-Z]{1}\s\d{1}[a-zA-Z]{1}\d{1}$/;
    var pattern = /^[abceghjklmnprstvwxyzABCEGHJKLMNPRSTVXY]\d[abceghjklmnprstvwxyzABCEGHJKLMNPRSTVWXYZ]( )?\d[abceghjklmnprstvwxyzABCEGHJKLMNPRSTVWXYZ]\d$/;
    return pattern.test(zip);
}

function validateEmail(elementValue) {
    var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return pattern.test(elementValue);
}

function validatePhoneNumber(elementValue) {
    var phoneNumberPattern = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})(\s[x*]?\d{1,4})?$/;
    //var phoneNumberPattern = /^[2-9]\d{2}-\d{3}-\d{4}$/;

    return phoneNumberPattern.test(elementValue);
}

getNormColor = function(color) {

    if (color.indexOf('#') != -1) color = color.substring(1, 7);
    else color = rgbToHex(color);

    return color;
}

rgbToHex = function(rgbColor) {

    var rgbString = rgbColor;

    var parts = rgbString.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    // parts now should be ["rgb(0, 70, 255", "0", "70", "255"]
    delete (parts[0]);
    for (var i = 1; i <= 3; ++i) {
        parts[i] = parseInt(parts[i]).toString(16);
        if (parts[i].length == 1) parts[i] = '0' + parts[i];
    }
    var hexString = parts.join(''); // "0070ff"

    return hexString;
}

jQuery.fn.validate = function(options) {

    var settings = jQuery.extend({
        name: "ValidateUI",
        submit: true,
        /*jquery link who's gonna postback
        .NET specific*/
        postBackLink: null,
        /*when enter key is stroke, submit/postback the form*/
        onEnter: true,
        //function to execute one the form is validated
        onSuccess: null
    }, options);

    var _element = $(this);

    //ajout de l'image à droite des inputs
    //apparaît en cas d'erreur
    $('li.required', _element).each(function() {
        $(this).append('<span class="error-img"></span>');

        $('label', this).each(function(obj) {
            $(this).html('<span class="mandatory">*</span> ' + $(this).html());
        });
    });

    //validation de tous les email
    function emailExist(emailLi) {
        var result = true;

        for (i = 0; i < emailLi.length; i++) {
            var $requiredInput = $(emailLi[i]).children(':input:first');

            var $oldInput = $(emailLi[i]).children(':input.old-value');

            if ($requiredInput.val() != "") {

                //si jai un old value, compare la valeur courante avec lancienne.
                //si elle est différente, valide le email, sinon ne valide pas,
                //sil ny a pas de old value, valide seulement le email
                if (($oldInput.length > 0 && $requiredInput.val() != $oldInput.val()) || $oldInput.length == 0) {

                    var s = new JsonCustomer();

                    try {

                        var response = s.ValidateAccount($requiredInput.val());
                        var $infoBulle = $(emailLi).find('.email-already-in-use');

                        if (!response) {
                            result = false;
                            $(emailLi[i]).addClass('error');
                            $infoBulle.show();
                        }
                        else {
                            $(emailLi[i]).removeClass('error');
                            $infoBulle.hide();
                        }
                    }
                    catch (er) {
                        window.location = "/fr-ca/paiement/achat-express/";
                    }

                }
            }

        }

        return result;
    }

    //validation de tous les email
    function validateAllEmail(emailLi) {
        var result = true;

        for (i = 0; i < emailLi.length; i++) {
            //cache l'infobulle
            $(emailLi).find('.email-already-in-use').hide();

            var requiredInput = $(emailLi[i]).children(':input');
            var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

            if ($(requiredInput).val() != "") {
                if (!filter.test($(requiredInput).val())) {
                    result = false;
                    $(emailLi[i]).addClass('error');
                }
                else {
                    $(emailLi[i]).removeClass('error');
                }
            }
        }

        return result;
    }

    function compareAllInput(compareLi) {
        var result = true;

        for (i = 0; i < compareLi.length; i++) {

            var input = $(compareLi[i]).children(':input'),
                $liCompared = compareLi,
                $liComparedInput = $liCompared.find('input'),
                $li = $liCompared.prev(),
                $liInput = $li.find('input');

            if ($liInput.val() != $liComparedInput.val() || (($(compareLi[i]).hasClass('optional-required') || $(compareLi[i]).hasClass('required')) && input.val() == "")) {
                result = false;
                $(compareLi[i]).addClass('error');
                $liCompared.addClass("error-compare-password");


            } else {
                $(compareLi[i]).removeClass('error');
                $liCompared.removeClass("error-compare-password");
            }

        }

        return result;
    }

    function validateAllPhone(phoneLi) {
        var result = true;

        for (i = 0; i < phoneLi.length; i++) {
            var input = $(phoneLi[i]).children(':input');

            if (!validatePhoneNumber($(input).val())) {
                result = false;
                $(phoneLi[i]).addClass('error');
            }
            else {
                $(phoneLi[i]).removeClass('error');
            }
        }

        return result;
    }

    function validateAllZip(ZipLi) {
        var result = true;

        for (i = 0; i < ZipLi.length; i++) {
            var input = $(ZipLi[i]).children(':input');

            if (!validateZipCode($(input).val())) {
                result = false;
                $(ZipLi[i]).addClass('error');
            }
            else {
                $(ZipLi[i]).removeClass('error');
            }
        }

        return result;
    }

    function validateAllPostalCode(PostalCode) {
        var result = true;

        for (i = 0; i < PostalCode.length; i++) {

            var requiredInput = $(PostalCode[i]).children(':input');
            var filter = /^[abceghjklmnprstvwxyzABCEGHJKLMNPRSTVXY]\d[abceghjklmnprstvwxyzABCEGHJKLMNPRSTVWXYZ]( )?\d[abceghjklmnprstvwxyzABCEGHJKLMNPRSTVWXYZ]\d$/;

            if ($(requiredInput).val() != "") {
                if (!filter.test($(requiredInput).val())) {
                    result = false;
                    $(PostalCode[i]).addClass('error');
                }
                else {
                    $(PostalCode[i]).removeClass('error');
                }
            }
        }

        return result;
    }

    function validateAllRequired(requiredLi) {
        var result = true;

        for (i = 0; i < requiredLi.length; i++) {
            var requiredInput = $(requiredLi[i]).find(':input');
            var resultLi = true;

            if ($(requiredInput[0]).attr("type") == "radio") { resultLi = false; result = false; }

            for (j = 0; j < requiredInput.length; j++) {

                var type = $(requiredInput[j]).attr('type');
                var value = $(requiredInput[j]).val();

                switch (type) {
                    case 'checkbox':
                        if (!$(requiredInput[j]).attr('checked')) { result = false; resultLi = false; }
                        break;

                    case 'radio':

                        var groupName = $(requiredInput[j]).attr('name');
                        var $radioGroup = $('input[name=' + groupName + ']');

                        for (k = 0; k < $radioGroup.length; k++) {
                            if ($($radioGroup[k]).attr('checked')) { result = true; resultLi = true; }
                        }

                        break;

                    case 'select-one':
                        if (value === "" || value === "0") { result = false; resultLi = false; }
                        break;

                    case 'text':
                        if (value == "" || value == $(requiredInput[j]).attr('title')) { result = false; resultLi = false; }
                        break;

                    case 'password':
                        if (value == "") { result = false; resultLi = false; }
                        break;

                    case 'textarea':
                        if (value == "") { result = false; resultLi = false; }
                        break;
                }
            }


            if (!resultLi) $(requiredLi[i]).addClass('error');
            else $(requiredLi[i]).removeClass('error');
        }

        return result;
    }

    function validateAllOptional(optionalUl) {
        var result = true;

        for (i = 0; i < optionalUl.length; i++) {

            //valider les input optionel si la dépendance est rempli, coché ou sélectionné
            var optionalLi = $(optionalUl[i]).children("li.optional");
            var optionalInput = $(optionalLi).find(':input');
            var type = $(optionalInput).attr('type');
            var validate = false;

            switch (type) {
                case 'checkbox':
                    if (optionalInput[0].checked) validate = true;
                    break;
            }

            //valide les élément requis
            if (validate) {

                var requiredLi = $("li.optional-required");
                var resultRequired = validateAllRequired(requiredLi);

                //validation de tous les email
                var emailLi = $("li.optional-email");
                var resultEmail = validateAllEmail(emailLi);

                //comparaison de deux input
                var compareLi = $("li.optional-compare");
                var resultCompare = compareAllInput(compareLi);

                //validation du téléphone
                var phoneLi = $("li.optional-phone");
                var resultPhone = validateAllPhone(phoneLi);

                //validation du code postal
                var ZipLi = $("li.optional-zip");
                var resultZip = validateAllZip(ZipLi);

                //validation des input optionel, s'il y a lieu
                var optionalUl = $("ul.optional-optional");
                var resultOptional = validateAllOptional(optionalUl);

                if (!resultRequired || !resultEmail || !resultCompare || !resultPhone || !resultZip) result = false;
            }
            //enleve la class error
            else {
                $(optionalUl[i]).children("li.error").each(function() {
                    $(this).removeClass('error')
                });
            }
        }

        return result;
    }

    function validateAllMin(tabli) {
        var result = true;

        for (i = 0; i < tabli.length; i++) {
            var $li = $(tabli[i]),
                $input = $li.find(':input'),
                resultLi = true,
                minlength = $li.attr('data-minlength');

            // if field is optional
            if (!$li.hasClass("required")) {

                if ($input.val() == "") {
                    $li.removeClass('error');
                    $li.removeClass('error-minlength');
                }
                else if ($input.val() != '' && $input.val().length < minlength) {
                    result = false;

                    if ($li.hasClass('error')) {
                        $li.addClass('error-minlength');
                    } else {
                        $li.addClass('error error-minlength');
                    }

                } else {
                    $li.removeClass('error-minlength');
                    $li.removeClass('error');
                }

            } // if field is required
            else {
                if ($input.val() != '' && $input.val().length < minlength) {
                    result = false;

                    if ($li.hasClass('error')) {
                        $li.addClass('error-minlength');
                    } else {
                        $li.addClass('error error-minlength');
                    }
                }
                else {
                    $li.removeClass('error-minlength');
                }
            }
        }
        return false;

        return result;
    }

    function isFormValid() {

        var requiredLi = $("li.required", _element);
        var resultRequired = validateAllRequired(requiredLi);

        //validation de tous les email
        var emailLi = $("li.email", _element);
        var resultEmail = validateAllEmail(emailLi);

        //vérifie que l'email est unique
        var emaiExistlLi = $("li.email-exist", _element);
        if (resultEmail) {
            resultEmail = emailExist(emaiExistlLi);
        }

        //comparaison de deux input
        var compareLi = $("li.compare", _element);
        var resultCompare = compareAllInput(compareLi);

        //validation du téléphone
        var phoneLi = $("li.phone", _element);
        var resultPhone = validateAllPhone(phoneLi);

        //validation du zip code
        var ZipLi = $("li.zip", _element);
        var resultZip = validateAllZip(ZipLi);

        //validation du minimum length
        var MinLi = $("li.minlength", _element);
        var resultMin = validateAllMin(MinLi);

        //validation du code postal
        var PostalCode = $("li.postalcode", _element);
        var resultPostalCode = validateAllPostalCode(PostalCode);

        //validation des input optionel, s'il y a lieu
        var optionalUl = $("ul.optional", _element);
        var resultOptional = validateAllOptional(optionalUl);



        /*test de la ligne de code suivante :*/
        if ($('li.error', _element).length > 0) {
            $($('li.error :input', _element)[0]).focus();
            return false;
        }
        else { return true; }
    }

    if (settings.submit) {
        $(this).bind("submit", isFormValid);
    }

    if (settings.onSuccess && settings.postBackLink != null) {
        var $postBackLink = settings.postBackLink;

        $postBackLink.click(function(e) {

            var result = false;

            if (isFormValid()) {
                result = settings.onSuccess();
            }

            return result;
        });

    }
    else if (!settings.submit && settings.postBackLink != null) {

        var $postBackLink = settings.postBackLink;

        for (i = 0; i < $postBackLink.length; i++) {
            var $link = $($postBackLink[i]);

            $link.click(function(e) {
                var result = isFormValid();

                return result;
            });
        }

    }

    if (settings.onEnter) {

        //add event on enter key
        $('ul.form li input', _element).keydown(function(e) {
            var enter = 13;

            if (e.which == enter) {
                if (settings.submit) {
                    $('form').submit();
                }
                else if (settings.postBackLink != null) {
                    var args = $(settings.postBackLink).getDoPostBackArgs();

                    if (isFormValid()) {

                        var result = true;
                        if (settings.onSuccess) {
                            result = settings.onSuccess();
                        }

                        if (result) __doPostBack(args.args0, args.args1);

                        return result;
                    }

                    return false;
                }
            }
        });
    }
    return this;

}

jQuery.fn.getDoPostBackArgs = function() {
    var $link = $(this),
        href = $link.attr('href'),
        temp = "";


    if (href != '' && href.indexOf('doPostBack') != -1) {
        temp = href.split('(')[1];
        temp = temp.split(')')[0];
        temp = temp.split(',');
    }


    return { args0: temp[0].replace(/\'/g, ""), args1: temp[1].replace(/\'/g, "") };
}

/*
- lorsque l'utilisation focus un champ, la valeur par défault (dans l'attribut "title") est effacé
- si l'utilisateur quitte le champs et qu'il est vide, remet la valeur par défaut
*/
jQuery.fn.onFocusClearField = function() {

    var $tab = $(this);

    for (i = 0; i < $tab.length; i++) {

        $el = $($tab[i]);

        $el.focus(function(e) {

            var defautlVal = $(this).attr('title');

            if ($(this).val() === defautlVal) {
                $(this).val('');
                $(this).addClass('query');
            }
        });

        $el.blur(function(e) {

            var defautlVal = $(this).attr('title');

            if ($(this).val() === '') {
                $(this).val(defautlVal);
                $(this).removeClass('query');
            }
        });
    }
}
/************************************************************/

/************************************************************/
/* PROJECTS HOME */
function initProjectsHome() {
    var $idea = $('#idea'),
        $specialFeatures = $('#special-features');

    if ($idea.height() > $specialFeatures.height()) $specialFeatures.css('height', $idea.height());
    else if ($specialFeatures.height() > $idea.height()) $idea.css('height', $specialFeatures.height());

}
/************************************************************/

/************************************************************/
/* FONCTION COMMUNE À TOUT LE SITE */
function initWebAccessRequest() {
    $('#web-access-request').validate({
        submit: false,
        postBackLink: $("a[id$=hlSubmit]")
    });

}
/************************************************************/

/************************************************************/
/* FONCTION COMMUNE À TOUT LE SITE */
function setFieldWithDefaultValue() {
    var $inputs = $(':input.text');

    for (i = 0; i < $inputs.length; i++) {

        $input = $($inputs[i]);


        if ($input.val() == '')
            $input.val($input.attr('title'));

    }
}

function initSearch() {

    $('#search input').onFocusClearField();

}
function initMenu() {

    var hasMouseLeave = false;
    $('#nav > ul > li > a.nav').parent().mouseenter(function(e) {

        var $li = $(this);

        hasMouseLeave = false;

        $('a.nav', $li).addClass('nav-mouseover');

        setTimeout(function() {
            if (!hasMouseLeave && $('a.nav', $li).hasClass('nav-mouseover'))
                $('.sub-nav', $li).show();
        }, 250);

    });

    $('#nav > ul > li > a.nav').parent().mouseleave(function(e) {

        hasMouseLeave = true;

        $('.sub-nav', this).hide();
        $('a.nav', this).removeClass('nav-mouseover');
    });
}

function initLoginPanel() {

    $required = $('#login-panel li.required');
    $required.removeClass('required');

    $("#connection a.open").click(function(e) {
        e.preventDefault();

        $required.addClass('required');

        $('#nav-top').css('z-index', '0');

        $("#login-panel #login-content").slideDown("slow");

        return false;
    });

    // Collapse Panel
    $("#connection a.close").click(function(e) {
        e.preventDefault();

        $required.removeClass('required');

        $("#login-panel #login-content").slideUp("slow", function() {
            $('#nav-top').css('z-index', '999');
        });

        return false;
    });

    $("#connection #toggle a").click(function(e) {
        e.preventDefault();

        $("#connection #toggle a").toggle();

        return false;
    });
}

var Project = {
    YoutubeUrl: null,
    init: function () {
        if (Project.YoutubeUrl != null) {
            $('#embed-youtube .video').oembed(Project.YoutubeUrl);
        }
        Project.initThumbnail();
    },
    initThumbnail: function () {

        var tabTumbs = $('#thumbnail a');
        var tabImg = $('#big-thumb a');

        for (i = 0; i < tabTumbs.length; i++) {
            $thumb = $(tabTumbs[i]);
            $img = $(tabImg[i]);

            $thumb.data('img', $img);
        }


        $('#big-thumb').click(function (e) {
            var el = e.target;

            if ($(el).is('span.zoom')) $('#big-thumb a.active').click();
        });

        $('#thumbnail a.thumbnail').click(function (e) {
            e.preventDefault();

            var $a = $(this);
            var $img = $a.data('img');
            var $activeImg = $('#big-thumb a.active');

            $activeImg.fadeOut('normal', function () {

                $(this).removeClass('active');

                $img.fadeIn();
                $img.addClass('active');
                $img.css('display', 'block');
            });

            return false;
        });
    }
};

function initCreativeClubActivateAccount() {
    $(document).ready(function() {

        var $optinsWrapper = $("#optins-newsletter"),
            $optinsInput = $("#optins-newsletter [id$=cbxOptInNewsletter]"),
            $optinsInputChild = $optinsWrapper.find('.optins input');

        // if checked onload show checkbox list
        if ($optinsInput.is(':checked'))
            $optinsWrapper.find('.optins').show();


        $optinsInput.bind('click', function() {

            if ($(this).is(':checked')) {
                $optinsWrapper.find('.optins').show();
            }
            else {
                $optinsWrapper.find('.optins').hide();
                
                $optinsInputChild.each(function() {
                    $(this).removeAttr("checked");
                });
            }

        });

        $('#creative-club-activation').validate({
            submit: false,
            postBackLink: $('a[id$=btnActivate]')
        });

    });
    
}

function initCreativeClubLogin() {
    $(document).ready(function() {
        $('#creative-club-login').validate({
            submit: false,
            postBackLink: $('a[id$=btnSubmit]')
        });
    });
}

function initCreativeClubVerify() {
    $(document).ready(function() {
        $('#creative-club-verify').validate({
            submit: false,
            postBackLink: $('a[id$=btnSubmit]')
        });
    });
}

function limitChars(elem, length) {
    var elemVal = elem.value;

    // if no length is passed, apply default.
    if (length == null)
        length = 2000;

    if (elemVal.length > length) {
        $(elem).parent().addClass('required error');
        $(".maxlength-error").slideDown('slow');
    } else {
        $(elem).parent().removeClass('required error');
        $(".maxlength-error").slideUp('slow');
    }
}

var CommercialAccount = {
    isNumber: function (n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    },
    login: function () {

        $('#commercial-account-login').validate({
            submit: false,
            postBackLink: $('a[id$=btnSubmit]')
        });

        function validateClientNumber() {

            result = true;

            var $clientNumber = $('#txtAccountNumber'),
                $clientNumberValue = $clientNumber.val();

            if ($clientNumberValue != "") {
                result = CommercialAccount.isNumber($clientNumberValue);

                if (!CommercialAccount.isNumber($clientNumberValue)) {
                    $clientNumber.parent().addClass("required error");
                    result = false;
                }
                else {
                    $clientNumber.parent().removeClass("required error");
                    result = true;
                }

            } else {
                $clientNumber.parent().removeClass("required error");
                result = true;
            }

            return result;
        }
    },
    activate: function () {

        //cache textarea element + it's value
        var $txtAdditionalComments = $("#txtAdditionalComments"),
            $maxlengthErrorMsg = $(".maxlength-error");

        $maxlengthErrorMsg.hide();
        
        $txtAdditionalComments.keyup(function () {
            limitChars(this);
        });

        $('#commercial-account-activation').validate({
            submit: false,
            postBackLink: $('a[id$=btnActivate]')
        });
    }
}


function init() {
    initLoginPanel();
    initMenu();
    initSearch();
}


$(document).ready(init);
/**********************************************************/
