diff --git a/src/Umbraco.Web.UI.Client/lib/jquery/jquery-2.0.3.min.js b/src/Umbraco.Web.UI.Client/lib/jquery/jquery-2.0.3.min.js
index 5fb3abb4a7..e8685eb042 100644
--- a/src/Umbraco.Web.UI.Client/lib/jquery/jquery-2.0.3.min.js
+++ b/src/Umbraco.Web.UI.Client/lib/jquery/jquery-2.0.3.min.js
@@ -1,5 +1,4 @@
/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery-2.0.3.min.map
*/
(function (e, undefined) {
var t, n, r = typeof undefined, i = e.location, o = e.document, s = o.documentElement, a = e.jQuery, u = e.$, l = {}, c = [], p = "2.0.3", f = c.concat, h = c.push, d = c.slice, g = c.indexOf, m = l.toString, y = l.hasOwnProperty, v = p.trim, x = function (e, n) { return new x.fn.init(e, n, t) }, b = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, w = /\S+/g, T = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, C = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, k = /^-ms-/, N = /-([\da-z])/gi, E = function (e, t) { return t.toUpperCase() }, S = function () { o.removeEventListener("DOMContentLoaded", S, !1), e.removeEventListener("load", S, !1), x.ready() }; x.fn = x.prototype = { jquery: p, constructor: x, init: function (e, t, n) { var r, i; if (!e) return this; if ("string" == typeof e) { if (r = "<" === e.charAt(0) && ">" === e.charAt(e.length - 1) && e.length >= 3 ? [null, e, null] : T.exec(e), !r || !r[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); if (r[1]) { if (t = t instanceof x ? t[0] : t, x.merge(this, x.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : o, !0)), C.test(r[1]) && x.isPlainObject(t)) for (r in t) x.isFunction(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); return this } return i = o.getElementById(r[2]), i && i.parentNode && (this.length = 1, this[0] = i), this.context = o, this.selector = e, this } return e.nodeType ? (this.context = this[0] = e, this.length = 1, this) : x.isFunction(e) ? n.ready(e) : (e.selector !== undefined && (this.selector = e.selector, this.context = e.context), x.makeArray(e, this)) }, selector: "", length: 0, toArray: function () { return d.call(this) }, get: function (e) { return null == e ? this.toArray() : 0 > e ? this[this.length + e] : this[e] }, pushStack: function (e) { var t = x.merge(this.constructor(), e); return t.prevObject = this, t.context = this.context, t }, each: function (e, t) { return x.each(this, e, t) }, ready: function (e) { return x.ready.promise().done(e), this }, slice: function () { return this.pushStack(d.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, eq: function (e) { var t = this.length, n = +e + (0 > e ? t : 0); return this.pushStack(n >= 0 && t > n ? [this[n]] : []) }, map: function (e) { return this.pushStack(x.map(this, function (t, n) { return e.call(t, n, t) })) }, end: function () { return this.prevObject || this.constructor(null) }, push: h, sort: [].sort, splice: [].splice }, x.fn.init.prototype = x.fn, x.extend = x.fn.extend = function () { var e, t, n, r, i, o, s = arguments[0] || {}, a = 1, u = arguments.length, l = !1; for ("boolean" == typeof s && (l = s, s = arguments[1] || {}, a = 2), "object" == typeof s || x.isFunction(s) || (s = {}), u === a && (s = this, --a) ; u > a; a++) if (null != (e = arguments[a])) for (t in e) n = s[t], r = e[t], s !== r && (l && r && (x.isPlainObject(r) || (i = x.isArray(r))) ? (i ? (i = !1, o = n && x.isArray(n) ? n : []) : o = n && x.isPlainObject(n) ? n : {}, s[t] = x.extend(l, o, r)) : r !== undefined && (s[t] = r)); return s }, x.extend({ expando: "jQuery" + (p + Math.random()).replace(/\D/g, ""), noConflict: function (t) { return e.$ === x && (e.$ = u), t && e.jQuery === x && (e.jQuery = a), x }, isReady: !1, readyWait: 1, holdReady: function (e) { e ? x.readyWait++ : x.ready(!0) }, ready: function (e) { (e === !0 ? --x.readyWait : x.isReady) || (x.isReady = !0, e !== !0 && --x.readyWait > 0 || (n.resolveWith(o, [x]), x.fn.trigger && x(o).trigger("ready").off("ready"))) }, isFunction: function (e) { return "function" === x.type(e) }, isArray: Array.isArray, isWindow: function (e) { return null != e && e === e.window }, isNumeric: function (e) { return !isNaN(parseFloat(e)) && isFinite(e) }, type: function (e) { return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? l[m.call(e)] || "object" : typeof e }, isPlainObject: function (e) { if ("object" !== x.type(e) || e.nodeType || x.isWindow(e)) return !1; try { if (e.constructor && !y.call(e.constructor.prototype, "isPrototypeOf")) return !1 } catch (t) { return !1 } return !0 }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, error: function (e) { throw Error(e) }, parseHTML: function (e, t, n) { if (!e || "string" != typeof e) return null; "boolean" == typeof t && (n = t, t = !1), t = t || o; var r = C.exec(e), i = !n && []; return r ? [t.createElement(r[1])] : (r = x.buildFragment([e], t, i), i && x(i).remove(), x.merge([], r.childNodes)) }, parseJSON: JSON.parse, parseXML: function (e) { var t, n; if (!e || "string" != typeof e) return null; try { n = new DOMParser, t = n.parseFromString(e, "text/xml") } catch (r) { t = undefined } return (!t || t.getElementsByTagName("parsererror").length) && x.error("Invalid XML: " + e), t }, noop: function () { }, globalEval: function (e) { var t, n = eval; e = x.trim(e), e && (1 === e.indexOf("use strict") ? (t = o.createElement("script"), t.text = e, o.head.appendChild(t).parentNode.removeChild(t)) : n(e)) }, camelCase: function (e) { return e.replace(k, "ms-").replace(N, E) }, nodeName: function (e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() }, each: function (e, t, n) { var r, i = 0, o = e.length, s = j(e); if (n) { if (s) { for (; o > i; i++) if (r = t.apply(e[i], n), r === !1) break } else for (i in e) if (r = t.apply(e[i], n), r === !1) break } else if (s) { for (; o > i; i++) if (r = t.call(e[i], i, e[i]), r === !1) break } else for (i in e) if (r = t.call(e[i], i, e[i]), r === !1) break; return e }, trim: function (e) { return null == e ? "" : v.call(e) }, makeArray: function (e, t) { var n = t || []; return null != e && (j(Object(e)) ? x.merge(n, "string" == typeof e ? [e] : e) : h.call(n, e)), n }, inArray: function (e, t, n) { return null == t ? -1 : g.call(t, e, n) }, merge: function (e, t) { var n = t.length, r = e.length, i = 0; if ("number" == typeof n) for (; n > i; i++) e[r++] = t[i]; else while (t[i] !== undefined) e[r++] = t[i++]; return e.length = r, e }, grep: function (e, t, n) { var r, i = [], o = 0, s = e.length; for (n = !!n; s > o; o++) r = !!t(e[o], o), n !== r && i.push(e[o]); return i }, map: function (e, t, n) { var r, i = 0, o = e.length, s = j(e), a = []; if (s) for (; o > i; i++) r = t(e[i], i, n), null != r && (a[a.length] = r); else for (i in e) r = t(e[i], i, n), null != r && (a[a.length] = r); return f.apply([], a) }, guid: 1, proxy: function (e, t) { var n, r, i; return "string" == typeof t && (n = e[t], t = e, e = n), x.isFunction(e) ? (r = d.call(arguments, 2), i = function () { return e.apply(t || this, r.concat(d.call(arguments))) }, i.guid = e.guid = e.guid || x.guid++, i) : undefined }, access: function (e, t, n, r, i, o, s) { var a = 0, u = e.length, l = null == n; if ("object" === x.type(n)) { i = !0; for (a in n) x.access(e, t, a, n[a], !0, o, s) } else if (r !== undefined && (i = !0, x.isFunction(r) || (s = !0), l && (s ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { return l.call(x(e), n) })), t)) for (; u > a; a++) t(e[a], n, s ? r : r.call(e[a], a, t(e[a], n))); return i ? e : l ? t.call(e) : u ? t(e[0], n) : o }, now: Date.now, swap: function (e, t, n, r) { var i, o, s = {}; for (o in t) s[o] = e.style[o], e.style[o] = t[o]; i = n.apply(e, r || []); for (o in t) e.style[o] = s[o]; return i } }), x.ready.promise = function (t) { return n || (n = x.Deferred(), "complete" === o.readyState ? setTimeout(x.ready) : (o.addEventListener("DOMContentLoaded", S, !1), e.addEventListener("load", S, !1))), n.promise(t) }, x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (e, t) { l["[object " + t + "]"] = t.toLowerCase() }); function j(e) { var t = e.length, n = x.type(e); return x.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === n || "function" !== n && (0 === t || "number" == typeof t && t > 0 && t - 1 in e) } t = x(o), function (e, undefined) { var t, n, r, i, o, s, a, u, l, c, p, f, h, d, g, m, y, v = "sizzle" + -new Date, b = e.document, w = 0, T = 0, C = st(), k = st(), N = st(), E = !1, S = function (e, t) { return e === t ? (E = !0, 0) : 0 }, j = typeof undefined, D = 1 << 31, A = {}.hasOwnProperty, L = [], q = L.pop, H = L.push, O = L.push, F = L.slice, P = L.indexOf || function (e) { var t = 0, n = this.length; for (; n > t; t++) if (this[t] === e) return t; return -1 }, R = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", M = "[\\x20\\t\\r\\n\\f]", W = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", $ = W.replace("w", "w#"), B = "\\[" + M + "*(" + W + ")" + M + "*(?:([*^$|!~]?=)" + M + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + $ + ")|)|)" + M + "*\\]", I = ":(" + W + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + B.replace(3, 8) + ")*)|.*)\\)|)", z = RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), _ = RegExp("^" + M + "*," + M + "*"), X = RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), U = RegExp(M + "*[+~]"), Y = RegExp("=" + M + "*([^\\]'\"]*)" + M + "*\\]", "g"), V = RegExp(I), G = RegExp("^" + $ + "$"), J = { ID: RegExp("^#(" + W + ")"), CLASS: RegExp("^\\.(" + W + ")"), TAG: RegExp("^(" + W.replace("w", "w*") + ")"), ATTR: RegExp("^" + B), PSEUDO: RegExp("^" + I), CHILD: RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), bool: RegExp("^(?:" + R + ")$", "i"), needsContext: RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") }, Q = /^[^{]+\{\s*\[native \w/, K = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, Z = /^(?:input|select|textarea|button)$/i, et = /^h\d$/i, tt = /'|\\/g, nt = RegExp("\\\\([\\da-f]{1,6}" + M + "?|(" + M + ")|.)", "ig"), rt = function (e, t, n) { var r = "0x" + t - 65536; return r !== r || n ? t : 0 > r ? String.fromCharCode(r + 65536) : String.fromCharCode(55296 | r >> 10, 56320 | 1023 & r) }; try { O.apply(L = F.call(b.childNodes), b.childNodes), L[b.childNodes.length].nodeType } catch (it) { O = { apply: L.length ? function (e, t) { H.apply(e, F.call(t)) } : function (e, t) { var n = e.length, r = 0; while (e[n++] = t[r++]); e.length = n - 1 } } } function ot(e, t, r, i) { var o, s, a, u, l, f, g, m, x, w; if ((t ? t.ownerDocument || t : b) !== p && c(t), t = t || p, r = r || [], !e || "string" != typeof e) return r; if (1 !== (u = t.nodeType) && 9 !== u) return []; if (h && !i) { if (o = K.exec(e)) if (a = o[1]) { if (9 === u) { if (s = t.getElementById(a), !s || !s.parentNode) return r; if (s.id === a) return r.push(s), r } else if (t.ownerDocument && (s = t.ownerDocument.getElementById(a)) && y(t, s) && s.id === a) return r.push(s), r } else { if (o[2]) return O.apply(r, t.getElementsByTagName(e)), r; if ((a = o[3]) && n.getElementsByClassName && t.getElementsByClassName) return O.apply(r, t.getElementsByClassName(a)), r } if (n.qsa && (!d || !d.test(e))) { if (m = g = v, x = t, w = 9 === u && e, 1 === u && "object" !== t.nodeName.toLowerCase()) { f = gt(e), (g = t.getAttribute("id")) ? m = g.replace(tt, "\\$&") : t.setAttribute("id", m), m = "[id='" + m + "'] ", l = f.length; while (l--) f[l] = m + mt(f[l]); x = U.test(e) && t.parentNode || t, w = f.join(",") } if (w) try { return O.apply(r, x.querySelectorAll(w)), r } catch (T) { } finally { g || t.removeAttribute("id") } } } return kt(e.replace(z, "$1"), t, r, i) } function st() { var e = []; function t(n, r) { return e.push(n += " ") > i.cacheLength && delete t[e.shift()], t[n] = r } return t } function at(e) { return e[v] = !0, e } function ut(e) { var t = p.createElement("div"); try { return !!e(t) } catch (n) { return !1 } finally { t.parentNode && t.parentNode.removeChild(t), t = null } } function lt(e, t) { var n = e.split("|"), r = e.length; while (r--) i.attrHandle[n[r]] = t } function ct(e, t) { var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && (~t.sourceIndex || D) - (~e.sourceIndex || D); if (r) return r; if (n) while (n = n.nextSibling) if (n === t) return -1; return e ? 1 : -1 } function pt(e) { return function (t) { var n = t.nodeName.toLowerCase(); return "input" === n && t.type === e } } function ft(e) { return function (t) { var n = t.nodeName.toLowerCase(); return ("input" === n || "button" === n) && t.type === e } } function ht(e) { return at(function (t) { return t = +t, at(function (n, r) { var i, o = e([], n.length, t), s = o.length; while (s--) n[i = o[s]] && (n[i] = !(r[i] = n[i])) }) }) } s = ot.isXML = function (e) { var t = e && (e.ownerDocument || e).documentElement; return t ? "HTML" !== t.nodeName : !1 }, n = ot.support = {}, c = ot.setDocument = function (e) { var t = e ? e.ownerDocument || e : b, r = t.defaultView; return t !== p && 9 === t.nodeType && t.documentElement ? (p = t, f = t.documentElement, h = !s(t), r && r.attachEvent && r !== r.top && r.attachEvent("onbeforeunload", function () { c() }), n.attributes = ut(function (e) { return e.className = "i", !e.getAttribute("className") }), n.getElementsByTagName = ut(function (e) { return e.appendChild(t.createComment("")), !e.getElementsByTagName("*").length }), n.getElementsByClassName = ut(function (e) { return e.innerHTML = "
", e.firstChild.className = "i", 2 === e.getElementsByClassName("i").length }), n.getById = ut(function (e) { return f.appendChild(e).id = v, !t.getElementsByName || !t.getElementsByName(v).length }), n.getById ? (i.find.ID = function (e, t) { if (typeof t.getElementById !== j && h) { var n = t.getElementById(e); return n && n.parentNode ? [n] : [] } }, i.filter.ID = function (e) { var t = e.replace(nt, rt); return function (e) { return e.getAttribute("id") === t } }) : (delete i.find.ID, i.filter.ID = function (e) { var t = e.replace(nt, rt); return function (e) { var n = typeof e.getAttributeNode !== j && e.getAttributeNode("id"); return n && n.value === t } }), i.find.TAG = n.getElementsByTagName ? function (e, t) { return typeof t.getElementsByTagName !== j ? t.getElementsByTagName(e) : undefined } : function (e, t) { var n, r = [], i = 0, o = t.getElementsByTagName(e); if ("*" === e) { while (n = o[i++]) 1 === n.nodeType && r.push(n); return r } return o }, i.find.CLASS = n.getElementsByClassName && function (e, t) { return typeof t.getElementsByClassName !== j && h ? t.getElementsByClassName(e) : undefined }, g = [], d = [], (n.qsa = Q.test(t.querySelectorAll)) && (ut(function (e) { e.innerHTML = "", e.querySelectorAll("[selected]").length || d.push("\\[" + M + "*(?:value|" + R + ")"), e.querySelectorAll(":checked").length || d.push(":checked") }), ut(function (e) { var n = t.createElement("input"); n.setAttribute("type", "hidden"), e.appendChild(n).setAttribute("t", ""), e.querySelectorAll("[t^='']").length && d.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll(":enabled").length || d.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), d.push(",.*:") })), (n.matchesSelector = Q.test(m = f.webkitMatchesSelector || f.mozMatchesSelector || f.oMatchesSelector || f.msMatchesSelector)) && ut(function (e) { n.disconnectedMatch = m.call(e, "div"), m.call(e, "[s!='']:x"), g.push("!=", I) }), d = d.length && RegExp(d.join("|")), g = g.length && RegExp(g.join("|")), y = Q.test(f.contains) || f.compareDocumentPosition ? function (e, t) { var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode; return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) } : function (e, t) { if (t) while (t = t.parentNode) if (t === e) return !0; return !1 }, S = f.compareDocumentPosition ? function (e, r) { if (e === r) return E = !0, 0; var i = r.compareDocumentPosition && e.compareDocumentPosition && e.compareDocumentPosition(r); return i ? 1 & i || !n.sortDetached && r.compareDocumentPosition(e) === i ? e === t || y(b, e) ? -1 : r === t || y(b, r) ? 1 : l ? P.call(l, e) - P.call(l, r) : 0 : 4 & i ? -1 : 1 : e.compareDocumentPosition ? -1 : 1 } : function (e, n) { var r, i = 0, o = e.parentNode, s = n.parentNode, a = [e], u = [n]; if (e === n) return E = !0, 0; if (!o || !s) return e === t ? -1 : n === t ? 1 : o ? -1 : s ? 1 : l ? P.call(l, e) - P.call(l, n) : 0; if (o === s) return ct(e, n); r = e; while (r = r.parentNode) a.unshift(r); r = n; while (r = r.parentNode) u.unshift(r); while (a[i] === u[i]) i++; return i ? ct(a[i], u[i]) : a[i] === b ? -1 : u[i] === b ? 1 : 0 }, t) : p }, ot.matches = function (e, t) { return ot(e, null, null, t) }, ot.matchesSelector = function (e, t) { if ((e.ownerDocument || e) !== p && c(e), t = t.replace(Y, "='$1']"), !(!n.matchesSelector || !h || g && g.test(t) || d && d.test(t))) try { var r = m.call(e, t); if (r || n.disconnectedMatch || e.document && 11 !== e.document.nodeType) return r } catch (i) { } return ot(t, p, null, [e]).length > 0 }, ot.contains = function (e, t) { return (e.ownerDocument || e) !== p && c(e), y(e, t) }, ot.attr = function (e, t) { (e.ownerDocument || e) !== p && c(e); var r = i.attrHandle[t.toLowerCase()], o = r && A.call(i.attrHandle, t.toLowerCase()) ? r(e, t, !h) : undefined; return o === undefined ? n.attributes || !h ? e.getAttribute(t) : (o = e.getAttributeNode(t)) && o.specified ? o.value : null : o }, ot.error = function (e) { throw Error("Syntax error, unrecognized expression: " + e) }, ot.uniqueSort = function (e) { var t, r = [], i = 0, o = 0; if (E = !n.detectDuplicates, l = !n.sortStable && e.slice(0), e.sort(S), E) { while (t = e[o++]) t === e[o] && (i = r.push(o)); while (i--) e.splice(r[i], 1) } return e }, o = ot.getText = function (e) { var t, n = "", r = 0, i = e.nodeType; if (i) { if (1 === i || 9 === i || 11 === i) { if ("string" == typeof e.textContent) return e.textContent; for (e = e.firstChild; e; e = e.nextSibling) n += o(e) } else if (3 === i || 4 === i) return e.nodeValue } else for (; t = e[r]; r++) n += o(t); return n }, i = ot.selectors = { cacheLength: 50, createPseudo: at, match: J, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace(nt, rt), e[3] = (e[4] || e[5] || "").replace(nt, rt), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || ot.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && ot.error(e[0]), e }, PSEUDO: function (e) { var t, n = !e[5] && e[2]; return J.CHILD.test(e[0]) ? null : (e[3] && e[4] !== undefined ? e[2] = e[4] : n && V.test(n) && (t = gt(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) } }, filter: { TAG: function (e) { var t = e.replace(nt, rt).toLowerCase(); return "*" === e ? function () { return !0 } : function (e) { return e.nodeName && e.nodeName.toLowerCase() === t } }, CLASS: function (e) { var t = C[e + " "]; return t || (t = RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && C(e, function (e) { return t.test("string" == typeof e.className && e.className || typeof e.getAttribute !== j && e.getAttribute("class") || "") }) }, ATTR: function (e, t, n) { return function (r) { var i = ot.attr(r, e); return null == i ? "!=" === t : t ? (i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i + " ").indexOf(n) > -1 : "|=" === t ? i === n || i.slice(0, n.length + 1) === n + "-" : !1) : !0 } }, CHILD: function (e, t, n, r, i) { var o = "nth" !== e.slice(0, 3), s = "last" !== e.slice(-4), a = "of-type" === t; return 1 === r && 0 === i ? function (e) { return !!e.parentNode } : function (t, n, u) { var l, c, p, f, h, d, g = o !== s ? "nextSibling" : "previousSibling", m = t.parentNode, y = a && t.nodeName.toLowerCase(), x = !u && !a; if (m) { if (o) { while (g) { p = t; while (p = p[g]) if (a ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) return !1; d = g = "only" === e && !d && "nextSibling" } return !0 } if (d = [s ? m.firstChild : m.lastChild], s && x) { c = m[v] || (m[v] = {}), l = c[e] || [], h = l[0] === w && l[1], f = l[0] === w && l[2], p = h && m.childNodes[h]; while (p = ++h && p && p[g] || (f = h = 0) || d.pop()) if (1 === p.nodeType && ++f && p === t) { c[e] = [w, h, f]; break } } else if (x && (l = (t[v] || (t[v] = {}))[e]) && l[0] === w) f = l[1]; else while (p = ++h && p && p[g] || (f = h = 0) || d.pop()) if ((a ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) && ++f && (x && ((p[v] || (p[v] = {}))[e] = [w, f]), p === t)) break; return f -= i, f === r || 0 === f % r && f / r >= 0 } } }, PSEUDO: function (e, t) { var n, r = i.pseudos[e] || i.setFilters[e.toLowerCase()] || ot.error("unsupported pseudo: " + e); return r[v] ? r(t) : r.length > 1 ? (n = [e, e, "", t], i.setFilters.hasOwnProperty(e.toLowerCase()) ? at(function (e, n) { var i, o = r(e, t), s = o.length; while (s--) i = P.call(e, o[s]), e[i] = !(n[i] = o[s]) }) : function (e) { return r(e, 0, n) }) : r } }, pseudos: { not: at(function (e) { var t = [], n = [], r = a(e.replace(z, "$1")); return r[v] ? at(function (e, t, n, i) { var o, s = r(e, null, i, []), a = e.length; while (a--) (o = s[a]) && (e[a] = !(t[a] = o)) }) : function (e, i, o) { return t[0] = e, r(t, null, o, n), !n.pop() } }), has: at(function (e) { return function (t) { return ot(e, t).length > 0 } }), contains: at(function (e) { return function (t) { return (t.textContent || t.innerText || o(t)).indexOf(e) > -1 } }), lang: at(function (e) { return G.test(e || "") || ot.error("unsupported lang: " + e), e = e.replace(nt, rt).toLowerCase(), function (t) { var n; do if (n = h ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang")) return n = n.toLowerCase(), n === e || 0 === n.indexOf(e + "-"); while ((t = t.parentNode) && 1 === t.nodeType); return !1 } }), target: function (t) { var n = e.location && e.location.hash; return n && n.slice(1) === t.id }, root: function (e) { return e === f }, focus: function (e) { return e === p.activeElement && (!p.hasFocus || p.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, enabled: function (e) { return e.disabled === !1 }, disabled: function (e) { return e.disabled === !0 }, checked: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && !!e.checked || "option" === t && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, e.selected === !0 }, empty: function (e) { for (e = e.firstChild; e; e = e.nextSibling) if (e.nodeName > "@" || 3 === e.nodeType || 4 === e.nodeType) return !1; return !0 }, parent: function (e) { return !i.pseudos.empty(e) }, header: function (e) { return et.test(e.nodeName) }, input: function (e) { return Z.test(e.nodeName) }, button: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && "button" === e.type || "button" === t }, text: function (e) { var t; return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || t.toLowerCase() === e.type) }, first: ht(function () { return [0] }), last: ht(function (e, t) { return [t - 1] }), eq: ht(function (e, t, n) { return [0 > n ? n + t : n] }), even: ht(function (e, t) { var n = 0; for (; t > n; n += 2) e.push(n); return e }), odd: ht(function (e, t) { var n = 1; for (; t > n; n += 2) e.push(n); return e }), lt: ht(function (e, t, n) { var r = 0 > n ? n + t : n; for (; --r >= 0;) e.push(r); return e }), gt: ht(function (e, t, n) { var r = 0 > n ? n + t : n; for (; t > ++r;) e.push(r); return e }) } }, i.pseudos.nth = i.pseudos.eq; for (t in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) i.pseudos[t] = pt(t); for (t in { submit: !0, reset: !0 }) i.pseudos[t] = ft(t); function dt() { } dt.prototype = i.filters = i.pseudos, i.setFilters = new dt; function gt(e, t) { var n, r, o, s, a, u, l, c = k[e + " "]; if (c) return t ? 0 : c.slice(0); a = e, u = [], l = i.preFilter; while (a) { (!n || (r = _.exec(a))) && (r && (a = a.slice(r[0].length) || a), u.push(o = [])), n = !1, (r = X.exec(a)) && (n = r.shift(), o.push({ value: n, type: r[0].replace(z, " ") }), a = a.slice(n.length)); for (s in i.filter) !(r = J[s].exec(a)) || l[s] && !(r = l[s](r)) || (n = r.shift(), o.push({ value: n, type: s, matches: r }), a = a.slice(n.length)); if (!n) break } return t ? a.length : a ? ot.error(e) : k(e, u).slice(0) } function mt(e) { var t = 0, n = e.length, r = ""; for (; n > t; t++) r += e[t].value; return r } function yt(e, t, n) { var i = t.dir, o = n && "parentNode" === i, s = T++; return t.first ? function (t, n, r) { while (t = t[i]) if (1 === t.nodeType || o) return e(t, n, r) } : function (t, n, a) { var u, l, c, p = w + " " + s; if (a) { while (t = t[i]) if ((1 === t.nodeType || o) && e(t, n, a)) return !0 } else while (t = t[i]) if (1 === t.nodeType || o) if (c = t[v] || (t[v] = {}), (l = c[i]) && l[0] === p) { if ((u = l[1]) === !0 || u === r) return u === !0 } else if (l = c[i] = [p], l[1] = e(t, n, a) || r, l[1] === !0) return !0 } } function vt(e) { return e.length > 1 ? function (t, n, r) { var i = e.length; while (i--) if (!e[i](t, n, r)) return !1; return !0 } : e[0] } function xt(e, t, n, r, i) { var o, s = [], a = 0, u = e.length, l = null != t; for (; u > a; a++) (o = e[a]) && (!n || n(o, r, i)) && (s.push(o), l && t.push(a)); return s } function bt(e, t, n, r, i, o) { return r && !r[v] && (r = bt(r)), i && !i[v] && (i = bt(i, o)), at(function (o, s, a, u) { var l, c, p, f = [], h = [], d = s.length, g = o || Ct(t || "*", a.nodeType ? [a] : a, []), m = !e || !o && t ? g : xt(g, f, e, a, u), y = n ? i || (o ? e : d || r) ? [] : s : m; if (n && n(m, y, a, u), r) { l = xt(y, h), r(l, [], a, u), c = l.length; while (c--) (p = l[c]) && (y[h[c]] = !(m[h[c]] = p)) } if (o) { if (i || e) { if (i) { l = [], c = y.length; while (c--) (p = y[c]) && l.push(m[c] = p); i(null, y = [], l, u) } c = y.length; while (c--) (p = y[c]) && (l = i ? P.call(o, p) : f[c]) > -1 && (o[l] = !(s[l] = p)) } } else y = xt(y === s ? y.splice(d, y.length) : y), i ? i(null, s, y, u) : O.apply(s, y) }) } function wt(e) { var t, n, r, o = e.length, s = i.relative[e[0].type], a = s || i.relative[" "], l = s ? 1 : 0, c = yt(function (e) { return e === t }, a, !0), p = yt(function (e) { return P.call(t, e) > -1 }, a, !0), f = [function (e, n, r) { return !s && (r || n !== u) || ((t = n).nodeType ? c(e, n, r) : p(e, n, r)) }]; for (; o > l; l++) if (n = i.relative[e[l].type]) f = [yt(vt(f), n)]; else { if (n = i.filter[e[l].type].apply(null, e[l].matches), n[v]) { for (r = ++l; o > r; r++) if (i.relative[e[r].type]) break; return bt(l > 1 && vt(f), l > 1 && mt(e.slice(0, l - 1).concat({ value: " " === e[l - 2].type ? "*" : "" })).replace(z, "$1"), n, r > l && wt(e.slice(l, r)), o > r && wt(e = e.slice(r)), o > r && mt(e)) } f.push(n) } return vt(f) } function Tt(e, t) { var n = 0, o = t.length > 0, s = e.length > 0, a = function (a, l, c, f, h) { var d, g, m, y = [], v = 0, x = "0", b = a && [], T = null != h, C = u, k = a || s && i.find.TAG("*", h && l.parentNode || l), N = w += null == C ? 1 : Math.random() || .1; for (T && (u = l !== p && l, r = n) ; null != (d = k[x]) ; x++) { if (s && d) { g = 0; while (m = e[g++]) if (m(d, l, c)) { f.push(d); break } T && (w = N, r = ++n) } o && ((d = !m && d) && v--, a && b.push(d)) } if (v += x, o && x !== v) { g = 0; while (m = t[g++]) m(b, y, l, c); if (a) { if (v > 0) while (x--) b[x] || y[x] || (y[x] = q.call(f)); y = xt(y) } O.apply(f, y), T && !a && y.length > 0 && v + t.length > 1 && ot.uniqueSort(f) } return T && (w = N, u = C), b }; return o ? at(a) : a } a = ot.compile = function (e, t) { var n, r = [], i = [], o = N[e + " "]; if (!o) { t || (t = gt(e)), n = t.length; while (n--) o = wt(t[n]), o[v] ? r.push(o) : i.push(o); o = N(e, Tt(i, r)) } return o }; function Ct(e, t, n) { var r = 0, i = t.length; for (; i > r; r++) ot(e, t[r], n); return n } function kt(e, t, r, o) { var s, u, l, c, p, f = gt(e); if (!o && 1 === f.length) { if (u = f[0] = f[0].slice(0), u.length > 2 && "ID" === (l = u[0]).type && n.getById && 9 === t.nodeType && h && i.relative[u[1].type]) { if (t = (i.find.ID(l.matches[0].replace(nt, rt), t) || [])[0], !t) return r; e = e.slice(u.shift().value.length) } s = J.needsContext.test(e) ? 0 : u.length; while (s--) { if (l = u[s], i.relative[c = l.type]) break; if ((p = i.find[c]) && (o = p(l.matches[0].replace(nt, rt), U.test(u[0].type) && t.parentNode || t))) { if (u.splice(s, 1), e = o.length && mt(u), !e) return O.apply(r, o), r; break } } } return a(e, f)(o, t, !h, r, U.test(e)), r } n.sortStable = v.split("").sort(S).join("") === v, n.detectDuplicates = E, c(), n.sortDetached = ut(function (e) { return 1 & e.compareDocumentPosition(p.createElement("div")) }), ut(function (e) { return e.innerHTML = "", "#" === e.firstChild.getAttribute("href") }) || lt("type|href|height|width", function (e, t, n) { return n ? undefined : e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) }), n.attributes && ut(function (e) { return e.innerHTML = "", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") }) || lt("value", function (e, t, n) { return n || "input" !== e.nodeName.toLowerCase() ? undefined : e.defaultValue }), ut(function (e) { return null == e.getAttribute("disabled") }) || lt(R, function (e, t, n) { var r; return n ? undefined : (r = e.getAttributeNode(t)) && r.specified ? r.value : e[t] === !0 ? t.toLowerCase() : null }), x.find = ot, x.expr = ot.selectors, x.expr[":"] = x.expr.pseudos, x.unique = ot.uniqueSort, x.text = ot.getText, x.isXMLDoc = ot.isXML, x.contains = ot.contains }(e); var D = {}; function A(e) { var t = D[e] = {}; return x.each(e.match(w) || [], function (e, n) { t[n] = !0 }), t } x.Callbacks = function (e) { e = "string" == typeof e ? D[e] || A(e) : x.extend({}, e); var t, n, r, i, o, s, a = [], u = !e.once && [], l = function (p) { for (t = e.memory && p, n = !0, s = i || 0, i = 0, o = a.length, r = !0; a && o > s; s++) if (a[s].apply(p[0], p[1]) === !1 && e.stopOnFalse) { t = !1; break } r = !1, a && (u ? u.length && l(u.shift()) : t ? a = [] : c.disable()) }, c = { add: function () { if (a) { var n = a.length; (function s(t) { x.each(t, function (t, n) { var r = x.type(n); "function" === r ? e.unique && c.has(n) || a.push(n) : n && n.length && "string" !== r && s(n) }) })(arguments), r ? o = a.length : t && (i = n, l(t)) } return this }, remove: function () { return a && x.each(arguments, function (e, t) { var n; while ((n = x.inArray(t, a, n)) > -1) a.splice(n, 1), r && (o >= n && o--, s >= n && s--) }), this }, has: function (e) { return e ? x.inArray(e, a) > -1 : !(!a || !a.length) }, empty: function () { return a = [], o = 0, this }, disable: function () { return a = u = t = undefined, this }, disabled: function () { return !a }, lock: function () { return u = undefined, t || c.disable(), this }, locked: function () { return !u }, fireWith: function (e, t) { return !a || n && !u || (t = t || [], t = [e, t.slice ? t.slice() : t], r ? u.push(t) : l(t)), this }, fire: function () { return c.fireWith(this, arguments), this }, fired: function () { return !!n } }; return c }, x.extend({ Deferred: function (e) { var t = [["resolve", "done", x.Callbacks("once memory"), "resolved"], ["reject", "fail", x.Callbacks("once memory"), "rejected"], ["notify", "progress", x.Callbacks("memory")]], n = "pending", r = { state: function () { return n }, always: function () { return i.done(arguments).fail(arguments), this }, then: function () { var e = arguments; return x.Deferred(function (n) { x.each(t, function (t, o) { var s = o[0], a = x.isFunction(e[t]) && e[t]; i[o[1]](function () { var e = a && a.apply(this, arguments); e && x.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[s + "With"](this === r ? n.promise() : this, a ? [e] : arguments) }) }), e = null }).promise() }, promise: function (e) { return null != e ? x.extend(e, r) : r } }, i = {}; return r.pipe = r.then, x.each(t, function (e, o) { var s = o[2], a = o[3]; r[o[1]] = s.add, a && s.add(function () { n = a }, t[1 ^ e][2].disable, t[2][2].lock), i[o[0]] = function () { return i[o[0] + "With"](this === i ? r : this, arguments), this }, i[o[0] + "With"] = s.fireWith }), r.promise(i), e && e.call(i, i), i }, when: function (e) { var t = 0, n = d.call(arguments), r = n.length, i = 1 !== r || e && x.isFunction(e.promise) ? r : 0, o = 1 === i ? e : x.Deferred(), s = function (e, t, n) { return function (r) { t[e] = this, n[e] = arguments.length > 1 ? d.call(arguments) : r, n === a ? o.notifyWith(t, n) : --i || o.resolveWith(t, n) } }, a, u, l; if (r > 1) for (a = Array(r), u = Array(r), l = Array(r) ; r > t; t++) n[t] && x.isFunction(n[t].promise) ? n[t].promise().done(s(t, l, n)).fail(o.reject).progress(s(t, u, a)) : --i; return i || o.resolveWith(l, n), o.promise() } }), x.support = function (t) { var n = o.createElement("input"), r = o.createDocumentFragment(), i = o.createElement("div"), s = o.createElement("select"), a = s.appendChild(o.createElement("option")); return n.type ? (n.type = "checkbox", t.checkOn = "" !== n.value, t.optSelected = a.selected, t.reliableMarginRight = !0, t.boxSizingReliable = !0, t.pixelPosition = !1, n.checked = !0, t.noCloneChecked = n.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !a.disabled, n = o.createElement("input"), n.value = "t", n.type = "radio", t.radioValue = "t" === n.value, n.setAttribute("checked", "t"), n.setAttribute("name", "t"), r.appendChild(n), t.checkClone = r.cloneNode(!0).cloneNode(!0).lastChild.checked, t.focusinBubbles = "onfocusin" in e, i.style.backgroundClip = "content-box", i.cloneNode(!0).style.backgroundClip = "", t.clearCloneStyle = "content-box" === i.style.backgroundClip, x(function () { var n, r, s = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box", a = o.getElementsByTagName("body")[0]; a && (n = o.createElement("div"), n.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", a.appendChild(n).appendChild(i), i.innerHTML = "", i.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%", x.swap(a, null != a.style.zoom ? { zoom: 1 } : {}, function () { t.boxSizing = 4 === i.offsetWidth }), e.getComputedStyle && (t.pixelPosition = "1%" !== (e.getComputedStyle(i, null) || {}).top, t.boxSizingReliable = "4px" === (e.getComputedStyle(i, null) || { width: "4px" }).width, r = i.appendChild(o.createElement("div")), r.style.cssText = i.style.cssText = s, r.style.marginRight = r.style.width = "0", i.style.width = "1px", t.reliableMarginRight = !parseFloat((e.getComputedStyle(r, null) || {}).marginRight)), a.removeChild(n)) }), t) : t }({}); var L, q, H = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, O = /([A-Z])/g; function F() { Object.defineProperty(this.cache = {}, 0, { get: function () { return {} } }), this.expando = x.expando + Math.random() } F.uid = 1, F.accepts = function (e) { return e.nodeType ? 1 === e.nodeType || 9 === e.nodeType : !0 }, F.prototype = { key: function (e) { if (!F.accepts(e)) return 0; var t = {}, n = e[this.expando]; if (!n) { n = F.uid++; try { t[this.expando] = { value: n }, Object.defineProperties(e, t) } catch (r) { t[this.expando] = n, x.extend(e, t) } } return this.cache[n] || (this.cache[n] = {}), n }, set: function (e, t, n) { var r, i = this.key(e), o = this.cache[i]; if ("string" == typeof t) o[t] = n; else if (x.isEmptyObject(o)) x.extend(this.cache[i], t); else for (r in t) o[r] = t[r]; return o }, get: function (e, t) { var n = this.cache[this.key(e)]; return t === undefined ? n : n[t] }, access: function (e, t, n) { var r; return t === undefined || t && "string" == typeof t && n === undefined ? (r = this.get(e, t), r !== undefined ? r : this.get(e, x.camelCase(t))) : (this.set(e, t, n), n !== undefined ? n : t) }, remove: function (e, t) { var n, r, i, o = this.key(e), s = this.cache[o]; if (t === undefined) this.cache[o] = {}; else { x.isArray(t) ? r = t.concat(t.map(x.camelCase)) : (i = x.camelCase(t), t in s ? r = [t, i] : (r = i, r = r in s ? [r] : r.match(w) || [])), n = r.length; while (n--) delete s[r[n]] } }, hasData: function (e) { return !x.isEmptyObject(this.cache[e[this.expando]] || {}) }, discard: function (e) { e[this.expando] && delete this.cache[e[this.expando]] } }, L = new F, q = new F, x.extend({ acceptData: F.accepts, hasData: function (e) { return L.hasData(e) || q.hasData(e) }, data: function (e, t, n) { return L.access(e, t, n) }, removeData: function (e, t) { L.remove(e, t) }, _data: function (e, t, n) { return q.access(e, t, n) }, _removeData: function (e, t) { q.remove(e, t) } }), x.fn.extend({ data: function (e, t) { var n, r, i = this[0], o = 0, s = null; if (e === undefined) { if (this.length && (s = L.get(i), 1 === i.nodeType && !q.get(i, "hasDataAttrs"))) { for (n = i.attributes; n.length > o; o++) r = n[o].name, 0 === r.indexOf("data-") && (r = x.camelCase(r.slice(5)), P(i, r, s[r])); q.set(i, "hasDataAttrs", !0) } return s } return "object" == typeof e ? this.each(function () { L.set(this, e) }) : x.access(this, function (t) { var n, r = x.camelCase(e); if (i && t === undefined) { if (n = L.get(i, e), n !== undefined) return n; if (n = L.get(i, r), n !== undefined) return n; if (n = P(i, r, undefined), n !== undefined) return n } else this.each(function () { var n = L.get(this, r); L.set(this, r, t), -1 !== e.indexOf("-") && n !== undefined && L.set(this, e, t) }) }, null, t, arguments.length > 1, null, !0) }, removeData: function (e) { return this.each(function () { L.remove(this, e) }) } }); function P(e, t, n) { var r; if (n === undefined && 1 === e.nodeType) if (r = "data-" + t.replace(O, "-$1").toLowerCase(), n = e.getAttribute(r), "string" == typeof n) { try { n = "true" === n ? !0 : "false" === n ? !1 : "null" === n ? null : +n + "" === n ? +n : H.test(n) ? JSON.parse(n) : n } catch (i) { } L.set(e, t, n) } else n = undefined; return n } x.extend({
diff --git a/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js b/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js
index e75d75494e..f3f58c7446 100644
--- a/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js
+++ b/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js
@@ -1,6 +1,19 @@
-
+
//TODO: WE NEED TO CONVERT ALL OF THESE METHODS TO PROXY TO OUR APPLICATION SINCE MANY CUSTOM APPS USE THIS!
+//TEST to mock iframe, this intercepts calls directly
+//to the old iframe, and funnels requests to angular directly
+var right = {document: {location: {}}};
+Object.defineProperty(right.document.location, "href", {
+ get: function() {
+ return this._href ? this._href : "";
+ },
+ set: function(value) {
+ this._href = value;
+ UmbClientMgr.contentFrame(value);
+ },
+});
+
Umbraco.Sys.registerNamespace("Umbraco.Application");
(function($) {
@@ -130,13 +143,13 @@ Umbraco.Sys.registerNamespace("Umbraco.Application");
contentFrame: function (strLocation) {
if (!strLocation || strLocation == "") {
- //SD: NOTE: We used to return the content iframe object but now I'm not sure we should do that ?!
-
- if (typeof top.right != "undefined") {
- return top.right;
- }
- else {
- return top; //return the current window if the content frame doesn't exist in the current context
+ //SD: NOTE: We used to return the content iframe object but now I'm not sure we should do that ?!
+
+ if (typeof top.right != "undefined") {
+ return top.right;
+ }
+ else {
+ return top; //return the current window if the content frame doesn't exist in the current context
}
//return;
}
@@ -165,31 +178,31 @@ Umbraco.Sys.registerNamespace("Umbraco.Application");
//get our angular navigation service
var injector = getRootInjector();
- var dialogService = injector.get("dialogService");
-
+ var dialogService = injector.get("dialogService");
+
var self = this;
//TODO: need to get the closeTriggers working for compatibility too somehow.
- var dialog = dialogService.open({
+ var dialog = dialogService.open({
template: url,
width: width,
height: height,
iframe: true,
show: true,
- callback: function (result) {
-
- if (typeof onCloseCallback == "function") {
- onCloseCallback.apply(self, [result]);
- }
-
- dialog.hide();
- }
- });
-
- this._modal.push(dialog);
-
- return dialog;
+ callback: function (result) {
+
+ if (typeof onCloseCallback == "function") {
+ onCloseCallback.apply(self, [result]);
+ }
+
+ dialog.hide();
+ }
+ });
+
+ this._modal.push(dialog);
+
+ return dialog;
},
closeModalWindow: function(rVal) {
@@ -199,11 +212,11 @@ Umbraco.Sys.registerNamespace("Umbraco.Application");
// all legacy calls to closeModalWindow are expecting to just close the last opened one so we'll ensure
// that this is still the case.
- if (this._modal != null && this._modal.length > 0) {
- dialogService.close(this._modal.pop(), { outVal: rVal });
- }
- else {
- dialogService.closeAll(rVal);
+ if (this._modal != null && this._modal.length > 0) {
+ dialogService.close(this._modal.pop(), { outVal: rVal });
+ }
+ else {
+ dialogService.closeAll(rVal);
}
},
_debug: function(strMsg) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/sectionicon.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/sectionicon.directive.js
index bb9939ae17..7f8ea83215 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/sectionicon.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/sectionicon.directive.js
@@ -1,9 +1,9 @@
-angular.module("umbraco.directives")
+angular.module("umbraco.directives")
.directive('sectionIcon', function ($compile, iconHelper) {
return {
- restrict: 'E',
- replace: true,
-
+ restrict: 'E',
+ replace: true,
+
link: function (scope, element, attrs) {
var icon = attrs.icon;
@@ -13,13 +13,18 @@
element.html("");
}
else if (iconHelper.isFileBasedIcon(icon)) {
+ var convert = iconHelper.convertFromLegacyImage(icon);
+ if(convert){
+ element.html("");
+ }else{
+ element.html("");
+ }
//it's a file, normally legacy so look in the icon tray images
- element.html("");
}
else {
//it's normal
- element.html("");
- }
+ element.html("");
+ }
}
};
});
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/umbheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/umbheader.directive.js
index de10465b81..032ef08ab1 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/umbheader.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/umbheader.directive.js
@@ -12,9 +12,40 @@ angular.module("umbraco.directives")
},
link: function (scope, iElement, iAttrs) {
+ function collectFromDom(activeTab){
+ var $panes = $('div.tab-content');
+ $panes.find('.tab-pane').each(function (index) {
+ var $this = angular.element(this);
+ var id = $this.attr("rel");
+ var label = $this.attr("label");
+ var tab = {id: id, label: label, active: false};
+ if(!activeTab){
+ tab.active = true;
+ activeTab = tab;
+ }
+
+ if ($this.attr("rel") === String(activeTab.id)) {
+ $this.addClass('active');
+ }
+ else {
+ $this.removeClass('active');
+ }
+
+ //this is sorta hacky since we add a tab object to the tabs collection
+ //based on a dom element, there is most likely a better way...
+ if (label) {
+ scope.collectedTabs.push(tab);
+ }
+ });
+ }
+
scope.showTabs = iAttrs.tabs ? true : false;
scope.collectedTabs = [];
+ $timeout(function () {
+ collectFromDom(undefined);
+ }, 500);
+
//when the tabs change, we need to hack the planet a bit and force the first tab content to be active,
//unfortunately twitter bootstrap tabs is not playing perfectly with angular.
scope.$watch("tabs", function (newValue, oldValue) {
@@ -32,33 +63,17 @@ angular.module("umbraco.directives")
//set the flag
//hasProcessed = true;
- var $panes = $('div.tab-content');
+
var activeTab = _.find(newValue, function (item) {
return item.active;
});
+
//we need to do a timeout here so that the current sync operation can complete
// and update the UI, then this will fire and the UI elements will be available.
$timeout(function () {
- $panes.find('.tab-pane').each(function (index) {
- var $this = angular.element(this);
- var id = $this.attr("rel");
- var label = $this.attr("data-label");
-
- if ($this.attr("rel") === String(activeTab.id)) {
- $this.addClass('active');
- }
- else {
- $this.removeClass('active');
- }
-
- //this is sorta hacky since we add a tab object to the tabs collection
- //based on a dom element, there is most likely a better way...
- if (label) {
- scope.collectedTabs.push({id: id, label: label});
- }
- });
- });
+ collectFromDom(activeTab);
+ }, 500);
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
index 5e6d5c2ea4..b6ef1edd25 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
@@ -21,7 +21,10 @@ angular.module('umbraco.services')
//TODO: would be nicer to set all of the options here first instead of implicitly below!
var ui = {};
-
+ $rootScope.$on("closeDialogs", function(){
+
+ });
+
function setMode(mode) {
switch (mode) {
case 'tree':
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js
index b311fb214c..321eb141b6 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js
@@ -332,9 +332,14 @@ function iconHelper() {
{ oldIcon: ".sprTreeDeveloperCacheTypes", newIcon: "icon-box" },
{ oldIcon: ".sprTreeDeveloperMacro", newIcon: "icon-cogs" },
{ oldIcon: ".sprTreeDeveloperRegistry", newIcon: "icon-windows" },
- { oldIcon: ".sprTreeDeveloperPython", newIcon: "icon-linux" }
+ { oldIcon: ".sprTreeDeveloperPython", newIcon: "icon-linux" },
+ { oldIcon: "images/tray/contour.png", newIcon: "icon-umb-contour" }
];
+ var imageConverter = [
+ {oldImage: "contour.png", newIcon: "icon-umb-contour"}
+ ];
+
return {
/** Used by the create dialogs for content/media types to format the data so that the thumbnails are styled properly */
@@ -415,6 +420,14 @@ function iconHelper() {
}
return icon;
},
+
+ convertFromLegacyImage: function (icon) {
+ var found = _.find(imageConverter, function (item) {
+ return item.oldImage.toLowerCase() === icon.toLowerCase();
+ });
+ return (found ? found.newIcon : undefined);
+ },
+
/** If we detect that the tree node has legacy icons that can be converted, this will convert them */
convertFromLegacyTreeNodeIcon: function (treeNode) {
if (this.isLegacyTreeNodeIcon(treeNode)) {
diff --git a/src/Umbraco.Web.UI.Client/src/less/dragdrop.less b/src/Umbraco.Web.UI.Client/src/less/dragdrop.less
new file mode 100644
index 0000000000..afae4d4da3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/less/dragdrop.less
@@ -0,0 +1,36 @@
+body.dragging, body.dragging * {
+ cursor: move !important;
+}
+
+.dragged {
+ position: absolute;
+ opacity: 0.5;
+ z-index: 2000;
+}
+
+.umb-sort li{
+ display: block;
+ margin: 5px;
+ padding: 5px;
+ border: 1px solid #CCC;
+ background: @grayLighter;
+}
+
+.umb-sort li.placeholder {
+ position: relative;
+ margin: 0;
+ padding: 0;
+ border: none;
+}
+.umb-sort li.placeholder:before {
+ position: absolute;
+ content: "";
+ width: 0;
+ height: 0;
+ margin-top: -5px;
+ left: -5px;
+ top: -4px;
+ border: 5px solid transparent;
+ border-left-color: red;
+ border-right: none;
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/less/helveticons.less b/src/Umbraco.Web.UI.Client/src/less/helveticons.less
index f3132a0668..156eaba482 100644
--- a/src/Umbraco.Web.UI.Client/src/less/helveticons.less
+++ b/src/Umbraco.Web.UI.Client/src/less/helveticons.less
@@ -2,7 +2,6 @@
font-family: 'icomoon';
src:url('../fonts/helveticons/helveticons.eot');
src:url('../fonts/helveticons/helveticons.eot?#iefix') format('embedded-opentype'),
- url('../fonts/helveticons/helveticons.woff') format('woff'),
url('../fonts/helveticons/helveticons.ttf') format('truetype'),
url('../fonts/helveticons/helveticons.svg#icomoon') format('svg');
font-weight: normal;
@@ -94,9 +93,6 @@ i.small:before{
.icon-wall-plug:before {
content: "\e014";
}
-.icon-umb-members:before {
- content: "\e015";
-}
.icon-voice:before {
content: "\e016";
}
@@ -151,24 +147,28 @@ i.small:before{
.icon-umb-deploy:before {
content: "\e027";
}
-.icon-umb-contour:before {
+.icon-umb-contour:before, .traycontent:before, {
content: "\e028";
}
-.icon-umb-settings:before {
+.icon-umb-settings:before, .traysettings:before, {
content: "\e029";
}
-.icon-umb-users:before {
+.icon-umb-users:before, .trayusers:before, {
content: "\e02a";
}
-.icon-umb-media:before {
+.icon-umb-media:before, .traymedia:before, {
content: "\e02b";
}
-.icon-umb-content:before {
+.icon-umb-content:before, .traycontent:before{
content: "\e02c";
}
-.icon-umb-developer:before {
+.icon-umb-developer:before, .traydeveloper:before, {
content: "\e02d";
}
+.icon-umb-members:before, .traymember:before {
+ content: "\e015";
+}
+
.icon-tv:before {
content: "\e02e";
}
diff --git a/src/Umbraco.Web.UI.Client/src/less/sections.less b/src/Umbraco.Web.UI.Client/src/less/sections.less
index d830cdd892..d2be07b7c3 100644
--- a/src/Umbraco.Web.UI.Client/src/less/sections.less
+++ b/src/Umbraco.Web.UI.Client/src/less/sections.less
@@ -11,13 +11,10 @@ ul.sections {
ul.sections li {
border-bottom: 1px solid @grayDark;
display: block;
- padding: 0px;
- height: 56px;
- padding: 23px 0 0 0
}
ul.sections li [class^="icon-"]:before, ul.sections li [class*=" icon-"]:before{
- font-size: 32px;
+ font-size: 24px;
}
ul.sections li a {
@@ -25,24 +22,24 @@ ul.sections li a {
text-decoration: none;
font-size: 10px;
text-align: center;
- color: @grayLight;
- -webkit-transition: color .2s linear;
- -moz-transition: color .2s linear;
- transition: color .2s linear;
+ color: @gray;
+ -webkit-transition: color .5s linear;
+ -moz-transition: color .5s linear;
+ transition: color .5s linear;
+
+ padding-top: 15px;
+ padding-bottom: 15px;
}
ul.sections a span {
display: block;
- visibility: hidden;
font-size: 10px;
line-height: 1em;
- -webkit-transition: color .2s linear;
- -moz-transition: color .2s linear;
- transition: color .2s linear;
}
-ul.sections:hover li a span {
- visibility: visible;
+
+ul.sections:hover li a {
+ color: @grayLight;
}
@@ -57,6 +54,7 @@ ul.sections li.avatar {
ul.sections li.avatar a {
margin: 0 auto;
+ padding: 0;
width: 40px;
height: 40px;
}
@@ -71,38 +69,20 @@ ul.sections li.avatar a img {
ul.sections li i {
display: inline-block;
- background-repeat: no-repeat;
- background-position: 0 0;
- width: 30px;
- height: 30px
+}
+
+ul.sections li a {
+ display: inline-block;
+ padding-left: 4px;
+ padding-right: 4px;
}
ul.sections li.current {
border-left: 4px @orange solid;
}
-ul.sections li i.traycontent {
- background-image: url(../img/applicationIcons/Umbraco_icons-02.svg);
-}
-
-ul.sections li i.traymedia {
- background-image: url(../img/applicationIcons/Umbraco_icons-03.svg);
-}
-
-ul.sections li i.traysettings {
- background-image: url(../img/applicationIcons/Umbraco_icons-05.svg);
-}
-
-ul.sections li i.traydeveloper {
- background-image: url(../img/applicationIcons/Umbraco_icons-01.svg);
-}
-
-ul.sections li i.trayusers {
- background-image: url(../img/applicationIcons/Umbraco_icons-04.svg);
-}
-
-ul.sections li i.traymember {
- background-image: url(../img/applicationIcons/Umbraco_icons-05.svg);
+ul.sections li.current a{
+ padding-left: 0px;
}
ul.sections li.help {
@@ -115,9 +95,3 @@ ul.sections li.help {
display: block;
width: 100%;
}
-
-ul.sections li.help a span {
-
- visibility: hidden;// remove when helvicons is ready
-}
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js
index 16f86f7eb5..66890f5b6e 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js
@@ -36,9 +36,11 @@ function MainController($scope, $routeParams, $rootScope, $timeout, $http, $log,
//only close dialogs if non-lin and non-buttons are clicked
var el = event.target.nodeName;
var pEl = event.target.parentElement.nodeName;
+ var close = $(event.target).closest("#navigation");
+ var parents = $(event.target).parents("#navigation");
//SD: I've updated this so that we don't close the dialog when clicking inside of the dialog
- if ($(event.target).closest("#navigation").length === 1) {
+ if (parents.length === 1) {
return;
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/navigation.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/navigation.controller.js
index aa6d58911b..4ab8df9059 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/navigation.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/navigation.controller.js
@@ -38,7 +38,7 @@ function NavigationController($scope,$rootScope, $location, $log, $routeParams,
//This reacts to clicks passed to the body element which emits a global call to close all dialogs
$rootScope.$on("closeDialogs", function (event) {
- if (navigationService.ui.stickyNavigation && (!event.target || $(event.target).parents(".umb-modalcolumn").size() == 0)) {
+ if (navigationService.ui.stickyNavigation) {
navigationService.hideNavigation();
angularHelper.safeApply($scope);
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/umb-navigation.html b/src/Umbraco.Web.UI.Client/src/views/directives/umb-navigation.html
index 0df1f53233..d4e4862ed7 100644
--- a/src/Umbraco.Web.UI.Client/src/views/directives/umb-navigation.html
+++ b/src/Umbraco.Web.UI.Client/src/views/directives/umb-navigation.html
@@ -21,7 +21,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/web.config b/src/Umbraco.Web.UI.Client/src/web.config
new file mode 100644
index 0000000000..6903c39608
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/web.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/tray/contour.png b/src/Umbraco.Web.UI/Umbraco/Images/tray/contour.png
new file mode 100644
index 0000000000..7a1b3e01dc
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/tray/contour.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_archive.png b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_archive.png
new file mode 100644
index 0000000000..8443c23eb9
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_archive.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_datasource.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_datasource.gif
new file mode 100644
index 0000000000..eff4528415
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_datasource.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_entries.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_entries.gif
new file mode 100644
index 0000000000..dcf36d972e
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_entries.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_exportform.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_exportform.gif
new file mode 100644
index 0000000000..385e077d65
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_exportform.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_folder.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_folder.gif
new file mode 100644
index 0000000000..4d4fdc8e92
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_folder.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_form.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_form.gif
new file mode 100644
index 0000000000..2b49b1eb22
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_form.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_importform.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_importform.gif
new file mode 100644
index 0000000000..ac86897f75
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_importform.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_prevaluesource.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_prevaluesource.gif
new file mode 100644
index 0000000000..d40f332f55
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_prevaluesource.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_workflow.gif b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_workflow.gif
new file mode 100644
index 0000000000..befcf396d3
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/Images/umbraco/icon_workflow.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/js/web.config b/src/Umbraco.Web.UI/Umbraco/js/web.config
new file mode 100644
index 0000000000..6903c39608
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/js/web.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Analyzer.aspx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Analyzer.aspx
new file mode 100644
index 0000000000..a9991908a6
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Analyzer.aspx
@@ -0,0 +1,19 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Analyzer.aspx.cs" Inherits="Umbraco.Forms.UI.Pages.Analyzer" %>
+
+
+
+
+
+ Untitled Page
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Designer.asmx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Designer.asmx
new file mode 100644
index 0000000000..f6d3f8a1a6
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Designer.asmx
@@ -0,0 +1 @@
+<%@ WebService Language="C#" CodeBehind="Designer.asmx.cs" Class="UmbracoContour.Webservices.Designer" %>
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/EntriesDashboard.ascx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/EntriesDashboard.ascx
new file mode 100644
index 0000000000..4353ff76c6
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/EntriesDashboard.ascx
@@ -0,0 +1,6 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="EntriesDashboard.ascx.cs" Inherits="Umbraco.Forms.UI.Dashboard.EntriesDashboard" %>
+<%@ Register Namespace="umbraco.uicontrols" Assembly="controls" TagPrefix="umb" %>
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/ExportFormEntries.aspx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/ExportFormEntries.aspx
new file mode 100644
index 0000000000..64b6408508
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/ExportFormEntries.aspx
@@ -0,0 +1,42 @@
+<%@ Page MasterPageFile="../../masterpages/umbracoPage.Master" Language="C#" AutoEventWireup="true" CodeBehind="ExportFormEntries.aspx.cs" Inherits="Umbraco.Forms.UI.Pages.ExportFormEntries" %>
+<%@ Register Namespace="umbraco.uicontrols" Assembly="controls" TagPrefix="umb" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FeedProxy.aspx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FeedProxy.aspx
new file mode 100644
index 0000000000..c57ff9877c
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FeedProxy.aspx
@@ -0,0 +1,2 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FeedProxy.aspx.cs" Inherits="Umbraco.Forms.UI.Pages.FeedProxy" %>
+<%@ OutputCache Duration="1800" VaryByParam="url" %>
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FileProxy.aspx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FileProxy.aspx
new file mode 100644
index 0000000000..755ddc246b
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FileProxy.aspx
@@ -0,0 +1 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileProxy.aspx.cs" Inherits="Umbraco.Forms.UI.Pages.FileProxy" %>
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Forms.asmx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Forms.asmx
new file mode 100644
index 0000000000..31c6ab1299
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Forms.asmx
@@ -0,0 +1 @@
+<%@ WebService Language="C#" CodeBehind="Forms.asmx.cs" Class="UmbracoContour.Webservices.Forms" %>
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FormsDashboard.ascx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FormsDashboard.ascx
new file mode 100644
index 0000000000..be81c0106d
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/FormsDashboard.ascx
@@ -0,0 +1,271 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FormsDashboard.ascx.cs"
+ Inherits="Umbraco.Forms.UI.Dashboard.FormsDashboard" %>
+<%@ Register Namespace="umbraco.uicontrols" Assembly="controls" TagPrefix="umb" %>
+
+
+
+
+
+
+
+
+
+
+
Thank you for trying out Umbraco Contour!
+
To purchase Umbraco Contour, simply go to the
+ Umbraco online shop and you're up and running in minutes!
+
+
If you've already purchased Umbraco Contour, you can install your license
+ automatically by using your umbraco.org profile credentials below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Following licenses was found via your profile on umbraco.org:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Please choose the domain that should be used for this license (without www - for instance 'mysite.com')
+
Any subdomain will work with this license, ie. 'www.mysite.com', 'dev.mysite.com', 'staging.mysite.com'. In addition 'localhost' will always work.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thank you for trying out Umbraco Contour
+
+
+ This version of Umbraco Contour is beta software, that means we
+ are not 100% done polishing the edges and some areas might be in need of some extra
+ care
+
+
+ Should you encounter any bugs or issues with using Umbraco Contour, please submit
+ a bug report to us, so we can fix it as fast as possible.
+
+ Want to master Umbraco Contour ? Spend a couple of minutes learning som new tricks
+ by watching one of the many videos about using this product. And visit umbraco.tv for even more umbraco videos
Upgrade Contour from 1.x to 3.x successful/h1>
+
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Comment form.ucf b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Comment form.ucf
new file mode 100644
index 0000000000..aec5cc04ce
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Comment form.ucf
@@ -0,0 +1,141 @@
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Contact form.ucf b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Contact form.ucf
new file mode 100644
index 0000000000..2c2de40a66
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Contact form.ucf
@@ -0,0 +1,115 @@
+
+
+ Contact
+ 2012-11-19T12:26:50.927
+ NoIndicator
+
+ false
+ false
+ {0} is mandatory
+ {0} is not valid
+ Thank you
+ 0
+ false
+ false
+ true
+ false
+
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Forms/Readme.txt b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Forms/Readme.txt
new file mode 100644
index 0000000000..31a78ba6e5
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Forms/Readme.txt
@@ -0,0 +1,27 @@
+Custom markup for your Contour forms
+----------------------------
+It's possible to update the default view for the Contour form and fieldtypes,
+making it possible to have complete control over your form markup.
+You can do this for al your forms or for a single form.
+
+To do this for all your forms simply update the default views:
+~\umbraco\plugins\umbracoContour\Views\Form.cshtml (view for the form, including page name, fieldset, legend, field container)
+~\umbraco\plugins\umbracoContour\Views\FieldType.*.cshtml (view for a specific field type like textfield, datepicker, ...)
+
+If you want to do this for a specific form you'll need to create the following folder:
+~\umbraco\plugins\umbracoContour\Views\Forms\{FormId}\ (FormId needs to be an existing form id, you can view the id of the form on the settings tab of the form designer)
+
+As an example if your form id is 85514c04-e188-43d0-9246-98b34069750c then you can overwrite the form view by adding the Form.cshtml file to the directory
+First copying the default one and then making your changes is the best way to get started
+~\umbraco\plugins\umbracoContour\Views\Forms\85514c04-e188-43d0-9246-98b34069750c/Form.cshtml
+
+You can also overwrite views for 1 or more fieldtypes by adding the views to the folder (again if you first copy the default one and then make your changes...)
+~\umbraco\plugins\umbracoContour\Views\Forms\85514c04-e188-43d0-9246-98b34069750c\Fieldtype.Textfield.cshtml
+
+A final option is to overwrite the view for a specific field on a form (if you want to target a specific field but not all fields of this type)
+~\umbraco\plugins\umbracoContour\Views\Forms\85514c04-e188-43d0-9246-98b34069750c\FieldNameWithoutSpaces.cshtml
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Script.cshtml b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Script.cshtml
new file mode 100644
index 0000000000..0186f76e68
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Script.cshtml
@@ -0,0 +1,167 @@
+@inherits WebViewPage
+@using Umbraco.Forms.Core
+@using Umbraco.Forms.Mvc.Models
+@using Umbraco.Forms.Mvc.BusinessLogic
+@using Umbraco.Forms.MVC.Extensions
+@using Umbraco.Forms.Core.Extensions
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Web.config b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Web.config
new file mode 100644
index 0000000000..a4def2a3db
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/Web.config
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/_ViewStart.cshtml b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/_ViewStart.cshtml
new file mode 100644
index 0000000000..efda124b1f
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Views/_ViewStart.cshtml
@@ -0,0 +1,3 @@
+@{
+ Layout = "~/Views/Shared/_Layout.cshtml";
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Workflows.asmx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Workflows.asmx
new file mode 100644
index 0000000000..cc1852d204
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/Workflows.asmx
@@ -0,0 +1 @@
+<%@ WebService Language="C#" CodeBehind="Workflows.asmx.cs" Class="UmbracoContour.Webservices.Workflows" %>
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/archiveForm.aspx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/archiveForm.aspx
new file mode 100644
index 0000000000..512113d027
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/archiveForm.aspx
@@ -0,0 +1,43 @@
+<%@ Page MasterPageFile="../../masterpages/umbracoDialog.Master" Language="C#" AutoEventWireup="true" CodeBehind="archiveForm.aspx.cs" Inherits="Umbraco.Forms.UI.Dialogs.archiveForm" %>
+
+
+
+
+
+
+
+
+
+
+
+
+ <% if (Request["unarchive"] == null)
+ { %>
+ Archiving your form will remove the form from various lists (form picker, ...) and will place the designer in read only mode.
+ <%}
+ else
+ { %>
+ Unarchiving your form will make it possible to edit the form again and the form will also appear in various list (form picker, ...) again.
+ <% } %>
+
+
The form ''
+ <% if (Request["unarchive"] == null)
+ { %>
+ has been archived.
+ <%}
+ else
+ { %>
+ has been unarchived.
+ <% } %>
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/createForm.ascx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/createForm.ascx
new file mode 100644
index 0000000000..4b4390f2e9
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/createForm.ascx
@@ -0,0 +1,25 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="createForm.ascx.cs" Inherits="Umbraco.Forms.UI.Dialogs.createForm" %>
+
+
To create a new form, simply give it a name and click the Create button. By Choosing a template, some relevant fields are automaticly added to your form (they can be edited afterwards). How does this work (video)?
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/Calendar.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/Calendar.png
new file mode 100644
index 0000000000..69010b0d34
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/Calendar.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/back.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/back.png
new file mode 100644
index 0000000000..ae9897bfc2
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/back.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/down-arrow.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/down-arrow.gif
new file mode 100644
index 0000000000..c82334a756
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/down-arrow.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/drag.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/drag.png
new file mode 100644
index 0000000000..26afa629c1
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/drag.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/checkbox.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/checkbox.png
new file mode 100644
index 0000000000..8ae2067561
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/checkbox.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/checkboxlist.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/checkboxlist.png
new file mode 100644
index 0000000000..be1ea4a65d
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/checkboxlist.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/datepicker.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/datepicker.png
new file mode 100644
index 0000000000..813ad0e624
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/datepicker.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/dropdownlist.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/dropdownlist.png
new file mode 100644
index 0000000000..5f51147828
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/dropdownlist.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/hiddenfield.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/hiddenfield.png
new file mode 100644
index 0000000000..331b3d3636
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/hiddenfield.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/passwordfield.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/passwordfield.png
new file mode 100644
index 0000000000..b9720283d2
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/passwordfield.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/radiobuttonlist.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/radiobuttonlist.png
new file mode 100644
index 0000000000..c8b4ba32b0
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/radiobuttonlist.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/recaptcha-example.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/recaptcha-example.png
new file mode 100644
index 0000000000..e30aa4ae1d
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/recaptcha-example.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/recaptcha.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/recaptcha.png
new file mode 100644
index 0000000000..038ec62b50
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/recaptcha.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/textarea.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/textarea.png
new file mode 100644
index 0000000000..e667fa2d95
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/textarea.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/textfield.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/textfield.png
new file mode 100644
index 0000000000..d37e7304e2
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/textfield.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/upload.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/upload.png
new file mode 100644
index 0000000000..ebb96c3f00
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/fieldtypes/upload.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/forward.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/forward.png
new file mode 100644
index 0000000000..8c5ed917a0
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/forward.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_bug.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_bug.gif
new file mode 100644
index 0000000000..7b01acf57a
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_bug.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_export.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_export.gif
new file mode 100644
index 0000000000..c043505dab
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_export.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_field.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_field.gif
new file mode 100644
index 0000000000..47f0071b26
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_field.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_fieldset.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_fieldset.gif
new file mode 100644
index 0000000000..d62b9ef8dc
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_fieldset.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_page.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_page.gif
new file mode 100644
index 0000000000..51b6970223
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_page.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_preview.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_preview.gif
new file mode 100644
index 0000000000..8b23ca5fd2
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_preview.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_settings.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_settings.png
new file mode 100644
index 0000000000..5a3f894513
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_settings.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_workflow.gif b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_workflow.gif
new file mode 100644
index 0000000000..dd45704311
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/icon_workflow.gif differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/approve.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/approve.png
new file mode 100644
index 0000000000..78acbfe957
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/approve.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/copy.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/copy.png
new file mode 100644
index 0000000000..2907459b7e
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/copy.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/copy_hover.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/copy_hover.png
new file mode 100644
index 0000000000..34db1f81bd
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/copy_hover.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/csv.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/csv.png
new file mode 100644
index 0000000000..43df1559f7
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/csv.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/csv_hover.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/csv_hover.png
new file mode 100644
index 0000000000..10b34d3b90
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/csv_hover.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/delete.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/delete.png
new file mode 100644
index 0000000000..2904b00e45
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/delete.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/edit.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/edit.png
new file mode 100644
index 0000000000..9e2d357b25
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/edit.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/email.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/email.png
new file mode 100644
index 0000000000..e588e2fb2d
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/email.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/print.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/print.png
new file mode 100644
index 0000000000..2db08242a0
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/print.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/print_hover.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/print_hover.png
new file mode 100644
index 0000000000..9808a9cc9c
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/print_hover.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/xls.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/xls.png
new file mode 100644
index 0000000000..5aaf40d0e3
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/xls.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/xls_hover.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/xls_hover.png
new file mode 100644
index 0000000000..5b1930afd8
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/recordviewericons/xls_hover.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_asc.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_asc.png
new file mode 100644
index 0000000000..457c68959b
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_asc.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_both.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_both.png
new file mode 100644
index 0000000000..533b120f38
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_both.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_dsc.png b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_dsc.png
new file mode 100644
index 0000000000..247e69d7e1
Binary files /dev/null and b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/images/sort_dsc.png differ
diff --git a/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/importForm.aspx b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/importForm.aspx
new file mode 100644
index 0000000000..e6e6f1fd37
--- /dev/null
+++ b/src/Umbraco.Web.UI/Umbraco/plugins/umbracoContour/importForm.aspx
@@ -0,0 +1,50 @@
+<%@ Page MasterPageFile="../../masterpages/umbracoDialog.Master" Language="C#" AutoEventWireup="true" CodeBehind="importForm.aspx.cs" Inherits="Umbraco.Forms.UI.Dialogs.importForm" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To import a Contour form, find the ".ucf" file on your computer by clicking the "Browse" button and click "Import" (you'll be asked for confirmation on the next screen)
+
+