PageSourceSearch

https://igradeplus.com/js/oorian.min.js?1790834799676

js igradeplus.com collected 2026-10-03 22:27:37 UTC 226,669 bytes, 4,936 lines download raw bytes

vendor: 4,491 bytes, lines 1-2
1/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
2!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*ne
vendor: 3,069 bytes, line 2
2w Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}
vendor: 9,959 bytes, line 2
2function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)}
vendor: 79,644 bytes, lines 2-5
2,input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
3}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
4marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
5padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
6
7/**********************************************************************************************************************
8 *  Copyright (c) 2020
9 *  Corvus Engineering, LLC
10 *  All Rights Reserved
11 *
12 *  This file is the intellectual property of:
13 *   Corvus Engineering, LLC
14 *   4206 Buckskin Lake Dr.
15 *   Ellicott City, Maryland 21042
16 *
17 *   [email protected]
18 *   www.corvusengineering.com
19 *
20 *  Use is subject to licensing agreement.
21 *
22 **********************************************************************************************************************/
23var oorian = oorian || {};
24
25oorian.dom = {};
26
27oorian.dom.getScreenSize = function ()
28{
29    let size = new Object();
30    size.width = screen.width;
31    size.height = screen.height;
32    return size;
33};
34
35oorian.dom.getWindowSize = function ()
36{
37    let size = new Object();
38    
39    if (window.innerWidth === undefined)
40    {
41        size.width = window.clientWidth;
42        size.height = window.clientHeight;
43    }
44    else
45    {
46        size.width = window.innerWidth;
47        size.height = window.innerHeight;
48    }
49    
50    return size;
51};
52
53oorian.dom.getDocumentSize = function ()
54{
55    let size = new Object();
56    
57    size.width = Math.max(
58        document.documentElement["clientWidth"],
59        document.body["scrollWidth"],
60        document.documentElement["scrollWidth"],
61        document.body["offsetWidth"],
62        document.documentElement["offsetWidth"]);    
63        
64    size.height = Math.max(
65        document.documentElement["clientHeight"],
66        document.body["scrollHeight"],
67        document.documentElement["scrollHeight"],
68        document.body["offsetHeight"],
69        document.documentElement["offsetHeight"]);    
70        
71    return size;
72};
73
74oorian.dom.getDeviceOrientation = function ()
75{
76    let orientation = "landscape";
77    
78    if (oorian.dom.getWindowWidth() > oorian.dom.getWindowHeight()) 
79    {
80       orientation = "portrait";
81    }
82    
83    return orientation;
84};
85
86oorian.dom.getAbsPosition = function(element)
87{
88    let rect = element.getBoundingClientRect();
89    let pos = new Object();
90    pos.x = rect.left;
91    pos.y = rect.top;
92    return pos;
93};
94
95oorian.dom.getRelPosition = function(element)
96{
97    let pos = new Object();
98    pos.x = element.offsetLeft;
99    pos.y = element.offsetTop;
100    return pos;
101};
102
103oorian.dom.getSize = function(element)
104{
105    let size = new Object();
106    size.width = element.offsetWidth;
107    size.height = element.offsetHeight;
108    return size;
109};
110
111oorian.dom.getComponents = function()
112{
113    return document.querySelectorAll("*[data-component]");
114};
115
116oorian.dom.getComponents = function(componentName)
117{
118    return document.querySelectorAll("*[data-component=" + componentName + "]");
119};
120
121oorian.dom.getComponentsFor = function(elementId)
122{
123    return document.querySelectorAll("#" + elementId + " *[data-component]");
124};
125
126oorian.dom.getComponentsFor = function(elementId, componentName)
127{
128    return document.querySelectorAll("#" + elementId + " *[data-component=" + componentName + "]");
129};
130
131oorian.dom.getChildren = function (parent, recursive)
132{
133    let results = new Array();
134    let children = parent.children;
135
136    for (let i=0; i<children.length; i++)
137    {
138        results.push(children[i]);
139        
140        if (recursive === true)
141        {
142            let grandChildren = getChildren(children[i], true);
143        
144            for (let j=0; j<grandChildren.length; j++)
145            {
146                results.push(grandChildren[j]);
147            }
148        }
149    }
150    
151    return results;
152};
153
154oorian.dom.getChildrenByTag = function (parent, tag, recursive)
155{
156    let results = new Array();
157    let children = parent.children;
158
159    for (let i=0; i<children.length; i++)
160    {
161        if (strcmp(children[i].tagName, tag) === 0)
162        {
163            results.push(children[i]);
164        }
165        
166        if (recursive === true)
167        {
168            let grandChildren = getChildren(children[i], true);
169        
170            for (let j=0; j<grandChildren.length; j++)
171            {
172                if (strcmp(grandChildren[j].tagName, tag) === 0)
173                {
174                    results.push(grandChildren[j]);
175                }
176            }
177        }
178    }
179    
180    return results;
181};
182
183oorian.dom.getChildrenByAttribute = function (parent, attr, recursive)
184{
185    let results = new Array();
186    let children = parent.children;
187
188    for (let i=0; i<children.length; i++)
189    {
190        if (children[i].getAttribute(attr) !== null)
191        {
192            results.push(children[i]);
193        }
194        
195        if (recursive === true)
196        {
197            let grandChildren = getChildren(children[i], true);
198        
199            for (let j=0; j<grandChildren.length; j++)
200            {
201                if (grandChildren[j].getAttribute(attr) !== null)
202                {
203                    results.push(grandChildren[j]);
204                }
205            }
206        }
207    }
208    
209    return results;
210};
211
212oorian.dom.getChildrenByAttributeValue = function (parent, attr, value, recursive)
213{
214    let results = new Array();
215    let children = parent.children;
216
217    for (let i=0; i<children.length; i++)
218    {
219        if (strcmp(children[i].getAttribute(attr), value) === 0)
220        {
221            results.push(children[i]);
222        }
223        
224        if (recursive === true)
225        {
226            let grandChildren = getChildren(children[i], true);
227        
228            for (let j=0; j<grandChildren.length; j++)
229            {
230                if (strcmp(grandChildren[j].getAttribute(attr), value) === 0)
231                {
232                    results.push(grandChildren[j]);
233                }
234            }
235        }
236    }
237    
238    return results;
239};
240
241oorian.dom.isChildOf = function (child, parent)
242{
243    let result = false;
244    
245    if (parent !== null && parent !== undefined)
246    {
247        let children = parent.children;
248
249        for (let i=0; i<children.length; i++)
250        {
251            if (children[i].id === child.id)
252            {
253                result = true;
254                break;
255            }
256            else
257            {
258                result = isChildOf(child, children[i]);
259                
260                if (result === true)
261                {
262                    break;
263                }
264            }
265        }
266    }
267    
268    return result;
269};
270
271oorian.dom.isDefined = function(object)
272{
273    return (object !== undefined && object !== null);
274};
275
276oorian.dom.scrollTo = function(elementId, pos)
277{
278    var element = document.getElementById(elementId);
279    
280    if (element !== null)
281    {
282        element.scrollTop = pos + "px";
283    }
284};
285
286oorian.dom.scrollToBottom = function (elementId)
287{
288    var element = document.getElementById(elementId);
289    
290    if (element !== null)
291    {
292        element.scrollTop = element.scrollHeight;
293    }
294};
295
296oorian.dom.scrollToTop = function (parentId, targetId)
297{
298    let target = document.getElementById(targetId);
299    let parent = document.getElementById(parentId);
300    parent.scrollTop = parent.scrollTop + target.getBoundingClientRect().top - parent.getBoundingClientRect().top;
301};
302
303// Corvus Engineering
304var webbrowser;
305var docWidth;
306var docHeight;
307var winWidth;
308var winHeight;
309var screenWidth;
310var screenHeight;
311var executeOnLoad = new Array();
312var clickedElement = null;
313var hasFocus = null;
314var lastFocusedElement = null;
315
316var urlTimer = null;
317var lastUrl = null;
318var lastHashUpdate = null;
319var autoClickedElement = null;
320
321var keepAlive               = 0;
322var mouseClickedEvent       = 1;
323var mouseDblClickEvent      = 2;
324var mouseDownEvent          = 3;
325var mouseUpEvent            = 4;
326var mouseOverEvent          = 5;
327var mouseOutEvent           = 6;
328var focusInEvent            = 7;
329var focusOutEvent           = 8;
330var keyDownEvent            = 9;
331var keyUpEvent              = 10;
332var keyPressedEvent         = 11;
333var inputChangeEvent        = 12;
334var inputCompleteEvent      = 13;
335var inputInitEvent          = 14;
336var tableSortEvent          = 16;
337var hashChangeEvent         = 21;
338var fileUploadEvent         = 26;
339var fileSelectEvent         = 27;
340var callbackEvent           = 30;
341var timerCallbackEvent      = 31;
342var jsReturnEvent           = 32;
343var pageInitEvent           = 40;
344var pageUnloadEvent         = 41;
345var windowSizeEvent         = 50;
346var documentSizeEvent       = 51;
347var screenSizeEvent         = 52;
348var elementUpdate           = 60;
349var dragStartEvent          = 70;
350var dragEndEvent            = 71;
351var dragExitEvent           = 72;
352var dragEnterEvent          = 73;
353var dragOverEvent           = 74;
354var dragLeaveEvent          = 75;
355var dropEvent               = 76;
356var dropdownExpandEvent     = 80;
357var dropdownCollapseEvent   = 81;
358var timerEvent              = 90;
359var swipeEvent              = 91;
360var swipeLeftEvent          = 92;
361var swipeRightEvent         = 93;
362var scrollStartEvent        = 94;
363var scrollStopEvent         = 95;
364var tapEvent                = 96;
365var tapHoldEvent            = 97;
366var scrollEvent             = 98;
367var scrollEndEvent          = 99;
368var formSubmit              = 200;
369var userElementEvent        = 1000;
370var clientDataEvent         = 1010;
371var styleSyncEvent          = 1020;
372function initializePage()
373{
374    //document.body.style.visibility = "visible";
375    
376    if (navigator.userAgent.indexOf("MSIE") > 0)
377    {
378        webbrowser = "MSIE";
379    }
380    else
381    {
382        webbrowser = "Other";
383    }
384    
385
386    initializeHandlers();
387
388    var elements = $('[data-onPageLoad]');
389    
390    for (i=0; i<elements.length; i++)
391    {
392        var func = elements[i].getAttribute("data-onPageLoad");
393        func = func.replace("this.id", "'" + elements[i].id + "'");
394        eval(func);
395    }
396    
397    elements = $('[data-dynamicSizing]');
398    
399    for (i=0; i<elements.length; i++)
400    {
401        var func = elements[i].getAttribute("data-dynamicSizing");
402        func = func.replace("this.id", "'" + elements[i].id + "'");
403        eval(func);
404    }
405
406    preprocessElements();
407    
408    // Send Page Init Event
409    var params = new Object();
410    var ratio = window.devicePixelRatio || 1;
411
412    params["utcoffset"] = new Date().getTimezoneOffset();
413    params["pixelratio"] = ratio;
414    params["screenwidth"] = getScreenWidth();
415    params["screenheight"] = getScreenHeight();;
416    params["winwidth"] = getWindowWidth();
417    params["winheight"] = getWindowHeight();
418    params["docwidth"] = getDocumentWidth();
419    params["docheight"] = getDocumentHeight();
420    params["orientation"] = getDeviceOrientation();
421    sendAjaxEvent(null, null, pageInitEvent, params);
422    
423//    $.ajaxSetup({ 
424//        headers: { 'x-my-custom-header': 'some value' } 
425//    });     
426
427    //oorian.ws.connect(true);
428}
429
430function initializeHandlers()
431{
432    $(document).change(handleChangeEvent);
433    $(document.body).dblclick(handleDblClickEvent);
434    $(document.body).mousedown(handleMouseDownEvent);
435    $(document.body).mouseup(handleMouseUpEvent);
436    $(document.body).mouseover(handleMouseOverEvent);
437    $(document.body).mousemove(handleMouseMoveEvent);
438    $(document.body).mouseout(handleMouseOutEvent);
439    $(document.body).resize(handleDocumentResize);
440    $(document.body).bind("tap", handleTap);    
441    $(document.body).bind("taphold", handleTapHold);    
442    $(window).on("scroll", handleScrollEvent);
443    $(window).on("scrollend", handleScrollEndEvent);
444    $(window).on("keyup", handleKeyUpEvent);
445    $(window).on("keydown", handleKeyDownEvent);
446    $(window).on("keypress", handleKeyPressedEvent);
447    $(window).on("swipe", handleSwipe);
448    $(window).on("swipeleft", handleSwipeLeft);
449    $(window).on("swiperight", handleSwipeRight);
450    $(window).on("scrollstart", handleScrollStart);
451    $(window).on("scrollstop", handleScrollStop);    
452    $(window).on("wheel", handleWheel);    
453    $(window).resize(handleWindowResize);
454    $(window).click(handleClickEvent);
455    $(window).on("pageshow", reloadOnBack());
456    window.addEventListener("beforeunload", function(event) {handlePageUnload(event)});
457    
458
459    // Can't do this because of the IE handles focus compared to other browsers
460    $(document.body).focusin(handleFocusInEvent);
461    $(document.body).focusout(handleFocusOutEvent);
462}
463
464function reloadOnBack()
465{
466    if (document.head.hasAttribute("data-reloadOnBack") && performance.navigation.type === 2)
467    {
468        location.reload(true);
469    }
470}
471
472var sortcolnum = null;
473var dir = "asc";
474
475
476function processTableSorter(element)
477{
478    var tableId = $(element).attr("data-sorttable");
479    var colnum = $(element).attr("data-sortcolumn");
480    var datatype = $(element).attr("data-sortdatatype");
481    
482    sortTable(tableId, colnum, datatype);
483}
484
485function sortTable(tableId, colnum, datatype)
486{
487    var order;
488    
489    if (colnum !== sortcolnum)
490    {
491        order = 0;
492    }
493    else if (dir === 'asc')
494    {
495        order = 1;
496    }
497    else
498    {
499        order = 0;
500    }
501
502    sortTableWithOrder(tableId, colnum, datatype, order);
503}
504
505function sortTableWithOrder(tableId, colnum, datatype, order)
506{
507    sortcolnum = colnum;
508    dir = (order === 0 ? "asc" : "dsc");
509    
510    // loop through all rows and get values in specified column
511    var table = document.getElementById(tableId);
512    var rows = new Array();
513    
514    var tbody = getChildrenByTag(table, "tbody", false);
515    var bodyrows = getChildrenByTag(tbody[0], "tr", false);
516    
517    for (var i = 0; i < bodyrows.length; i++)
518    {
519        rows[i] = bodyrows[i];
520    }
521    
522    if (datatype === "char")
523    {
524        sortStrings(rows);
525    }
526    else if (datatype === "numeric")
527    {
528        sortNumbers(rows);
529    }
530    else if (datatype === "date")
531    {
532        sortDates(rows);
533    }
534    else if (datatype === "custom")
535    {
536        sortCustom(rows);
537    }
538    
539    for (var i=0; i<rows.length; i++)
540    {
541        $(rows[i]).remove();
542    }    
543    
544    var body = $(table).children("tbody");
545    
546    for (var i=0; i<rows.length; i++)
547    {
548        $(body).append(rows[i]);
549    }
550}
551
552function sortStrings(values)
553{
554    values.sort(sortString);
555}
556
557function sortString(row1, row2)
558{
559    var element1 = row1.childNodes[sortcolnum];
560    var element2 = row2.childNodes[sortcolnum];
561    
562    var data1 = $(element1).attr("data-sortdata");
563    var data2 = $(element2).attr("data-sortdata");
564
565    var value1;
566    var value2;
567
568    if (data1 !== undefined && data2 !== undefined)
569    {
570        value1 = data1;
571        value2 = data2;
572    }
573    else
574    {
575        var input1 = $(element1).find("input");
576        var input2 = $(element2).find("input");
577
578        if (input1[0] !== undefined)
579        {
580            value1 = input1.get(0).value;
581        }
582        else
583        {
584            value1 = element1.textContent;
585        }
586
587        if (input2[0] !== undefined)
588        {
589            value2 = input2.get(0).value;
590        }
591        else
592        {
593            value2 = element2.textContent;
594        }
595    }
596        
597    if (isEmpty(value1) === false && isEmpty(value2) === false)
598    {
599        if (dir === 'asc')
600        {
601            return strcmp(value1, value2);
602        }
603        else
604        {
605            return strcmp(value2, value1);
606        }
607    }
608    else if (isEmpty(value1) && isEmpty(value2))
609    {
610        return 0;
611    }
612    else if (isEmpty(value1))
613    {
614        return 1;
615    }
616    else
617    {
618        return -1;
619    }
620}
621
622function sortNumbers(values)
623{
624    values.sort(sortNumber);
625}
626
627function sortNumber(row1, row2)
628{
629    var element1 = row1.childNodes[sortcolnum];
630    var element2 = row2.childNodes[sortcolnum];
631    
632    var data1 = $(element1).attr("data-sortdata");
633    var data2 = $(element2).attr("data-sortdata");
634
635    var value1;
636    var value2;
637
638    if (data1 !== undefined)
639    {
640        value1 = Number.parseFloat(data1);
641    }
642    else
643    {
644        var input1 = $(element1).find("input");
645
646        if (input1[0] !== undefined)
647        {
648            value1 = parseFloat(input1.get(0).value);
649        }
650        else
651        {
652            value1 = parseFloat(element1.textContent);
653        }
654
655    }
656
657    if (data2 !== undefined)
658    {
659        value2 = Number.parseFloat(data2);
660    }
661    else
662    {
663        var input2 = $(element2).find("input");
664
665        if (input2[0] !== undefined)
666        {
667            value2 = parseFloat(input2.get(0).value);
668        }
669        else
670        {
671            value2 = parseFloat(element2.textContent);
672        }
673    }
674        
675    if (isNaN(value1))
676    {
677        if (dir === 'asc')
678        {
679            value1 = Number.MAX_VALUE;
680        }
681        else
682        {
683            value1 = -Number.MAX_VALUE;
684        }
685    }
686    
687    if (isNaN(value2))
688    {
689        if (dir === 'asc')
690        {
691            value2 = Number.MAX_VALUE;
692        }
693        else
694        {
695            value2 = -Number.MAX_VALUE;
696        }
697    }
698        
699    if (dir === 'asc')
700    {
701        return value1 - value2;
702    }
703    else
704    {
705        return value2 - value1;
706    }
707}
708
709function sortDates(values)
710{
711    values.sort(sortDate);
712}
713
714function sortDate(row1, row2)
715{
716    var element1 = row1.childNodes[sortcolnum];
717    var element2 = row2.childNodes[sortcolnum];
718
719    var data1 = $(element1).attr("data-sortdata");
720    var data2 = $(element2).attr("data-sortdata");
721
722    var value1;
723    var value2;
724
725    if (data1 !== undefined && isNaN(data1) === false)
726    {
727        value1 = Number.parseFloat(data1);
728    }
729
730    if (data2 !== undefined && isNaN(data2) === false)
731    {
732        value2 = Number.parseFloat(data2);
733    }
734
735    if (value1 === undefined)
736    {
737        var input1 = $(element1).find("input");
738
739        if (input1[0] !== undefined)
740        {
741            value1 = parseDate(input1.get(0).value);
742        }
743        else
744        {
745            value1 = parseDate(element1.textContent);
746        }
747    }
748
749    if (value2 === undefined)
750    {
751        var input2 = $(element2).find("input");
752
753        if (input2[0] !== undefined)
754        {
755            value2 = parseDate(input2.get(0).value);
756        }
757        else
758        {
759            value2 = parseDate(element2.textContent);
760        }
761    }
762
763    if (isNaN(value1))
764    {
765        if (dir === 'asc')
766        {
767            value1 = Number.MAX_VALUE;
768        }
769        else
770        {
771            value1 = -Number.MAX_VALUE;
772        }
773    }
774    
775    if (isNaN(value2))
776    {
777        if (dir === 'asc')
778        {
779            value2 = Number.MAX_VALUE;
780        }
781        else
782        {
783            value2 = -Number.MAX_VALUE;
784        }
785    }
786        
787    if (dir === 'asc')
788    {
789        return value1 - value2;
790    }
791    else
792    {
793        return value2 - value1;
794    }
795}
796
797function parseDate(dateStr)
798{
799    // pattern = YYYYY/MM/DD
800    var pattern = /(\d\d\d\d)[.\-/](\d\d)[.\-/](\d\d)/; 
801    var results = pattern.exec(dateStr);
802    
803    if (results !== null && results.length === 4)
804    {
805        var date = new Date(results[1], results[2]-1, results[3]);
806        return date.getTime();
807    }
808
809    // pattern = MM/DD/YYYY
810    pattern = /(\d{1,2})[.\-/](\d{1,2})[.\-/](\d{4})/;  
811    results = pattern.exec(dateStr);
812
813    if (results !== null && results.length === 4)
814    {
815        var date = new Date(results[3], results[1]-1, results[2]);
816        return date.getTime();
817    }
818
819    // pattern = MM/DD/YY
820    pattern = /(\d{1,2})[.\-/](\d{1,2})[.\-/](\d{2})/;  
821    results = pattern.exec(dateStr);
822
823    if (results !== null && results.length === 4)
824    {
825        var date = new Date(results[3], results[1]-1, results[2]);
826        return date.getTime();
827    }
828
829    // pattern = MMM DD, YYYY
830    // For this pattern the month is a string and must be converted to number 0 - 11
831    pattern = /(\D{3,})\s+?(\d{1,2}),\s*(\d{4}).*/;
832    results = pattern.exec(dateStr);
833
834    if (results !== null && results.length === 4)
835    {
836        var month = results[1].substring(0, 3);
837        var day = results[2];
838        var year = results[3];
839        
840        var months = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
841        var monthnum = 0;
842        
843        for (var i=0; i<12; i++)
844        {
845            if (months[i] === month)
846            {
847                monthnum = i;
848            }
849        }
850        
851        var date = new Date(year, monthnum, day);
852        return date.getTime();
853    }
854}
855
856function sortCustom(values)
857{
858
859}
860
861
862var timeoutMap = new Array();
863var intervalMap = new Array();
864
865
866function createTimer(timerId, periodic, interval)
867{
868    if (periodic === "true")
869    {
870        var timer = setInterval(function(){onTimerExpire(timerId);}, interval);
871        intervalMap[timerId] = timer;
872    }
873    else
874    {
875        var timer = setTimeout(function(){onTimerExpire(timerId);}, interval);
876        timeoutMap[timerId] = timer;        
877    }
878}
879
880function cancelTimer(timerId)
881{
882    var timer = intervalMap[timerId];
883    
884    if (timer)
885    {
886        clearInterval(timer);
887    }
888    else
889    {
890        timer = timeoutMap[timerId];
891        
892        if (timer)
893        {
894            clearTimeout(timer);
895        }
896    }
897}
898
899function onTimerExpire(timerId)
900{
901    sendTimerEvent(timerId);
902}
903
904function sendTimerEvent(timerId)
905{
906    var params = new Object();
907    params["timerId"] = timerId;
908    sendAjaxEvent(null, null, timerEvent, params);
909}
910
911function preprocessElements()
912{
913    
914} 
915
916function preprocessModalElements()
917{
918    var modals = $("[data-modal]");
919    
920    for (var i=0; i<modals.length; i++)
921    {
922        var modal = modals[i];
923        var child = modal.childNodes[1];
924
925        if (child)
926        {
927            var ww = $(window).outerWidth();
928            var wh = $(window).outerHeight();
929
930            var cw = $(child).outerWidth();
931            var ch = $(child).outerHeight();
932
933            // Center modal child
934            var left = (ww - cw)/2;
935            var top = (wh - ch)/2;
936
937            $(child).css("position", "absolute");
938            $(child).css("left", left);
939            $(child).css("top", top);
940        }
941    }    
942}
943
944
945function preprocessDroplists()
946{
947    var droplists = $('[data-component="droplist"]');
948    
949    for (var i=0; i<droplists.length; i++)
950    {
951        var droplist = droplists[i];
952        
953        var header = $(droplist).find($('[data-component="droplist-header"]'));
954        var content = $(droplist).find($('[data-component="droplist-content"]'));
955        
956        var width  = Math.max($(header).outerWidth(), $(content).outerWidth());
957
958        $(header).width(width);
959        $(content).width(width);
960    }
961}
962
963
964function preprocessJQueryElements()
965{
966    // Find draggable elements and set them
967//    $('[data-draggable="true"]').draggable({stop: handleDrop});
968//    $('[data-droppable="true"]').droppable();
969//    $('[data-sortable="true"]').sortable({start: startDndSort, stop: stopDndSort, placeholder: "false" });
970//    $('[data-disableSelection="true"]').disableSelection();
971
972//    var elements = $('[data-onPageLoad]');
973//    
974//    for (i=0; i<elements.length; i++)
975//    {
976//        var func = elements[i].getAttribute("data-onPageLoad");
977//        eval(func);
978//    }
979    
980    for (i=0; i<executeOnLoad.length; i++)
981    {
982        eval(executeOnLoad[i]);
983    }
984}
985
986function reprocessInputElements()
987{
988    // blur any inputs that have initial-text defined and whose value
989    // equals that initial text
990    var inputs = $("input");
991    
992    for (var i=0; i<inputs.length; i++)
993    {
994        var input = inputs[i];
995        
996        if (input.type === "text")
997        {
998            var initialtext = input.getAttribute("data-initialtext");
999            var style;
1000            
1001            if (initialtext !== null && (input.value === initialtext || input.value === ""))
1002            {
1003                $(input).attr("value", initialtext)
1004                
1005                style = input.getAttribute("data-initialtextstyle");
1006                
1007                if (style !== null)
1008                {
1009                    oorian.css.mergeStyle(input, style);
1010                }
1011            }
1012            else
1013            {
1014                style = input.getAttribute("data-normaltextstyle");
1015                
1016                if (style !== null)
1017                {
1018                    oorian.css.mergeStyle(input, style);
1019                }
1020            }
1021        }
1022    }
1023}
1024
1025function reprocessModalElements()
1026{
1027    preprocessModalElements();
1028}
1029
1030function reprocessDroplists()
1031{
1032    preprocessDroplists();
1033}
1034
1035function reprocessJQueryElements()
1036{
1037    preprocessJQueryElements();
1038}
1039
1040var delayHideTimer;
1041var lastx;
1042var lasty;
1043var inputElement;
1044var inputTimer;
1045var tapused;
1046var lastChangeEventElement;
1047var lastChangeEventTime = 0;
1048var blockPageUnloadRequest = false;
1049
1050
1051function blockPageUnload()
1052{
1053    blockPageUnloadRequest = true;
1054}
1055
1056function unblockPageUnload()
1057{
1058    blockPageUnloadRequest = false;
1059}
1060
1061function handlePageUnload(event)
1062{
1063    if (blockPageUnloadRequest)
1064    {
1065        sendAjaxEvent(0, 0, pageUnloadEvent, null);
1066        event.preventDefault();
1067        event.returnValue = '';
1068        return false;
1069    }
1070}
1071
1072function handleWindowResize()
1073{
1074    checkScreenSize();
1075    checkWindowSize();
1076    
1077    var elements = $('[data-onWindowResize]');
1078    
1079    for (i=0; i<elements.length; i++)
1080    {
1081        var func = elements[i].getAttribute("data-onWindowResize");
1082        func = func.replace("this.id", "'" + elements[i].id + "'");
1083        eval(func);
1084    }
1085    
1086    elements = $('[data-dynamicSizing]');
1087    
1088    for (i=0; i<elements.length; i++)
1089    {
1090        var func = elements[i].getAttribute("data-dynamicSizing");
1091        func = func.replace("this.id",  "'" + elements[i].id + "'");
1092        eval(func);
1093    }
1094}
1095
1096function handleDocumentResize()
1097{
1098    checkDocumentSize();
1099
1100    var elements = $('[data-onDocumentResize]');
1101    
1102    for (i=0; i<elements.length; i++)
1103    {
1104        var func = elements[i].getAttribute("data-onDocumentResize");
1105        func = func.replace("this.id",  "'" + elements[i].id + "'");
1106        eval(func);
1107    }
1108}
1109
1110function handleClickEvent(event)
1111{
1112    if (tapused === undefined || tapused === false)
1113    {
1114        if (!event) event = window.event; 
1115
1116        var target = getTarget(event);
1117
1118        if (target === autoClickedElement)
1119        {
1120            return true;
1121        }
1122
1123        if (hasValue(target) && target !== window)
1124        {
1125            var element = target;
1126
1127            if (isTrue($(element).attr("disabled")) === false)
1128            {
1129                handleClick(target, event.clientX, event.clientY);
1130                applySelectedStyle(target);
1131            }
1132        }
1133    }
1134    else
1135    {
1136        tapused = false;
1137    }
1138    
1139    return true;
1140}
1141
1142function handleClick(target, clientX, clientY)
1143{
1144    var element = target;
1145
1146    clickedElement = element;
1147
1148    while (element !== document && hasValue($(element).attr("data-sorttable")) === false &&
1149           isTrue($(element).attr("data-consumeEvent")) === false)
1150    {
1151        element = element.parentNode;
1152    }
1153
1154    if (element !== document && hasValue($(element).attr("data-sorttable")) && $(element).attr("disabled") !== "disabled")
1155    {
1156        processTableSorter(element);
1157    }
1158
1159    element = clickedElement;
1160
1161    while (element !== document && 
1162           isTrue($(element).attr("data-generateMouseClickedEvent")) === false &&
1163           isTrue($(element).attr("data-consumeEvent")) === false)
1164    {
1165        element = element.parentNode;
1166    }
1167
1168    if (element !== document && 
1169        isTrue($(element).attr("data-generateMouseClickedEvent")) && 
1170        $(element).attr("disabled") !== "disabled")
1171    {
1172        var params = new Object();
1173        params["clientX"] = clientX;
1174        params["clientY"] = clientY;
1175        sendAjaxEvent(target.id, element.id, mouseClickedEvent, params);
1176        
1177        if (isTrue($(element).attr("data-consumeEvent")) === true)
1178        {
1179            event.preventDefault();
1180        }
1181    }
1182}
1183
1184function applySelectedStyle(target)
1185{
1186    var element = target;
1187    
1188    while (element !== document && isTrue($(element).attr("data-consumeEvent")) === false)
1189    {
1190        element = element.parentNode;
1191    }
1192    
1193    
1194    // TODO: finish implementation
1195    // Not doing anything yet.
1196}
1197
1198function handleDblClickEvent(event)
1199{
1200    if (!event) event = window.event; 
1201
1202    var source = getTarget(event);
1203    var target = source;
1204    
1205    if (hasValue(target))
1206    {
1207        while (target !== document && 
1208               isTrue($(target).attr("data-generateMouseDblClickedEvent")) === false && 
1209               isTrue($(target).attr("data-consumeEvent")) === false)
1210        {
1211            target = target.parentNode;
1212        }
1213
1214        if (target !== document && isTrue($(target).attr("data-generateMouseDblClickedEvent")))
1215        {
1216            var params = new Object();
1217            params["clientX"] = event.clientX;
1218            params["clientY"] = event.clientY;
1219            sendAjaxEvent(source.id, target.id, mouseDblClickEvent, params);
1220        }
1221    }
1222}
1223
1224function handleMouseMoveEvent(event)
1225{
1226
1227}
1228
1229function handleMouseDownEvent(event)
1230{
1231    var result = true;
1232    
1233    if (!event) event = window.event; 
1234    
1235    var source = getTarget(event);
1236    var target = source;
1237
1238    if (hasValue(target))
1239    {
1240        while (target !== document && 
1241               isTrue($(target).attr("data-generateMouseDownEvent")) === false &&
1242               isTrue($(target).attr("data-consumeEvent")) === false)
1243        {
1244            target = target.parentNode;
1245        }
1246        
1247        if (target !== document && isTrue($(target).attr("data-generateMouseDownEvent")))
1248        {
1249            var params = new Object();
1250            params["clientX"] = event.clientX;
1251            params["clientY"] = event.clientY;
1252            sendAjaxEvent(source.id, target.id, mouseDownEvent, params);
1253        }
1254    }
1255    
1256    return result;
1257}
1258
1259function handleMouseUpEvent(event)
1260{
1261    if (!event) event = window.event; 
1262
1263    var source = getTarget(event);
1264    var target = source;
1265
1266    if (hasValue(target))
1267    {
1268        while (target !== document && 
1269               isTrue($(target).attr("data-generateMouseUpEvent")) === false &&
1270               isTrue($(target).attr("data-consumeEvent")) === false)
1271        {
1272            target = target.parentNode;
1273        }
1274
1275        if (target !== document && isTrue($(target).attr("data-generateMouseUpEvent")))
1276        {
1277            var params = new Object();
1278            params["clientX"] = event.clientX;
1279            params["clientY"] = event.clientY;
1280            sendAjaxEvent(source.id, target.id, mouseUpEvent, params);
1281        }
1282    }
1283}
1284
1285function handleMouseOverEvent(event)
1286{
1287    if (!event) event = window.event; 
1288
1289    var source = getTarget(event);
1290    var target = source;
1291
1292    if (hasValue(target) && target !== window)
1293    {
1294        var element = target;
1295
1296        while (element !== document && isTrue($(element).attr("data-consumeEvent")) === false)
1297        {
1298            if (isTrue($(element).attr("data-selected")) === false)
1299            {
1300                if (hasValue($(element).attr("data-over-class")))
1301                {
1302                    var className = $(element).attr("data-over-class");
1303
1304                    if (className !== null && $(element).attr("disabled") !== "disabled")
1305                    {
1306                        element.className = className;
1307                    }                    
1308                }
1309                
1310                if (hasValue($(element).attr("data-overstyle")))
1311                {
1312                    var style = $(element).attr("data-overstyle");
1313
1314                    if (style !== null && $(element).attr("disabled") !== "disabled")
1315                    {
1316                        oorian.css.mergeStyle(element, style);
1317                    }
1318                }
1319            }
1320            
1321            element = element.parentNode;
1322        }
1323
1324        if (target.nodeName === "IMG")
1325        {
1326            var src = $(target).attr("data-oversrc");
1327            
1328            if (hasValue(src))
1329            {
1330                target.src = src;
1331            }
1332        }
1333
1334        element = target;
1335        
1336        while (element !== document && 
1337               isTrue($(element).attr("data-generateMouseOverEvent")) === false &&
1338               isTrue($(element).attr("data-consumeEvent")) === false)
1339        {
1340            element = element.parentNode;
1341        }
1342        
1343        if (element !== document && 
1344            isTrue($(element).attr("data-generateMouseOverEvent")))
1345        {
1346            var params = new Object();
1347            params["clientX"] = event.clientX;
1348            params["clientY"] = event.clientY;
1349            sendAjaxEvent(source.id, element.id, mouseOverEvent, params);
1350        }
1351    }
1352}
1353
1354function handleSwipe(event)
1355{
1356    if (!event) event = window.event; 
1357
1358    var source = getTarget(event);
1359    var target = source;
1360
1361    if (hasValue(target))
1362    {
1363        while (target !== document && 
1364               isTrue($(target).attr("data-generateSwipeEvent")) === false &&
1365               isTrue($(target).attr("data-consumeEvent")) === false)
1366        {
1367            target = target.parentNode;
1368        }
1369
1370        if (target !== document && isTrue($(target).attr("data-generateSwipeEvent")))
1371        {
1372            sendAjaxEvent(source.id, target.id, swipeEvent, null);
1373        }
1374    }
1375}
1376
1377function handleSwipeLeft(event)
1378{
1379    if (!event) event = window.event; 
1380
1381    var source = getTarget(event);
1382    var target = source;
1383
1384    if (hasValue(target))
1385    {
1386        while (target !== document && 
1387               isTrue($(target).attr("data-generateSwipeLeftEvent")) === false &&
1388               isTrue($(target).attr("data-consumeEvent")) === false)
1389        {
1390            target = target.parentNode;
1391        }
1392
1393        if (target !== document && isTrue($(target).attr("data-generateSwipeLeftEvent")))
1394        {
1395            sendAjaxEvent(source.id, target.id, swipeLeftEvent, null);
1396        }
1397    }
1398}
1399
1400function handleSwipeRight(event)
1401{
1402    if (!event) event = window.event; 
1403
1404    var source = getTarget(event);
1405    var target = source;
1406
1407    if (hasValue(target))
1408    {
1409        while (target !== document && 
1410               isTrue($(target).attr("data-generateSwipeRightEvent")) === false &&
1411               isTrue($(target).attr("data-consumeEvent")) === false)
1412        {
1413            target = target.parentNode;
1414        }
1415
1416        if (target !== document && isTrue($(target).attr("data-generateSwipeRightEvent")))
1417        {
1418            sendAjaxEvent(source.id, target.id, swipeRightEvent, null);
1419        }
1420    }
1421}
1422
1423function handleScrollStart(event)
1424{
1425    if (!event) event = window.event; 
1426
1427    var source = getTarget(event);
1428    var target = source;
1429
1430    if (hasValue(target))
1431    {
1432        while (target !== document && 
1433               isTrue($(target).attr("data-generateScrollStartEvent")) === false &&
1434               isTrue($(target).attr("data-consumeEvent")) === false)
1435        {
1436            target = target.parentNode;
1437        }
1438
1439        if (target !== document && isTrue($(target).attr("data-generateScrollStartEvent")))
1440        {
1441            sendAjaxEvent(source.id, target.id, scrollStartEvent, null);
1442        }
1443    }
1444}
1445
1446function handleScrollStop(event)
1447{
1448    if (!event) event = window.event; 
1449
1450    var source = getTarget(event);
1451    var target = source;
1452
1453    if (hasValue(target))
1454    {
1455        while (target !== document && 
1456               isTrue($(target).attr("data-generateScrollStopEvent")) === false &&
1457               isTrue($(target).attr("data-consumeEvent")) === false)
1458        {
1459            target = target.parentNode;
1460        }
1461
1462        if (target !== document && isTrue($(target).attr("data-generateScrollStopEvent")))
1463        {
1464            sendAjaxEvent(source.id, target.id, scrollStopEvent, null);
1465        }
1466    }
1467}
1468
1469function handleWheel(event)
1470{
1471    if (!event) event = window.event; 
1472
1473    var source = getTarget(event);
1474    var target = source;
1475
1476    if (hasValue(target))
1477    {
1478    }
1479}
1480
1481function handleTap(event)
1482{
1483    if (!event) event = window.event; 
1484
1485    var source = getTarget(event);
1486    var target = source;
1487
1488    if (hasValue(target))
1489    {
1490        while (target !== document && 
1491               isTrue($(target).attr("data-generateTapEvent")) === false &&
1492               isTrue($(target).attr("data-consumeEvent")) === false)
1493        {
1494            target = target.parentNode;
1495        }
1496
1497        if (target !== document && isTrue($(target).attr("data-generateTapEvent")))
1498        {
1499            sendAjaxEvent(source.id, target.id, tapEvent, null);
1500        }
1501    }
1502        
1503    handleClickEvent(event, event.clientX, event.clientY);
1504    
1505    tapused = true;
1506}
1507
1508function handleTapHold(event)
1509{
1510    if (!event) event = window.event; 
1511
1512    var source = getTarget(event);
1513    var target = source;
1514
1515    if (hasValue(target))
1516    {
1517        while (target !== document && 
1518               isTrue($(target).attr("data-generateTapHoldEvent")) === false &&
1519               isTrue($(target).attr("data-consumeEvent")) === false)
1520        {
1521            target = target.parentNode;
1522        }
1523
1524        if (target !== document && isTrue($(target).attr("data-generateTapHoldEvent")))
1525        {
1526            sendAjaxEvent(source.id, target.id, tapHoldEvent, null);
1527        }
1528    }
1529}
1530
1531function delayHide(element)
1532{
1533    $(element).hide();
1534}
1535
1536function handleMouseOutEvent(event)
1537{
1538    if (!event) event = window.event; 
1539
1540    var source = getTarget(event);
1541    var target = source;
1542
1543    if (target !== null && target !== window)
1544    {
1545        var element = target;
1546
1547        while (element !== document && isTrue(element.getAttribute("data-consumeEvent")) === false)
1548        {
1549            if (isTrue($(element).attr("data-selected")) === false)
1550            {
1551                if (hasValue($(element).attr("data-normal-class")))
1552                {
1553                    var className = $(element).attr("data-normal-class");
1554
1555                    if (className !== null && $(element).attr("disabled") !== "disabled")
1556                    {
1557                        element.className = className;
1558                    }                    
1559                }
1560                
1561                if (hasValue($(element).attr("data-normalstyle")))
1562                {
1563                    var style = element.getAttribute("data-normalstyle");
1564
1565                    if (style !== null && $(element).attr("disabled") !== "disabled")
1566                    {
1567                        oorian.css.mergeStyle(element, style);
1568                    }
1569                }
1570            }
1571            
1572            element = element.parentNode;
1573        }
1574
1575        if (target.nodeName === "IMG")
1576        {
1577            var src = $(target).attr("data-normalsrc");
1578            
1579            if (hasValue(src))
1580            {
1581                target.src = src;
1582            }
1583        }
1584
1585        element = target;
1586        
1587        while (element !== document && 
1588               hasValue($(element).attr("data-generateMouseOutEvent")) === false &&
1589               isTrue($(element).attr("data-consumeEvent")) === false)
1590        {
1591            element = element.parentNode;
1592        }
1593        
1594        if (element !== document && element.getAttribute("data-generateMouseOutEvent") !== null)
1595        {
1596            var params = new Object();
1597            params["clientX"] = event.clientX;
1598            params["clientY"] = event.clientY;
1599            sendAjaxEvent(source.id, element.id, mouseOutEvent, params);
1600        }
1601        
1602        element = target;
1603        
1604        while (element !== document && 
1605               isTrue($(element).attr("data-popup")) === false &&
1606               isTrue($(element).attr("data-consumeEvent")) === false)
1607        {
1608            element = element.parentNode;
1609        }
1610        
1611        if (element !== document && isTrue($(element).attr("data-popup")))
1612        {
1613            handlePopupMouseOut(element);
1614        }        
1615    }
1616}
1617
1618function handleFocusInEvent(event)
1619{
1620    if (!event) event = window.event; 
1621
1622    var source = getTarget(event);
1623
1624    if (source !== null && source !== window)
1625    {
1626        if (source !== hasFocus)
1627        {
1628            if (source.getAttribute("data-generateFocusInEvent") !== null)
1629            {
1630                sendAjaxEvent(source.id, source.id, focusInEvent, null);
1631            }
1632         
1633            var target = source;
1634            
1635            hasFocus = target;
1636            lastFocusedElement = target;
1637
1638            while (target !== document && target.getAttribute("data-consumeEvent") === null)
1639            {
1640                target = target.parentNode;
1641            }
1642        }
1643        else
1644        {
1645            if (typeof event.stopPropagation !== "undefined") 
1646            {
1647                event.stopPropagation();
1648            } 
1649            else 
1650            {
1651                event.cancelBubble = true;
1652            }            
1653        }   
1654        
1655        return true;
1656    }
1657}
1658
1659function handleFocusOutEvent(event)
1660{
1661    if (!event) event = window.event; 
1662
1663    var source = getTarget(event);
1664
1665    if (source !== null && source !== window)
1666    {
1667        hasFocus = null;
1668        
1669        if (source.nodeName === "TEXTAREA")
1670        {
1671            sendInputCompleteEvent(source.id, source.id, source.name, source.value);
1672        }
1673        else if (source.nodeName === "INPUT" && (
1674                 source.type === "text" || source.type === "password" || source.type === "time" || 
1675                 source.type === "email" || source.type === "number" || source.type === "search" ||
1676                 source.type === "tel" || source.type === "url"))        
1677        {
1678            // InputCompleteEvents are sent when a text input loses focus or when a change event is fired.
1679            // Sometimes only a change event is fired.  Sometimes only a focus out event is fired.  
1680            // Sometimes both are fired.  In the case where both are fired, we need to prevent 
1681            // a duplicate InputCompleteEvent from being sent; therefore, we track the last element
1682            // that fired a change event and the time it was fired.  If the element that fired the
1683            // change event matches the element that fired this focus out event and the time it was 
1684            // fired was less than 10ms ago, we do not send an InputCompleteEvent.
1685            var time = Date.now();
1686            var dt = time - lastChangeEventTime;
1687
1688            if (oorian.dom.isDefined(lastChangeEventElement) === false || lastChangeEventElement.id !== source.id || dt > 10)
1689            {
1690                sendInputCompleteEvent(source.id, source.id, source.name, source.value);
1691            }
1692        }
1693        else if (source.getAttribute("data-generateFocusOutEvent") !== null)
1694        {
1695            sendAjaxEvent(source.id, source.id, focusOutEvent, null);
1696            
1697            if (typeof event.stopPropagation !== "undefined") 
1698            {
1699                event.stopPropagation();
1700            } 
1701            else 
1702            {
1703                event.cancelBubble = true;
1704            }            
1705        }        
1706
1707        return true;
1708    }
1709}
1710
1711function handleScrollEvent(event)
1712{
1713    if (!event) event = window.event; 
1714    
1715    var source = getTarget(event);
1716    var target = source;
1717    
1718    if (source === document && document.body.hasAttribute("data-generateScrollEvent"))
1719    {
1720        source = document.body;
1721        target = source;
1722        var params = new Object();
1723        params["scrollTop"] = document.scrollingElement.scrollTop;
1724        params["scrollBottom"] = document.body.scrollHeight - (document.scrollingElement.scrollTop + window.innerHeight);
1725        params["scrollHeight"] = document.scrollingElement.scrollHeight;
1726        params["scrollLeft"] = document.scrollingElement.scrollLeft;
1727        params["scrollRight"] = document.body.scrollWidth - (document.scrollingElement.scrolLeft + window.innerWidth);
1728        params["scrollWidth"] = document.scrollingElement.scrollWidth;
1729        sendAjaxEvent(source.id, target.id, scrollEvent, params);
1730    }
1731    else if (source !== document)
1732    {
1733        source = document.body;
1734        target = source;
1735        var params = new Object();
1736        params["scrollTop"] = target.scrollTop;
1737        params["scrollBottom"] = target.scrollHeight - (target.scrollTop + target.innerHe
1737ight);
1738        params["scrollHeight"] = target.scrollHeight;
1739        params["scrollLeft"] = target.scrollLeft;
1740        params["scrollRight"] = document.body.scrollWidth - (document.scrollingElement.scrolLeft + window.innerWidth);
1741        params["scrollWidth"] = target.scrollWidth;
1742        sendAjaxEvent(source.id, target.id, scrollEvent, params);
1743    }
1744}
1745
1746function handleScrollEndEvent(event)
1747{
1748    if (!event) event = window.event; 
1749    
1750    var source = getTarget(event);
1751    var target = source;
1752    
1753    if (source === document && document.body.hasAttribute("data-generateScrollEndEvent"))
1754    {
1755        source = document.body;
1756        target = source;
1757        var params = new Object();
1758        
1759        params["scrollTop"] = document.scrollingElement.scrollTop;
1760        params["scrollBottom"] = document.body.scrollHeight - (document.scrollingElement.scrollTop + window.innerHeight);
1761        params["scrollHeight"] = document.scrollingElement.scrollHeight;
1762        params["scrollLeft"] = document.scrollingElement.scrollLeft;
1763        params["scrollRight"] = document.body.scrollWidth - (document.scrollingElement.scrolLeft + window.innerWidth);
1764        params["scrollWidth"] = document.scrollingElement.scrollWidth;
1765        sendAjaxEvent(source.id, target.id, scrollEndEvent, params);
1766    }
1767    else if (source !== document)
1768    {
1769        source = document.body;
1770        target = source;
1771        var params = new Object();
1772        params["scrollTop"] = target.scrollTop;
1773        params["scrollBottom"] = target.scrollHeight - (target.scrollTop + target.innerHeight);
1774        params["scrollHeight"] = target.scrollHeight;
1775        params["scrollLeft"] = target.scrollLeft;
1776        params["scrollRight"] = target.scrollWidth - (target.scrolLeft + target.innerWidth);
1777        params["scrollWidth"] = target.scrollWidth;
1778        sendAjaxEvent(source.id, target.id, scrollEndEvent, params);
1779    }
1780}
1781
1782function handleKeyDownEvent(event)
1783{
1784    if (!event) event = window.event; 
1785    
1786    var source = getTarget(event);
1787    var target = source;
1788
1789    while (target !== null && target !== window && target !== document)
1790    {
1791        if (target.getAttribute("data-generateKeyDownEvent") === "true" ||(
1792            oorian.dom.isDefined(event.keyCode) && target.getAttribute("data-generateKeyDownEvent") === event.keyCode.toString()))
1793        {
1794            var params = new Object();
1795            params["keyCode"] = event.keyCode;
1796            params["key"] = event.key;
1797            params["which"] = event.which;
1798            params["charCode"] = event.charCode;
1799            sendAjaxEvent(source.id, target.id, keyDownEvent, params);
1800            break;
1801        }
1802        else
1803        {
1804            target = target.parentNode;
1805        }
1806    }
1807    
1808    return true;
1809}
1810
1811function handleKeyUpEvent(event)
1812{
1813    if (!event) event = window.event; 
1814    
1815    var source = getTarget(event);
1816    var target = source;
1817
1818    while (target !== null && target !== document)
1819    {
1820        if (target.getAttribute("data-generateInputChangeEvent") === "true")
1821        {
1822            if (target.nodeName === "INPUT" && (
1823                target.type === "text" || target.type === "password" || target.type === "time" || 
1824                target.type === "email" || target.type === "number" || target.type === "search" ||
1825                target.type === "tel" || target.type === "url"))        
1826            {
1827                sendInputChangeEvent(source.id, target.id, target.name, target.value, null);
1828            }
1829            else if (target.nodeName === "TEXTAREA")
1830            {
1831                sendInputChangeEvent(source.id, target.id, target.name, target.value, null);
1832            }
1833        }
1834
1835        if (target.getAttribute("data-generateKeyUpEvent") === "true" || (
1836            oorian.dom.isDefined(event.keyCode) && target.getAttribute("data-generateKeyUpEvent") === event.keyCode.toString()))
1837        {
1838            var params = new Object();
1839            params["keyCode"] = event.keyCode;
1840            params["key"] = event.key;
1841            params["which"] = event.which;
1842            params["charCode"] = event.charCode;
1843            sendAjaxEvent(source.id, target.id, keyUpEvent, params);
1844            break;
1845        }
1846        else
1847        {
1848            target = target.parentNode;
1849        }
1850    }
1851
1852    return true;
1853}
1854
1855function handleKeyPressedEvent(event)
1856{
1857    if (!event) event = window.event; 
1858    
1859    var source = getTarget(event);
1860    var target = source;
1861
1862    while (target !== null && target !== document)
1863    {
1864        if (target.getAttribute("data-changeOnEnter") && event.key === 'Enter')
1865        {
1866            sendInputCompleteEvent(source.id, target.id, target.name, target.value, null);
1867        }
1868        else if (target.getAttribute("data-tabOnKeyPressed"))
1869        {
1870            var key = parseInt(target.getAttribute("data-tabOnKeyPressed"), 10);
1871            
1872            if (key === event.keyCode)
1873            {
1874                onKeyPressedTab(target);
1875                break;
1876            }
1877        }
1878        else if (target.getAttribute("data-generateKeyPressedEvent") !== null)
1879        {
1880            var keycodes = target.getAttribute("data-generateKeyPressedEvent");
1881            
1882            if (keycodes === "true")
1883            {
1884                consumeEvent(event);
1885
1886                var params = new Object();
1887                params["keyCode"] = event.keyCode;
1888                params["which"] = event.which;
1889                params["charCode"] = event.charCode;
1890                sendAjaxEvent(source.id, target.id, keyPressedEvent, params);
1891                break;
1892            }
1893            else
1894            {
1895                keycodes = keycodes.split(",");
1896                
1897                for (var i=0; i<keycodes.length; i++)
1898                {
1899                    if (parseInt(keycodes[i]) === event.keyCode)
1900                    {
1901                        consumeEvent(event);
1902                        var params = new Object();
1903                        params["keyCode"] = event.keyCode;
1904                        params["which"] = event.which;
1905                        params["charCode"] = event.charCode;
1906                        sendAjaxEvent(source.id, target.id, keyPressedEvent, params);
1907                        break;
1908                    }
1909                }
1910            }
1911        }
1912
1913        target = target.parentNode;
1914    }
1915
1916    return true;
1917}
1918
1919function handleInputEvent(target)
1920{
1921    if (target.nodeName === "INPUT")
1922    {
1923        if (target.type === "range")
1924        {
1925            sendInputChangeEvent(target.id, target.id, target.name, target.value, target.checked);
1926        }
1927    }
1928}
1929
1930// This fuction is called whenever an input element is changed.
1931// For a text input this is called only when the input loses focus.
1932function handleChangeEvent(event)
1933{
1934    if (!event) event = window.event; 
1935    
1936    var source = getTarget(event);
1937    var target = source;
1938
1939    if (target !== null && target !== window)
1940    {
1941        if (target.nodeName === "INPUT")
1942        {
1943            if (target.type === "radio" || target.type === "checkbox")
1944            {
1945                sendInputChangeEvent(source.id, target.id, target.name, target.value, target.checked);
1946            }
1947            else if (target.type === "text" || target.type === "password" || target.type === "time" || 
1948                     target.type === "email" || target.type === "number" || target.type === "search" ||
1949                     target.type === "tel" || target.type === "url")
1950            {
1951                // InputCompleteEvents are sent when a text input loses focus or when a change event is fired.
1952                // Sometimes only a change event is fired.  Sometimes only a focus out event is fired.  
1953                // Sometimes both are fired.  In the case where both are fired, we need to prevent 
1954                // a duplicate InputCompleteEvent from being sent; therefore, we track the last element
1955                // that fired a change event and the time it was fired. The FocusOut handler uses this
1956                // info to determine whether or not it needs to send an InputCompleteEvent.
1957                lastChangeEventElement = target;
1958                lastChangeEventTime = Date.now();
1959                sendInputCompleteEvent(source.id, target.id, target.name, target.value);
1960            }
1961        }
1962        else if (target.nodeName === "TEXTAREA")
1963        {
1964            if (target.getAttribute("data-generateInputChangeEvent") === "true")
1965            {
1966                sendInputChangeEvent(source.id, target.id, target.name, target.value, null);
1967            }
1968        }
1969        else if (target.nodeName === "SELECT")
1970        {
1971            var options = target.options;
1972            var selected = new Array();
1973            
1974            for (var i=0; i<options.length; i++)
1975            {
1976                if (options[i].selected)
1977                {
1978                    selected.push(options[i].value);
1979                }
1980            }
1981            
1982            sendInputChangeEvent(source.id, target.id, target.name, selected.toString(), target.selectedIndex);
1983        }
1984    }
1985}
1986
1987function getTarget(event)
1988{
1989    var target;
1990	if (event.target) target = event.target;
1991	else if (event.srcElement) target = event.srcElement;
1992    if (target !== null && target !== undefined && target.nodeName === "#text") target = target.parentNode;    
1993    return target;
1994}
1995
1996// Not sure if these are still used
1997function handleTableSortEvent(tableCell)
1998{
1999    if (tableCell !== null)
2000    {
2001        var colnum = tableCell.cellIndex;
2002        var row = tableCell.parentNode;
2003        var head = row.parentNode;
2004        var table = head.parentNode;
2005        
2006        if (table !== null)
2007        {
2008            var params = new Object();
2009            params["colnum"] = colnum;
2010            sendAjaxEvent(table.id, table.id, tableSortEvent, params);
2011        }
2012    }
2013}
2014
2015function consumeEvent(event)
2016{
2017    if (typeof event.stopPropagation !== "undefined") 
2018    {
2019        event.preventDefault();
2020        event.stopPropagation();
2021    } 
2022    else 
2023    {
2024        event.preventDefault();
2025        event.cancelBubble = true;
2026    }    
2027}
2028function processElementResponse(responseData)
2029{
2030    _clearConnectionError();
2031
2032    if (oorian.dom.isDefined(responseData) && responseData !== "")
2033    {
2034        if (responseData.getElementsByTagName("sessionclosed").length > 0)
2035        {
2036            processError();
2037        }
2038        else
2039        {
2040            var responses = responseData.getElementsByTagName("response");
2041            var callbacks = new Array();
2042
2043            for (var i=0; i<responses.length; i++)
2044            {
2045                var response = responses[i];
2046                var id = response.getAttribute("id");
2047
2048                if (id === "addition")
2049                {
2050                    processElementAddition(response);
2051                }
2052                else if (id === "subtraction")
2053                {
2054                    processElementSubtraction(response);
2055                }
2056                else if (id === "bodyupdate")
2057                {
2058                    processBodyUpdate(response);
2059                }
2060                else if (id === "update")
2061                {
2062                    processElementUpdate(response);
2063                }
2064                else if (id === "attributeupdate")
2065                {
2066                    processElementAttributeUpdate(response);
2067                }
2068                else if (id === "redirect")
2069                {
2070                    processRedirect(response);
2071                }
2072                else if (id === "click")
2073                {
2074                    processElementClick(response);
2075                }
2076                else if (id === "hashupdate")
2077                {
2078                    processHashUpdate(response);
2079                }
2080                else if (id === "submitform")
2081                {
2082                    processFormSubmit(response);
2083                }
2084                else if (id === "uploadfile")
2085                {
2086                    processFileUpload(response);
2087                }
2088                else if (id === "executejs")
2089                {
2090                    processExecuteJavaScript(response);
2091                }
2092                else if (id === "executejsxml")
2093                {
2094                    processExecuteJavaScriptXml(response);
2095                }
2096                else if (id === "fileuploadstatus")
2097                {
2098                    processFileUploadStatus(response);
2099                }
2100                else if (id === "print")
2101                {
2102                    printData(response);
2103                }
2104                else if (id === "openwindow")
2105                {
2106                    processWindowOpen(response);
2107                }
2108                else if (id === "closewindow")
2109                {
2110                    processWindowClose(response);
2111                }
2112                else if (id === "setfocus")
2113                {
2114                    processSetFocus(response);
2115                }
2116                else if (id === "setfocusandselect")
2117                {
2118                    processSetFocusAndSelect(response);
2119                }
2120                else if (id === "setfocusandvalue")
2121                {
2122                    processSetFocusAndValue(response);
2123                }
2124                else if (id === "selecttext")
2125                {
2126                    processSelectText(response);
2127                }
2128                else if (id === "fadein")
2129                {
2130                    processFadeIn(response);
2131                }
2132                else if (id === "fadeout")
2133                {
2134                    processFadeOut(response);
2135                }
2136                else if (id === "loadimages")
2137                {
2138                    processLoadImages(response);
2139                }
2140                else if (id === "createtimer")
2141                {
2142                    processCreateTimer(response);
2143                }
2144                else if (id === "canceltimer")
2145                {
2146                    processCancelTimer(response);
2147                }
2148                else if (id === "expanddropdown")
2149                {
2150                    processExpandDropdownCommand(response);
2151                }
2152                else if (id === "sorttable")
2153                {
2154                    processSortTable(response);
2155                }
2156                else if (id === "blockPageUnload")
2157                {
2158                    blockPageUnload();
2159                }
2160                else if (id === "unblockPageUnload")
2161                {
2162                    unblockPageUnload();
2163                }
2164                else if (id === "callback")
2165                {
2166                    var callbackObject = new Object();
2167                    callbackObject.elementId = responses[i].getAttribute("element");
2168                    callbackObject.callbackId = responses[i].getAttribute("callback");
2169                    callbackObject.delay = responses[i].getAttribute("delay");
2170                    callbacks.push(callbackObject);
2171                }
2172            }
2173
2174            if (responses.length > 0)
2175            {
2176                checkDocumentSize();
2177
2178                document.body.style.visibility = 'visible';
2179
2180                for (var i=0; i<callbacks.length; i++)
2181                {
2182                    var callbackObject = callbacks[i];
2183                    
2184                    var params = new Object();
2185                    params["callback"] = callbackObject.callbackId;
2186
2187                    if (callbackObject.delay !== null && callbackObject.delay > 0)
2188                    {
2189                        setTimeout(function(){sendAjaxEvent(callbackObject.elementId, callbackObject.elementId, callbackEvent, params);}, callbackObject.delay);
2190                    }
2191                    else
2192                    {
2193                        sendAjaxEvent(callbackObject.elementId, callbackObject.elementId, callbackEvent, params);
2194                    }
2195                }
2196            }
2197        }
2198    }
2199}
2200
2201function processError()
2202{
2203    document.location = "/sessionclosed";
2204}
2205
2206function processElementAddition(response)
2207{
2208    var tag = response.getAttribute("tag");
2209    var parentId = response.getAttribute("parent");
2210    var parent = document.getElementById(parentId);
2211    
2212    if (parent !== null)
2213    {
2214        var html = response.getElementsByTagName("html")[0];
2215
2216        var cdata = html.childNodes[0];
2217
2218        if (cdata === null)
2219        {
2220            cdata = html.childNodes[1];
2221        }
2222
2223        if (cdata !== null)
2224        {
2225            var element = document.createElement(tag);
2226
2227            if (tag === "table")
2228            {
2229                // table needs special handling
2230                // Need create a temporary div for storing table
2231                var element = document.createElement("div");
2232
2233                if (cdata.textContent === undefined)
2234                {
2235                    element.innerHTML = cdata.text;
2236                }
2237                else
2238                {
2239                    element.innerHTML = cdata.textContent;                
2240                }
2241
2242                parent.appendChild(element.childNodes[0]);
2243            }
2244            else if (tag === "thead" || tag === "tbody")
2245            {
2246                var element = document.createElement("table");
2247
2248                if (cdata.textContent === undefined)
2249                {
2250                    element.innerHTML = cdata.text;
2251                }
2252                else
2253                {
2254                    element.innerHTML = cdata.textContent;                
2255                }
2256
2257                parent.appendChild(element.childNodes[0]);
2258            }
2259            else if (tag === "tr")
2260            {
2261                var element = document.createElement("tbody");
2262
2263                if (cdata.textContent === undefined)
2264                {
2265                    element.innerHTML = cdata.text;
2266                }
2267                else
2268                {
2269                    element.innerHTML = cdata.textContent;                
2270                }
2271
2272                parent.appendChild(element.childNodes[0]);
2273            }
2274            else
2275            {
2276                var element = document.createElement("div");
2277
2278                if (cdata.textContent === undefined)
2279                {
2280                    element.innerHTML = cdata.text;
2281                }
2282                else
2283                {
2284                    element.innerHTML = cdata.textContent;                
2285                }
2286
2287                parent.appendChild(element.childNodes[0]);
2288            }
2289        }
2290    }
2291}
2292
2293function processElementSubtraction(response)
2294{
2295    var elementId = response.getAttribute("element")
2296    var element = document.getElementById(elementId);
2297    
2298    if (element !== null)
2299    {
2300        var parent = element.parentNode;
2301
2302        if (parent !== null)
2303        {
2304            parent.removeChild(element)
2305        }
2306    }
2307}
2308
2309function processBodyUpdate(response)
2310{
2311    var newAttrs = response.getElementsByTagName("attribute");
2312
2313    oorian.css.removeAttributes(document.body);
2314
2315    if (newAttrs !== null)
2316    {
2317        for (var i=0; i<newAttrs.length; i++)
2318        {
2319            var attrName = newAttrs[i].getAttribute("name");
2320            var attrVal = newAttrs[i].childNodes[0].textContent;
2321
2322            if (attrName !== "style")
2323            {
2324                $(document.body).attr(attrName, attrVal);
2325            }
2326        }
2327    }
2328
2329    var style = response.getAttribute("style");
2330
2331    if (style !== null)
2332    {
2333        oorian.css.copyStyleText(style, document.body);
2334    }
2335    
2336    var innerhtml = response.getElementsByTagName("innerhtml")[0];
2337
2338    var cdata = innerhtml.childNodes[0];
2339
2340    if (cdata === null || cdata === undefined)
2341    {
2342        cdata = innerhtml.childNodes[1];
2343    }
2344
2345    if (cdata !== null && cdata !== undefined)
2346    {
2347        if (cdata.textContent === undefined)
2348        {
2349            document.body.innerHTML = cdata.text;
2350        }
2351        else
2352        {
2353            document.body.innerHTML = cdata.textContent;                
2354        }
2355    }
2356
2357    document.body.style.visibility = "visible";
2358
2359    var elements = $('[data-dynamicSizing]');
2360    
2361    for (i=0; i<elements.length; i++)
2362    {
2363        var func = elements[i].getAttribute("data-dynamicSizing");
2364        func = func.replace("this.id", "'" + elements[i].id + "'");
2365        eval(func);
2366    }
2367}
2368
2369function processElementUpdate(response)
2370{
2371    var elementId  = response.getAttribute("element");
2372
2373    if (elementId !== "null")
2374    {
2375        var element = document.getElementById(elementId);
2376
2377        if (element !== null)
2378        {
2379       
2379     // preserve all iframes
2380            var html = response.getElementsByTagName("html")[0];
2381
2382            var cdata = html.childNodes[0];
2383
2384            if (cdata === null)
2385            {
2386                cdata = html.childNodes[1];
2387            }
2388
2389            if (cdata !== null)
2390            {
2391                var tempElement = document.createElement("DIV");
2392
2393                if (cdata.textContent === undefined)
2394                {
2395                    tempElement.innerHTML = cdata.text;
2396                }
2397                else
2398                {
2399                    tempElement.innerHTML = cdata.textContent;                
2400                }
2401
2402                var newElement = tempElement.childNodes[0];
2403                                
2404                while(element.attributes.length > 0)
2405                {
2406                    element.removeAttribute(element.attributes[0].name);                                
2407                }
2408                
2409                for (var i=0; i<newElement.attributes.length; i++)
2410                {
2411                    if (newElement.attributes[i].name === 'value')
2412                    {
2413                        element.value = newElement.attributes[i].value;
2414                    }
2415                    else
2416                    {
2417                        element.setAttribute(newElement.attributes[i].name, newElement.attributes[i].value);
2418                    }
2419                }
2420                
2421                element.innerHTML = newElement.innerHTML;
2422            }
2423            
2424            var func = element.getAttribute("data-dynamicSizing");
2425            
2426            if (func !== null)
2427            {
2428                func = func.replace("this.id",  "'" + element.id + "'");
2429                eval(func);
2430            }
2431            
2432            var children = getChildrenByAttribute(element, "data-dynamicSizing", true);
2433            
2434            for (var i=0; i<children.length; i++)
2435            {
2436                var child = children[i];
2437                
2438                func = child.getAttribute("data-dynamicSizing");
2439
2440                if (func !== null)
2441                {
2442                    func = func.replace("this.id", "'" + child.id + "'");
2443                    eval(func);
2444                }
2445            }
2446        }
2447    }
2448}
2449
2450function processElementAttributeUpdate(response)
2451{
2452    var elementId  = response.getAttribute("element");
2453    
2454    if (elementId !== "null")
2455    {
2456        var element = document.getElementById(elementId);
2457     
2458        if (element !== null)
2459        {
2460            var newAttrs = response.getElementsByTagName("attribute");
2461
2462            oorian.css.replaceAttributes(element, newAttrs);
2463
2464            style = response.getAttribute("style");
2465
2466            if (style !== null)
2467            {
2468                oorian.css.copyStyleText(style, element);
2469            }
2470
2471            // Set all div and table elements to use border box modeling
2472            if (element.tagName === "DIV" || element.tagName === "TABLE")
2473            {
2474                element.style["-webkit-box-sizing"] = "border-box";
2475                element.style["-moz-box-sizing"] = "border-box";
2476                element.style["box-sizing"] = "border-box";
2477            }
2478        }
2479    }
2480}
2481
2482function processResize(response)
2483{
2484    var elementId  = response.getAttribute("element");
2485    var element = document.getElementById(elementId);
2486
2487    if (element !== null)
2488    {
2489        var func = element.getAttribute("data-dynamicSizing");
2490        func = func.replace("this.id", "'" + elementId + "'");
2491        eval(func);
2492    }
2493}
2494
2495function processRedirect(response)
2496{
2497    var url = decodeURIComponent(response.getAttribute("url"));
2498    
2499    if (url.indexOf("#") === 0)
2500    {
2501        document.location.hash = url;
2502    }
2503    else
2504    {
2505        document.location.href = url;
2506    }
2507}
2508
2509function processElementClick(response)
2510{
2511    var elementId  = response.getAttribute("element");
2512
2513    if (elementId !== "null")
2514    {
2515        var element = document.getElementById(elementId);
2516
2517        if (element !== null)
2518        {
2519            autoClickedElement = element;
2520            element.click();
2521        }
2522    }
2523}
2524
2525function processSetFocus(response)
2526{
2527    var elementId  = response.getAttribute("element");
2528
2529    if (elementId !== "null")
2530    {
2531        var element = document.getElementById(elementId);
2532
2533        if (element !== null)
2534        {
2535            element.focus();
2536        }
2537    }
2538}
2539
2540function processSetFocusAndSelect(response)
2541{
2542    var elementId  = response.getAttribute("element");
2543
2544    if (elementId !== "null")
2545    {
2546        var element = document.getElementById(elementId);
2547
2548        if (element !== null)
2549        {
2550            element.focus();
2551            element.select();
2552        }
2553    }
2554}
2555
2556function processSetFocusAndValue(response)
2557{
2558    var elementId  = response.getAttribute("element");
2559
2560    if (elementId !== "null")
2561    {
2562        var element = document.getElementById(elementId);
2563
2564        if (element !== null)
2565        {
2566            element.value='';
2567            element.value = response.getAttribute("value");
2568            element.focus();
2569        }
2570    }
2571}
2572
2573function processSelectText(response)
2574{
2575    var elementId  = response.getAttribute("element");
2576
2577    if (elementId !== "null")
2578    {
2579        var element = document.getElementById(elementId);
2580
2581        if (element !== null)
2582        {
2583            element.select();
2584        }
2585    }
2586}
2587
2588function processFadeOut(response)
2589{
2590    var elementId  = response.getAttribute("element");
2591    var duration = response.getAttribute("duration");
2592    
2593    if (elementId !== "null")
2594    {
2595        var element = document.getElementById(elementId);
2596        
2597        if (element !== null)
2598        {
2599            $(element).fadeOut(duration, function(){sendElementUpdate(elementId);});
2600        }
2601    }
2602}
2603
2604function processFadeIn(response)
2605{
2606    var elementId  = response.getAttribute("element");
2607    var duration = response.getAttribute("duration");
2608    
2609    if (elementId !== "null")
2610    {
2611        var element = document.getElementById(elementId);
2612        
2613        if (element !== null)
2614        {
2615            $(element).fadeIn(duration, function(){sendElementUpdate(elementId);});
2616        }
2617    }
2618}
2619
2620function processHashUpdate(response)
2621{
2622    var hash = response.textContent;
2623    
2624    if (hash === "")
2625    {
2626        lastHashUpdate = null;
2627    }
2628    else if (hash !== lastHashUpdate)
2629    {
2630        lastHashUpdate = hash;
2631        
2632        self.document.location = "#" + hash;
2633    }
2634}
2635
2636function processLoadImages(response)
2637{
2638    var imageUrls = response.getElementsByTagName("image");
2639    
2640    for (var i=0; i<imageUrls.length; i++)
2641    {
2642        var url = decodeURIComponent(imageUrls[i].getAttribute("src"));
2643        sendAjaxGetRequest(url, "");
2644    }
2645}
2646
2647function processFormSubmit(response)
2648{
2649    var formid = response.getAttribute("formid");
2650    var form = document.getElementById(formid);
2651    
2652    if (form !== null)
2653    {
2654        var action = form.getAttribute("action");
2655        
2656        if (action === null || isEmpty(action))
2657        {
2658            onFormSubmit(form);
2659        }
2660        else
2661        {
2662            form.submit();
2663        }
2664    }    
2665}
2666
2667function processExecuteJavaScript(response)
2668{
2669    var js = response.childNodes[0].data;
2670    
2671    if (js !== null)
2672    {        
2673        var retval = eval(js);
2674        
2675        if (hasValue(retval))
2676        {
2677            var elementId  = response.getAttribute("element");
2678            var callbackId = response.getAttribute("callback");
2679
2680            var params = new Object();
2681            params["callback"] = callbackId;
2682            params["retval"] = retval;
2683            sendAjaxEvent(elementId, elementId, jsReturnEvent, params);
2684        }            
2685    }
2686}
2687
2688function processExecuteJavaScriptXml(response)
2689{
2690    var ns = response.getAttribute("namespace");
2691    var fnname = response.getAttribute("function");
2692    var xmlwrapper = response.getElementsByTagName("xml.wrapper");
2693    
2694    if (fnname !== null && xmlwrapper !== null)
2695    {
2696        var fn;
2697
2698        if (ns !== null)
2699        {
2700            fn = window[ns][fnname];
2701        }
2702        else
2703        {
2704            fn = window[fnname];
2705        }
2706        
2707        var retval = fn(xmlwrapper);
2708        
2709        if (hasValue(retval))
2710        {
2711            var elementId  = response.getAttribute("element");
2712            var callbackId = response.getAttribute("callback");
2713
2714            var params = new Object();
2715            params["callback"] = callbackId;
2716            params["retval"] = retval;
2717            sendAjaxEvent(elementId, elementId, jsReturnEvent, params);
2718        }            
2719    }
2720}
2721
2722function processExecuteJavaScriptJson(response)
2723{
2724    var ns = response.getAttribute("namespace");
2725    var fnname = response.getAttribute("function");
2726    var json = response.getElementsByTagName("json");
2727    
2728    if (fnname !== null && json !== null)
2729    {   
2730        var fn;
2731
2732        if (ns !== null)
2733        {
2734            fn = window[ns][fnname];
2735        }
2736        else
2737        {
2738            fn = window[fnname];
2739        }
2740
2741        var retval = fn(json[0].innerHTML);
2742        
2743        if (hasValue(retval))
2744        {
2745            var elementId  = response.getAttribute("element");
2746            var callbackId = response.getAttribute("callback");
2747
2748            var params = new Object();
2749            params["callback"] = callbackId;
2750            params["retval"] = retval;
2751            sendAjaxEvent(elementId, elementId, jsReturnEvent, params);
2752        }            
2753    }
2754}
2755
2756function printData(response)
2757{
2758    var title = response.getAttribute("title");
2759    var params = response.getAttribute("params");
2760
2761    if (response.getAttribute("url") !== null)
2762    {
2763        var url = decodeURIComponent(response.getAttribute("url"));
2764
2765        let newWindow = window.open(url, title, params);
2766
2767        if (newWindow)
2768        {
2769            newWindow.print();
2770        }
2771        else
2772        {
2773            alert("Unable to open new window. Please check your browser's popup blocker settings.");
2774        }
2775    }
2776    else
2777    {
2778        var cdata = response.childNodes[0];
2779        var html;
2780
2781        if (cdata.textContent === undefined)
2782        {
2783            html = cdata.text;
2784        }
2785        else
2786        {
2787            html = cdata.textContent;                
2788        }
2789
2790        let newWindow = window.open("", title, params);
2791
2792        if (newWindow)
2793        {
2794            newWindow.document.write(html);
2795            newWindow.document.write('<script>window.print();</script>');
2796            newWindow.document.close();
2797        }
2798        else
2799        {
2800            alert("Unable to open new window. Please check your browser's popup blocker settings.");
2801        }
2802    }
2803}
2804
2805function processWindowOpen(response)
2806{
2807    var title = response.getAttribute("title");
2808    var params = response.getAttribute("params");
2809
2810    if (response.getAttribute("url") !== null)
2811    {
2812        var url = decodeURIComponent(response.getAttribute("url"));
2813
2814        let newWindow = window.open(url, title, params);
2815
2816        if (!newWindow)
2817        {
2818            alert("Unable to open new window. Please check your browser's popup blocker settings.");
2819        }
2820    }
2821    else
2822    {
2823        var cdata = response.childNodes[0];
2824        var html;
2825        
2826        if (cdata.textContent === undefined)
2827        {
2828            html = cdata.text;
2829        }
2830        else
2831        {
2832            html = cdata.textContent;                
2833        }
2834        
2835        let newWindow = window.open("", title, params);
2836
2837        if (newWindow)
2838        {
2839            newWindow.document.write(html);
2840            newWindow.document.close();
2841        }
2842        else
2843        {
2844            alert("Unable to open new window. Please check your browser's popup blocker settings.");
2845        }
2846    }
2847}
2848
2849function processWindowClose(response)
2850{
2851    var name = response.getAttribute("name");
2852    closeWindow(name);
2853}
2854
2855function closeWindow(name)
2856{
2857    var w = window.open("", name);
2858    
2859    if (w !== null && w !== undefined)
2860    {
2861        w.close();
2862    }
2863}
2864
2865function reloadPageOnCacheError()
2866{
2867    blockPageUnloadEvent = true;
2868    location.reload(true); 
2869}
2870
2871
2872function processCreateTimer(response)
2873{
2874    var timerId = response.getAttribute("timer");
2875    var periodic = response.getAttribute("periodic");
2876    var interval = response.getAttribute("interval");
2877    
2878    createTimer(timerId, periodic, interval);
2879}
2880
2881function processCancelTimer(response)
2882{
2883    var timerId = response.getAttribute("timer");
2884    
2885    cancelTimer(timerId);
2886}
2887
2888function processExpandDropdownCommand(response)
2889{
2890    var dropdownId = response.getAttribute("dropdownId");
2891    var bodyId = response.getAttribute("dropdownBodyId");
2892    
2893    showDropdownBody(document.getElementById(dropdownId), document.getElementById(bodyId));
2894}
2895
2896function processSortTable(response)
2897{
2898    var tableId = response.getAttribute("tableId");
2899    var colnum = response.getAttribute("colnum");
2900    var datatype = response.getAttribute("datatype");
2901    var order = response.getAttribute("order");
2902    
2903    sortTableWithOrder(tableId, colnum, datatype, order);
2904}
2905
2906function sendInputInitEvent(sourceId, targetId, name, value, state)
2907{
2908    var params = new Object();
2909    params["name"] = name;
2910    params["value"] = value;
2911    params["state"] = state;
2912    sendAjaxEvent(sourceId, targetId, inputInitEvent, params);
2913}
2914
2915function sendInputChangeEvent(sourceId, targetId, name, value, state)
2916{
2917    var params = new Object();
2918    params["name"] = name;
2919    params["value"] = value;
2920    params["state"] = state;
2921    sendAjaxEvent(sourceId, targetId, inputChangeEvent, params);
2922}
2923
2924function sendInputCompleteEvent(sourceId, targetId, name, value)
2925{
2926    var params = new Object();
2927    params["name"] = name;
2928    params["value"] = value;
2929    sendAjaxEvent(sourceId, targetId, inputCompleteEvent, params);
2930}
2931
2932function sendUserElementEvent(sourceId, params)
2933{
2934    sendAjaxEvent(sourceId, sourceId, userElementEvent, params);
2935}
2936
2937function sendClientDataEvent(params)
2938{
2939    if (oorian.dom.isDefined(params) === false)
2940    {
2941        params = new Object();
2942    }
2943
2944    params["pageid"] = document.head.id;
2945    params["event"] = clientDataEvent;
2946    sendAjaxEvent(0, 0, clientDataEvent, params);
2947}
2948
2949function sendStyleSyncEvent(elements)
2950{
2951    var params = new Object();
2952    
2953    if (Array.isArray(elements))
2954    {
2955        for (var i=0; i<elements.length; i++)
2956        {
2957            var element = elements[i];
2958            params[element.id] = element.style.cssText;
2959        }
2960    }
2961    else if (typeof elements === 'object')
2962    {
2963        params[elements.id] = elements.style.cssText;
2964    }
2965    else
2966    {
2967        
2968    }
2969
2970    sendAjaxEvent(0, 0, styleSyncEvent, params);
2971}
2972
2973function sendAjaxUserEvent(params)
2974{
2975    if (oorian.dom.isDefined(params) === false)
2976    {
2977        params = new Object();
2978    }
2979
2980    params["pageid"] = document.head.id;
2981    
2982    var command = getContextPath() + "/OorianAjaxEventHandler";
2983    sendAjaxPostRequest(command, params, processElementResponse);
2984   
2985}
2986
2987function sendWebSocketUserEvent(params)
2988{
2989    if (oorian.dom.isDefined(params) === false)
2990    {
2991        params = new Object();
2992    }
2993
2994    params["pageid"] = document.head.id;
2995    oorian.ws.sendMessage(params);
2996}
2997
2998function sendAjaxEvent(sourceId, targetId, event, params)
2999{    
3000    if (oorian.dom.isDefined(params) === false)
3001    {
3002        params = new Object();
3003    }
3004
3005    params["pageid"] = document.head.id;
3006    params["sourceid"] = sourceId;
3007    params["targetid"] = targetId;
3008    params["event"] = event;
3009    
3010    var command = getContextPath() + "/OorianAjaxEventHandler";
3011    sendAjaxPostRequest(command, params, processElementResponse);
3012}
3013
3014function sendWebSocketEvent(sourceId, targetId, event, params)
3015{    
3016    if (oorian.dom.isDefined(params) === false)
3017    {
3018        params = new Object();
3019    }
3020
3021    params["pageid"] = document.head.id;
3022    params["sourceid"] = sourceId;
3023    params["targetid"] = targetId;
3024    params["event"] = event;
3025    
3026    oorian.ws.sendMessage(params);
3027}
3028
3029
3030var _connectionErrorShowing = false;
3031
3032function _showConnectionError()
3033{
3034    if (_connectionErrorShowing) return;
3035    _connectionErrorShowing = true;
3036
3037    var overlay = document.createElement("div");
3038    overlay.id = "oorian-connection-error";
3039    overlay.style.cssText = "position:fixed;top:0;left:0;right:0;bottom:0;z-index:999999;background:rgba(0,0,0,0.6);display:flex;align-items:center;justify-content:center;";
3040
3041    var dialog = document.createElement("div");
3042    dialog.style.cssText = "background:#fff;border-radius:8px;padding:32px 40px;max-width:440px;text-align:center;box-shadow:0 4px 24px rgba(0,0,0,0.4);font-family:sans-serif;";
3043
3044    var icon = document.createElement("div");
3045    icon.style.cssText = "font-size:48px;margin-bottom:16px;";
3046    icon.textContent = "\u26A0";
3047
3048    var title = document.createElement("div");
3049    title.style.cssText = "font-size:18px;font-weight:bold;color:#333;margin-bottom:12px;";
3050    title.textContent = "Connection Lost";
3051
3052    var message = document.createElement("div");
3053    message.style.cssText = "font-size:14px;color:#666;margin-bottom:24px;line-height:1.5;";
3054    message.textContent = "The server is not responding. Any changes you make will not be saved. Please check your connection and reload the page.";
3055
3056    var button = document.createElement("button");
3057    button.style.cssText = "background:#d32f2f;color:#fff;border:none;border-radius:4px;padding:10px 28px;font-size:14px;font-weight:bold;cursor:pointer;line-height:1;display:inline-flex;align-items:center;";
3058    button.textContent = "Reload Page";
3059    button.onclick = function() { location.reload(); };
3060
3061    dialog.appendChild(icon);
3062    dialog.appendChild(title);
3063    dialog.appendChild(message);
3064    dialog.appendChild(button);
3065    overlay.appendChild(dialog);
3066    document.body.appendChild(overlay);
3067}
3068
3069function _clearConnectionError()
3070{
3071    if (!_connectionErrorShowing) return;
3072    _connectionErrorShowing = false;
3073
3074    var overlay = document.getElementById("oorian-connection-error");
3075    if (overlay && overlay.parentNode) overlay.parentNode.removeChild(overlay);
3076}
3077
3078// Only surface the Connection Lost dialog when the browser truly could not
3079// reach the server. status === 0 means no response was received (network
3080// down, server unreachable, DNS/CORS failure). "timeout" means the request
3081// never completed. Aborts (navigation), HTTP error responses, and parse
3082// errors are ignored — they aren't connection problems.
3083function _handleAjaxError(jqXHR, textStatus)
3084{
3085    if (textStatus === "abort") return;
3086    if (jqXHR.status === 0 || textStatus === "timeout") _showConnectionError();
3087}
3088
3089function sendAjaxGetRequest(action, callback)
3090{
3091  $.ajax({
3092         type:"GET",
3093         url: action,
3094         contentType: "application/x-www-form-urlencoded;charset=utf-8",
3095         success: callback,
3096         error: _handleAjaxError
3097     });
3098}
3099
3100function sendAjaxPostRequest(action, parameters, callback)
3101{
3102  $.ajax({
3103         type:"POST",
3104         url: action,
3105         contentType: "application/x-www-form-urlencoded;charset=utf-8",
3106         data: parameters,
3107         success: callback,
3108         error: _handleAjaxError
3109     });
3110}
3111
3112function sendAjaxDataRequest(action, parameters, callback)
3113{
3114  $.ajax({
3115         type:"POST",
3116         url: action,
3117         contentType: false,
3118         //contentType: "multipart/form-data",
3119         processData: false,
3120         data: parameters,
3121         success: callback,
3122         error: _handleAjaxError
3123     });
3124}
3125
3126var oorian = oorian || {};
3127
3128oorian.css = {};
3129
3130oorian.css.show = function(element)
3131{
3132    element.style.display = "initial";
3133    element.style.visibility = "visible";
3134};
3135
3136oorian.css.hide = function(element)
3137{
3138    element.style.display = "none";
3139    element.style.visibility = "hidden";
3140};
3141
3142oorian.css.replaceAttributes = function(element, newAttrs)
3143{
3144    if (element !== null)
3145    {
3146        if (webbrowser !== null && webbrowser !== "MSIE")        
3147        {
3148            var stopcount = 0;
3149            
3150            while (element.attributes.length > stopcount)
3151            {
3152                attrName = element.attributes[0 + stopcount].name.toLowerCase();
3153                
3154                if (attrName !== "style" && attrName !== "type" && attrName !== "value")
3155                {
3156                    $(element).removeAttr(attrName);
3157                }
3158                else
3159                {
3160                    stopcount++;
3161                }
3162            }
3163            
3164            for (i=0; i<newAttrs.length; i++)
3165            {
3166                var attrName = newAttrs[i].getAttribute("name");
3167                var cdata = newAttrs[i].childNodes[0];
3168
3169                if (cdata === null)
3170                {
3171                    cdata = html.childNodes[1];
3172                }
3173                
3174                if (cdata !== undefined)
3175                {
3176                    var attrVal = cdata.textContent;
3177
3178                    if (attrVal === undefined)
3179                    {
3180                        attrVal = cdata.text;
3181                    }
3182
3183                    if (attrName !== "style" && attrName !== "type")
3184                    {
3185                        $(element).attr(attrName, attrVal);
3186                    }
3187                }
3188            }            
3189        }
3190        else
3191        {
3192            var oldAttrs = element.attributes;
3193            
3194            $(element).removeAttributes();
3195            
3196            while (oldAttrs.length > 0)
3197            {
3198                 $(element).removeAttr(oldAttrs[0].name);
3199            }
3200            
3201            if (newAttrs !== undefined && newAttrs !== null)
3202            {
3203                for (i=0; i<newAttrs.length; i++)
3204                {
3205                    var attrName = newAttrs[i].getAttribute("name");
3206                    var attrVal = newAttrs[i].childNodes[0].data;
3207                    
3208                    if (attrName === "type")
3209                    {
3210                       element.type = attrVal;  
3211                    }
3212                    else
3213                    {
3214                         $(element).attr(attrName, attrVal);
3215                    }
3216                }
3217            }
3218        }
3219    }
3220};
3221
3222oorian.css.attributeSetContains = function(array, name)
3223{
3224    contains = false;
3225    
3226    for (var i=0; i<array.length && contains === false; i++)
3227    {
3228        if (array[i].attributes[0].value.toLowerCase() === name.toLowerCase())
3229        {
3230            contains = true;
3231        }
3232    }
3233    
3234    return contains;
3235};
3236
3237oorian.css.removeAttributes = function(element)
3238{
3239    if (element !== null)
3240    {
3241        var oldAttrs = element.attributes;
3242
3243        if (webbrowser !== null && webbrowser !== "MSIE")        
3244        {
3245            var style = null;
3246
3247            if (oldAttrs !== null)
3248            {
3249                while (oldAttrs.length > 0)
3250                {
3251                    element.removeAttribute(oldAttrs[0].name);
3252                }
3253
3254                if (style !== null)
3255                {
3256                     $(element).attr("style", style);
3257                }
3258            }
3259        }
3260        else
3261        {
3262            for (var i=0; i<oldAttrs.length; i++)
3263            {
3264                element.removeAttribute(oldAttrs[i].name);
3265            }
3266        }
3267    }
3268};
3269
3270oorian.css.mergeStyle = function(element, newStyle)
3271{
3272    if (newStyle !== null)
3273    {
3274        if (webbrowser === null || webbrowser === "MSIE")
3275        {
3276            var newAttrs = newStyle.split(";");
3277
3278            for (i=0; i<newAttrs.length; i++)
3279            {
3280                var attr = newAttrs[i].replace(/^\s+|\s+$/g, '');
3281
3282                if (attr !== "")
3283                {
3284                    prop = attr.split(":");
3285                    var p = prop[0].replace(/^\s+|\s+$/g, '');
3286                    var v = prop[1].replace(/^\s+|\s+$/g, '');
3287                    element.style[p] = v;
3288                }
3289            }
3290        }
3291        else
3292        {
3293            newAttrs = newStyle.split(";");
3294
3295            for (var i=0; i<newAttrs.length; i++)
3296            {
3297                if (newAttrs[i].trim().length > 0)
3298                {
3299                    var prop = newAttrs[i].split(":");
3300                    element.style[prop[0].trim()] = prop[1].trim();
3301                }
3302            }
3303        }
3304    }
3305};
3306 
3307oorian.css.copyStyleText = function(cssText, dest)
3308{
3309    if (webbrowser === null || webbrowser === "MSIE")
3310    {
3311        dest.style.cssText = cssText;
3312    }
3313    else
3314    {
3315        // Remove old attributes
3316        while (dest.style.length > 0)
3317        {
3318            dest.style.removeProperty(dest.style.item(0));
3319        }
3320        
3321        var attrs = cssText.split(";");
3322
3323        for (var i=0; i<attrs.length; i++)
3324        {
3325            if (attrs[i].trim().length > 0)
3326            {
3327                var attr = attrs[i];
3328                var name = attr.substring(0, attr.indexOf(":"));
3329                var value = attr.substring(attr.indexOf(":")+1);
3330                dest.style.setProperty(name.trim(), value.trim(), "");
3331            }
3332        }
3333    }
3334};
3335function resizeToWindowHeight(id, dy, otherElementId)
3336{
3337    var element = document.getElementById(id);
3338    var otherElement = null;
3339    
3340    if (otherElementId !== null)
3341    {
3342        otherElement = document.getElementById(otherElementId);
3343    }
3344    
3345    if (otherElement !== null)
3346    {
3347        $(element).outerHeight($(window).height() - parseInt(dy) - $(otherElement).height());
3348    }
3349    else
3350    {
3351        $(element).outerHeight($(window).height() - parseInt(dy));
3352    }
3353}
3354
3355function resizeToWindowWidth(id, dx)
3356{
3357    var element = document.getElementById(id);
3358    $(element).outerWidth($(window).width() - parseInt(dx));
3359}
3360
3361function setMinHeightToWindowHeight(id, dy)
3362{
3363    var element = document.getElementById(id);
3364    $(element).css("min-height", $(window).height() - parseInt(dy));
3365}
3366
3367function setMinWidthToWindowWidth(id, dx)
3368{
3369    var element = document.getElementById(id);
3370    $(element).css("min-width", $(window).width() - parseInt(dx));
3371}
3372
3373function setMaxHeightToWindowHeight(id, dy)
3374{
3375    var element = document.getElementById(id);
3376    $(element).css("max-height", $(window).height() - parseInt(dy));
3377}
3378
3379function setMaxWidthToWindowWidth(id, dx)
3380{
3381    var element = document.getElementById(id);
3382    $(element).css("max-width", $(window).width() - parseInt(dx));
3383}
3384
3385function makeSameSize(elementIds, match)
3386{
3387    var matchElement = document.getElementById(match);
3388    var width = matchElement.offsetWidth;
3389    var height = matchElement.offsetHeight;
3390    
3391    for (var i=0; i<elementIds.length; i++)
3392    {
3393        var element = document.getElementById(elementIds[i]);
3394        element.style.width = width + "px";
3395        element.style.height = height + "px";
3396    }
3397}
3398
3399function makeSameSizeMax(elementIds)
3400{
3401    var elements = new Array();
3402    var maxwidth = 0;
3403    var maxheight = 0;
3404    
3405    for (var i=0; i<elementIds.length; i++)
3406    {
3407        var element = document.getElementById(elementIds[i]);
3408        elements.push(element);
3409        
3410        if (element.offsetWidth > maxwidth)
3411        {
3412            maxwidth = element.offsetWidth;
3413        }
3414        
3415        if (element.offsetHeight > maxheight)
3416        {
3417            maxheight = element.offsetHeight;
3418        }
3419    }
3420    
3421    for (i=0; i<elements.length; i++)
3422    {
3423        elements[i].style.width = maxwidth + "px";
3424        elements[i].style.height = maxheight + "px";
3425    }
3426}
3427
3428function makeSameSizeMin(elementIds)
3429{
3430    var elements = new Array();
3431    
3432    var first = document.getElementById(elementIds[0]);
3433    
3434    var minwidth = first.offsetWidth;
3435    var minheight = first.offsetHeight;
3436    
3437    for (var i=1; i<elementIds.length; i++)
3438    {
3439        var element = document.getElementById(elementIds[i]);
3440        elements.push(element);
3441        
3442        if (element.offsetWidth < minwidth)
3443        {
3444            minwidth = element.offsetWidth;
3445        }
3446        
3447        if (element.offsetHeight < minheight)
3448        {
3449            minheight = element.offsetHeight;
3450        }
3451    }
3452    
3453    for (i=0; i<elements.length; i++)
3454    {
3455        elements[i].style.width = minwidth + "px";
3456        elements[i].style.height = minheight + "px";
3457    }
3458}
3459
3460function makeSameWidth(elementIds, match)
3461{
3462    var matchElement = document.getElementById(match);
3463    var width = matchElement.offsetWidth;
3464    
3465    for (var i=0; i<elementIds.length; i++)
3466    {
3467        var element = document.getElementById(elementIds[i]);
3468        element.style.width = width + "px";
3469    }
3470}
3471
3472function makeSameWidthMax(elementIds)
3473{
3474    var elements = new Array();
3475    var maxwidth = 0;
3476    
3477    for (var i=0; i<elementIds.length; i++)
3478    {
3479        var element = document.getElementById(elementIds[i]);
3480        elements.push(element);
3481        
3482        if (element.offsetWidth > maxwidth)
3483        {
3484            maxwidth = element.offsetWidth;
3485        }
3486    }
3487    
3488    for (i=0; i<elements.length; i++)
3489    {
3490        elements[i].style.width = maxwidth + "px";
3491    }
3492}
3493
3494function makeSameWidthMin(elementIds)
3495{
3496    var elements = new Array();
3497    
3498    var first = document.getElementById(elementIds[0]);
3499    
3500    var minwidth = first.offsetWidth;
3501    
3502    for (var i=1; i<elementIds.length; i++)
3503    {
3504        var element = document.getElementById(elementIds[i]);
3505        elements.push(element);
3506        
3507        if (element.offsetWidth < minwidth)
3508        {
3509            minwidth = element.offsetWidth;
3510        }
3511    }
3512    
3513    for (i=0; i<elements.length; i++)
3514    {
3515        elements[i].style.width = minwidth + "px";
3516    }
3517}
3518
3519function makeSameHeight(elementIds, match)
3520{
3521    var matchElement = document.getElementById(match);
3522    var height = matchElement.offsetHeight;
3523    
3524    for (var i=0; i<elementIds.length; i++)
3525    {
3526        var element = document.getElementById(elementIds[i]);
3527        element.style.height = height + "px";
3528    }
3529}
3530
3531function makeSameHeightMax(elementIds)
3532{
3533    var elements = new Array();
3534    var maxheight = 0;
3535    
3536    for (var i=0; i<elementIds.length; i++)
3537    {
3538        var element = document.getElementById(elementIds[i]);
3539        elements.push(element);
3540        
3541        if (element.offsetHeight > maxheight)
3542        {
3543            maxheight = element.offsetHeight;
3544        }
3545    }
3546    
3547    for (i=0; i<elements.length; i++)
3548    {
3549        elements[i].style.height = maxheight + "px";
3550    }
3551}
3552
3553function makeSameHeightMin(elementIds)
3554{
3555    var elements = new Array();
3556    
3557    var first = document.getElementById(elementIds[0]);
3558    
3559    var minheight = first.offsetHeight;
3560    
3561    for (var i=1; i<elementIds.length; i++)
3562    {
3563        var element = document.getElementById(elementIds[i]);
3564        elements.push(element);
3565        
3566        if (element.offsetHeight < minheight)
3567        {
3568            minheight = element.offsetHeight;
3569        }
3570    }
3571    
3572    for (i=0; i<elements.length; i++)
3573    {
3574        elements[i].style.height = minheight + "px";
3575    }
3576}
3577function processImage(image)
3578{
3579    if (hasValue(image.attributes["data-scale"]))
3580    {
3581        var scale = image.attributes["data-scale"].value;
3582        var parent = image.parentNode;
3583
3584        var w = $(image).outerWidth();
3585        var h = $(image).outerHeight();
3586
3587        if (w === 0) w = 1;
3588        if (h === 0) h = 1;
3589
3590        var r = w/h;
3591
3592        var pw = $(parent).width();
3593        var ph = $(parent).height();
3594        
3595        var wr = pw / w;
3596        var hr = ph / h;
3597
3598        var nw = pw;
3599        var nh = pw / r;
3600
3601        if (scale === "limit")
3602        {
3603            if (pw > w && ph > h)
3604            {
3605                nw = w;
3606                nh = h;
3607            }
3608            else
3609            {
3610                if (hr < wr)
3611                {
3612                    nh = ph;
3613                    nw = ph * r;
3614                }
3615            }
3616        }
3617        else if (scale === "fill")
3618        {
3619            if (w > pw && h >
3619 ph)
3620            {
3621                if (wr > hr)
3622                {
3623                    nw = pw;
3624                    nh = nw / r;
3625                }
3626                else
3627                {
3628                    nh = ph;
3629                    nw = nh * r;
3630                }
3631            }
3632            else if (w > pw)
3633            {
3634                nh = ph;
3635                nw = nh * r;
3636            }
3637            else if (h > ph)
3638            {
3639                nw = pw;
3640                nh = nw / r;
3641            }
3642        }
3643        else if (scale === "fit")
3644        {
3645            if (hr < wr)
3646            {
3647                nh = ph;
3648                nw = ph * r;
3649            }
3650        }
3651        else if (scale === "auto")
3652        {
3653            if ((w >= h && pw >= ph) || (h > w && ph > pw))
3654            {
3655                if (w >= h)
3656                {
3657                    nw = ph * r;
3658                    nh = ph;
3659                }
3660                else
3661                {
3662                    nw = pw;
3663                    nh = pw / r;
3664                }
3665            }
3666            else
3667            {
3668                if (hr < wr)
3669                {
3670                    nh = ph;
3671                    nw = ph * r;
3672                }
3673            }
3674        }
3675
3676        $(image).width(nw);
3677        $(image).height(nh);
3678        $(image).css("display", "");
3679    }
3680}
3681
3682
3683
3684// This file contains utility methods that are not directly implemented by javascript.
3685// It is preferrable to add methods here that may wrap JQuery utility methods, instead 
3686// of using JQuery utility methods directly in code.
3687
3688function getContextPath()
3689{
3690    return document.head.getAttribute("data-contextpath");
3691}
3692
3693function getChildren(parent, recursive)
3694{
3695    var results = new Array();
3696    var children = parent.children;
3697
3698    for (var i=0; i<children.length; i++)
3699    {
3700        results.push(children[i]);
3701        
3702        if (recursive === true)
3703        {
3704            var grandChildren = getChildren(children[i], true);
3705        
3706            for (var j=0; j<grandChildren.length; j++)
3707            {
3708                results.push(grandChildren[j]);
3709            }
3710        }
3711    }
3712    
3713    return results;
3714}
3715
3716function getChildrenByTag(parent, tag, recursive)
3717{
3718    var results = new Array();
3719    var children = parent.children;
3720
3721    for (var i=0; i<children.length; i++)
3722    {
3723        if (strcmp(children[i].tagName, tag) === 0)
3724        {
3725            results.push(children[i]);
3726        }
3727        
3728        if (recursive === true)
3729        {
3730            var grandChildren = getChildren(children[i], true);
3731        
3732            for (var j=0; j<grandChildren.length; j++)
3733            {
3734                if (strcmp(grandChildren[j].tagName, tag) === 0)
3735                {
3736                    results.push(grandChildren[j]);
3737                }
3738            }
3739        }
3740    }
3741    
3742    return results;
3743    
3744}
3745
3746function getChildrenByAttribute(parent, attr, recursive)
3747{
3748    var results = new Array();
3749    var children = parent.children;
3750
3751    for (var i=0; i<children.length; i++)
3752    {
3753        if (children[i].getAttribute(attr) !== null)
3754        {
3755            results.push(children[i]);
3756        }
3757        
3758        if (recursive === true)
3759        {
3760            var grandChildren = getChildren(children[i], true);
3761        
3762            for (var j=0; j<grandChildren.length; j++)
3763            {
3764                if (grandChildren[j].getAttribute(attr) !== null)
3765                {
3766                    results.push(grandChildren[j]);
3767                }
3768            }
3769        }
3770    }
3771    
3772    return results;
3773}
3774
3775function getChildrenByAttributeValue(parent, attr, value, recursive)
3776{
3777    var results = new Array();
3778    var children = parent.children;
3779
3780    for (var i=0; i<children.length; i++)
3781    {
3782        if (strcmp(children[i].getAttribute(attr), value) === 0)
3783        {
3784            results.push(children[i]);
3785        }
3786        
3787        if (recursive === true)
3788        {
3789            var grandChildren = getChildren(children[i], true);
3790        
3791            for (var j=0; j<grandChildren.length; j++)
3792            {
3793                if (strcmp(grandChildren[j].getAttribute(attr), value) === 0)
3794                {
3795                    results.push(grandChildren[j]);
3796                }
3797            }
3798        }
3799    }
3800    
3801    return results;
3802}
3803
3804function isChildOf(child, parent)
3805{
3806    var result = false;
3807    
3808    if (parent !== null && parent !== undefined)
3809    {
3810        var children = parent.children;
3811
3812        for (var i=0; i<children.length; i++)
3813        {
3814            if (children[i].id === child.id)
3815            {
3816                result = true;
3817                break;
3818            }
3819            else
3820            {
3821                result = isChildOf(child, children[i]);
3822                
3823                if (result === true)
3824                {
3825                    break;
3826                }
3827            }
3828        }
3829    }
3830    
3831    return result;
3832}
3833
3834
3835
3836function scrollToTop(parentId, targetId)
3837{
3838    var target = document.getElementById(targetId);
3839    var parent = document.getElementById(parentId);
3840    parent.scrollTop = parent.scrollTop + target.getBoundingClientRect().top - parent.getBoundingClientRect().top;
3841}
3842
3843function checkScreenSize()
3844{
3845    // check to see if the size of the document or 
3846    // the size of the window has changed.
3847    if ((screenWidth !== undefined && screenWidth !== getScreenWidth()) || 
3848        (screenHeight !== undefined && screenHeight !== getScreenHeight()))
3849    {
3850        screenWidth = getScreenWidth();
3851        screenHeight = getScreenHeight();
3852        winWidth = getWindowWidth();
3853        winHeight = getWindowHeight();
3854        
3855        var params = new Object();
3856
3857        params["screenwidth"] = screenWidth;
3858        params["screenheight"] = screenHeight;
3859        params["orientation"] = 0;
3860        params["winwidth"] = winWidth;
3861        params["winheight"] = winHeight;
3862
3863        sendAjaxEvent(null, null, screenSizeEvent, params);
3864    }
3865}
3866
3867var windowResizeTimer;
3868
3869function checkWindowSize()
3870{
3871    // check to see if the size of the document or 
3872    // the size of the window has changed.
3873    if (winWidth !== getWindowWidth() || winHeight !== getWindowHeight())
3874    {
3875        window.clearTimeout(windowResizeTimer);
3876        
3877        winWidth = getWindowWidth();
3878        winHeight = getWindowHeight();
3879        
3880        windowResizeTimer = setTimeout(sendWindowSizeEvent, 50);
3881    }
3882}
3883
3884function sendWindowSizeEvent()
3885{
3886    var params = new Object();
3887
3888    screenWidth = getScreenWidth();
3889    screenHeight = getScreenHeight();
3890    winWidth = getWindowWidth();
3891    winHeight = getWindowHeight();
3892
3893    params["screenwidth"] = screenWidth;
3894    params["screenheight"] = screenHeight;
3895    params["orientation"] = 0;
3896    params["winwidth"] = winWidth;
3897    params["winheight"] = winHeight;
3898
3899    sendAjaxEvent(null, null, windowSizeEvent, params);
3900}
3901
3902function checkDocumentSize()
3903{
3904    // check to see if the size of the document or 
3905    // the size of the window has changed.
3906    if (docWidth !== getDocumentWidth() || docHeight !== getDocumentHeight())
3907    {
3908        docWidth = getDocumentWidth();
3909        docHeight = getDocumentHeight();
3910        
3911        var params = new Object();
3912
3913        params["docwidth"] = docWidth;
3914        params["docheight"] = docHeight;
3915    }
3916}
3917
3918function getScreenWidth()
3919{
3920    return screen.width;
3921}
3922
3923function getScreenHeight()
3924{
3925    return screen.height;    
3926}
3927
3928function getWindowWidth()
3929{
3930    return $(window).width();
3931}
3932
3933function getWindowHeight()
3934{
3935    return $(window).height();    
3936}
3937
3938function getDocumentWidth()
3939{
3940    return $(document).width();
3941}
3942
3943function getDocumentHeight()
3944{
3945    return $(document).height();
3946}
3947
3948function getDeviceOrientation()
3949{
3950    var orientation = "landscape";
3951    
3952    if (getWindowWidth() > getWindowHeight()) 
3953    {
3954       orientation = "portrait";
3955    }
3956    
3957    return orientation;
3958}
3959
3960function trim(text)
3961{
3962    return text.replace(/^\s+|\s+$/g, '');
3963}
3964
3965function hasValue(variable)
3966{
3967    return (variable !== null && variable !== undefined);
3968}
3969
3970function isTrue(variable)
3971{
3972    return (variable !== null && variable !== undefined && variable === "true");
3973}
3974
3975function strcmp(a, b) 
3976{
3977    if (a.toString().toLowerCase() < b.toString().toLowerCase()) return -1;
3978    if (a.toString().toLowerCase() > b.toString().toLowerCase()) return 1;
3979    return 0;
3980}
3981
3982function isEmpty(str) 
3983{
3984    return (!str || /^\s*$/.test(str));
3985}
3986
3987function htmlEncode(value)
3988{
3989  return $('<div/>').text(value).html();
3990}
3991
3992function htmlDecode(value)
3993{
3994  return $('<div/>').html(value).text();
3995}
3996var oorian = oorian || {};
3997
3998oorian.utils = {};
3999
4000oorian.utils.getKey = function(event)
4001{
4002    if (!event) event = window.event; 
4003    
4004    return event.keyCode;
4005
4006//    if (event.key !== undefined) 
4007//    {
4008//        return event.key;
4009//    } 
4010//    else if (event.keyIdentifier !== undefined) 
4011//    {
4012//        return event.keyIdentifier;
4013//    } 
4014//    else if (event.keyCode !== undefined) 
4015//    {
4016//        return event.keyCode;
4017//    }    
4018};
4019
4020oorian.utils.navigateToAfterDelay = function(url, msecs)
4021{
4022    setTimeout(function(){document.location=url;}, msecs);
4023};
4024
4025oorian.utils.navigateBackAfterDelay = function(msecs)
4026{
4027    setTimeout(function(){history.back();}, msecs);
4028};
4029
4030oorian.utils.setCookie = function(cookieName, cookieValue) 
4031{
4032    var date = new Date();
4033    date.setTime(date.getTime() + (60 * 60 * 1000));
4034    var expires = "expires=" + date.toUTCString();
4035    document.cookie = cookieName + "=" + cookieValue + "; " + expires;
4036};
4037
4038oorian.utils.getCookie = function(cookieName) 
4039{
4040    var name = cookieName + "=";
4041    var cookies = document.cookie.split(';');
4042
4043    for(var i=0; i<cookies.length; i++) 
4044    {
4045        var cookie = trim(cookies[i]);
4046        
4047        if (cookie.indexOf(name) === 0) 
4048        {
4049          return cookie.substring(name.length,cookie.length);
4050      }
4051    }    
4052    return "";
4053};
4054
4055oorian.utils.onMouseOverChangeStyle = function(id, style)
4056{
4057    var element = document.getElementById(id);
4058    
4059    if (element !== null)
4060    {
4061        oorian.css.mergeStyle(element, style);
4062    }
4063};
4064
4065oorian.utils.onMouseOverChangeClass = function(id, cls)
4066{
4067    var element = document.getElementById(id);
4068    
4069    if (element !== null)
4070    {
4071        element.class = cls;
4072    }
4073};
4074
4075oorian.utils.onMouseOutChangeStyle = function(id, style)
4076{
4077    var element = document.getElementById(id);
4078    
4079    if (element !== null)
4080    {
4081        oorian.css.mergeStyle(element, style);
4082    }
4083};
4084
4085oorian.utils.onMouseOutChangeClass = function(id, cls)
4086{
4087    var element = document.getElementById(id);
4088    
4089    if (element !== null)
4090    {
4091        element.class = cls;
4092    }
4093};
4094
4095oorian.utils.onMouseOverShow = function(id)
4096{
4097    var element = document.getElementById(id);
4098    
4099    if (element !== null)
4100    {
4101        element.style.setProperty("visibility", "visible");
4102    }
4103};
4104
4105oorian.utils.onMouseOutHide = function(id)
4106{
4107    var element = document.getElementById(id);
4108    
4109    if (element !== null)
4110    {
4111        element.style.setProperty("visibility", "hidden");
4112    }
4113};
4114
4115
4116function onKeyPressedTab(target)
4117{
4118    //add all elements we want to include in our selection
4119    var focussableElements = 'a:not([disabled]), button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])';
4120
4121    if (document.activeElement && document.activeElement.form) 
4122    {
4123        var focussable = Array.prototype.filter.call(document.activeElement.form.querySelectorAll(focussableElements),
4124        function (element) {
4125            //check for visibility while always include the current activeElement 
4126            return element.offsetWidth > 0 || element.offsetHeight > 0 || element === document.activeElement
4127        });
4128    
4129        var index = focussable.indexOf(document.activeElement);
4130        
4131        focussable[index + 1].focus();
4132    }
4133}
4134
4135function checkUrl()
4136{
4137    var currUrl = self.document.location.href;
4138    
4139    if (lastUrl !== currUrl)
4140    {
4141        var anchor = self.document.location.hash;
4142
4143        if (anchor.length > 0)
4144        {
4145            anchor = anchor.substr(1);
4146            processAnchor(anchor);
4147        }
4148        else if (lastUrl !== null && lastUrl.indexOf(currUrl) === 0) 
4149        {
4150            //sendAjaxEvent(anchor, smartNavEvent, null);            
4151        }
4152        
4153        lastUrl = self.document.location.href;
4154    }
4155    
4156    urlTimer = setTimeout(checkUrl, 100);
4157}
4158
4159function processHash()
4160{
4161    var hashChanged = false;
4162    
4163    var hash = self.document.location.hash;
4164
4165    if (hash.length > 0)
4166    {
4167        handleHashChange();
4168        hashChanged = true;
4169    }
4170    
4171    return hashChanged;
4172}
4173
4174function handleHashChange()
4175{
4176    var hash = self.document.location.hash;
4177    var params = new Object();
4178    params["hash"] = hash;
4179        
4180    if (hash.length > 0)
4181    {
4182        hash = hash.substr(1);
4183        
4184        if (lastHashUpdate === null || hash !== lastHashUpdate)
4185        {
4186            sendAjaxEvent(null, null, hashChangeEvent, params);
4187        }
4188        else
4189        {
4190            lastHashUpdate = null;
4191        }
4192    }
4193    else
4194    {
4195        sendAjaxEvent(null, null, hashChangeEvent, params);
4196    }
4197}
4198
4199
4200function submitForm(formId)
4201{
4202    var form = document.getElementById(formId);
4203    
4204    if (form !== null)
4205    {
4206        form.submit();
4207    }
4208}
4209
4210function onFormSubmit(form, event)
4211{
4212    var params = new Object();
4213    var formData = $(form).serialize();
4214    var pairs = formData.split("&");
4215
4216    for(var i=0; i<pairs.length; i++)
4217    {
4218        var pair = pairs[i].split("=");
4219        var key = pair[0];
4220        var value = pair[1];
4221        
4222        
4223        if (params[key] === undefined)
4224        {
4225            params[key] = new Array();
4226        }
4227
4228        params[key].push(value);
4229    }    
4230    
4231    // Stops browser from submitting form
4232    if (event !== undefined)
4233    {
4234        event.preventDefault();
4235    }
4236
4237    sendAjaxEvent(form.id, form.id, formSubmit, params);
4238    
4239    return false;
4240}
4241
4242
4243function filesSelected(fileInput)
4244{
4245    var files = fileInput.files;
4246    var id = $(fileInput).attr("id");
4247
4248    var params = new Object();
4249    params["files"] = new Array();
4250
4251    for (var i=0; i<files.length; i++)
4252    {
4253        params["files"].push(files[i].name);
4254    }
4255
4256    sendAjaxEvent(id, id, fileSelectEvent, params);
4257}
4258
4259function uploadFiles(fileInputId)
4260{
4261    var fileInput = document.getElementById(fileInputId);
4262    var files = fileInput.files;
4263    var formData = new FormData();
4264    
4265    formData.append("pageid", document.head.id);
4266    formData.append("eventid", fileUploadEvent);
4267    formData.append("sourceid", fileInputId);
4268    formData.append("targetid", fileInputId);
4269
4270    for (var i=0; i<files.length; i++)
4271    {
4272         formData.append("upload_file", files[i]);
4273    }
4274    
4275    filesSelected(fileInput);
4276
4277    $.ajax({
4278           type:"POST",
4279           url: "/OorianFileUploadHandler",
4280           contentType: false,
4281           processData: false,
4282           cache: false,
4283           data: formData,
4284           success: processElementResponse
4285    });    
4286}
4287
4288function uploadFileFormData(formData)
4289{
4290    $.ajax({
4291           type:"POST",
4292           url: "/OorianFileUploadHandler",
4293           contentType: false,
4294           processData: false,
4295           cache: false,
4296           data: formData,
4297           success: processElementResponse
4298       });    
4299}
4300
4301/**********************************************************************************************************************
4302 *  Copyright (c) 2018
4303 *  Corvus Engineering, LLC
4304 *  All Rights Reserved
4305 *
4306 *  This file is the intellectual property of:
4307 *   Corvus Engineering, LLC
4308 *   4206 Buckskin Lake Dr.
4309 *   Ellicott City, Maryland 21042
4310 *
4311 *   [email protected]
4312 *   www.corvusengineering.com
4313 *
4314 *  Use is subject to licensing agreement.
4315 *
4316 **********************************************************************************************************************/
4317var lastPopup;
4318
4319function showPopup(popupId, location, clientX, offsetX, clientY, offsetY)
4320{
4321    if (lastPopup !== null)
4322    {
4323        $(lastPopup).hide();
4324    }
4325    
4326    var popup = document.getElementById(popupId);
4327    
4328    if (popup !== null)
4329    {
4330        lastPopup = popup;
4331        
4332        var left;
4333        var top;
4334        
4335        if (location === "right")
4336        {
4337            left = clientX + offsetX;
4338            top = clientY - $(popup).outerHeight(true)/2;
4339        }
4340        else if (location === "left")
4341        {
4342            left = clientX - offsetX - $(popup).outerWidth(true);
4343            top = clientY - offsetY - $(popup).outerHeight(true)/2;
4344        }
4345        else if (location === "above")
4346        {
4347            left = clientX - $(popup).outerWidth(true)/2;
4348            top = clientY - offsetY - $(popup).outerHeight(true);
4349        }
4350        else if (location === "below")
4351        {
4352            left = clientX - $(popup).outerWidth(true)/2;
4353            top = clientY + offsetY;
4354        }
4355        else if (location === "pagecenter")
4356        {
4357            
4358        }
4359
4360        if (left < 0)
4361        {
4362            left = clientX + offsetX;
4363        }
4364        else 
4365        {
4366            // if popup is off the screen horz, switch
4367            var right = left + $(popup).outerWidth(true);
4368
4369            if (right > $(window).outerWidth())
4370            {
4371                left = clientX - offsetX - $(popup).outerWidth(true);
4372            }
4373        }
4374
4375        if (top < 0)
4376        {
4377            top = clientY + offsetY;
4378        }
4379        else
4380        {
4381            // if popup is off the screen vert, switch
4382            var bottom = top + $(popup).outerHeight(true);
4383
4384            if (bottom > $(window).height())
4385            {
4386                top = $(window).height() - $(popup).outerHeight(true) - 25;
4387            }
4388        }
4389
4390        $(body).append(popup);
4391        $(popup).css("position", "absolute");
4392        $(popup).css("left", left);
4393        $(popup).css("top", top);
4394        $(popup).show();
4395    }
4396}
4397
4398function handlePopupMouseOut(event, target)
4399{
4400    if (target !== undefined)
4401    {
4402        var popupId = $(target).attr("data-popup");
4403
4404        if (hasValue(popupId))
4405        {
4406            var popup = document.getElementById(popupId);
4407
4408            if (hasValue(popup))
4409            {
4410                delayHideTimer = setTimeout(function(){delayHide(popup);}, 100);
4411            }
4412        }
4413        else
4414        {
4415            // This allows us to check whether or not the mouse is
4416            // over the popup itself after it has left the popup launcher.
4417            // Checking the mouse coords seems to be the only effective
4418            // way of doing this.
4419            var mouseX = event.pageX;
4420            var mouseY = event.pageY;
4421
4422            if (mouseX <= $(target).offset().left || 
4423                mouseX >= ($(target).offset().left + $(target).outerWidth(true)) ||
4424                mouseY <= $(target).offset().top || 
4425                mouseY >= ($(target).offset().top + $(target).outerHeight(true)))
4426            {
4427                $(target).hide();
4428            }
4429        }
4430    }
4431}
4432
4433
4434var draggedItem;
4435var origNextSibling;
4436var origParent;
4437var droppedCompleted;
4438
4439
4440function handleOnDragStart(event)
4441{
4442    droppedCompleted = false;
4443    draggedItem = event.target;
4444    origNextSibling = draggedItem.nextSibling;
4445    origParent = draggedItem.parentNode;
4446    
4447    event.dataTransfer.setData("draggedItem", draggedItem.id);
4448        
4449    let target = document.getElementById(event.target.id);
4450    
4451    if (isTrue($(target).attr("data-generateDragStartEvent")))
4452    {
4453        sendAjaxEvent(target.id, target.id, dragStartEvent, null);
4454    }
4455}
4456
4457function handleOnDragExit(event)
4458{
4459}
4460
4461function handleOnDragEnd(event)
4462{
4463    if (droppedCompleted === false)
4464    {
4465        origParent.insertBefore(draggedItem, origNextSibling);
4466    }
4467
4468    let target = document.getElementById(event.target.id);
4469    
4470    if (isTrue($(target).attr("data-generateDragEndEvent")))
4471    {
4472        sendAjaxEvent(target.id, target.id, dragEndEvent, null);
4473    }
4474
4475    draggedItem = null;
4476    origNextSibling = null;
4477    origParent = null;
4478}
4479
4480function handleOnDragEnter(event)
4481{
4482    let target = document.getElementById(event.target.id);
4483    
4484    if (isTrue($(target).attr("data-generateDragEnterEvent")))
4485    {
4486        sendAjaxEvent(target.id, target.id, dragEnterEvent, null);
4487    }
4488}
4489
4490function handleOnDragLeave(event)
4491{
4492    let target = document.getElementById(event.target.id);
4493    
4494    if (isTrue($(target).attr("data-generateDragLeaveEvent")))
4495    {
4496        sendAjaxEvent(target.id, target.id, dragLeaveEvent, null);
4497    }
4498}
4499
4500function handleOnDragOver(event, dropTarget)
4501{
4502    let overElement = document.getElementById(event.target.id);
4503
4504    if (oorian.dom.isDefined(draggedItem))
4505    {
4506        while (overElement !== dropTarget && overElement.parentNode !== null && overElement.parentNode !== dropTarget)
4507        {
4508            overElement = overElement.parentNode;
4509        }
4510        
4511        if (overElement === dropTarget)
4512        {
4513            // First determine if there is an element to the right of this element, if there is, insert before that element.
4514            // If not, determine if there is an element below this element, if so insert before that element.
4515            let result = getClosestElementToRight(dropTarget, event.x, event.y);
4516            
4517            if (result !== null)
4518            {
4519                dropTarget.insertBefore(draggedItem, result);
4520            }
4521            else
4522            {
4523                result = getClosestElementBelow(dropTarget, event.x, event.y);
4524
4525                if (result !== null)
4526                {
4527                    dropTarget.insertBefore(draggedItem, result);
4528                }
4529                else
4530                {
4531                    dropTarget.appendChild(draggedItem);
4532                }
4533            }            
4534        }
4535        else if (overElement !== null)
4536        {
4537            let rect = overElement.getBoundingClientRect();
4538            
4539            let y1 = draggedItem.getBoundingClientRect().y;
4540            let y2 = rect.y + rect.height/2;
4541            
4542            if (y1 > y2)
4543            {
4544                dropTarget.insertBefore(draggedItem, overElement);
4545            }
4546            else
4547            {
4548                dropTarget.insertBefore(draggedItem, overElement.nextSibling);
4549            }
4550        }
4551
4552        params = new Object();
4553        params["payloadid"] = draggedItem.id;
4554
4555        if (isTrue($(overElement).attr("data-generateDragOverEvent")))
4556        {
4557            sendAjaxEvent(overElement.id, overElement.id, dragOverEvent, params);
4558        }
4559    }
4560
4561    event.preventDefault();
4562    event.stopPropagation();
4563}
4564
4565function handleOnDrop(event, dropTarget)
4566{
4567    droppedCompleted = true;
4568    
4569    event.preventDefault();
4570    event.stopPropagation();
4571
4572    if (event.dataTransfer.files.length > 0)
4573    {
4574        uploadDroppedFiles(event.dataTransfer.files, dropTarget);
4575    }
4576    else
4577    {
4578        let droppedElementId = event.dataTransfer.getData("draggedItem");        
4579        let newParent = dropTarget;
4580
4581        params = new Object();
4582        params["droppedElementId"] = droppedElementId;
4583        params["oldParentId"] = origParent.id;
4584        params["newParentId"] = newParent.id;
4585
4586        let oldChildIds = new Array();
4587
4588        for (i=0; i<origParent.childNodes.length; i++)
4589        {
4590            oldChildIds[i] = origParent.childNodes[i].id;
4591        }
4592
4593        params["oldParentChildIds"] = oldChildIds;
4594
4595        let newChildIds = new Array();
4596
4597        for (i=0; i<newParent.childNodes.length; i++)
4598        {
4599            newChildIds[i] = newParent.childNodes[i].id;
4600        }
4601
4602        params["newParentChildIds"] = newChildIds;
4603
4604        if (isTrue($(dropTarget).attr("data-generateDropEvent")))
4605        {
4606            sendAjaxEvent(dropTarget.id, dropTarget.id, dropEvent, params);
4607        }
4608    }
4609}
4610
4611function uploadDroppedFiles(files, dropTarget)
4612{
4613    var formData = new FormData();
4614    
4615    formData.append("pageid", document.head.id);
4616    formData.append("eventid", fileUploadEvent);
4617    formData.append("sourceid", dropTarget.id);
4618    formData.append("targetid", dropTarget.id);
4619
4620    for (var i=0; i<files.length; i++)
4621    {
4622         formData.append("upload_file", files[i]);
4623    }
4624    
4625    $.ajax({
4626           type:"POST",
4627           url: "/OorianFileUploadHandler",
4628           contentType: false,
4629           processData: false,
4630           cache: false,
4631           data: formData,
4632           success: processElementResponse
4633    });        
4634}
4635
4636function getClosestElementToRight(container, x, y)
4637{
4638    let children = container.childNodes;
4639    
4640    let result = null;
4641    
4642    for (i=0; i<children.length; i++)
4643    {
4644        let child = children[i];
4645        
4646        childX = child.getBoundingClientRect().x;
4647        childY1 = child.getBoundingClientRect().y;
4648        childY2 = childY1 + child.getBoundingClientRect().height;;
4649        
4650        if (childX > x && y >= childY1 && y <= childY2)
4651        {
4652            if (result === null || childX < result.getBoundingClientRect().x)
4653            {
4654                result = child;
4655            }
4656        }
4657    }
4658    
4659    return result;
4660}
4661
4662function getClosestElementBelow(container, x, y)
4663{
4664    let children = container.childNodes;
4665    
4666    let result = null;
4667    
4668    for (i=0; i<children.length; i++)
4669    {
4670        let child = children[i];
4671        
4672        childY = child.getBoundingClientRect().y;
4673        childX1 = child.getBoundingClientRect().x;
4674        childX2 = childX1 + child.getBoundingClientRect().width;
4675        
4676        if (childY > y && x >= childX1 && x <= childX2)
4677        {
4678            if (result === null || childY < result.getBoundingClientRect().y)
4679            {
4680                result = child;
4681            }
4682        }
4683    }
4684    
4685    return result;
4686}
4687
4688/**********************************************************************************************************************
4689 *  Copyright (c) 2020
4690 *  Corvus Engineering, LLC
4691 *  All Rights Reserved
4692 *
4693 *  This file is the intellectual property of:
4694 *   Corvus Engineering, LLC
4695 *   4206 Buckskin Lake Dr.
4696 *   Ellicott City, Maryland 21042
4697 *
4698 *   [email protected]
4699 *   www.corvusengineering.com
4700 *
4701 *  Use is subject to licensing agreement.
4702 *
4703 **********************************************************************************************************************/
4704var oorian = oorian || {};
4705
4706oorian.sse = {};
4707
4708oorian.sse.init = function()
4709{
4710    var pageId = document.head.id;
4711    var evtSource = new EventSource("/OorianSse?page=" + pageId);
4712    evtSource.onopen = function(event) {console.log("Opened")};
4713    evtSource.onerror = function(event) {console.log("Error")};
4714    evtSource.addEventListener("oorian.ping", oorian.sse.handlePing(event));
4715    evtSource.addEventListener("oorian.update", oorian.sse.handleUpdate(event));
4716    
4717
4718};
4719
4720oorian.sse.handlePing = function(event)
4721{
4722    console.log("Ping");
4723};
4724
4725oorian.sse.handleUpdate = function(event)
4726{
4727    console.log("Update");
4728};
4729
4730/**********************************************************************************************************************
4731 *  Copyright (c) 2020
4732 *  Corvus Engineering, LLC
4733 *  All Rights Reserved
4734 *
4735 *  This file is the intellectual property of:
4736 *   Corvus Engineering, LLC
4737 *   4206 Buckskin Lake Dr.
4738 *   Ellicott City, Maryland 21042
4739 *
4740 *   [email protected]
4741 *   www.corvusengineering.com
4742 *
4743 *  Use is subject to licensing agreement.
4744 *
4745 **********************************************************************************************************************/
4746var oorian = oorian || {};
4747
4748oorian.ws = {};
4749
4750oorian.ws.socket;
4751
4752oorian.ws.connect = function(init)
4753{
4754    oorian.ws.socket = new WebSocket(location.origin.replace(/^http/, 'ws') +"/oorianws/" + document.head.id);
4755    oorian.ws.socket.onopen = oorian.ws.onOpen;
4756    oorian.ws.socket.onmessage = oorian.ws.onMessage;
4757    oorian.ws.socket.onerror = oorian.ws.onError;
4758    oorian.ws.socket.onclose = oorian.ws.onClose;
4759    oorian.ws.socket.init = init;
4760
4761};
4762
4763oorian.ws.sendMessage = function(params)
4764{
4765    if (oorian.ws.socket !== undefined && oorian.ws.socket.readyState === WebSocket.OPEN)
4766    {
4767        oorian.ws.socket.send(JSON.stringify(params));
4768    }
4769    else if (oorian.ws.socket === undefined || oorian.ws.socket.readyState === WebSocket.CLOSED)
4770    {
4771        oorian.ws.connect(false);
4772        oorian.ws.socket.reconnectParams = params;
4773    }
4774};
4775
4776oorian.ws.onOpen = function(evt)
4777{
4778    if (oorian.ws.socket.init === false)
4779    {
4780        oorian.ws.sendMessage(oorian.ws.socket.reconnectParams);
4781    }
4782};
4783
4784oorian.ws.onMessage = function(evt)
4785{
4786    if (evt.data === "oorian.deadsession")
4787    {
4788        location.reload();
4789    }
4790    else if (evt.data !== "oorian.ping")
4791    {
4792        parser = new DOMParser();
4793        let responseData = parser.parseFromString(evt.data,"text/xml");
4794
4795        if (responseData !== null && responseData !== "")
4796        {
4797            if (responseData.getElementsByTagName("sessionclosed").length > 0)
4798            {
4799                processError();
4800            }
4801            else
4802            {
4803                var responses = responseData.getElementsByTagName("response");
4804
4805                for (var i=0; i<responses.length; i++)
4806                {
4807                    var response = responses[i];
4808                    var id = response.getAttribute("id");
4809
4810                    if (id === "addition")
4811                    {
4812                        processElementAddition(response);
4813                    }
4814                    else if (id === "subtraction")
4815                    {
4816                        processElementSubtraction(response);
4817                    }
4818                    else if (id === "bodyupdate")
4819                    {
4820                        processBodyUpdate(response);
4821                    }
4822                    else if (id === "update")
4823                    {
4824                        processElementUpdate(response);
4825                    }
4826                    else if (id === "attributeupdate")
4827                    {
4828                        processElementAttributeUpdate(response);
4829                    }
4830                    else if (id === "redirect")
4831                    {
4832                        processRedirect(response);
4833                    }
4834                    else if (id === "click")
4835                    {
4836                        processElementClick(response);
4837                    }
4838                    else if (id === "hashupdate")
4839                    {
4840                        processHashUpdate(response);
4841                    }
4842                    else if (id === "submitform")
4843                    {
4844                        processFormSubmit(response);
4845                    }
4846                    else if (id === "uploadfile")
4847                    {
4848                        processFileUpload(response);
4849                    }
4850                    else if (id === "executejs")
4851                    {
4852                        processExecuteJavaScript(response);
4853                    }
4854                    else if (id === "executejsxml")
4855                    {
4856                        processExecuteJavaScriptXml(response);
4857                    }
4858                    else if (id === "fileuploadstatus")
4859                    {
4860                        processFileUploadStatus(response);
4861                    }
4862                    else if (id === "openwindow")
4863                    {
4864                        processWindowOpen(response);
4865                    }
4866                    else if (id === "closewindow")
4867                    {
4868                        processWindowClose(response);
4869                    }
4870                    else if (id === "setfocus")
4871                    {
4872                        processSetFocus(response);
4873                    }
4874                    else if (id === "setfocusandselect")
4875                    {
4876                        processSetFocusAndSelect(response);
4877                    }
4878                    else if (id === "setfocusandvalue")
4879                    {
4880                        processSetFocusAndValue(response);
4881                    }
4882                    else if (id === "selecttext")
4883                    {
4884                        processSelectText(response);
4885                    }
4886                    else if (id === "fadein")
4887                    {
4888                        processFadeIn(response);
4889                    }
4890                    else if (id === "fadeout")
4891                    {
4892                        processFadeOut(response);
4893                    }
4894                    else if (id === "loadimages")
4895                    {
4896                        processLoadImages(response);
4897                    }
4898                    else if (id === "createtimer")
4899                    {
4900                        processCreateTimer(response);
4901                    }
4902                    else if (id === "canceltimer")
4903                    {
4904                        processCancelTimer(response);
4905                    }
4906                    else if (id === "expanddropdown")
4907                    {
4908                        processExpandDropdownCommand(response);
4909                    }
4910                    else if (id === "sorttable")
4911                    {
4912                        processSortTable(response);
4913                    }
4914                }
4915
4916                if (responses.length > 0)
4917                {
4918                    checkDocumentSize();
4919
4920                    document.body.style.visibility = 'visible';
4921                }
4922            }
4923        }
4924    }
4925};
4926
4927oorian.ws.onClose = function(evt)
4928{
4929    console.log("Websocket Closed: " + evt);
4930};
4931
4932oorian.ws.onError = function(evt)
4933{
4934    console.log("Websocket Error: " + evt);
4935};
4936

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.