/*!
 * jQuery JavaScript Library v1.5.1
 * http://jquery.com/
 *
 * Copyright 2011, John Resig
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 * Copyright 2011, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 *
 * Date: Wed Feb 23 13:55:29 2011 -0500
 */
(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}catch(g){throw g}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(e)return e;e=a={}}var c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments.length,c=b<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),e=c.promise();if(b>1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var h=/[\n\t\r]/g,i=/\s+/,j=/\r/g,k=/^(?:href|src|style)$/,l=/^(?:button|input)$/i,m=/^(?:button|input|object|select|textarea)$/i,n=/^a(?:rea)?$/i,o=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(i);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(h+=" "+b[j]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(i);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var j=(" "+g.className+" ").replace(h," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");g.className=d.trim(j)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),j=b,k=a.split(i);while(f=k[g++])j=e?j:!h.hasClass(f),h[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(h," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(o.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(j,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&o.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var w=s.handle;w&&(w.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{if(b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&C("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&C("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=p.exec(h),k="",j&&(k=j[0],h=h.replace(p,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.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".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,ba)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bT=d.now(),bU,bV;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cd(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cc("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(cc("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cd(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(b$.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=b_.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show",1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(ca),ca=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var ce=/^t(?:able|d|h)$/i,cf=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=cg(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!ce.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);/*!
 * jQuery UI 1.8.11
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI
 */
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
;/*
 * jQuery UI Effects 1.8.11
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI/Effects/
 */
jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.11",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),
b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,
a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,
a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==
e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=
g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
;/*
 * jQuery UI Effects Highlight 1.8.11
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI/Effects/Highlight
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
;/*!
// Infinite Scroll jQuery plugin
// copyright Paul Irish, licensed GPL & MIT
// version 2.0b1.110420

// home and docs: http://www.infinite-scroll.com
*/
(function($){$.fn.infinitescroll=function infscr(options,callback){function areSelectorsValid(opts){var debug=$.fn.infinitescroll._debug;for(var key in opts){if(key.indexOf&&key.indexOf("Selector")>-1&&$(opts[key]).length===0){debug("Your "+key+" found no elements.");return false}return true}}function determinePath(path){if($.isFunction(opts.pathParse)){debug("pathParse");return[path]}else{if(path.match(/^(.*?)\b2\b(.*?$)/)){path=path.match(/^(.*?)\b2\b(.*?$)/).slice(1)}else{if(path.match(/^(.*?)2(.*?$)/)){if(path.match(/^(.*?page=)2(\/.*|$)/)){path=path.match(/^(.*?page=)2(\/.*|$)/).slice(1);return path}path=path.match(/^(.*?)2(.*?$)/).slice(1)}else{if(path.match(/^(.*?page=)1(\/.*|$)/)){path=path.match(/^(.*?page=)1(\/.*|$)/).slice(1);return path}else{debug("Sorry, we couldn't parse your Next (Previous Posts) URL. Verify your the css selector points to the correct A tag. If you still get this error: yell, scream, and kindly ask for help at infinite-scroll.com.");props.isInvalidPage=true}}}}debug("determinePath",path);return path}function hiddenHeight(element){var height=0;$(element).children().each(function(){height=height+$(this).outerHeight(false)});return height}function generateInstanceID(element){var number=$(element).length+$(element).html().length+$(element).attr("class").length+$(element).attr("id").length;opts.infid=number}if(typeof options=="string"){var command=options,argument=callback,validCommand=(command=="pause"||command=="destroy"||command=="retrieve"||command=="binding"),debug=$.fn.infinitescroll._debug;argument=argument||null;command=(validCommand)?$.fn.infinitescroll[command](argument):debug("Invalid command");return false}var opts=$.infinitescroll.opts=$.extend({},$.infinitescroll.defaults,options),props=$.infinitescroll,innerContainerHeight,box,frag,desturl,pause,error,errorStatus,method,result;callback=$.fn.infinitescroll._callback=callback||function(){},debug=$.fn.infinitescroll._debug,error=$.fn.infinitescroll._error,pause=$.fn.infinitescroll.pause,destroy=$.fn.infinitescroll.destroy,binding=$.fn.infinitescroll.binding;if(!areSelectorsValid(opts)){return false}opts.container=opts.container||document.documentElement;opts.contentSelector=opts.contentSelector||this;opts.infid=(opts.infid==0)?generateInstanceID(opts.contentSelector):opts.infid;opts.loadMsgSelector=opts.loadMsgSelector||opts.contentSelector;var relurl=/(.*?\/\/).*?(\/.*)/,path=$(opts.nextSelector).attr("href");if(!path){debug("Navigation selector not found");return}opts.path=determinePath(path);props.loadingMsg=$('<div id="infscr-loading" style="text-align: center;"><img alt="Loading..." src="'+opts.loadingImg+'" /><div>'+opts.loadingText+"</div></div>");(new Image()).src=opts.loadingImg;opts.binder=(opts.container.nodeName=="HTML")?$(window):$(opts.container);innerContainerHeight=(opts.container.nodeName=="HTML")?$(document).height():innerContainerHeight=hiddenHeight(opts.container);debug("Scrolling in: ",(opts.container.nodeName=="HTML")?"window":opts.container);opts.pixelsFromNavToBottom=innerContainerHeight+(opts.container==document.documentElement?0:$(opts.container).offset().top)-$(opts.navSelector).offset().top;binding("bind");opts.binder.trigger("smartscroll.infscr."+opts.infid);return this};$.infinitescroll={defaults:{debug:false,binder:$(window),preload:false,nextSelector:"div.navigation a:first",loadingImg:"http://www.infinite-scroll.com/loading.gif",loadingText:"<em>Loading the next set of posts...</em>",donetext:"<em>Congratulations, you've reached the end of the internet.</em>",navSelector:"div.navigation",contentSelector:null,loadMsgSelector:null,loadingMsgRevealSpeed:"fast",extraScrollPx:150,itemSelector:"div.post",animate:false,pathParse:undefined,dataType:"html",appendCallback:true,bufferPx:40,orientation:"height",errorCallback:function(){},currPage:1,infid:0,isDuringAjax:false,isInvalidPage:false,isDestroyed:false,isDone:false,isPaused:false,container:undefined,pixelsFromNavToBottom:undefined,path:undefined},loadingImg:undefined,loadingMsg:undefined,currDOMChunk:null};$.fn.infinitescroll._debug=function infscr_debug(){if($.infinitescroll.opts.debug){return window.console&&console.log.call(console,arguments)}};$.fn.infinitescroll._shorthand=function infscr_shorthand(){};$.fn.infinitescroll._nearbottom=function infscr_nearbottom(){var opts=$.infinitescroll.opts,debug=$.fn.infinitescroll._debug,hiddenHeight=$.fn.infinitescroll._hiddenheight;if(opts.container.nodeName=="HTML"){var pixelsFromWindowBottomToBottom=0+$(document).height()-($(opts.container).scrollTop()||$(opts.container.ownerDocument.body).scrollTop())-$(window).height()}else{var pixelsFromWindowBottomToBottom=0+hiddenHeight(opts.container)-$(opts.container).scrollTop()-$(opts.container).height()}debug("math:",pixelsFromWindowBottomToBottom,opts.pixelsFromNavToBottom);return(pixelsFromWindowBottomToBottom-opts.bufferPx<opts.pixelsFromNavToBottom)};$.fn.infinitescroll._setup=function infscr_setup(){var props=$.infinitescroll,opts=$.infinitescroll.opts,isNearBottom=$.fn.infinitescroll._nearbottom,kickOffAjax=$.fn.infinitescroll.retrieve;if(opts.isDuringAjax||opts.isInvalidPage||opts.isDone||opts.isDestroyed||opts.isPaused){return}if(!isNearBottom(opts,props)){return}kickOffAjax()};$.fn.infinitescroll.retrieve=function infscr_retrieve(){var props=$.infinitescroll,opts=props.opts,debug=$.fn.infinitescroll._debug,loadCallback=$.fn.infinitescroll._loadcallback,error=$.fn.infinitescroll._error,path=opts.path,box,frag,desturl,method,condition;opts.isDuringAjax=true;props.loadingMsg.appendTo(opts.loadMsgSelector).show(opts.loadingMsgRevealSpeed,function(){$(opts.navSelector).hide();opts.currPage++;debug("heading into ajax",path);box=$(opts.contentSelector).is("table")?$("<tbody/>"):$("<div/>");desturl=($.isFunction(opts.pathParse))?opts.pathParse(path.join("2"),opts.currPage):desturl=path.join(opts.currPage);method=(opts.dataType=="html"||opts.dataType=="json")?opts.dataType:"html+callback";if(opts.appendCallback&&opts.dataType=="html"){method+="+callback"}switch(method){case"html+callback":debug("Using HTML via .load() method");box.load(desturl+" "+opts.itemSelector,null,function(jqXHR,textStatus){loadCallback(box,jqXHR.responseText)});break;case"html":case"json":debug("Using "+(method.toUpperCase())+" via $.ajax() method");$.ajax({url:desturl,dataType:opts.dataType,complete:function _infscrAjax(jqXHR,textStatus){condition=(typeof(jqXHR.isResolved)!=="undefined")?(jqXHR.isResolved()):(textStatus==="success"||textStatus==="notmodified");(condition)?loadCallback(box,jqXHR.responseText):error([404])}});break}})};$.fn.infinitescroll._loadcallback=function infscr_loadcallback(box,data){var props=$.infinitescroll,opts=$.infinitescroll.opts,error=$.fn.infinitescroll._error,showDoneMsg=$.fn.infinitescroll._donemsg,callback=$.fn.infinitescroll._callback,result,frag;result=(opts.isDone)?"done":(!opts.appendCallback)?"no-append":"append";switch(result){case"done":showDoneMsg();return false;break;case"no-append":if(opts.dataType=="html"){data="<div>"+data+"</div>";data=$(data).find(opts.itemSelector)}break;case"append":var children=box.children();if(children.length==0||children.hasClass("error404")){return error([404])}frag=document.createDocumentFragment();while(box[0].firstChild){frag.appendChild(box[0].firstChild)}$(opts.contentSelector)[0].appendChild(frag);data=children.get();break}props.loadingMsg.fadeOut("normal");if(opts.animate){var scrollTo=$(window).scrollTop()+$("#infscr-loading").height()+opts.extraScrollPx+"px";$("html,body").animate({scrollTop:scrollTo},800,function(){opts.isDuringAjax=false})}if(!opts.animate){opts.isDuringAjax=false}callback.call($(opts.contentSelector)[0],data)};$.fn.infinitescroll._donemsg=function infscr_donemsg(){var props=$.infinitescroll,opts=$.infinitescroll.opts;props.loadingMsg.find("img").hide().parent().find("div").html(opts.donetext).animate({opacity:1},2000,function(){$(this).parent().fadeOut("normal")});opts.errorCallback()};$.fn.infinitescroll.pause=function infscr_pause(pause){var debug=$.fn.infinitescroll._debug,opts=$.infinitescroll.opts;if(pause!=="pause"&&pause!=="resume"&&pause!=="toggle"&&pause!==null){debug("Invalid argument. Toggling pause value instead")}pause=(pause&&(pause=="pause"||pause=="resume"))?pause:"toggle";switch(pause){case"pause":opts.isPaused=true;break;case"resume":opts.isPaused=false;break;case"toggle":opts.isPaused=!opts.isPaused;break}debug("Paused",opts.isPaused);return false};$.fn.infinitescroll._error=function infscr_error(xhr){var opts=$.infinitescroll.opts,binder=(opts.container.nodeName=="HTML")?$(window):$(opts.container),debug=$.fn.infinitescroll._debug,showDoneMsg=$.fn.infinitescroll._donemsg,error=(!opts.isDone&&xhr==404)?"end":(opts.isDestroyed&&xhr==302)?"destroy":"unknown";switch(error){case"end":debug("Page not found. Self-destructing...");showDoneMsg();opts.isDone=true;opts.currPage=1;opts.isPaused=false;binder.unbind("smartscroll.infscr."+opts.infid);break;case"destroy":debug("Destroyed. Going to next instance...");opts.isDone=true;opts.currPage=1;opts.isPaused=false;binder.unbind("smartscroll.infscr."+opts.infid);break;case"unknown":debug("Unknown Error. WHAT DID YOU DO?!...");showDoneMsg();opts.isDone=true;opts.currPage=1;binder.unbind("smartscroll.infscr."+opts.infid);break}};$.fn.infinitescroll.destroy=function infscr_destroy(){var opts=$.infinitescroll.opts,error=$.fn.infinitescroll._error;opts.isDestroyed=true;return error([302])};$.fn.infinitescroll.binding=function infscr_binding(binding){var opts=$.infinitescroll.opts,setup=$.fn.infinitescroll._setup,error=$.fn.infinitescroll._error,debug=$.fn.infinitescroll._debug;switch(binding){case"bind":opts.binder.bind("smartscroll.infscr."+opts.infid,setup);break;case"unbind":opts.binder.unbind("smartscroll.infscr."+opts.infid);break}debug("Binding",binding);return false};var event=$.event,scrollTimeout;event.special.smartscroll={setup:function(){$(this).bind("scroll",event.special.smartscroll.handler)},teardown:function(){$(this).unbind("scroll",event.special.smartscroll.handler)},handler:function(event,execAsap){var context=this,args=arguments;event.type="smartscroll";if(scrollTimeout){clearTimeout(scrollTimeout)}scrollTimeout=setTimeout(function(){jQuery.event.handle.apply(context,args)},execAsap==="execAsap"?0:100)}};$.fn.smartscroll=function(fn){return fn?this.bind("smartscroll",fn):this.trigger("smartscroll",["execAsap"])}})(jQuery);/*
 * jQuery autoResize (textarea auto-resizer)
 * @copyright James Padolsey http://james.padolsey.com
 * @version 1.04
 */

(function(a){a.fn.autoResize=function(j){var b=a.extend({onResize:function(){},animate:true,animateDuration:150,animateCallback:function(){},extraSpace:20,limit:1000},j);this.filter('textarea').each(function(){var c=a(this).css({resize:'none','overflow-y':'hidden'}),k=c.height(),f=(function(){var l=['height','width','lineHeight','textDecoration','letterSpacing'],h={};a.each(l,function(d,e){h[e]=c.css(e)});return c.clone().removeAttr('id').removeAttr('name').css({position:'absolute',top:0,left:-9999}).css(h).attr('tabIndex','-1').insertBefore(c)})(),i=null,g=function(){f.height(0).val(a(this).val()).scrollTop(10000);var d=Math.max(f.scrollTop(),k)+b.extraSpace,e=a(this).add(f);if(i===d){return}i=d;if(d>=b.limit){a(this).css('overflow-y','');return}b.onResize.call(this);b.animate&&c.css('display')==='block'?e.stop().animate({height:d},b.animateDuration,b.animateCallback):e.height(d)};c.unbind('.dynSiz').bind('keyup.dynSiz',g).bind('keydown.dynSiz',g).bind('change.dynSiz',g)});return this}})(jQuery);/*
 * timeago: a jQuery plugin, version: 0.9.3 (2011-01-21)
 * @requires jQuery v1.2.3 or later
 *
 * Timeago is a jQuery plugin that makes it easy to support automatically
 * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
 *
 * For usage and examples, visit:
 * http://timeago.yarp.com/
 *
 * Licensed under the MIT:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright (c) 2008-2011, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)
 */
(function($) {
  $.timeago = function(timestamp) {
    if (timestamp instanceof Date) {
      return inWords(timestamp);
    } else if (typeof timestamp === "string") {
      return inWords($.timeago.parse(timestamp));
    } else {
      return inWords($.timeago.datetime(timestamp));
    }
  };
  var $t = $.timeago;

  $.extend($.timeago, {
    settings: {
      refreshMillis: 60000,
      allowFuture: false,
      strings: {
        prefixAgo: null,
        prefixFromNow: null,
        suffixAgo: "geleden",
        suffixFromNow: "from now",
        seconds: "enkele seconden",
        minute: "een minuut",
        minutes: "%d minuten",
        hour: "een uur",
        hours: "%d uren",
        day: "een dag",
        days: "%d dagen",
        month: "een maand",
        months: "%d maanden",
        year: "een jaar",
        years: "%d jaren",
        numbers: []
      }
    },
    inWords: function(distanceMillis) {
      var $l = this.settings.strings;
      var prefix = $l.prefixAgo;
      var suffix = $l.suffixAgo;
      if (this.settings.allowFuture) {
        if (distanceMillis < 0) {
          prefix = $l.prefixFromNow;
          suffix = $l.suffixFromNow;
        }
        distanceMillis = Math.abs(distanceMillis);
      }

      var seconds = distanceMillis / 1000;
      var minutes = seconds / 60;
      var hours = minutes / 60;
      var days = hours / 24;
      var years = days / 365;

      function substitute(stringOrFunction, number) {
        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
        var value = ($l.numbers && $l.numbers[number]) || number;
        return string.replace(/%d/i, value);
      }

      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
        seconds < 90 && substitute($l.minute, 1) ||
        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
        minutes < 90 && substitute($l.hour, 1) ||
        hours < 24 && substitute($l.hours, Math.round(hours)) ||
        hours < 48 && substitute($l.day, 1) ||
        days < 30 && substitute($l.days, Math.floor(days)) ||
        days < 60 && substitute($l.month, 1) ||
        days < 365 && substitute($l.months, Math.floor(days / 30)) ||
        years < 2 && substitute($l.year, 1) ||
        substitute($l.years, Math.floor(years));

      return $.trim([prefix, words, suffix].join(" "));
    },
    parse: function(iso8601) {
      var s = $.trim(iso8601);
      s = s.replace(/\.\d\d\d+/,""); // remove milliseconds
      s = s.replace(/-/,"/").replace(/-/,"/");
      s = s.replace(/T/," ").replace(/Z/," UTC");
      s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
      return new Date(s);
    },
    datetime: function(elem) {
      // jQuery's `is()` doesn't play well with HTML5 in IE
      var isTime = $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
      var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title");
      return $t.parse(iso8601);
    }
  });

  $.fn.timeago = function() {
    var self = this;
    self.each(refresh);

    var $s = $t.settings;
    if ($s.refreshMillis > 0) {
      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
    }
    return self;
  };

  function refresh() {
    var data = prepareData(this);
    if (!isNaN(data.datetime)) {
      $(this).text(inWords(data.datetime));
    }
    return this;
  }

  function prepareData(element) {
    element = $(element);
    if (!element.data("timeago")) {
      element.data("timeago", { datetime: $t.datetime(element) });
      var text = $.trim(element.text());
      if (text.length > 0) {
        element.attr("title", text);
      }
    }
    return element.data("timeago");
  }

  function inWords(date) {
    return $t.inWords(distance(date));
  }

  function distance(date) {
    return (new Date().getTime() - date.getTime());
  }

  // fix for IE6 suckage
  document.createElement("abbr");
  document.createElement("time");
}(jQuery));
/**
 * jQuery position plugin
 *
 * @author Davy De Pauw
 * 
 */

(function($) {
    $.fn.position = function(options) {
        
        return this.each(function() {

            // Extend options
            var opts = $.extend({}, $.fn.position.defaults, options);

            // Get container
            var $c = $(this);

            // Create div
            $d = $('<div></div>');

            // Copy attributes
            if($c.attr('id')) $d.attr('id', $c.attr('id'));
            if($c.attr('class')) $d.attr('class', $c.attr('class'));

            // Wrap div around container
            $d = $c.wrap($d).parent();

            // Set row width
            var $rWidth = 0;
            // Get container width
            var $cWidth = $c.width();

            // Get elements within container
            var $els = $c.children();

            // Determine row type
            opts.rType = $c[0].tagName.toLowerCase();

            // Remove parent wrapper from elements
            $els.unwrap();

            // Create constructor for new row
            var row = '<' + opts.rType + ' class="' + opts.rowClass + '"></' + opts.rType + '>';

            // Compose and attach new row
            $r = $(row).appendTo($d);

            // Iterate each element
            $els.each(function(i) {
                // Outerwidth
                $oWidth = $(this).outerWidth(true);
                // Innerwidth
                $iWidth = $(this).outerWidth(false);

                // Reset module
                $(this).removeClass(opts.lastClass);

                // Check if element with margins fits into row
                if(($rWidth + $oWidth) <= $cWidth)
                {
                    $rWidth += $oWidth;
                }
                // Check if element without margin fits into row
                else if(($rWidth + $iWidth) <= $cWidth)
                {
                    // Add class last to element
                    $(this).addClass(opts.lastClass);
                    $rWidth += $iWidth;
                }
                // Start new row
                else
                {
                    // Attach new row
                    $r = $(row).appendTo($d);
                    $rWidth = 0;
                    $rWidth += $oWidth;
                }
                // Append element to row
                $(this).appendTo($r);
            });


        });
    };

    // Set plugin defaults
    $.fn.position.defaults = {
        lastClass: 'last',
        rowClass: 'row group'
    };

}) (jQuery);
/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();/**
 *
 * @provides frontend.prelude
 */

/**
 * Prelude.
 *
 * The Prelude is what keeps us from being messy. In order to co-exist with
 * arbitary environments, we need to control our footprint. The one and only
 * rule to follow here is that we need to limit the globals we introduce. The
 * only global we should every have is ``frontend``. This is exactly what the prelude
 * enables us to do.
 *
 * The main method to take away from this file is `frontend.copy()`_. As the name
 * suggests it copies things. Its powerful -- but to get started you only need
 * to know that this is what you use when you are augmenting the frontend object. For
 * example, this is skeleton for how ``frontend.Event`` is defined::
 *
 * frontend.module('Event', {
 *     subscribe: function() { ... },
 *     unsubscribe: function() { ... },
 *     fire: function() { ... }
 * });
 *
 * This is similar to saying::
 *
 * frontend.Event = {
 *     subscribe: function() { ... },
 *     unsubscribe: function() { ... },
 *     fire: function() { ... }
 * };
 *
 * Except it does some housekeeping, prevents redefinition by default and other
 * goodness.
 *
 * .. _frontend.copy(): #method_frontend.copy
 *
 * @class FB
 * @static
 * @access private
 */
if (!window.frontend) {
    frontend = {
        // use the init method to set these values correctly
        _session    : null,
        
        // logging is enabled by default. this is the logging shown to the
        // developer and not at all noisy.
        _logging: true,

        // Page title    
        _pageTitle: 'Joepie',
        _awaitingMessages: 0,

        /**
         * Copies things from source into target.
         *
         * @access private
         * @param target    {Object}  the target object where things will be copied
         *                            into
         * @param source    {Object}  the source object where things will be copied
         *                            from
         * @param overwrite {Boolean} indicate if existing items should be
         *                            overwritten
         * @param tranform  {function} [Optional], transformation function for
         *        each item
         */
        copy: function(target, source, overwrite, transform) {
            for (var key in source) {
                if (overwrite || typeof target[key] === 'undefined') {
                    target[key] = transform ? transform(source[key]) :  source[key];
                }
            }
            
            return target;
        },

        /**
         * Create a namespaced object.
         *
         * @access private
         * @param name {String} full qualified name ('Util.foo', etc.)
         * @param value {Object} value to set. Default value is {}. [Optional]
         * @return {Object} The created object
         */
        create: function(name, value) {
            var node = window.frontend, // We will use 'frontend' as root namespace
            nameParts = name ? name.split('.') : [],
            c = nameParts.length;
            for (var i = 0; i < c; i++) {
                var part = nameParts[i];
                var nso = node[part];
                
                if (!nso) {
                    nso = (value && i + 1 == c) ? value : {};
                    node[part] = nso;
                }
                
                node = nso;
            }
            
            return node;
        },

        /**
         * Copy stuff from one object to the specified namespace that
         * is frontend.<target>.
         * If the namespace target doesn't exist, it will be created automatically.
         *
         * @access private
         * @param target    {Object|String}  the target object to copy into
         * @param source    {Object}         the source object to copy from
         * @param overwrite {Boolean}        indicate if we should overwrite
         * @return {Object} the *same* target object back
         */
        module: function(target, source, overwrite) {
            // a string means a dot separated object that gets appended to, or created
            return frontend.copy(
                typeof target == 'string' ? frontend.create(target) : target,
                source,
                overwrite
            );
        },

        /**
         * Logs a message for the developer if logging is on.
         *
         * @access private
         * @param args {Object} the thing to log
         */
        log: function(args) {
            if (frontend._logging) {
                //TODO what is window.Debug, and should it instead be relying on the
                //     event fired below?
                if (window.Debug && window.Debug.writeln) {
                    window.Debug.writeln(args);
                } else if (window.console) {
                    window.console.log(args);
                }
            }
    
            // fire an event if the event system is available
            if(frontend.Event) {
                frontend.Event.fire('frontend.log', args);
            }
        },

        /**
         * Call this function to enable redering of HTML5 elements
         * on AJAX loaded content
         *
         * @access private
         */

        shiv: function(h, u) {
            // http://jdbartlett.github.com/innershiv | WTFPL License
        	var d, r;
        	
    		if (!d) {
    			d = document.createElement('div');
    			r = document.createDocumentFragment();
    			/*@cc_on d.style.display = 'none';@*/
    		}
    		
    		var e = d.cloneNode(true);
    		/*@cc_on document.body.appendChild(e);@*/
    		e.innerHTML = h.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    		/*@cc_on document.body.removeChild(e);@*/
    		
    		if (u === false) return e.childNodes;
    		
    		var f = r.cloneNode(true), i = e.childNodes.length;
    		while (i--) f.appendChild(e.firstChild);
    		
    		return f;
        },

        setPageTitle: function(title)
        {
            // Set the page title
            document.title = this._pageTitle + ' (' + this._awaitingMessages + ')';        
        },

        resetPageTitle: function()
        {
            // Reset awaiting messages
            frontend._awaitingMessages = 0;                
            
            // Reset title to default
            document.title = this._pageTitle;
        },

        /**
         * Shortcut for document.getElementById
         * @method $
         * @param {string} DOM id
         * @return DOMElement
         * @access private
         */
        $: function(id) {
          return document.getElementById(id);
        }
    };
}/**
 *
 * @provides frontend.init
 * @requires frontend.prelude
 *           frontend.ui
 */

/**
 * This is the top level for all the public APIs.
 *
 * @class Frontend
 * @static
 * @access public
 */
frontend.module('', {
    /**
     * Initialize the library.
     *
     * The best place to put this code is right before the closing
     * `</body>` tag.
     *
     */
     init: function(options) {
         // only need to list values here that do not already have a falsy default.
         // this is why cookie/session/status are not listed here.
        options = frontend.copy(options || {}, {
            logging: true
        });
        
        //frontend._apiKey = options.appId || options.apiKey;

        // disable logging if told to do so, but only if the url doesnt have the
        // token to turn it on. this allows for easier debugging of third party
        // sites even if logging has been turned off.
        if (!options.logging && window.location.toString().indexOf('debug=1') < 0) {
            frontend._logging = false;
        }
    }
});/**
 *
 * @provides frontend.XHR
 * @layer basic
 * @requires frontend.prelude
 */

/**
 * This provides helper methods related to DOM.
 *
 * @class frontend.XHR
 * @static
 * @private
 */
frontend.module('XHR', {
        
    prepareCall: function(params) {
        
        var 
            action = (params.action) ? params.action.toLowerCase() : null,
            
            // Set general defaults
            defaults = {
                type: 'GET',
                
                // Preloading
                // Preloader must be shown? (animated gif)
                preloader: false,
                // Specify the item on wich the preloader element has to be appended
                preloaderElement: null,
                // Specify if the element needs a 'preloading' class (for further CSS control)
                preloaderClass: false
            };
        
        // Set default dataType to html
        // Can be overrided through the action switch
        defaults.dataType  = 'html';

        
        // Set type based parameters     
        switch(action) {
        
            case 'search':                
                defaults.url = '/search';
                
                break;
        
            case 'search-friends':
                defaults.url = '/find-friends';
            
                break;
        
            // Is an ajax call to an url, which returns a html result
            case 'href':
                break;

            case 'lightbox':
                defaults.dataType = 'text';
                break;

            case 'json':
                defaults.dataType = 'json';
                break;
                
            default:
        
                break;        
        };

        // Extends the user params with the defaults
        params = frontend.copy(params || {}, defaults);
        
        if(params.preloader && params.preloaderElement)
        {
            frontend.Preloader.attach(params.preloaderElement, params.preloaderClass);
        }

        // Do the AJAX call
        frontend.XHR.call(params);
    },
    
    
    call: function(params) {

        // jQuery AJAX call
        $.ajax({
        
            type: params.type,
            url: params.url,
            data: params.data,
            dataType: params.dataType,
            
            // Gets called before the ajax call
            beforeSend: function()
            {
                if(typeof params.beforeSend === 'function')
                {
                    params.beforeSend();
                }
            },
            
            // Callback function if success
            success: function(data)
            {
                if(typeof params.success === 'function')
                {
                    params.success(data);
                }

                // Remove preloader
                if(params.preloader && params.preloaderElement)
                {                    
                    frontend.Preloader.remove(params.preloaderElement, params.preloaderClass);
                }
            },
            
            // Callback in case of an error
            error: function()
            {
                if(typeof params.error === 'function')
                {
                    params.error();
                }

                // Remove preloader
                if(params.preloader && params.preloaderElement)
                {                    
                    frontend.Preloader.remove(params.preloaderElement, params.preloaderClass);
                }
            }
            
            
        });
    
    }
});
    /**
 *
 * @provides frontend.dom
 * @layer basic
 * @requires frontend.prelude
 */

/**
 * This provides helper methods related to DOM.
 *
 * @class frontend.Dom
 * @static
 * @private
 */
frontend.module('Dom', {
    
    /**
     * Get the viewport info. Contains size and scroll offsets.
     *
     * @returns {Object} with the width and height
     */
    getViewportInfo: function() {
        // W3C compliant, or fallback to body
        var root = (document.documentElement && document.compatMode == 'CSS1Compat')
            ? document.documentElement
            : document.body;
        
        return {
            // Fix for Chrome (see: http://code.google.com/p/chromium/issues/detail?id=2891)
            scrollTop    : Math.max(document.body.scrollTop, document.documentElement.scrollTop),
            scrollLeft   : root.scrollLeft,
            width        : self.innerWidth  ? self.innerWidth  : root.clientWidth,
            height       : self.innerHeight ? self.innerHeight : root.clientHeight,
            scrollHeight : root.scrollHeight
        };
    },
    
    
    getFlashMovieObject: function(movieName)
    {
        if (window.document[movieName]) 
        {
        	  return window.document[movieName];
        }
        
        if (navigator.appName.indexOf("Microsoft Internet")==-1)
        {
        	if (document.embeds && document.embeds[movieName])
        	  return document.embeds[movieName]; 
        }
        
        else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
        {
        	return document.getElementById(movieName);
        }
        
    }
});/**
 *
 * @provides frontend.Number
 * @layer basic
 * @requires frontend.prelude
 */

/**
 * This provides helper methods related to DOM.
 *
 * @class frontend.Number
 * @static
 * @private
 */
frontend.module('Number', {
    
    /**
     * 
     *
     * @returns {Number}
     */
    mod: function(a, b) {
        var r = a%b;
        return r<0 ? r+b : r;
    }    
});/**
 *
 * @provides frontend.dialog
 * @layer basic
 * @requires frontend.prelude
 */

/**
 * This provides helper methods related to DOM.
 *
 * @class frontend.Dialog
 * @static
 * @private
 */
frontend.module('Dialog', {
    
    _showLoader: function(opts) {
    
    },
    
    _options: null,
    _parentNode: null,
    _contentNode: null,
    _dialogVisible: false,
    
    /**
     * Get the viewport info. Contains size and scroll offsets.
     *
     * @returns {Object} with the width and height
     */
    create: function(opts) {


        var
            dialog      = document.createElement('div'),
            contentRoot = document.createElement('div'),
            className   = 'dialog';

        // Reset parent node
        _parentNode = null;

        // Defaults:
        // Only need to list values here that do not already have a falsy default.
        _options = opts = frontend.copy(opts || {}, {
            overlay: true,
            data: {},
            visible: true,
            
            // onClose event
            onClose: function() {
            
                // If a custom before close event is specified
                if(typeof opts.beforeClose === 'function')
                {    
                    opts.beforeClose();                
                }

                // Remove the dialog
                frontend.Dialog.remove(dialog, frontend.$('overlay'));                            
            }
        });
        
        // 
        
           
       // Show laoder?     
        if(opts.loader) {
            frontend.Dialog._showLoader(opts.onClose);
        }

        // Single dialog?
        dialog.id = 'dialog';

        // Assign classname to dialog and dialog-content div        
        dialog.className = className;
        
        // Check if additional class is provided
        if(opts.cssClass) dialog.className += (' ' + opts.cssClass);
        
        contentRoot.className = 'dialog-content';

        if(opts.href)
        {
            var href = opts.href;
            
            // Type = dialog?
            if(opts.type == 'dialog')
            {
                // Check if href is an #id
                if(href.substr(0, 1) === '#')
                {
                    // Get the id name, minus the #-sign
                    targetId = href.substr(1, href.length - 1);
                                    
                    // Get the node
                    _contentNode = frontend.$(targetId);
                    
                    // Save the parent node
                    _parentNode = _contentNode.parentNode;
                    
                    // Check if the node is an object
                    if(typeof _contentNode == 'object')
                    {
                        // Clone node
//                        content = content.cloneNode(true);
                        _contentNode.style.display = 'block';
                        
                        // Append the node to the lightbox
                        frontend.Content.append(_contentNode, contentRoot);                
                    }
                    
                } else {       
                                                 
                    // Do AJAX call                
                    frontend.XHR.prepareCall({
                                            
                        // Action type
                        action: 'href',
    
                        // URL
                        url: opts.href,
    
                        // Data to be sent
                        data: opts.data,
                        
                        success: function(data) {
                            
                            frontend.Content.append(data, contentRoot);
                            
                            // Provide a callback once the AJAX call is made
                            if(typeof opts.ajaxCallback === 'function')
                            {   
                                opts.ajaxCallback();
                            }
                        }
                        
                    });
                }
            }
            
            // Video file
            else if(opts.type == 'video')
            {
                // Do AJAX call                
                frontend.XHR.prepareCall({
                                        
                    // Action type
                    action: 'href',

                    // URL
                    url: opts.href,

                    // Data to be sent
                    data: opts.data,
                    
                    success: function(data) {
                        
                        frontend.Content.append(data, contentRoot);
                        
                        // Provide a callback once the AJAX call is made
                        if(typeof opts.ajaxCallback === 'function')
                        {   
                            opts.ajaxCallback();
                        }
                    }
                    
                });
                
                dialog.className = 'lightbox video';
                
                // Always show an close icon with the lightbox
                opts.closeIcon = true;                
            }
            
            // Type = lightbox?
            else
            {                
                // Create new image
                var image = new Image();
                
                // Position the dialog when loaded
                image.onload = function() {
                    
                    // Position
                    frontend.Dialog.position(dialog, opts.position, opts.coordinates);

                    dialog.className += ' loaded';

                    // Show the image
                    this.style.visibility = 'visible';
                };
                
                // The path
                image.src = opts.href;
                
                // Hide the image to prevent image jumping around
                image.style.visibility = 'hidden';
                
                // Set dialog type to lightbox
                dialog.className = 'lightbox';
                
                // Append the image to the dialog
                frontend.Content.append(image, contentRoot);                
                
                // Always show an close icon with the lightbox
                opts.closeIcon = true;
            }
        }

        // Optional close element (either link or button)
        if((opts.closeIcon || opts.closeButton) && opts.onClose) {
            var closeEl;
            
            // Create a link or a button
            if(opts.closeIcon) 
            {    
                closeEl = document.createElement('a')
            } 
            else 
            {            
                closeEl = document.createElement('button');
                closeEl.innerHTML = opts.closeLabel;
            }

            // Assign classname and onclick event
            closeEl.className = 'dialog-close';
            closeEl.onclick = function(e) {            
                opts.onClose(e);
            }
            
            // For extra padding
            dialog.className += ' closable';
            
            dialog.appendChild(closeEl);
        }


        // Attach dialog-content
        dialog.appendChild(contentRoot);

        // Attach dialog to body
        frontend.Content.append(dialog, document.body);
        
        // Should the dialog be visible
        if(opts.visible) {
            frontend.Dialog.show(dialog);
        }
        
        // Show an overlay?
        if(opts.overlay) {
            frontend.Dialog.showOverlay(dialog, opts);
        }
        
        // Position the dialog
        frontend.Dialog.position(dialog, opts.position, opts.coordinates);
        
        // Listen for ESC key
        document.onkeydown = function(evt) {

            // Get the event
            evt = evt || window.event;
            
            // 27 = ESC key
            if (evt.keyCode == 27) {
            
                // If a dialog is visible, close it
                if(_dialogVisible) opts.onClose(evt);
            
            }
        };        
                
        return contentRoot;
    },
    
    position: function(el, position, coordinates) {

        var
            // Dialog dimensions
            dialog = {
                width  : parseInt(el.offsetWidth, 10),
                height : parseInt(el.offsetHeight, 10)
            },
            
            // Viewport dimensions
            view   = frontend.Dom.getViewportInfo(),
            
            // Calculate left and top value
            left   = (view.scrollLeft + (view.width  - dialog.width) / 2),
            top    = (view.scrollTop + (view.height - dialog.height) / 2.5);
           
        // Default centering    
        el.style.left = (left > 0 ? left : 0) + 'px';        
        el.style.top = (top > 0 ? top : 0) + 'px';
        
        switch(position) {
                                    
            // Center the dialog in the horizontal center of the screen, 
            // with a fixed top position
            case 'center-x':
            
                // Fixed top position
                el.style.top = coordinates.top + 'px';
                
                break;
            
            // Center the dialog in the vertical center of the screen, 
            // with a fixed left position
            case 'center-y':
            
                // Fixed left position
                el.style.left = coordinates.left + 'px';
                
                break;
            
            // Center the dialog in the horizontal and vertical center of the screen
            case 'center-xy':
            
                // Is already set
                break;
                        
            default:
                
                break;

        };
    },
    
    showOverlay: function(dialog, options) {
        var
            // Viewport dimensions
            view   = frontend.Dom.getViewportInfo(),

            // Create overlay dom element
            overlay = document.createElement('div');

        // Set classname    
        overlay.id = 'overlay';        

        // Set height
        overlay.style.height = view.scrollHeight + 'px';

        // Attach overlay to body
        frontend.Content.append(overlay, document.body);
        
        // Remove dialog on click            
        overlay.onclick = function() {
            options.onClose();
            
            _dialogVisible = false;
        }
        
    },
    
    show: function() {
        _dialogVisible = true;
    },
    
    remove: function(dialog, overlay) {
    
        // Move element back to DOM parent?
        if(_parentNode) {
        
            // Append the node to the DOM parent
            frontend.Content.append(_contentNode, _parentNode);  
            
            // Hide contentNode
            _contentNode.style.display = 'none';
        }
        
        // Remove nodes
        dialog.parentNode.removeChild(dialog);
        overlay.parentNode.removeChild(overlay);
        
        _dialogVisible = false;
    },
    
    callback: function(data) {    
        if(typeof _options.callback === 'function') {
            _options.callback(data);
        }
    }
    
});/**
 *
 * @provides frontend.content
 * @requires frontend.prelude 
 *           fb.array
 */

/**
 * "Content" is a very flexible term. Helpers for things like hidden
 * DOM content, iframes and popups.
 *
 * @class frontend.Content 
 * @static
 * @access private
 */
frontend.module('Content', {
    _root       : null,
    _hiddenRoot : null,
    _callbacks  : {},

    /**
     * Append some content.
     *
     * @access private
     * @param content {String|Node} a DOM Node or HTML string
     * @param root    {Node}        (optional) a custom root node
     * @return {Node} the node that was just appended
     */
    append: function(content, root) {

        // setup the root node, creating it if necessary
/*
        if (!root) {
            if (!frontend.content._root) {
                frontend.content._root = root = frontend.$('fb-root');
                if (!root) {
                    frontend.log('The "fb-root" div has not been created.');
                    return;
                } else {
                    root.className += ' fb_reset';
                }
            } else {
                root = frontend.content._root;
            }
        }
*/    
        if (typeof content == 'string') {
            var div = document.createElement('div');
            root.appendChild(div).innerHTML = content;
            return div;
        } else {
            return root.appendChild(content);
        }

    }
});
/**
 *
 * @provides frontend.layout
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "Content" is a very flexible term. Helpers for things like hidden
 * DOM content, iframes and popups.
 *
 * @class frontend.Layout
 * @static
 * @access private
 */
frontend.module('Layout', {

    init: function()
    {
        // Init tabs
        this.tabs();
        
        // Parse external links
        this.parseExternalLinks();    
    },

    equalizeHeights: function($a, $b) 
    {
    
        // Equalize the heights
        $a.css('min-height', $b.height());
        $a.context.referenceHeight = $b.height();

        this.calculateStreamItems();

    },        

    /**
     * Set the minimum height
     * Is needed when (eg.) side navigation is positioned absolutely
     * 
     * @author Davy De Pauw
     * @version 1.1
     */
     
    setMinHeight: function($reference, $target)
    {
        // Set min-height of #main div, based on outerheight of target
        $target.css('min-height', ($reference.outerHeight()) + 'px');
    },


    tabs: function() 
    {
    
        // Cache tabs
        $tabs = $('.tabs');
        
        // Iterate each tab instance
        $tabs.each(function(i) {
            
            $this = $(this);
            
            $nav = $this.find('.tab-nav');
            
            // Catch click
            $nav.find('a').live('click', function(e) {
                                
                $this = $(this);
                
                // Get the parent tabs wrapper
                $tabs = $this.closest('.tabs');
                
                $nav = $tabs.find('.tab-nav');
                
                // Remove selected classes
                $nav.find('li').removeClass('selected');
                
                // Add selected class
                $this.parent().addClass('selected');
                
                // Hide all tabs
                $tabs.find('.tab').hide();
                                
                // Show current tab
                $($this.attr('href')).show();
                
                // Prevent link clicking
                e.preventDefault();
                 
            });
            
            if($this.hasClass('activate'))
            {
                // Activate first tab
                $nav.find('a:first').trigger('click');
            }
            
        });
    
    },
    
    slider:
    {
        // Keep track of the current selected item
        currentIndex: 0,
        itemWidth: 160,
        
        init: function() {
            
            $('.slider').each(function()
            {        
                $slider = $(this);
                $area = $slider.find('.slide-area');
                $items = $area.find('li');

                // Set width of the area
                $area.css('width', $items.length * 160);
                
                $slider.find('nav a').click(function(e)
                {
                            
                    // Define variables
                    var 
                        $this = $(this),
                    
                        // Get parent slider
                        $slider = $this.closest('.slider'),
                    
                        // Slider
                        slider = frontend.Layout.slider,
                    
                        // Scrollable area
                        $area = $slider.find('.slide-area'),
    
                        $currentItem = $area.find('li.selected'),
                        
                        $items = $area.find('li'),
                        
                        
                        // Current index
                        currentIndex = $currentItem.index();
         
                    // Set index to currentItem
                    slider.currentIndex = currentIndex;
                    
                    if($this.hasClass('next')) {
                    
                    	// Increment index
                    	slider.currentIndex++;
                    	
                    	// Calculate next item
                    	// -1 because index is zero-based
                    	if(currentIndex < ($items.siblings().length - 2))
                    	{
                    	    currentIndex = slider.currentIndex++;
                    	}
                    	else
                    	{
                    	    currentIndex = 0;
                    	}
                    }
                
                    if($this.hasClass('prev')) {
                    	
                    	// Decrement index
                    	slider.currentIndex--;
                    	
                    	// Calculate prev item
                    	if(currentIndex > 0)
                    	{
                    		//if bigger than 0 (which is the first)
                    		//decrease index
                    	    currentIndex = slider.currentIndex--;
                    	}
                    	else
                    	{
                    		//last index
                    		// -1 because index is zero-based
                    	    currentIndex = ($items.siblings().length - 2);
                    	}
                    	
                    }
                    
                    // Check if not first item                
                    if(currentIndex > 0) {
                        // Calculate the position based on the currentIndex                	
                        scrollToVal = -(slider.itemWidth * currentIndex) + 'px';
                    } else {
                        // Position first item on 0
                        scrollToVal = '0px';
                    }
                    
                    // Reset selected states
                    $currentItem.removeClass('selected');
                    
                    // Select next/prev item
                    $items.eq(currentIndex).addClass('selected');
                    
                    // Do the scrolly thingy
                    $area.animate({ left: scrollToVal });

                    // Don't follow the link
                    e.preventDefault();              
           
                });            
            });        
        }
    },
    
    parseExternalLinks: function()
    {
        $('a[rel=external]').click(function(e){
            open(this.href);
            e.preventDefault();
        });
    },
        
    /**
     * Trigger
     *
     * Reusable trigger function to show or hide certain parts of a form.
     * Usage:
     * * Add trigger class to trigger input
     * * Add rel attribute containing the id reference of the target
     *
     * Example: <input type="checkbox" class="trigger" rel="target-somename" />
     *
     * You can attach the class="inverse" to the trigger to get an inversed trigger
     *
     * Example: <input type="checkbox" class="trigger inverse" rel="target-somename" />
     *
     * @author Davy De Pauw
     * @version 1.1
     */
     
    trigger: function() {
        $('a[rel="trigger"]').click(function(e) {
     
            // Get trigger target contained in rel attr
            $target = $('#' + $(this).attr('href'));
     
            // Get the value of checkbox
            var state = $(this).attr('checked');
     
            // Inversed trigger (target gets hidden on checked value)
            if($(this).hasClass('inverse')) $target.toggle(!state);
     
            // Normal trigger (target gets shown on checked value)
            else $target.toggle(state);
     
         });
     }    
});
/**
 *
 * @provides frontend.forms
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * Helpers for things like textfields, radio buttons and checkboxes.
 *
 * @class frontend.Forms
 * @static
 * @access private
 */
frontend.module('Forms', {

    /**
     * Initialize
     *
     * @access  public
     *
     * @author  Davy De Pauw
     */

    init: function() {
        
        // Init search
        this.search();
        
        // Init search friends
        this.searchFriends();
        
        // Init focus listeners
        this.setFocusListeners();
    },

    /**
     * Placeholder fallback
     *
     * Checks whether placeholder attribute is natively supported.
     * Provides fallback functionality if not.
     * Attaches 'idle' class to input field if placeholder text is visible.
     *
     * @access  public
     * @param   $target    {jQuery Object}
     *
     * @author  Davy De Pauw
     * @version 1.0
     */
     
    placeholders: function($target) {
    
        if($target) {
            
            // Iterate each input containing the placeholder attribute                
            $target.each(function(i) {
     
                // Input field
                $this = $(this);
     
                // Text contained in placeholder attribute                
                var placeholderText = $this.attr('placeholder');
     
                // Add placeholder text to input field value and attach idle class
                $this.val(placeholderText).addClass('idle');
     
                // Focus listener
                $this.focus(function(e) {
     
                    // Clear value if current value = placeholder text
                    if($(this).val() == placeholderText) $(this).val('').toggleClass('idle');
     
                });
     
                $this.blur(function(e) {
     
                    // If field is empty, fill it with placeholder text
                    if($(this).val() == '') $(this).val(placeholderText).toggleClass('idle');
     
                });            
            });        
        };         
    },
    
    
    /*
     * Set focus/blur listeners.
     *
     * @author Davy De Pauw
     * @version 1.1
     */
     
    setFocusListeners: function()
    {    
        // Field focus/blur
        $('form .field').live('focus', function()
        {             
            // Get dd
            $dd = $(this).closest('dd');
     
            // Add focus class to dd
            $dd.addClass('focus');
     
            // Add focus class to dt
            $dd.prev('dt').addClass('focus');
                        
        });
     
        $('form .field').live('blur', function()
        {
            // Get dd
            $dd = $(this).closest('dd');
     
            // Add focus class to dd
            $dd.removeClass('focus');
     
            // Remove focus class from dt
            $dd.prev('dt').removeClass('focus');
            
        });
    },

    /**
     * setRequiredIndicators adds * to elements which have a class="required"
     *
     * Usage: frontend.forms.requiredIndicator($('<span class="indicator">*</span>'));
     *
     * @author Davy De Pauw
     * @version 1.1
     */
     
    setRequiredIndicators: function($indicator) {
        
        if(!$indicator)
        {
            $indicator = $('<span class="indicator">*</span>');
        }
        
        $('.required label').append($indicator);
    },
    
    
    /**
     * Custom radio and/or checkbox input field
     *
     * @author Davy De Pauw
     * @version 1.5
     */
     
    customInputs: function()
    {
        $('span.cb input').live('click',function(e) {

            var grandparent = $(this).parent().parent();

            // Check if this is a radio button
            if(grandparent.hasClass('radio'))
            {
                // Reset all radio buttons in the name family
                $('input[name="' + $(this).attr('name') + '"]').parent().removeClass('checked');
            }
            frontend.Forms.toggleCustomInput($(this).parent(), $(this).parent().hasClass('checked'));
        });
    },
    
    
    /**
     * Custom radio and/or checkbox input field
     *
     * @author Davy De Pauw
     * @version 1.0
     */    
    
    toggleCustomInput: function(parent, state)
    {
        if(state)
        {
            parent.removeClass('checked');
            parent.children('input').attr('checked', false);
        }
        else
        {
            parent.addClass('checked');
            parent.children('input').attr('checked', true);
        }
    },
    
    
    /**
     * Custom radio and/or checkbox input field
     *
     * @author Davy De Pauw
     * @version 1.0
     */ 
     
    toggleCheckboxes: function($trigger) {
        var
            $form = $trigger.closest('form'),
            state = !$trigger.attr('checked');
                                        
        $form.find('label.checkbox .checkbox').not($trigger).each(function(i) {
            var $this = $(this);
            
            frontend.Forms.toggleCustomInput($this.parent(), state);            
        });
    },
    
    /**
     * Generic autocomplete function
     *
     * Get the value from the textfield passed in.
     * Action determines the search type.
     * Result is an HTML output in <div class="results"></div>
     *
     * @access  public
     *
     * @author  Davy De Pauw
     * @version 1.0
     */      
    
    autoComplete: function(searchField, action)
    {
        // Current value
        var 
            $searchField = $(searchField),
            value = $(searchField).val(),
            // The searchform and results container
            $form = $searchField.closest('form');
        
        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            action: action,

            // Action type
            method: 'POST',

            // Data to be sent
            data: {
                query: value
            },
            
            preloader: true,
            preloaderElement: $form,
            
            // Success callback
            success: function(data) {
            
                var $results = $form.find('.results');

                // Check if data is being returned
                if(data.length > 0) 
                {
                
                    // There is already an active results container
                    if($results.length > 0) 
                    {
                        $results.html(data);
                    }
                    
                    // No container available -> create one
                    else 
                    {                                
                        // Empty result container
                        $results = $('<div class="results"></div>');
                        
                        // Fill the container with returned results
                        $results.html(data);
                        
                        // Attach the results to the form
                        $form.append($results);
                    }
                } 
                else 
                {
                    // No data returned, so remove results
                    if($results.length) $results.remove();                                                    
                }
                
            }

        });
    
    },
    
    /**
     * Search Autocomplete
     *
     * Listeners for the main search autocomplete.
     * Keyup event gets triggered when user types in search-box.
     * Does an AJAX call after each keystroke.
     *
     * @access  public
     *
     * @author  Davy De Pauw
     * @version 1.1
     */    
    
    search: function()
    {
        $('.search-form .autocomplete').each(function(i) {
            
            // Input field
            var element = $(this);
            
            // Listen to keyup triggers
            element.bind('keyup', function(e) {            
                frontend.Forms.autoComplete(element, 'search');
            });
            
            element.focus(function(e) {
            
                // Attach focus class to the parent form
                $(this).closest('form').addClass('focus');
            
            });
            
            element.blur(function(e) {
            
                // Remove search-form focus after slight delay
                // Enables clicking on the links in the overlay
                window.setTimeout(function() {
                    $('.search-form').removeClass('focus');
                }, 150);                   
                
            });
            
        });
    },
    
    /**
     * Search for friends Autocomplete
     *
     * Listeners for the main search autocomplete.
     * Uses the live method, because this search is triggered in an AJAX dialog.
     * Keyup event gets triggered when user types in search-box.
     * Does an AJAX call after each keystroke.
     *
     * @access  public
     *
     * @author  Davy De Pauw
     * @version 1.0
     */     
    
    searchFriends: function()
    {
        var KEY_ENTER = 13;
        
        // Prevent enter on keydown (doesn't work on keyup)
        $('form.search-friends .autocomplete').live('keydown', function(e) {
            if(e.keyCode == KEY_ENTER) {
                e.preventDefault();
            }         
        });
        
        $('form.search-friends .autocomplete').live('keyup', function(e) {
            // Prevent load action on enter
            if(e.keyCode != KEY_ENTER) {
                frontend.Forms.autoComplete(this, 'search-friends');
            }
        });

        $('form.search-friends .more').live('click', function(e) {
            var $this = $(this),
                $form = $this.closest('form'),
                value = $form.find('#searchfriends-query').val(),
                $offset = $form.find('.offset');
                count = parseInt($offset.val());

            // Prepare an AJAX call
            frontend.XHR.prepareCall({

                // Action type
                action: 'search-friends',

                // Action type
                method: 'POST',

                // Data to be sent
                data: {
                    query: value,
                    offset: count
                },

                preloader: true,
                preloaderElement: $form,

                // Success callback
                success: function(data) {
                    var $results = $form.find('.results ul');

                    $data = $(data);
                    $elems = $data.find('li');
                    $results.append($elems);

                    $offset.val(count+$elems.length);

                    var length = $results.find('li').length,
                        amount = parseInt($form.find('.amount').val());

                    if (length >= amount) {
                        $this.hide();
                    }
                }

            });

            e.preventDefault();
        });
    }
});
/**
 *
 * @provides frontend.Feedback
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * 
 * Contains also the JS for the interaction block in the sidebar
 * Voting, hot or not, stories, ...
 *
 * @class frontend.Feedback
 * @static
 * @access private
 */
frontend.module('Feedback', {

    init: function() {
    
        $('body').addClass('feedback'); 
            
        //settings
        var 
            fadeSpeed = 200, 
            fadeTo = 0.8, 
            topDistance = 30,
            $toolbar = $('#feedback-toolbar'),
            topbarME = function() { $toolbar.fadeTo(fadeSpeed,1); }, 
            topbarML = function() { $toolbar.fadeTo(fadeSpeed,fadeTo); },
            inside = false;
            
        //do
        $(window).scroll(function() {
            position = $(window).scrollTop();
            
            if(position > topDistance && !inside) {
                //add events
                topbarML();
                $toolbar.bind('mouseenter',topbarME);
                $toolbar.bind('mouseleave',topbarML);
                inside = true;
            }
            else if (position < topDistance)
            {
                topbarME();
                $toolbar.unbind('mouseenter',topbarME);
                $toolbar.unbind('mouseleave',topbarML);
                inside = false;
            }
        });
        
        $toolbar.find('a').click(function(e) {

            var 
                state = true,
                $this = $(this);
        
            if($this.hasClass('show'))
            {
                state = true;
            }
            else if($this.hasClass('cancel'))
            {
                state = false;
            }

            frontend.Feedback.toggle($toolbar, state);
            
            e.preventDefault();                
        }); 

        $toolbar.find('button').click(function(e) {
            
            frontend.Feedback.post($toolbar);
            
            e.preventDefault();
            
        });

        $toolbar.find('#feedback-url').val(window.location.pathname);
     
     },

     toggle: function($toolbar, state) {
     
         if(state) $toolbar.addClass('open');
         else $toolbar.removeClass('open');
     },
     
     reset: function($toolbar) {
     
         // Reset text in textarea
         $toolbar.find('textarea').val('');
     
         // Close toolbar
         frontend.Feedback.toggle($toolbar, false);
     },
     
     post: function($toolbar) {
     
        var $form = $toolbar.find('form');
     
        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            url: $form.attr('action'),

            action: 'json',
            type: 'post',

            // Data to be sent
            data: $form.serialize(),

            // Success callback
            success: function(result) {

                if(result.status == 'valid') {
                
                    // Reset toolbar after submit
                    frontend.Feedback.reset($toolbar);
                
                }
                else if(result.status == 'invalid')
                {
                    // Something went wrong
                }
            }

        });             
     }
});/**
 *
 * @provides frontend.User
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "User" provides access to the Facebook and Netlog API's
 * Contains also the JS needed during registration and login procedures
 *
 * @class frontend.User
 * @static
 * @access private
 */
frontend.module('User', {
    timeouts: {},
    labels: {
        errorTitle: 'generic_errors_title'
    },
    urls: {
        validate: null,
        autocomplete: null
    },
    init: function()
    {
        this.initListeners();
    },
    initListeners: function()
    {
        // Registration form
        // When the user click on the registration form button, don't submit the form yet.
        // Instead, call the register function in the user module.
        // There the e-mail address is evaluated (TODO) and a confirmation dialog is shown.
        // When the user confirms the e-mailadres, then the form is submitted for registration.
        var $registerForm = $('#register-form');
        
        if($registerForm.length > 0) {
            // Attach blur listeners to all inputs
            // Except the birthdate
            $registerForm.find('input:not(.date)').live("blur", this.validateForm);
            $registerForm.find('input.date-year').live('blur', this.validateForm);

            $registerForm.find('#register').click(function(e) {

                // Send form to register user function
                frontend.User.register($(this).closest('form'));

                e.preventDefault();
            });

            $('#register-form input#city').live('keyup',this.cityAutocomplete);
            $('#register-form .results li').live('click',this.setCity);

            $('#register-form .results li').live('mouseover',function() { $(this).addClass('hover')});
            $('#register-form .results li').live('mouseout',function() { $(this).removeClass('hover')});
        }
    },
    cityAutocomplete: function()
    {
        var element = $(this);
        var form = element.closest('form');
        if ( form.find('#country').val() == 'be' ) {
            // Prepare an AJAX call
            frontend.XHR.prepareCall({

                // Action type
                action: 'html',
                url: frontend.User.urls.autocomplete,
                // Data to be sent
                data: {
                    query: $(this).val()
                },

                // Success callback
                success: function(data) {

                    // The searchform and results container
                    var results = form.find('.results');

                    // Check if data is being returned
                    if(data.length > 0)
                    {

                        // There is already an active results container
                        if(results.length > 0)
                        {
                            results.html(data);
                        }

                        // No container available -> create one
                        else
                        {
                            // Empty result container
                            results = $('<div class="results"></div>');

                            // Fill the container with returned results
                            results.html(data);

                            // Attach the results to the form
                            results.insertAfter(element);
                        }
                        results.show();
                    }
                    else
                    {
                        // No data returned, so remove results
                        if(results.length) results.remove();
                    }
                }
            });
        }
    },
    setCity: function()
    {
        var form = $(this).closest('form');
        form.find('#city').val($(this).find('.name').html());
        $(this).closest('.results').hide();
    },
    validateForm: function()
    {
        var field = $(this);
        var form = field.closest("form");
        var dl = field.closest("dl");
        var fieldname = field.attr("name");
        if ( fieldname.indexOf("dob") > -1 )
            fieldname = "dob";
        var value = {};
        var timeout = eval("frontend.User.timeouts."+fieldname);
        if ( timeout )
            clearTimeout(timeout);
        timeout = setTimeout(function() {
            if ( fieldname.indexOf("dob") > -1 ) {
                fieldname = "dob";
                value.day = $("input[name=\'dob[day]\']").val()
                value.month = $("input[name=\'dob[month]\']").val()
                value.year = $("input[name=\'dob[year]\']").val()
            } else
                value = field.val();
            frontend.XHR.prepareCall({
                type:"POST",
                action:'json',
                dataType:'json',
                url: frontend.User.urls.validate,
                data: {field: fieldname, value: value},
                success: function(result){
                    var errorDiv = form.children(".error-msg");
                    var ul = errorDiv.children("ul");
                    ul.children("."+result.field).remove();
                    dl.children("#"+result.field+"-label").removeClass("error");
                    dl.children("#"+result.field+"-element").removeClass("error");
                    if ( result.isValid ) {

                    } else {
                        form.children("header").addClass("errors");
                        if ( errorDiv.length == 0 ) {
                            errorDiv = $("<div></div>").attr("class","error-msg");
                            errorDiv.append($("<h2></h2>").append(frontend.User.labels.errorTitle));
                            errorDiv.append($("<ul></ul>"));
                            errorDiv.insertAfter(form.children("header"));
                            ul = errorDiv.children("ul");
                        }
                        $.each(result.errors, function(key, value) {
                            dl.children("#"+result.field+"-label").addClass("error");
                            dl.children("#"+result.field+"-element").addClass("error");
                            ul.append($("<li></li>").addClass(result.field).append(value));
                        });
                    }
                    if ( ul.children().length == 0 ) {
                        form.children("header").removeClass("errors");
                        form.children(".error-msg").remove();
                    }
                }
            });
        }, 750);
        eval("frontend.User.timeouts."+fieldname+" = "+timeout);
    },
    register: function(form)
    {
        var email = form.find("input[name='email']").val();
        $("#"+form.attr("id")+"-confirm .data").html(email);
        // Create a new dialog
        frontend.Dialog.create({ 

            // Grab the type from the rel attribute
            type: 'dialog', 
                        
            // The content of the dialog get determined by the href value of the link
            // If it's an anchor to an element on the page (#element), than this element is shown in the dialog
            // If it's a link to a page / ajax call, that result is shown
            href: "#"+form.attr("id")+"-confirm",
            //href: '/fratello/frontend/ajax/register_confirm.php', // debug
                        
            // Specify the position
            position: 'center-xy' 
        });
        
        // Remove the dialog when user clicks on dialog cancel
        $('.dialog .close').live('click', function(e) {
        
            var 
                $dialog = $('#dialog'),
                $content = $dialog.find('.dialog-content').children();
            
            $('body').append($content.hide());
        
            $dialog.remove();
            $('#overlay').remove();            
        });
        
        // Submit the form when user click on confirmation button in dialog
        $('.dialog .submit').live('click', function(e) {
            form.submit();
        });
    },
    recover: function (data, form, $dialog, overlay)
    {
        var 
            $element = $dialog.find('#recover_email'),
            $parent = $element.parent();
        
        $parent.removeClass('error');
        $element.siblings('.errors').remove();
        
        if(data.errors) {
            $parent.addClass('error');
            
            var $ul = $('<ul></ul>').attr('class','errors');
            
            $.each(data.errors, function(key,error) {
                
                // Loop each error
                for(var i = 0; i < error.length; i++)
                {
                    var $li = $('<li></li>');
                    $li.text(error[i]);                
                    $ul.append($li);
                }
            });
            
            $parent.append($ul);
        } else {
        
            $element.closest('div').append(data.message);
            $element.closest('fieldset').siblings('button').remove();
            $element.closest('dl').remove();
            
        }
    }
});/**
 *
 * @provides frontend.Friends
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * 
 * Contains also the JS for the profile pages
 *
 * @class frontend.Friends
 * @static
 * @access private
 */
frontend.module('Friends', {
    
    init: function() {
        
        var $friendList = $('aside #friend-list');

        frontend.Friends.requestCount = $('#requests-count');
                
        if($friendList.length > 0) {
            
            // Listener for more button
            var $more = $friendList.find('footer a.secundary');
            
            $more.click(function(e) {

                // Do the AJAX request for more friends
                frontend.Friends.load($(this), $friendList.find('input.offset'));
                
                e.preventDefault();
            });
        }

        $('.accept-request').click(function(e) {

            $.post($(this).attr('href'), {}, function(result) {
                frontend.Friends.addNewFriend(result.id);
                frontend.Friends.requestCountMinusOne();
                frontend.Friends.updateRequestsList();
            }, 'json');

            return false;
        });

        $('.refuse-request').click(function(e) {

            $.post($(this).attr('href'), {}, function(result) {
                frontend.Friends.removeRequest(result.id);
                frontend.Friends.requestCountMinusOne();
                frontend.Friends.updateRequestsList();
            }, 'json');

            return false;
        });

        $('.invite-suggested').live('click', function(e) {

            $.post($(this).attr('href'), {}, function(result) {
                frontend.Friends.addNewRequest(result.id, true);
                frontend.Friends.addSuggestion(result);
                frontend.Friends.updateRequestedList();
            }, 'json');

            return false;
        });

       $('.delete-suggested').live('click', function(e) {

            $.post($(this).attr('href'), {}, function(result) {
                frontend.Friends.addSuggestion(result);
            }, 'json');

            return false;
        });

        $('.dialog-requests-accept').live('click', function(e) {
            $request = $(this).parent();

            $.post($(this).attr('href'), {}, function(result) {
                $request.remove();
                frontend.Friends.addNewFriend(result.id);
                frontend.Friends.requestCountMinusOne();
                frontend.Friends.updateRequestsList();
            }, 'json');

            return false;
        });

        $('.dialog-requests-refuse').live('click', function(e) {
            $request = $(this).parent();

            $.post($(this).attr('href'), {}, function(result) {
                $request.remove();
                frontend.Friends.removeRequest(result.id);
                frontend.Friends.requestCountMinusOne();
                frontend.Friends.updateRequestsList();
            }, 'json');

            return false;
        });

        $('.dialog-search-request').live('click', function(e) {
            $request = $(this);

            $.post($(this).attr('href'), {}, function(result) {
                $request.remove();
                frontend.Friends.addNewRequest(result.id, false);
                frontend.Friends.updateRequestedList();
            }, 'json');

            return false;
        });

        // Add request on someone's profile page
        $('#add-request').click( function(e) {
            $.post($(this).attr('href'), {}, function(result) {
                $status = $('<h2></h2>').text(result.value);
                $('.request-status').html($status);
            }, 'json');

            return false;
        });

        // Accept request on someone's profile page
        $('#accept-request').live('click', function(e) {
            $.post($(this).attr('href'), {}, function(result) {
                $('.request-status').html(result.value);
            }, 'json');

            return false;
        });

        // Refuse request on someone's profile page
        $('#refuse-request').click( function(e) {
            $.post($(this).attr('href'), {}, function(result) {
                $('.request-status').html(result.value);
            }, 'json');

            return false;
        });

        $('.show-hide-list').each(function(){
            var $this = $(this);
            var $items = $this.find('ul:first');
            var $count = 10;
            $items.children(':gt(' + ($count-1) + ')').hide();

            if($items.children('li').length <= $count) {
                $this.find('footer').hide();
            }

            var $button = $this.find('.button');
            var $show = $button.find('.label-show');
            var $hide = $button.find('.label-hide');

            $button.html($show);

            $button.toggle(function(){
                $button.html($hide);
                $items.children().show();

                return false;
            }, function(){
                $button.html($show);
                $items.children(':gt(' + ($count-1) + ')').hide();

                return false;
            });
        });

    },

    load: function($button, $offset)
    {    
        var 
            $friendList = $button.closest('section.friend-list'),
            $ul = $friendList.find('ul'),
            amount = $friendList.find('input.amount').val();        
    
        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            url: $button.attr('href'),

            action: 'json',
            type: 'post',

            // Data to be sent
            data: { offset: $ul.children().length },
                                        
            // Success callback
            success: function(result) {            
                
                if(result.status == 'valid') {
                    
                    // Append friend data
                    $ul.append(result.data);

                    $offset.val(parseInt($offset.val())+result.count);
                                     
                    // Still results remaining?
                    if($ul.children().length >= amount)
                    {
                        $button.hide();
                    }
                }
                else if(result.status == 'invalid')
                {
                    // Something went wrong
                }
            }

        });
        
    },

    requestCountMinusOne: function()
    {
        var count = parseInt(frontend.Friends.requestCount.text()) - 1;
        frontend.Friends.requestCount.text(count > 0 ? count : 0);
    },

    addNewFriend: function(id)
    {
        var $request = $('#account-profile-'+id);
        if ($request.length > 0) {
            var $friendList = $('aside #friend-list');
            $friendList.show();
            $avatar = $request.find('img');
            link = $request.find('h2 a').attr('href');
            $new = $('<a></a>').attr('href', link).append($avatar);
            $li = $('<li></li>').append($new);
            $friendList.find('ul').prepend($li);
            $request.remove();
        }
    },

    addNewRequest: function(id, remove)
    {
        var $request = $('#account-profile-'+id);
        if ($request.length > 0) {
            var $requestedList = $('aside #requested-list');
            $requestedList.show();
            $avatar = $request.find('img').clone();
            $avatar.removeClass('avatar');
            link = $request.find('.profile-url').attr('href');
            $new = $('<a></a>').attr('href', link).append($avatar);
            $li = $('<li></li>').append($new);
            $requestedList.find('ul').prepend($li);

            if (remove) {
                $request.remove();
            }
        }
    },

    addSuggestion: function(data)
    {
        var $suggestion = $('#account-profile-'+data.id);
        $('.friend-suggestions .people').append(data.value);
        $suggestion.remove();
        frontend.Friends.updateSuggestedList();
    },

    removeRequest: function(id)
    {
        $('#account-profile-'+id).remove();
    },

    updateRequestsList: function()
    {
        var $list = $('aside .friend-requests');
        var $items = $list.find('ul.people');
        $items.children('li:hidden:first').show();

        if($items.children('li').length <= 10) {
            $list.find('footer').hide();
        }

        if($items.children('li').length == 0) {
            $list.hide();
        }
    },

    updateRequestedList: function()
    {
        var $list = $('aside #requested-list');
        var $items = $list.find('ul:first');

        if($items.children('li').length > 10) {
            $items.children('li:visible:last').hide();
            $list.find('footer').show();
        }
    },

    updateSuggestedList: function()
    {
        var $list = $('aside .friend-suggestions');
        var $items = $list.find('ul.people');

        if($items.children('li').length == 0) {
            $list.hide();
        }
    }
});
/**
 *
 * @provides frontend.Register
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "User" provides access to the Facebook and Netlog API's
 * Contains also the JS needed during registration and login procedures
 *
 * @class frontend.Register
 * @static
 * @access private
 */
frontend.module('Register', {
    
    init: function() {
        if($('#webcam-swf').length > 0) this.webcam.init();

        $('.oauth.liveconnect').click(function(e){
            e.preventDefault();
            liveConnectAuth('/account/live-connect/', true);
        });

        $('.oauth.facebook').click(function(e){
            e.preventDefault();
            facebookAuth('/account/facebook/', true);
            return false;
        });
        
        // Youtube videos on authentication page
        var $youtubeVideos = $("ul.ytvideolist");
        if($youtubeVideos.length > 0) 
        {
        	$.getScript('/fratello/frontend/assets/js/third-party/jquery.youtubeplaylist.js', function() {
        	  $("ul.ytvideolist").ytplaylist(
        	  {
        	      addThumbs:true, 
        	      autoPlay:false, 
        	      playerWidth:'525',
        	      playerHeight:'299',
        	      thumbSize:'small',
        	      showRelated:false
        	  });
        	});
        }
    },
    
    webcam: {
    
        init: function() {
            swfobject.registerObject("webcam-swf", "9.0.0", "expressInstall.swf");


        },
        
        save: function() {
        
        }
    
    }
});/**
 *
 * @provides frontend.stream
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "Stream" manages updates to the stream
 *
 * @class frontend.Stream
 * @static
 * @access private
 */
frontend.module('Stream', {
    
    init: function(stream)
    {
    	// Uncomment if we turn off polling
    	// var timer=setTimeout(frontend.Stream.refreshPage,5000);
    
        // Create hidden iFrame
        var iframe = $('<iframe></iframe>').attr('style','display:none;').attr('src','/wall');
        
        // Append iframe
        stream.append(iframe);

        $('#share-form').submit(function(e) {
            var 
                $form = $(this);
                data = $form.serialize();
                        
            $form.find('.errors').remove();
            $form.find('.error').removeClass('error');

            // Prepare an AJAX call
            frontend.XHR.prepareCall({

                // Action type
                url: '/wall/message',

                action: 'json',
                type: 'post',

                // Data to be sent
                data: data,

                preloader: true,
                preloaderElement: $form.find('button#send'),
                preloaderClass: true,

                // Success callback
                success: function(result) {
                    if(result.status == 'valid' ) {
                    
                        // Remove attached file to comment form
                        frontend.Stream.removeFile($form.find('#fieldset-image .thumb'));
                        
                        // Render result in stream
                        frontend.Stream.render(result);
                        
                        // Reset form
                        $(':text, :file, textarea', '#share-form').val('');
                        
                        // Reset height (for expanded scalable fields
                        $form.find('textarea.scalable').css('height', '');
                        
                    } else {
                        $.each(result.errors,function (key,messages) {
                            $('#share-form').find('#'+key).parent().addClass('error');
                            var errors = $('<ul></ul>').attr('class','errors');
                            $.each(messages,function (key,message) {
                                errors.append($('<li></li>').append(message));
                            });
                            $('#share-form').find('#'+key).parent().append(errors);
                        });
                    }                
                }
            });            

            /*
            $.post('/wall/message', data, function(result) {
                if(result.status == 'valid' ) {
                    frontend.Stream.render(result);
                    $(':text, :file, textarea', '#share-form').val('');
                    
                    // Reset height (for expanded scalable fields
                    $form.find('textarea.scalable').css('height', '');
                    
                } else {
                    $.each(result.errors,function (key,messages) {
                        $('#share-form').find('#'+key).parent().addClass('error');
                        var errors = $('<ul></ul>').attr('class','errors');
                        $.each(messages,function (key,message) {
                            errors.append($('<li></li>').append(message));
                        });
                        $('#share-form').find('#'+key).parent().append(errors);
                    });
                }
            },'json');
            */
            
            e.preventDefault();
        });

        $('.entry .options ul a').live('click',function(e) {

            // The link clicked
            var element = $(this);
            
            if (element.hasClass('block-user')) {
                
                frontend.Dialog.create({ 

                    // Grab the type from the rel attribute
                    type: 'dialog', 

                    // The content of the dialog get determined by the href value of the link
                    // If it's an anchor to an element on the page (#element), than this element is shown in the dialog
                    // If it's a link to a page / ajax call, that result is shown
                    href: element.attr('href'),
                    //href: '/fratello/frontend/ajax/register_confirm.php', // debug

                    // Specify the position
                    position: 'center-xy',
                    closeButton: true,
                    closeLabel: 'Sluiten'
                });

                // Remove the dialog when user clicks on dialog cancel
                $('.dialog .close').live('click', function(e) {

                    var 
                        $dialog = $('#dialog'),
                        $content = $dialog.find('.dialog-content').children();

                    $('body').append($content.hide());

                    $dialog.remove();
                    $('#overlay').remove();            
                });

                // Submit the form when user click on confirmation button in dialog
                $('.dialog .block-save').live('click', function(e) {
                    e.preventDefault();
                    $form = $(this).parent();
                    
                    frontend.XHR.prepareCall({

                        // Action type
                        url: $form.attr('action'),

                        action: 'json',
                        type: 'post',

                        // Data to be sent
                        data: $form.serialize(),

                        preloader: true,
                        preloaderElement: $form.find('button#save'),
                        preloaderClass: true,

                        // Success callback
                        success: function(result) {
                            if (result.status == 'valid') {
                                // remove block user links
                                $('.user-'+result.user_id).hide();
                                
                                // close dialog
                                var 
                                    $dialog = $('#dialog'),
                                    $content = $dialog.find('.dialog-content').children();

                                $('body').append($content.hide());

                                $dialog.remove();
                                $('#overlay').remove(); 
                            }
                        }
                    });
                    
//                    $.post(
//                        $form.attr('action'), $form.serialize(), function (result) {
//                        if (result.status == 'valid') {
//                            // close dialog
//                            var 
//                                $dialog = $('#dialog'),
//                                $content = $dialog.find('.dialog-content').children();
//
//                            $('body').append($content.hide());
//
//                            $dialog.remove();
//                            $('#overlay').remove(); 
//                        }
//                    }, 'json');
                });
            } else {
                
                // Prepare an AJAX call
                frontend.XHR.prepareCall({

                    // Action type
                    url: element.attr('href'),

                    action: 'json',
                    type: 'post',

                    // Data to be sent
                    data: {},

                    // Success callback
                    success: function(result) {

                        if(result.status == 'valid') {

                            // If the action was 'hide-user', then all those messages have to be removed
                            if(element.hasClass('.hide-user'))
                            {
                                // Iterate the items in the response
                                $.each(result.items, function(index, item)
                                {
                                    frontend.Stream.remove($('#' + result.type + '-' + item));
                                });
                            }
                            else
                            {
                                // Remove the item from the stream
                                frontend.Stream.remove($('#' + result.type + '-' + result.item));
                            }

                        }
                        else if(result.status == 'invalid')
                        {
                            // Something went wrong
                        }
                    }

                });
            }

            e.preventDefault();
        });
        
        $('.entry .options a.remove').live('click',function(e) {
            $(this).parent().find('li a').eq(0).trigger('click');

            e.preventDefault();
        });
       

        $("#share-form .tab-nav ul li a").live('click',function() {
            $('#share-form input[name=action]').val($(this).attr('rel'));
        });
        
        // If 
        if($('#stream-items.wall').length > 0) {
        
            $('#stream-items.wall').infinitescroll({
            
                navSelector : 'footer.wall-paging a.next',
                nextSelector : 'footer.wall-paging a.next',
                itemSelector : 'article.item',
                dataType : 'html',
                debug: false,
                pathParse: null
                // appendCallback : false, // USE FOR PREPENDING
                // pathParse : function( pathStr, nextPage ){ return pathStr.replace('2', nextPage ); }
            }, 
            
            function(newElements) {
                    
                 //USE FOR PREPENDING
                 // $(newElements).css('background-color','#ffef00');
                 // $(this).prepend(newElements);
                 //
                 //END OF PREPENDING
                
                 window.console && console.log('context: ', this);
                 window.console && console.log('returned: ', newElements);                    
            });                
        }
        

    },
    
    refreshPage: function() {
    	window.location.reload();
    },

    remove: function($item) {
        
        $item.remove();
        
        //item.parent().children('article').first().addClass('first');
    },
    
    update: function()
    {
        
    },
    
    hasNewItems: function(count){
        if(count)
        {
            frontend.setPageTitle = "(" + count + ") " + this._pageTitle;
        }
    },
    
    render: function(data)
    {
        // Redirect if necessary
        if(data.redirect) window.location = data.redirect;
        
        var 
            $stream = null,
            $article = null;
            
        // Prepend article to
        switch(data.channel) {
        
            case 'twitter':
            
                // Twitter stream
                $stream = $('section.twitter .contents');

                // Create an article container
                $article = $('<article class="item first"></article>');

                // Reset first class for previous first item
                frontend.Stream.reset($stream);

                // Attach result to article
                $article.append(data.html);
                $stream.prepend($article);
                $stream.children().last().remove();
                
                break;


            case 'contentitem':
            
                $target = $('#'+data.itemId+' .comments .items');

                // Get the children (the comment items)
                $children = $target.children(),

                // Get the number of items
                numItems = $children.length;

                // This limits the number of comments shown in closed state to 2
                if(numItems == 2)
                {
                    // There were already 2 comments visible
                    // So remove the last one
                    $children.eq(0).remove();

                    // Add 'ajax-loadable' class, which displays the show more comments link
                    $target.parent().addClass('ajax-loadable');

                }

                $target.parent().removeClass('no-comments');

                if(data.html)
                {
                    $article = $(frontend.shiv(data.html, false));
                    $target.append($article);
                }

                break;
                
            default:
            
                // Status stream
                $stream = $('section.stream');


                switch (data.type) {
                    case 'message':
                        if(data.deleted)
                        {
                            $stream.children('#'+data.id).remove();
                            $stream.children('article').first().addClass('first');
                        }
                        else
                        {
                            // Reset first class for previous first item
                            frontend.Stream.reset($stream);

                            // Create article with innerShiv
                            $article = $(frontend.shiv(data.html, false));

                            $stream.children('.profile-info').after($article);

                            if($stream.children('article').length > 10 )
                            {
                                $stream.children('article').last().remove();
                            }
/*
                            // Update page title
                            frontend._awaitingMessages++;                            
                            frontend.setPageTitle();
                            */
                        }
                        break;

                    case 'comment':
                        if(data.deleted)
                        {
                            $('#'+data.id).remove();
                        }
                        else
                        {
                            // Reset first class for previous first item
//                            frontend.Stream.reset($stream);

                            $target = $('#'+data.messageId+' .comments .items');

                            // Get the children (the comment items)
                            $children = $target.children(),

                            // Get the number of items
                            numItems = $children.length;

                            // This limits the number of comments shown in closed state to 2
                            if(numItems == 2)
                            {
                                // There were already 2 comments visible
                                // So remove the last one
                                $children.eq(0).remove();

                                // Add 'ajax-loadable' class, which displays the show more comments link
                                $target.parent().addClass('ajax-loadable');

                            }
                            
                            $target.parent().removeClass('no-comments');

                            $article = $(frontend.shiv(data.html, false));
                            $target.append($article);   // deleted?
                        }
                        break;
                }
                break;
        }
        
        // Make time fuzzy
        if($article) $article.find('time.fuzzy').timeago();
        
        // Make tabs work after comment post
        frontend.Layout.tabs();        
    },
    
    /**
     * Attaches a file to a comment
     * Gets the data from a JSON string
     * JSON string contains: filename and path to file
     * 
     * @author Davy De Pauw
     * @version 1.0
     */     
         
    attachFile: function(data, $form)
    {
        // Find correct attachment fieldset (photo)
        $fieldset = $('#fieldset-image');

        // Remove attached file
        frontend.Stream.removeFile($fieldset.find('.thumb'));

        // Remove errors
        $fieldset.find('.errors').remove();
        
        if(data.errors) {
            var errors = $('<ul></ul>').attr('class','errors upload-errors');
            
            $.each(data.errors,function (key,messages) {
                $.each(messages,function (key,message) {
                    errors.append($('<li></li>').append(message));
                });
            });

            $fieldset.prepend(errors);

        } else {

            // Hidden input field
            $photoFile = $fieldset.find('input[name="photo-file"]');
            $photoHash = $fieldset.find('input[name="photo-hash"]');

            // Check if photo is already attached
            if($photoFile.length == 0)
            {
                // Create a hidden input field containing the filename
                $photoFile = $('<input type="hidden" name="photo-file" id="" />');

                // Hidden input containing the hash (foldername)
                $photoHash = $('<input type="hidden" name="photo-hash" id="" />');
            }

            // Update the value of the hidde input field
            $photoFile.val(data.filename);
            $photoHash.val(data.hash);

            // Append hidden inputs
            $fieldset.append($photoFile);
            $fieldset.append($photoHash);
            
            // Render a thumbnail of the attached file
            $preview = $('<div class="thumb"></div>');

            // Image preview element
            $img = $('<img alt="" />');
            $img.attr('src', data.path);

            // Remove link (to delete the image again)
            $remove = $('<a href="" class="remove">Verwijderen</a>');

            // Provide a remove button callback
            $remove.click(function(e) {

                frontend.Stream.removeFile($(this).parent());

                e.preventDefault();
            });

            // Append to preview
            $preview.append($img);
            $preview.append($remove);

            // Add a classname to form
            $fieldset.addClass('attached');            

            // Append to attachment
//            $form.find('footer').append($preview);
            $fieldset.append($preview);
            
        }
    },
        
    /**
     * Remove an attached file from status form.
     * File can be removed when not posted yet.
     * 
     * @author Davy De Pauw
     * @version 1.1
     */  
    
    removeFile: function($file)
    {        
        // Get the parent form
        var $fieldset = $file.closest('fieldset');
        
        // Remove attached class from form
        $fieldset.removeClass('attached');
        
        // Get the hidden input field
        $photoFile = $fieldset.find('input[name="photo-file"]');
        $photoHash = $fieldset.find('input[name="photo-hash"]');
                
        // Remove input and thumb
        $photoFile.remove();
        $photoHash.remove();
        $file.remove();
    },    
    
    reset: function(stream)
    {
        stream.children('.first').removeClass('first');
    }
    
});/**
 *
 * @provides frontend.Comments
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * Comments module.
 *
 * @class frontend.Comments
 * @static
 * @access private
 */
frontend.module('Comments', {
    
    init: function()
    {
        // Comment button
        $('.button.comment, .comment .action').live('click', function(e) {
            
            $this = $(this);

            // Get root article
            $comments = $this.closest('.comments');
            
            if($this.hasClass('action'))
            {
                // Check if items block is visible
                $comments.find('.box').show();
                
                $comments.find('fieldset.comment-area .field').focus();
                                
            } else {
                // Hide buttons
                $this.hide();                
            }
                        
            // Get comment form and show
            $comments.find('.comment-form').show();

            e.preventDefault();
        });
        
        // Show all comments
        $('section.comments a.show-all, .actions .comment .count').not('a[rel="detail"]').click(function(e) {
                
            var 
                $this = $(this),
                $footer = $this.parent(),
                $comments = $this.closest('.comments'),
                amount = $comments.find('.comment .count').text(),
                $items = $comments.find('.items'),
                $newItems = null;
        
            // Check if AJAX results are visible
            
            if($footer.not('footer'))
            {
                $footer = $comments.find('footer');
            }            
        
            var data;
        
            if(!$comments.hasClass('detail')) 
            {
                data = { amount: amount };            
            }
            else
            {
                data = { offset: -$items.children().length, detail: true };
            }
        
            // Check if number of comments is smaller than current length
            if(amount > $items.children().length)
            {
                // Prepare an AJAX call
                frontend.XHR.prepareCall({
    
                    // Action type
                    action: 'json',
                    url: this.href,

                    // Data to be sent
                    data: data,
    
                    // Success callback
                    success: function(result) {

                        if(!$comments.hasClass('detail')) 
                        {
                            // Find items div
                            $items.prepend(frontend.shiv(result.data, false));
                        }
                        else
                        {
                            // Find items div
//                            $items.append(frontend.shiv(result.data, false));
                            $items.prepend(frontend.shiv(result.data, false));
                            
                            // Remove new posts to avoid duplicates
                            $comments.find('.items-new').remove();                                                                            
                        }
                        
                        // Check if number of comments is smaller than current length
                        if(amount <= $items.children().length)
                        {                
                            // Hide current link
                            $footer.find('.show-all').addClass('hide');
                            
                            // Show hide-all link
                            $footer.find('.hide-all').removeClass('hide');
                        }
                        
                        // Get date from comment
                        $items.find('time.fuzzy').timeago();
                        
                    }
                });
            }
            
            e.preventDefault();        
        });
        
        // Hide all comments link
        $('section.comments a.hide-all').click(function(e) {
            $this = $(this);
            
            $this.closest('.comments').find('.items .ajax-loaded').remove();
            $this.addClass('hide');
            
            // Show show-all link
            $this.parent().find('.show-all').removeClass('hide');                
            
            e.preventDefault();
        });

         // Love it or hate it action
        $('.button.opinion, .love-it .action, .hate-it .action').live('click', function(e) {

            var $link = $(this),
                $parent = $link.parent();
            
            // Prepare an AJAX call
            frontend.XHR.prepareCall({

                // Action type
                url: $link.attr('href'),

                action: 'json',
                type: 'post',

                // Data to be sent
                data: {},

                preloader: true,
                preloaderElement: $parent,
                preloaderClass: true,

                // Success callback
                success: function(result) {
                    if(result.status == 'valid') 
                    {
                        var $siblingParent = $parent.siblings('.' + ($parent.hasClass('love-it') ? 'hate' : 'love') + '-it');
                            
                        $link.siblings('.count').html($parent.hasClass('love-it') ? result.love : result.hate);
                        $siblingParent.children('.count').html($parent.hasClass('love-it') ? result.hate : result.love);
                        
                        // Add selected claass
                        $parent.addClass('selected');
                        // Remove select state from opposing button (hate if loved, love if hated)
                        $siblingParent.removeClass('selected');
                    }                    
                }
            });            
            
/*            
            $.post($(this).attr('href'), {}, function(result) {
                if ( result.status == 'valid' ) {
                    var parent = link.parent();
                    var siblingParent = link.parent().siblings('.'+(link.parent().hasClass('love-it')?'hate':'love')+'-it');
                    link.siblings('.count').html(parent.hasClass('love-it')?result.love:result.hate);
                    siblingParent.children('.count').html(parent.hasClass('love-it')?result.hate:result.love);
                    parent.addClass('selected');
                    siblingParent.removeClass('selected');
                }
            },'json');
*/

            e.preventDefault();
        });
        
        // Listener for comment submit
        $('form.comment-form button[type="submit"]').live('click', function(e) {
            var
                $this = $(this),
                $form = $this.closest('form');

            e.preventDefault();        
            
            if(!$this.attr('clicked') || $this.attr('clicked') == 'false')
            {                    
                // Submit the comment (AJAX call)                
                frontend.Comments.post($form);
            }

            $this.attr('clicked', true);

        });
        

        // Listener for remove links (comments)
        $('section.comments .items a.remove').live('click', function(e) {
            
            frontend.Comments.remove($(this));
            
            e.preventDefault();
        });
        
        
        // Init comment forms
        if($('form.comment-form').length > 0) {
            // Field focus/blur        
            $('.comment-form textarea.field').live('focus', function()
            {
                var $form = $(this).closest('form');
                $form.addClass('active');
                
                // Remove feedback         
                $form.find('.feedback').remove();
            });        
        
        }
        
        $('.admin-options ul a').live('click',function(e) {

            // The link clicked
            var element = $(this);
            
            frontend.Dialog.create({ 

                // Grab the type from the rel attribute
                type: 'dialog', 

                // The content of the dialog get determined by the href value of the link
                // If it's an anchor to an element on the page (#element), than this element is shown in the dialog
                // If it's a link to a page / ajax call, that result is shown
                href: element.attr('href'),
                //href: '/fratello/frontend/ajax/register_confirm.php', // debug

                // Specify the position
                position: 'center-xy',
                closeButton: true,
                closeLabel: 'Sluiten'
            });

            // Remove the dialog when user clicks on dialog cancel
            $('.dialog .close').live('click', function(e) {

                var 
                    $dialog = $('#dialog'),
                    $content = $dialog.find('.dialog-content').children();

                $('body').append($content.hide());

                $dialog.remove();
                $('#overlay').remove();            
            });

            // Submit the block form when user click on confirmation button in dialog
            $('.dialog .block-save').live('click', function(e) {
                e.preventDefault();
                $form = $(this).parent();

                frontend.XHR.prepareCall({

                    // Action type
                    url: $form.attr('action'),

                    action: 'json',
                    type: 'post',

                    // Data to be sent
                    data: $form.serialize(),

                    preloader: true,
                    preloaderElement: $form.find('button#save'),
                    preloaderClass: true,

                    // Success callback
                    success: function(result) {
                        if (result.status == 'valid') {
                            // close dialog
                            var 
                                $dialog = $('#dialog'),
                                $content = $dialog.find('.dialog-content').children();

//                            $('body').append($content.hide());

                            $dialog.remove();
                            $('#overlay').remove(); 
                        }
                    }
                });

            });

            // Submit the block form when user click on confirmation button in dialog
            $('.dialog .mail-save').live('click', function(e) {
                
                e.preventDefault();
                $form = $(this).parent();
                
                if ($form.find('#message').val() != '') {
                    
                    frontend.XHR.prepareCall({

                        // Action type
                        url: $form.attr('action'),

                        action: 'json',
                        type: 'post',

                        // Data to be sent
                        data: $form.serialize(),

                        preloader: true,
                        preloaderElement: $form.find('button#save'),
                        preloaderClass: true,

                        // Success callback
                        success: function(result) {
                            if (result.status == 'valid') {
                                // close dialog
                                var 
                                    $dialog = $('#dialog'),
                                    $content = $dialog.find('.dialog-content').children();

    //                            $('body').append($content.hide());

                                $dialog.remove();
                                $('#overlay').remove(); 
                            }
                        }
                    });
                } 

            });

            e.preventDefault();
        });
        
    },
    
    /**
     * Attaches a file to a comment
     * Gets the data from a JSON string
     * JSON string contains: filename and path to file
     * 
     * @author Davy De Pauw
     * @version 1.0
     */     
         
    attachFile: function(data, $form)
    {
           
        $attachment = $form.find('.attachment');
        // Find correct attachment fieldset (photo)
        $fieldset = $attachment.find('fieldset.photo');
        $fieldset.find('.errors').remove();
        if ( data.errors ) {
            var errors = $('<ul></ul>').attr('class','errors');
            $.each(data.errors,function (key,messages) {
                $.each(messages,function (key,message) {
                    errors.append($('<li></li>').append(message));
                });

            });
            $fieldset.append(errors);
        } else {
            // Hidden input field
            $photoFile = $fieldset.find('input[name="photo-file"]');
            $photoHash = $fieldset.find('input[name="photo-hash"]');

            // Check if photo is already attached
            if($photoFile.length == 0)
            {
                // Create a hidden input field containing the filename
                $photoFile = $('<input type="hidden" name="photo-file" id="" />');

                // Hidden input containing the hash (foldername)
                $photoHash = $('<input type="hidden" name="photo-hash" id="" />');
            }

            // Update the value of the hidde input field
            $photoFile.val(data.filename);
            $photoHash.val(data.hash);

            // Append hidden inputs
            $fieldset.append($photoFile);
            $fieldset.append($photoHash);

            // Render a thumbnail of the attached file
            $preview = $('<div class="thumb"></div>');

            // Image preview element
            $img = $('<img alt="" />');
            $img.attr('src', data.path);

            // Remove link (to delete the image again)
            $remove = $('<a href="" class="remove">Verwijderen</a>');

            // Provide a remove button callback
            $remove.click(function(e) {

                frontend.Comments.removeFile($(this).parent());

                e.preventDefault();
            });

            // Append to preview
            $preview.append($img);
            $preview.append($remove);

            // Add a classname to form
            $form.addClass('attached');

            // Append to attachment
            $fieldset.append($preview);
        }
    },

    /**
     * Remove an attached file from comment.
     * File can be removed when not posted yet.
     * 
     * @author Davy De Pauw
     * @version 1.1
     */  
    
    removeFile: function($file)
    {        
        // Get the parent form
        $form = $file.closest('form');
        
        // Remove attached class from form
        $form.removeClass('attached');
        
        // Get the hidden input field
        $photoFile = $form.find('input[name="photo-file"]');
        $photoHash = $form.find('input[name="photo-hash"]');
                
        // Remove input and thumb
        $photoFile.remove();
        $photoHash.remove();
        $file.remove();
    },
    
    /**
     * Post a comment
     * Provides the AJAX call for posting comments
     * 
     * @author Davy De Pauw
     * @version 1.1
     */    
    
    post: function($form)
    {
        // Default values
        var 
            photoFilename = '',
            photoHash = '',
            commentText = '',
            $target = $form.parent().find('.items'),
            $comments = $form.closest('section.comments'),
            $commentField = $form.find('.comment-area textarea.field'),
            $button = $form.find('button[type="submit"]');
    
        // Get attachment fieldset
        $attachment = $form.find('.attachment');
        
        // Upload field
        $photoFilename = $attachment.find('.photo input[name="photo-file"]');
        $photoHash = $attachment.find('.photo input[name="photo-hash"]');
        
        // Has a file been uploaded
        if($photoFilename.length > 0)
        {
            // Set fileUrl to uploaded image
            photoFilename = $photoFilename.val();

            // Set fileUrl to uploaded image
            photoHash = $photoHash.val();
        }

        // Remove feedback from previous items
        $form.find('.feedback').remove();

        // On detail page?
        if($comments.hasClass('detail'))
        {
            // Find footer
            // Find placeholder for new items
            var $anchor = $comments.find('.new_items_placeholder');
            
            // Find .items-new div
            $newItems = $comments.find('.items-new');
            
            // If .items-new doesn't exist
            if($newItems.length == 0) {
                // Insert it after footer
                $newItems = $('<div class="items-new"></div>').insertAfter($anchor);
            }
            
            // Target to append the new comments to
            $target = $newItems;
        }
    
        // Check if the user has added a comment (and the value isn't just the placeholder text)    
        if($commentField.val() != $commentField.attr('placeholder')) {
            commentText = $commentField.val();
        }

        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            url: $form.attr('action'),

            action: 'json',
            type: 'post',

            // Data to be sent
            data: {
                // Message
                'commenttext': commentText,
                
                // Photo URL
                'comment-image-url': $attachment.find('.photo input.field').val(),

                // Upload photo, defaults to null
                'photo-file': photoFilename,
                'photo-hash': photoHash,
                
                // Video URL
                'comment-video-url': $attachment.find('.video input.field').val()
                
            },

            preloader: true,
            preloaderElement: $form.find('button[type="submit"]'),
            preloaderClass: true,
                            
            // Success callback
            success: function(result) {            
                
                $button.attr('clicked', false);
                
                if(result.status == 'valid') {
                    // Render the comment on the page          
                    frontend.Comments.render($target, result);
                    
                    // Reset the fields of the comment form
                    frontend.Comments.reset($form);

                    // Update number of comments
                    frontend.Comments.updateCount($comments, result.amount);
                }
                else if(result.status == 'awaiting')
                {
                    // Display feedback message
                    frontend.Comments.showMessage($form, result);
                    
                    // Reset the fields of the comment form
                    frontend.Comments.reset($form);
                    
                }
                else if(result.status == 'invalid')
                {
                    frontend.Comments.displayErrors($form, result);
                }

            }

        });
    },
    
    render: function($target, data)
    {
        var
            // Get the children (the comment items)   
            $children = $target.children(),
            
            // Get the number of items
            numItems = $children.length;

                
        // This limits the number of comments shown in closed state to 2
        if(numItems == 2) 
        {
        
            // There were already 2 comments visible
            // So remove the last one
            $children.eq(0).remove();
            
            // Add 'ajax-loadable' class, which displays the show more comments link
            $target.parent().addClass('ajax-loadable');        
            
        }
    
        // Remove the class no-comments from items parent
        $target.parent().removeClass('no-comments');
    
        // Create node
        $comment = $(frontend.shiv(data.html, false));
    
        // Attach comment result from AJAX call to comment list
        $target.append($comment);
       
        // Fix for IE8      
        $comment = $target.children($comment);
       
        // Get date from comment
        $comment.find('time.fuzzy').timeago();
        
        // Highlight the placed comment
        //$comment.effect('highlight', { color: '#D6EDE1' }, 3000);
        
    },
    
    displayErrors: function($target, data)
    {            
        $.each(data.errors, function(key, value) {
            
            // Find the input with as name the key value
            var $field = $target.find('*[name="' + key + '"]');
        
            // Add error class to parent
            $field.parent().addClass('error');
        });    
    },
    
    reset: function($form)
    {        
        // Get attachment fieldset
        var $attachment = $form.find('.attachment');

        // Remove attached file to comment form
        frontend.Comments.removeFile($attachment.find('.thumb'));
        
        // Remove error classes
        $form.find('.error').removeClass('error');
                
        // Message field
        $form.find('.comment-area textarea.field').val('');
        
        // Photo URL
        $attachment.find('.photo input.field').val('');        
        
        // Video URL
        $attachment.find('.video input.field').val('');  
        
        // Remove hidden fields
        $attachment.find('.photo input[name="photo-file"]').remove();
        $attachment.find('.photo input[name="photo-hash"]').remove();
        
        $form.removeClass('active');
    },
    
    showMessage: function($form, data)
    {
        var $feedback = $('<ul class="feedback"></ul>');
    
        if(data.errors)
        {
            if(data.errors.commenttext)
            {
                $.each(data.errors.commenttext, function(key, value)                
                {
                    // Find the input with as name the key value
                    $feedback.append('<li>' + value + '</li>');                                        
                });
            }
        }
        
        $form.prepend($feedback);
    },
    
    updateCount: function($comments, count) 
    {
        var
            // Get the comment link containing the comment count            
            $count = $comments.find('header .actions .comment .count'),
            $footer = $comments.find('footer');
            $showAllCount = $footer.find('.show-all .amount');
        
        // Update the text value of the target specified
        $count.text(count);
        
        // Update the amount in the show all button
        if($showAllCount.length > 0) 
        {
            // Update
            $showAllCount.text(count);
        
            // If just 2 or less comments
            if(count <= 2) {
            
                // Hide the show/hide more comments button
                $footer.hide();
            
            }
            else 
            {
                // Reset to the show-all visible state
                $footer.find('.show-all').removeClass('hide');
                $footer.find('.hide-all').addClass('hide');
                
                // Show the footer
                $footer.show();
            }
        }
    },
    
    remove: function($this)
    {
        var 
            // Get the comment container
            $comment = $this.closest('article');
            
            // Get the comments section
            $comments = $this.closest('section.comments');
                
        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            url: $this.attr('href'),

            action: 'json',
            type: 'get',

            // Success callback
            success: function(result) {            
                
                if(result.status == 'valid') {
                
                    // Remove comment from container
                    $comment.remove();
                    
                    // Update number of comments
                    frontend.Comments.updateCount($comments, result.amount);
                    
                }
                else if(result.status == 'invalid')
                {
                }
            }
        });            
    }
    
});/**
 *
 * @provides frontend.Interact
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * 
 * Contains also the JS for the interaction block in the sidebar
 * Voting, hot or not, stories, ...
 *
 * @class frontend.Interact
 * @static
 * @access private
 */
frontend.module('Interact', {
    
    init: function() {
        
        // Catch clicks on submit button
        $('section.interact footer button[type="submit"], section.vote footer button[type="submit"]').live('click', function(e) {

            // Get the form
            $form = $(this).closest('form');
            
            frontend.Interact.post($form);

            e.preventDefault();
            
        });
                
    },
    
    post: function($form) {

        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            url: $form.attr('action'),

            action: 'json',
            type: 'post',

            // Data to be sent
            data: $form.serialize(),
            
            preloader: true,
            preloaderElement: $form.find('button[type="submit"]'),
            preloaderClass: true,
                                        
            // Success callback
            success: function(result) {            
                
                if(result.status == 'valid') {
                    
                    // Single submit
                    if($form.hasClass('single-submit'))
                    {
                        // Hide the form after submit
                        $form.hide();
                    }
                    
                    if(result.message) {
                        
                        var $feedback = $('<div class="feedback"></div>');
                    
                        $feedback.text(result.message);
                        
                        // Show result message
                        $form.find('footer').append($feedback);
                    }
                    
                    // Reset form fields
                    frontend.Interact.reset($form);
                }
                else if(result.status == 'invalid')
                {
                        var $feedback = $('<div class="errors"></div>');

                        $feedback.text(result.errors.votetext.alreadyVoted);

                        // Show result message
                        $form.find('footer').append($feedback);
                }
            }

        });
    
    },
    
    reset: function($form) 
    {
        if($form.find('textarea.field').length > 0) 
        {
            $form.find('textarea.field').val('');
        }
    }
});/**
 *
 * @provides frontend.Media
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "User" provides access to the Facebook and Netlog API's
 * Contains also the JS needed during registration and login procedures
 *
 * @class frontend.Media
 * @static
 * @access private
 */
frontend.module('Media', {
    
    init: function() {
    
        $('section.set .slide-area a').click(function(e) {
            
            frontend.Media.reset();
            frontend.Media.load(this.href);
            
        
            e.preventDefault();
        });
        
    },
    
    load: function(href) {

        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            action: 'href',

            // Data to be sent
            url: href,
            
            // Return json object
            dataType: 'json',
            
            // Success callback
            success: function(data) {
            
                frontend.Media.render(data);
            
            }

        });    
    },
    
    render: function(data) {
    
        $target = $('article.set-item');
        
        // Set title
        $target.find('header h1').html(data.title);
        
        // Set description
        $target.find('.description').html(data.description);

        $target.find('.media').html(data.media.embed);

        $target.show();
    },
    
    reset: function() {
        $target = $('article.set-item');
        $target.hide();
    }
    
});/**
 *
 * @provides frontend.Media
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "User" provides access to the Facebook and Netlog API's
 * Contains also the JS needed during registration and login procedures
 *
 * @class frontend.Media
 * @static
 * @access private
 */
frontend.module('Preloader', {
    
    init: function() {
        
    },
    
    attach: function($element, preloading)
    {
        var $preloader = '<span class="preloader"></span>';
        
        if($element.find('.preloader').length == 0) {
            
            if(preloading) {
                $element.addClass('preloading');
            }
        
            $element.append($preloader);
        }
    },
    
    remove: function($element, preloading)
    {
        if(preloading) {
            $element.removeClass('preloading');
        }

        $element.find('span.preloader').remove();
    }
});/**
 *
 * @provides frontend.Profile
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * 
 * Contains also the JS for the profile pages
 *
 * @class frontend.Profile
 * @static
 * @access private
 */
frontend.module('Profile', {
    
    init: function() {
        
        $('.profile-info section.editable').each(function(i) {
            
            var $this = $(this);
            
            // Edit
            $this.find('a.edit').click(function(e) {
                
                // Edit current section
                frontend.Profile.edit($this, $(this), false);
                
                e.preventDefault();
            });
            
            // Cancel
            $this.find('a.cancel').click(function(e) {
                            
                // Cancel editing
                frontend.Profile.edit($this, $(this), true);
                
                e.preventDefault();
            });
            
            // Save button
            $this.find('button[type="submit"]').click(function(e) {
            
                // Save data
                frontend.Profile.post($this);
                
                e.preventDefault();
            });
        });

        $('#defriend').click(function(e) {
            e.preventDefault();
            
            frontend.Profile.defriend($(this));
        });
    },

    edit: function($target, $action, cancel)
    {
        var 
            $content = $target.children('.edit-content'),
            $form = $target.children('form');
        
        if(cancel)
        {
            frontend.Profile.cancel($target);
        }
        else
        {
            // Show cancel link
            $target.find('a.cancel').show();                    
            
            // Hide content
            $content.hide();
            
            // Show form
            $form.show();

            // Set height of textarea equal to edit-content
            $form.find('textarea').height($content.height());
        }
            
        // Hide action link
        $action.hide();
    },
    
    cancel: function($target)
    {
        // Show cancel link
        $target.find('a.edit').show();        

        // Show content
        $target.children('.edit-content').show();

        // Hide form
        $target.find('form').hide();

        // Hide cancel action
        $target.find('a.cancel').hide();        
    },
    
    post: function($target) {

        var $form = $target.find('form');

        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            url: $form.attr('action'),

            action: 'json',
            type: 'post',

            // Data to be sent
            data: $form.serialize(),
                                        
            // Success callback
            success: function(result) {            
                
                if(result.status == 'valid') {
                    
                    // Update the edit field with the result
                    $target.find('.edit-content p').html(result.data);
                                        
                    // Hide edit form
                    frontend.Profile.cancel($target);
                    
                }
                else if(result.status == 'invalid')
                {
                }
            }

        });
    
    },

    defriend: function($link)
    {
        var name = $('#friend-name').text();
        $("#defriend-confirm .data").html(name);
        // Create a new dialog
        frontend.Dialog.create({

            type: 'dialog',

            href: "#defriend-confirm",
            //href: '/fratello/frontend/ajax/register_confirm.php', // debug

            // Specify the position
            position: 'center-xy'
        });

        // Remove the dialog when user clicks on dialog cancel
        $('.dialog .close').live('click', function(e) {

            var
                $dialog = $('#dialog'),
                $content = $dialog.find('.dialog-content').children();

            $('body').append($content.hide());

            $dialog.remove();
            $('#overlay').remove();
        });

        // Defriend on someone's profile page
        $('#defriend-confirm .submit').live('click', function(e) {
            $.post($link.attr('href'), {}, function(result) {
                $('.request-status').html(result.value);
            }, 'json');

            $('.dialog .close').click();

            return false;
        });
    }
});/**
 *
 * @provides frontend.stream
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "Stream" manages updates to the stream
 *
 * @class frontend.Stream
 * @static
 * @access private
 */
frontend.module('Webcam', {
    
    init: function(webcam, swfobject, name)
    {
        var $form = webcam.closest('form');
                
        $('#dialog #upload-webcam button').live('click',function(e) {

            e.preventDefault();
            
            // Get flash object
            var flash = frontend.Dom.getFlashMovieObject('webcam-container-upload');
                        
            // Check if saveImage exists            
            if(flash.saveImage)
            {
                // Let Flash save the image
                flash.saveImage($form.attr('action'), 'test');
//                flash.saveImage('/account/registration/step2-flash', 'test');
            }
        });
    },

    load: function()
    {
        swfobject.registerObject('upload', '9.0.115', 'expressInstall.swf');
        swfobject.embedSWF('/fratello/frontend/assets/swf/webcam.swf', 'webcam-container-upload', '405', '230', '9.0.0');
        frontend.Webcam.init($('#webcam-container-upload'), swfobject, 'upload');
    }
});/**
 *
 * @provides frontend.Calendar
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * Comments module.
 *
 * @class frontend.Calendar
 * @static
 * @access private
 */
frontend.module('Calendar', {
    
    initialLoad: true,
    
    init: function()
    {
        var 
            $calendar = $('aside section.calendar'),
            d = new Date(),
            currentMonth = d.getMonth();
        
        // Update the calendar based on the currentMonth
        this.update($calendar, currentMonth);
        
        
        // Listener for next button
        $calendar.find('a.calendar-control').click(function(e) {
            
            // Calculate the month to show, based on the next or previous class of the button
            // If next is clicked -> currentMonth+1
            // If prev is clicked -> currentMonth-1
            // This is passed into the Number.mod function to calculate whether it should be reset to first month
            currentMonth = frontend.Number.mod(($(this).hasClass('next')) ? currentMonth+1 : currentMonth-1, 12);

            // Update the calendar                        
            frontend.Calendar.update($calendar, currentMonth);
            
            e.preventDefault();
        });        

        $calendar.find('a.calendar-day').live('click', function(e) {
        
            // Remove selected class for current selection
            $('.calendar-day.selected').removeClass('selected');

            // Display today's birthdays
            $calendar.closest('.birthday').find('.contents .outer').html($(this).parent().find('.hide').html());
            
            // Add selected class to current day link
            $(this).addClass('selected');
            
            e.preventDefault();
        });

    },
    
    update: function($calendar, currentMonth)
    {
        // Prepare an AJAX call
        frontend.XHR.prepareCall({

            // Action type
            action: 'json',
            url: '/wall/calendar',

            // Data to be sent
            data: { month: currentMonth + 1 },

            // Success callback
            success: function(result) {

                $calendar.find('tbody').html(result.data);    
                $calendar.find('header h2').text(result.month);
                                                
                // Call this only on initial load
                if(frontend.Calendar.initialLoad)
                {
                    var $now = $calendar.find('.calendar-day.now');
                    
                    if($now.length > 0) $now.click();

                    frontend.Calendar.initialLoad = false;
                } 
                else
                {
                    // Get the data displaying today
                    var $today = $calendar.closest('.birthday').find('.contents .today');
                                    
                    if($today.length > 0)
                    {
                        // Set the day of which info is currently displayed active
                        $calendar.find('.' + $today.attr('rel')).addClass('selected');
                    }
                
                }
            }
        });    
    }
});

/*
$(function() {
    var calendar = $('.calendar');
    var d = new Date();
    var currentMonth = d.getMonth();
    updateCalendar(currentMonth);

    $('a.calendar-control.next').click(function() {
        currentMonth = mod(currentMonth+1, 12);
        updateCalendar();
        return false;
    });

    $('a.calendar-control.prev').click(function() {
        currentMonth = mod(currentMonth-1 , 12);
        updateCalendar();
        return false;
    });

    function updateCalendar() {
        $.post('/wall/calendar', {'month' : currentMonth+1}, function(response) {
            calendar.find('tbody').html(response.data);
            calendar.find('tbody').find('.hiddengroup').hide();

            calendar.find('header h2').text(response.month);

            $('.calendar-day').click(function() {
                $('.calendar-day.selected').removeClass('selected');
                $(this).addClass('selected');
                $('.birthday .contents .outer').html($(this).parent().find('.hiddengroup').html());
                return false;
            });

            $('a.calendar-day.now').click();

        }, 'json');
    }

    function mod(a, b) {
        var r = a%b;
        return r<0 ? r+b : r;
    }

});*//**
 *
 * @provides frontend.stream
 * @requires frontend.prelude 
 *           jquery
 */

/**
 * "Stream" manages updates to the stream
 *
 * @class frontend.Stream
 * @static
 * @access private
 */
frontend.module('Pictureupload', {
    
    getFilename: function(data, $form)
    {
        $form.find('input.field-upload').val(data.filename);
    }
});/*!
 * Joepie website
 *
 * @author Davy De Pauw (@float)
 * @copyright Marlon bvba <http://www.marlon.be>
 */

$('document').ready(function() {

    // Localize the different modules
    var
        calendar  = frontend.Calendar,
        comments  = frontend.Comments,
        dialog    = frontend.Dialog, 
        forms     = frontend.Forms,
        layout    = frontend.Layout,
        interact  = frontend.Interact,
        media     = frontend.Media,
        profile   = frontend.Profile,
        friends   = frontend.Friends,
        stream    = frontend.Stream,
        twitter   = frontend.Twitter,
        register  = frontend.Register,
        user      = frontend.User,
        webcam    = frontend.Webcam;
        

    // Initialize tabs
    // This enables tabs for all items containing the .tabs class
    layout.init();
    
    // Cache the forms module
        
    // Init modules
    comments.init();
    forms.init();
    friends.init();
    interact.init();
    media.init();
    profile.init();    
    register.init();
    user.init();

    // Focus listeners on visitor pages
    if($('.register').length > 0) forms.setFocusListeners();
    
    // Provices a fallback for browsers that don't support placeholder attribute
    if (!Modernizr.input.placeholder) {
        forms.placeholders($(':input[placeholder]'));     
    }
    
    // Initialize custom inputfields
    forms.customInputs();

    $('textarea.scalable').autoResize({
        
        // On resize:
        onResize: function() {},
        
        // After resize:
        animateCallback: function() {},
        
        // Quite slow animation:
        animateDuration: 150,
        
        // More extra space:
        extraSpace: 0
    });
    
    
    // Listen for clicks on links provided with the rel="dialog"
    // Displays a dialog containing the:
    // * Referenced id in the element
    // * Result of an AJAX call
    $('a[rel="dialog"]').click(function(e) {
        var $this = $(this),
            callback = null,
            cssClass = null,
            ajaxCallback = null,
            closelabel = '';
                
        if($this.hasClass('upload'))
        {
            callback = function(data)
            {

            	$form = $this.closest('form');

            	// if there is an input field next to the upload button
            	// get the file name from the file field in #dialog
            	// and use that as the value of the empty input field
            
            	if( $form.find('.field-upload').length !== 0 ) {
            		frontend.Pictureupload.getFilename(data, $form);
            	}
            
                // Remove dialog
                $('#dialog').remove();
                $('#overlay').remove();
                
                // Comment form
                if($form.hasClass('comment-form'))
                {
                    comments.attachFile(data, $form);
                }
                // Status update
                else
                {
                    stream.attachFile(data, $form);
                }
            };
            
            cssClass = 'dialog-upload';
        }
        if($this.hasClass('recover'))
        {
            callback = function(data)
            {                            
                var $dialog = $('#dialog');
            
                // Get the form contained in the dialog
                $form = $dialog.find('form');
                
                // Recover user password
                user.recover(data, $form, $dialog, $('#overlay'));
            }
        }

        if($this.hasClass('upload-webcam')) {
            ajaxCallback = webcam.load;
        }
        
        // Customize close label
        // Based on closelabel attribute on the callee link
        if($this.attr('closelabel') != undefined)
        {
            closeLabel = $this.attr('closelabel');
        }
        else
        {
            closeLabel = 'Sluiten';
        }
                    
        // Create a new dialog
        dialog.create({ 

            // Grab the type from the rel attribute
            type: $this.attr('rel'), 
                        
            // The content of the dialog get determined by the href value of the link.
            // If it's an anchor to an element on the page (#element), than this element is shown in the dialog.
            // If it's a link to a page / ajax call, that result is shown.
            href: $this.attr('href'), 
            
            // Specify the position
            position: 'center-xy',
            
            // Close button
            closeButton: true,
            closeLabel: closeLabel,
            
            // Optional callback
            callback: callback,

            ajaxCallback: ajaxCallback,
            
            // Additional CSS class name                 
            cssClass: cssClass
        });

        e.preventDefault();
    });
    
    $('.dialog .upload-picture button.save').live('click', function(e) {
        // Close dialog
        
        // Save uploaded file to current form
    });
    
    $('a[rel="lightbox"]').live('click', function(e) {
        var 
            $this = $(this),
            type = $this.attr('rel');
        
        
        if($this.hasClass('video'))
        {
            type = 'video';        
        }
        
        // Create a new dialog
        dialog.create({ 

            // Grab the type from the rel attribute
            type: type, 
                        
            // The content of the dialog get determined by the href value of the link.
            // If it's an anchor to an element on the page (#element), than this element is shown in the dialog.
            // If it's a link to a page / ajax call, that result is shown.
            href: $this.attr('href'), 
            
            // Specify the position
            position: 'center-xy'
        });
        
        e.preventDefault();
    });    
    
    // A select all checkboxes implementation
    $('.checkbox.select-all .checkbox').click(function(e) {
        forms.toggleCheckboxes($(this));
    });
    
    $checkboxes = $('.register form.checkboxes');
    
    // Check if registration page with checkboxes
    // = friend avatar list from facebook or liveconnect
    if($checkboxes.length > 0)
    {
        // Use the position plugin to create rows of ul's
        $checkboxes.find('ul.checkboxes').position();
    }
    
    // Sliders available on page?
    if($('.slider').length > 0) layout.slider.init();

    // Initialize timeAgo plugin (fuzzy dates implementation)
    $("time.fuzzy").timeago();

    // Get the stream section
    var streamContainer = $('.stream');
    
    // Init stream
    if(streamContainer.length > 0) stream.init(streamContainer);

    // Init calendar
    if($('aside section.calendar').length > 0) calendar.init();

    // Trigger click event
    $('.trigger-click').trigger('click');
    
    // Feedback toolbar
    if($('#feedback-toolbar').length > 0) frontend.Feedback.init();
    
    /*
    if($('section.home').length > 0)
    {    
        if (window.addEventListener){
            
            // Add listener for focus on window
            window.addEventListener('focus', function() {
                
                // Reset awaiting messages
                frontend.resetPageTitle();
                
            }, false);
            
        } else if (window.attachEvent){
        }
    }
    */
    
    $(document).ajaxError(function(evt, xhr, settings){
        try {
            result = JSON.parse(xhr.responseText);
            if (result.ajaxLogin) {
                window.location = '/';
            }
        } catch(err) {
        }
    });
    
    // Show splash on startpage
    if (typeof showSplashAzPage != "undefined") {
        if (showSplashAzPage) {
            $('#splashAzContainer').show();

            $('#splashAzPage-header').live('click', function(e) {
                $('#splashAzContainer').hide();
                e.preventDefault();
            });
        }
    }
    
    // show promobox on startpage
    if (typeof showPromoboxHeader != "undefined") {
        if (showPromoboxHeader) {
            $('#item-promo').show();
        }
    }
    
});

